@jmruthers/pace-core 0.6.6 → 0.6.8

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 (292) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +240 -0
  4. package/audit-tool/audits/03-architecture.cjs +224 -0
  5. package/audit-tool/audits/04-code-quality.cjs +149 -0
  6. package/audit-tool/audits/05-styling.cjs +224 -0
  7. package/audit-tool/audits/06-security-rbac.cjs +554 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +355 -0
  9. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  10. package/audit-tool/audits/09-operations.cjs +208 -0
  11. package/audit-tool/index.cjs +295 -0
  12. package/audit-tool/utils/code-utils.cjs +218 -0
  13. package/audit-tool/utils/file-utils.cjs +230 -0
  14. package/audit-tool/utils/report-utils.cjs +380 -0
  15. package/cursor-rules/00-standards-overview.mdc +156 -0
  16. package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
  17. package/cursor-rules/02-project-structure.mdc +37 -5
  18. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
  19. package/cursor-rules/04-code-quality.mdc +419 -0
  20. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
  21. package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
  22. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  23. package/cursor-rules/08-testing-documentation.mdc +324 -0
  24. package/cursor-rules/09-operations.mdc +365 -0
  25. package/dist/DataTable-6RMSCQJ6.js +15 -0
  26. package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  27. package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
  28. package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
  29. package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
  30. package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
  31. package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
  32. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  33. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  34. package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
  35. package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
  36. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  37. package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
  38. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  39. package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
  40. package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
  41. package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
  42. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  43. package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
  44. package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
  45. package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
  46. package/dist/components.d.ts +5 -4
  47. package/dist/components.js +29 -34
  48. package/dist/eslint-rules/index.cjs +22 -9
  49. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  50. package/dist/eslint-rules/rules/04-code-quality.cjs +346 -0
  51. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  52. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
  53. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
  54. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  55. package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
  56. package/dist/hooks.d.ts +5 -5
  57. package/dist/hooks.js +8 -8
  58. package/dist/index.d.ts +7 -7
  59. package/dist/index.js +21 -20
  60. package/dist/providers.js +2 -2
  61. package/dist/rbac/index.d.ts +1 -1
  62. package/dist/rbac/index.js +8 -8
  63. package/dist/theming/runtime.d.ts +61 -1
  64. package/dist/theming/runtime.js +1 -1
  65. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  66. package/dist/types.d.ts +2 -2
  67. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  68. package/dist/utils.d.ts +2 -2
  69. package/dist/utils.js +8 -8
  70. package/docs/README.md +1 -1
  71. package/docs/api/modules.md +106 -41
  72. package/docs/api-reference/components.md +18 -20
  73. package/docs/api-reference/hooks.md +80 -80
  74. package/docs/api-reference/types.md +1 -1
  75. package/docs/api-reference/utilities.md +1 -1
  76. package/docs/architecture/README.md +1 -1
  77. package/docs/core-concepts/events.md +3 -3
  78. package/docs/core-concepts/organisations.md +6 -6
  79. package/docs/core-concepts/permissions.md +6 -6
  80. package/docs/documentation-index.md +12 -18
  81. package/docs/getting-started/dependencies.md +23 -0
  82. package/docs/getting-started/documentation-index.md +1 -1
  83. package/docs/getting-started/examples/README.md +4 -4
  84. package/docs/getting-started/examples/full-featured-app.md +1 -1
  85. package/docs/getting-started/faq.md +2 -2
  86. package/docs/getting-started/quick-reference.md +4 -4
  87. package/docs/implementation-guides/app-layout.md +1 -1
  88. package/docs/implementation-guides/authentication.md +15 -15
  89. package/docs/implementation-guides/component-styling.md +1 -1
  90. package/docs/implementation-guides/data-tables.md +127 -34
  91. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  92. package/docs/implementation-guides/dynamic-colors.md +3 -3
  93. package/docs/implementation-guides/file-upload-storage.md +2 -2
  94. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  95. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  96. package/docs/implementation-guides/large-datasets.md +3 -2
  97. package/docs/implementation-guides/organisation-security.md +2 -2
  98. package/docs/implementation-guides/performance.md +2 -2
  99. package/docs/implementation-guides/permission-enforcement.md +1 -1
  100. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  101. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  102. package/docs/rbac/README.md +5 -5
  103. package/docs/rbac/advanced-patterns.md +6 -6
  104. package/docs/rbac/api-reference.md +20 -20
  105. package/docs/rbac/event-based-apps.md +3 -3
  106. package/docs/rbac/examples.md +41 -41
  107. package/docs/rbac/getting-started.md +37 -37
  108. package/docs/rbac/performance.md +1 -1
  109. package/docs/rbac/quick-start.md +52 -52
  110. package/docs/rbac/secure-client-protection.md +1 -1
  111. package/docs/rbac/troubleshooting.md +1 -1
  112. package/docs/security/README.md +5 -5
  113. package/docs/standards/0-standards-overview.md +220 -0
  114. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +241 -185
  115. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  116. package/docs/standards/3-architecture-standards.md +606 -0
  117. package/docs/standards/4-code-quality-standards.md +728 -0
  118. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  119. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  120. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  121. package/docs/standards/8-testing-documentation-standards.md +401 -0
  122. package/docs/standards/9-operations-standards.md +1102 -0
  123. package/docs/standards/README.md +203 -104
  124. package/docs/troubleshooting/README.md +4 -4
  125. package/docs/troubleshooting/common-issues.md +2 -2
  126. package/docs/troubleshooting/debugging.md +9 -9
  127. package/docs/troubleshooting/migration.md +4 -4
  128. package/eslint-config-pace-core.cjs +50 -20
  129. package/package.json +50 -19
  130. package/scripts/eslint-audit.cjs +123 -0
  131. package/scripts/install-cursor-rules.cjs +11 -243
  132. package/scripts/install-eslint-config.cjs +349 -0
  133. package/scripts/validate-dependencies.cjs +248 -0
  134. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  135. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  136. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +30 -18
  137. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  138. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  139. package/src/__tests__/templates/accessibility.test.template.tsx +10 -9
  140. package/src/__tests__/templates/component.test.template.tsx +18 -15
  141. package/src/components/AddressField/AddressField.tsx +26 -1
  142. package/src/components/Alert/Alert.test.tsx +86 -22
  143. package/src/components/Alert/Alert.tsx +19 -11
  144. package/src/components/Badge/Badge.tsx +1 -1
  145. package/src/components/Calendar/Calendar.tsx +201 -47
  146. package/src/components/Checkbox/Checkbox.test.tsx +2 -1
  147. package/src/components/ContextSelector/ContextSelector.tsx +108 -126
  148. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  149. package/src/components/DataTable/DataTable.tsx +1 -19
  150. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
  151. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
  152. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
  153. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  154. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  155. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  156. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  157. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  158. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  159. package/src/components/DataTable/components/EmptyState.tsx +11 -10
  160. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  161. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  162. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  163. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  164. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  165. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  166. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  167. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  168. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  169. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +45 -27
  170. package/src/components/DataTable/components/index.ts +2 -1
  171. package/src/components/DataTable/types.ts +0 -18
  172. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  173. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
  174. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  175. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  176. package/src/components/Dialog/Dialog.test.tsx +1 -0
  177. package/src/components/Dialog/Dialog.tsx +25 -8
  178. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  179. package/src/components/FileUpload/FileUpload.test.tsx +45 -16
  180. package/src/components/FileUpload/FileUpload.tsx +141 -130
  181. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
  182. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
  183. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
  184. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
  185. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
  186. package/src/components/Progress/Progress.tsx +2 -4
  187. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  188. package/src/components/Select/Select.tsx +86 -77
  189. package/src/components/Select/types.ts +3 -0
  190. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  191. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  192. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +8 -5
  193. package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
  194. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
  195. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
  196. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
  197. package/src/hooks/public/usePublicEvent.ts +5 -5
  198. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  199. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  200. package/src/hooks/public/usePublicRouteParams.ts +13 -9
  201. package/src/hooks/useAddressAutocomplete.test.ts +18 -18
  202. package/src/hooks/useAppConfig.ts +2 -2
  203. package/src/hooks/useEventTheme.test.ts +7 -7
  204. package/src/hooks/useEventTheme.ts +2 -1
  205. package/src/hooks/useFileDisplay.ts +2 -2
  206. package/src/hooks/useFileUrl.ts +52 -8
  207. package/src/hooks/useOrganisationSecurity.test.ts +2 -1
  208. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  209. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  210. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  211. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  212. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  213. package/src/providers/__tests__/ProviderLifecycle.test.tsx +38 -38
  214. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  215. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  216. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  217. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
  218. package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
  219. package/src/rbac/api.test.ts +104 -0
  220. package/src/rbac/engine.ts +1 -1
  221. package/src/rbac/hooks/useCan.test.ts +2 -2
  222. package/src/rbac/secureClient.ts +1 -1
  223. package/src/rbac/types/functions.ts +1 -1
  224. package/src/styles/core.css +7 -0
  225. package/src/theming/__tests__/parseEventColours.test.ts +118 -3
  226. package/src/theming/parseEventColours.ts +77 -11
  227. package/src/types/supabase.ts +2 -3
  228. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
  229. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  230. package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
  231. package/src/utils/formatting/formatDate.test.ts +3 -2
  232. package/src/utils/formatting/formatDateTime.test.ts +2 -2
  233. package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
  234. package/src/utils/storage/README.md +1 -1
  235. package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
  236. package/src/utils/storage/helpers.test.ts +69 -3
  237. package/cursor-rules/01-standards-compliance.mdc +0 -285
  238. package/cursor-rules/04-testing-standards.mdc +0 -270
  239. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  240. package/cursor-rules/06-code-quality.mdc +0 -311
  241. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  242. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  243. package/cursor-rules/11-performance-optimization.mdc +0 -169
  244. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  245. package/dist/DataTable-LRJL4IRV.js +0 -15
  246. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  247. package/dist/eslint-rules/rules/components.cjs +0 -113
  248. package/dist/eslint-rules/rules/imports.cjs +0 -102
  249. package/docs/best-practices/README.md +0 -472
  250. package/docs/best-practices/accessibility.md +0 -604
  251. package/docs/best-practices/common-patterns.md +0 -516
  252. package/docs/best-practices/deployment.md +0 -1103
  253. package/docs/best-practices/performance.md +0 -1328
  254. package/docs/best-practices/security.md +0 -940
  255. package/docs/best-practices/testing.md +0 -1034
  256. package/docs/rbac/compliance/compliance-guide.md +0 -544
  257. package/docs/standards/01-standards-compliance.md +0 -188
  258. package/docs/standards/03-solid-principles.md +0 -39
  259. package/docs/standards/04-testing-standards.md +0 -36
  260. package/docs/standards/05-bug-reports-and-features.md +0 -27
  261. package/docs/standards/06-code-quality.md +0 -34
  262. package/docs/standards/07-tech-stack-compliance.md +0 -30
  263. package/docs/standards/10-error-handling-patterns.md +0 -401
  264. package/docs/standards/11-performance-optimization.md +0 -348
  265. package/docs/standards/12-ci-cd-integration.md +0 -370
  266. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  267. package/scripts/audit/audit-compliance.cjs +0 -1295
  268. package/scripts/audit/audit-components.cjs +0 -260
  269. package/scripts/audit/audit-rbac.cjs +0 -954
  270. package/scripts/audit/audit-standards.cjs +0 -1268
  271. package/scripts/audit/index.cjs +0 -1927
  272. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  273. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  274. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  275. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  276. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  277. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  278. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  279. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  280. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  281. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  282. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  283. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  284. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  285. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  286. package/src/components/DataTable/utils/debugTools.ts +0 -514
  287. package/src/eslint-rules/index.cjs +0 -22
  288. package/src/eslint-rules/rules/components.cjs +0 -113
  289. package/src/eslint-rules/rules/imports.cjs +0 -102
  290. package/src/eslint-rules/rules/rbac.cjs +0 -790
  291. package/src/eslint-rules/utils/helpers.cjs +0 -42
  292. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jmruthers/pace-core",
3
- "version": "0.6.6",
3
+ "version": "0.6.8",
4
4
  "description": "React component library with Tailwind v4",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -79,8 +79,6 @@
79
79
  "./core-usage-manifest.json": "./core-usage-manifest.json",
80
80
  "./cursor-rules": "./cursor-rules",
81
81
  "./scripts/install-cursor-rules": "./scripts/install-cursor-rules.cjs",
82
- "./scripts/audit-dependencies": "./scripts/audit/audit-dependencies.cjs",
83
- "./scripts/audit": "./scripts/audit/index.cjs",
84
82
  "./source": {
85
83
  "import": "./src/index.ts",
86
84
  "default": "./src/index.ts"
@@ -153,7 +151,8 @@
153
151
  "core-usage-manifest.json",
154
152
  "eslint-config-pace-core.cjs",
155
153
  "scripts",
156
- "cursor-rules"
154
+ "cursor-rules",
155
+ "audit-tool"
157
156
  ],
158
157
  "scripts": {
159
158
  "_comment_build": "Build package and documentation",
@@ -167,7 +166,8 @@
167
166
  "link": "npm run build && npm link",
168
167
  "unlink": "npm unlink",
169
168
  "validate:theme": "node scripts/validate-theme.js",
170
- "prepublishOnly": "npm run build",
169
+ "prepublishOnly": "npm run validate:dependencies && npm run build",
170
+ "validate:dependencies": "node scripts/validate-dependencies.cjs",
171
171
  "clean": "rimraf dist",
172
172
  "_comment_test": "Test suite with various configurations",
173
173
  "test": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192 --max-semi-space-size=128\" vitest run --config ../../vitest.config.ts",
@@ -198,7 +198,9 @@
198
198
  "docs:generate": "node scripts/generate-docs.js generate",
199
199
  "docs:update-index": "node scripts/generate-docs.js update-index",
200
200
  "docs:generate-api": "node scripts/generate-docs.js generate-api",
201
- "docs:all": "node scripts/generate-docs.js all"
201
+ "docs:all": "node scripts/generate-docs.js all",
202
+ "_comment_audit": "Audit tool for consuming apps",
203
+ "audit:pace-core": "node packages/core/audit-tool/index.cjs"
202
204
  },
203
205
  "keywords": [
204
206
  "react",
@@ -217,38 +219,67 @@
217
219
  "clsx": "^2.0.0",
218
220
  "date-fns": "^3.0.0",
219
221
  "date-fns-tz": "^3.0.0",
220
- "react": "^19.0.0",
222
+ "react": "^19.2.3",
221
223
  "react-day-picker": "^9.0.0",
222
- "react-dom": "^19.0.0",
224
+ "react-dom": "^19.2.3",
223
225
  "react-hook-form": "^7.0.0",
224
226
  "react-router-dom": "^6.0.0",
225
227
  "tailwind-merge": "^2.0.0",
226
- "tailwindcss": "^4.0.0",
228
+ "tailwindcss": "^4.1.16",
227
229
  "zod": "^3.20.0"
228
230
  },
231
+ "peerDependenciesMeta": {
232
+ "@tanstack/react-query": {
233
+ "optional": true
234
+ },
235
+ "@tanstack/react-table": {
236
+ "optional": true
237
+ },
238
+ "clsx": {
239
+ "optional": true
240
+ },
241
+ "date-fns": {
242
+ "optional": true
243
+ },
244
+ "date-fns-tz": {
245
+ "optional": true
246
+ },
247
+ "react-hook-form": {
248
+ "optional": true
249
+ },
250
+ "react-day-picker": {
251
+ "optional": true
252
+ },
253
+ "zod": {
254
+ "optional": true
255
+ },
256
+ "tailwind-merge": {
257
+ "optional": true
258
+ }
259
+ },
229
260
  "devDependencies": {
230
261
  "@testing-library/jest-dom": "^6.6.3",
231
- "@testing-library/react": "^16.1.0",
232
- "@testing-library/user-event": "^14.5.2",
262
+ "@testing-library/react": "^16.3.0",
263
+ "@testing-library/user-event": "^14.6.1",
233
264
  "@types/papaparse": "^5.3.16",
234
- "@types/react": "^19.0.0",
235
- "@types/react-dom": "^19.0.0",
265
+ "@types/react": "^19.2.7",
266
+ "@types/react-dom": "^19.2.3",
236
267
  "@types/react-window": "^1.8.8",
237
- "@vitejs/plugin-react": "^4.5.1",
238
- "@vitest/coverage-v8": "^3.2.3",
268
+ "@vitejs/plugin-react": "^5.1.2",
269
+ "@vitest/coverage-v8": "^4.0.16",
239
270
  "esbuild": "^0.20.0",
240
271
  "eslint-plugin-react-hooks": "^5.2.0",
241
272
  "eslint-plugin-react-refresh": "^0.4.20",
242
273
  "globals": "^16.3.0",
243
274
  "jsdom": "^25.0.1",
244
275
  "react-router-dom": "^6.26.2",
245
- "tsup": "^8.5.0",
246
- "typedoc": "^0.26.11",
276
+ "tsup": "^8.5.1",
277
+ "typedoc": "^0.27.0",
247
278
  "typedoc-plugin-markdown": "^3.17.1",
248
279
  "typedoc-plugin-merge-modules": "^5.1.0",
249
- "typescript": "^5.4.0",
280
+ "typescript": "^5.9.3",
250
281
  "typescript-eslint": "^8.39.0",
251
- "vite": "^6.0.3"
282
+ "vite": "^7.2.7"
252
283
  },
253
284
  "dependencies": {
254
285
  "@hookform/resolvers": "^3.9.0",
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * ESLint Audit Script
5
+ * @package pace-core
6
+ * @module Scripts/eslint-audit
7
+ *
8
+ * Runs ESLint across the entire repository and outputs results to a timestamped file
9
+ * in the audit directory.
10
+ *
11
+ * Usage:
12
+ * npm run audit:eslint
13
+ */
14
+
15
+ const { execSync } = require('child_process');
16
+ const fs = require('fs');
17
+ const path = require('path');
18
+
19
+ // ANSI color codes for terminal output
20
+ const colors = {
21
+ reset: '\x1b[0m',
22
+ green: '\x1b[32m',
23
+ yellow: '\x1b[33m',
24
+ blue: '\x1b[34m',
25
+ cyan: '\x1b[36m',
26
+ bold: '\x1b[1m',
27
+ red: '\x1b[31m'
28
+ };
29
+
30
+ // Generate timestamp in format yyyymmddHHMM
31
+ function generateTimestamp() {
32
+ const now = new Date();
33
+ const year = now.getFullYear();
34
+ const month = String(now.getMonth() + 1).padStart(2, '0');
35
+ const day = String(now.getDate()).padStart(2, '0');
36
+ const hours = String(now.getHours()).padStart(2, '0');
37
+ const minutes = String(now.getMinutes()).padStart(2, '0');
38
+ return `${year}${month}${day}${hours}${minutes}`;
39
+ }
40
+
41
+ // Main execution
42
+ function main() {
43
+ const cwd = process.cwd();
44
+ const auditDir = path.join(cwd, 'audit');
45
+ const timestamp = generateTimestamp();
46
+ const outputFile = path.join(auditDir, `${timestamp}-eslint-report.txt`);
47
+
48
+ // Create audit directory if it doesn't exist
49
+ if (!fs.existsSync(auditDir)) {
50
+ fs.mkdirSync(auditDir, { recursive: true });
51
+ console.log(`${colors.green}Created audit/ directory${colors.reset}`);
52
+ }
53
+
54
+ console.log(`${colors.cyan}Running ESLint audit across the repository...${colors.reset}\n`);
55
+
56
+ try {
57
+ // Run ESLint and capture output
58
+ const eslintCommand = 'npm run lint 2>&1';
59
+ const output = execSync(eslintCommand, {
60
+ encoding: 'utf8',
61
+ cwd,
62
+ stdio: 'pipe'
63
+ });
64
+
65
+ // Write output to file
66
+ const reportContent = `ESLint Audit Report
67
+ Generated: ${new Date().toISOString()}
68
+ Timestamp: ${timestamp}
69
+
70
+ ${output}
71
+ `;
72
+
73
+ fs.writeFileSync(outputFile, reportContent, 'utf8');
74
+
75
+ // Check if there are any errors
76
+ const hasErrors = output.includes('error') || output.includes('✖');
77
+ const hasWarnings = output.includes('warning') || output.includes('⚠');
78
+
79
+ console.log(`${colors.bold}Audit Summary:${colors.reset}`);
80
+ if (hasErrors) {
81
+ console.log(` ${colors.red}Errors found${colors.reset} - See report for details`);
82
+ } else if (hasWarnings) {
83
+ console.log(` ${colors.yellow}Warnings found${colors.reset} - See report for details`);
84
+ } else {
85
+ console.log(` ${colors.green}No errors or warnings${colors.reset}`);
86
+ }
87
+
88
+ console.log(`\n${colors.cyan}Report saved to:${colors.reset} ${outputFile}`);
89
+ console.log(`\n${colors.cyan}To view the report:${colors.reset}`);
90
+ console.log(` ${colors.bold}cat ${outputFile}${colors.reset}`);
91
+
92
+ } catch (error) {
93
+ // ESLint may exit with non-zero code if errors are found
94
+ // Capture the output anyway
95
+ const output = error.stdout || error.message || String(error);
96
+
97
+ const reportContent = `ESLint Audit Report
98
+ Generated: ${new Date().toISOString()}
99
+ Timestamp: ${timestamp}
100
+
101
+ ${output}
102
+
103
+ Exit Code: ${error.status || 1}
104
+ `;
105
+
106
+ fs.writeFileSync(outputFile, reportContent, 'utf8');
107
+
108
+ console.log(`${colors.yellow}ESLint found issues (exit code: ${error.status || 1})${colors.reset}`);
109
+ console.log(`\n${colors.cyan}Report saved to:${colors.reset} ${outputFile}`);
110
+ console.log(`\n${colors.cyan}To view the report:${colors.reset}`);
111
+ console.log(` ${colors.bold}cat ${outputFile}${colors.reset}`);
112
+
113
+ // Don't exit with error - we've captured the report
114
+ process.exit(0);
115
+ }
116
+ }
117
+
118
+ // Run if called directly
119
+ if (require.main === module) {
120
+ main();
121
+ }
122
+
123
+ module.exports = { main, generateTimestamp };
@@ -1,21 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * Installation Script for pace-core Cursor Rules and ESLint Config
4
+ * Installation Script for pace-core Cursor Rules
5
5
  * @package @jmruthers/pace-core
6
6
  * @module Scripts/install-cursor-rules
7
7
  *
8
- * Sets up both:
9
- * 1. Cursor rules - Copies cursor rules from pace-core to consuming app's .cursor/rules/ directory
10
- * 2. ESLint config - Adds pace-core ESLint config to consuming app's ESLint configuration
8
+ * Sets up cursor rules:
9
+ * - Copies cursor rules from pace-core to consuming app's .cursor/rules/ directory
11
10
  *
12
11
  * This is an opt-in script - it does NOT run automatically via postinstall.
13
12
  *
13
+ * For ESLint setup, use install-eslint-config.cjs separately.
14
+ *
14
15
  * Usage:
15
- * node install-cursor-rules.cjs # Install both cursor rules and ESLint
16
- * node install-cursor-rules.cjs --skip-eslint # Only install cursor rules
17
- * node install-cursor-rules.cjs --skip-cursor # Only setup ESLint
18
- * node install-cursor-rules.cjs --force # Force update even if already configured
16
+ * node install-cursor-rules.cjs # Install cursor rules
17
+ * node install-cursor-rules.cjs --force # Force update even if already configured
19
18
  */
20
19
 
21
20
  const fs = require('fs');
@@ -219,250 +218,21 @@ function installCursorRules(force = false) {
219
218
  console.log(`${colors.cyan}Restart Cursor to load the new rules.${colors.reset}`);
220
219
  }
221
220
 
222
- // Find existing ESLint config file
223
- function findESLintConfig() {
224
- const cwd = process.cwd();
225
- const possibleConfigs = [
226
- 'eslint.config.js',
227
- 'eslint.config.cjs',
228
- 'eslint.config.mjs',
229
- '.eslintrc.js',
230
- '.eslintrc.cjs',
231
- '.eslintrc.json',
232
- '.eslintrc.yaml',
233
- '.eslintrc.yml',
234
- ];
235
-
236
- for (const configFile of possibleConfigs) {
237
- const configPath = path.join(cwd, configFile);
238
- if (fs.existsSync(configPath)) {
239
- return { path: configPath, name: configFile, isESM: configFile.endsWith('.js') || configFile.endsWith('.mjs') };
240
- }
241
- }
242
-
243
- return null;
244
- }
245
-
246
- // Check if pace-core config is already included
247
- function hasPaceCoreConfig(configContent) {
248
- // Check for pace-core config import/require
249
- const paceCorePatterns = [
250
- /@jmruthers\/pace-core\/eslint-config/,
251
- /pace-core\/eslint-config/,
252
- /paceCoreConfig/,
253
- /pace-core-compliance/,
254
- ];
255
-
256
- return paceCorePatterns.some(pattern => pattern.test(configContent));
257
- }
258
-
259
- // Detect if file is ES module
260
- function isESModule(filePath, content) {
261
- if (filePath.endsWith('.mjs')) return true;
262
- if (filePath.endsWith('.cjs')) return false;
263
- if (filePath.endsWith('.js')) {
264
- // Check for ES module indicators
265
- return /^import\s+.*from|^export\s+default/.test(content.trim());
266
- }
267
- return false;
268
- }
269
-
270
- // Backup file before modification
271
- function backupFile(filePath) {
272
- const backupPath = `${filePath}.backup.${Date.now()}`;
273
- fs.copyFileSync(filePath, backupPath);
274
- return backupPath;
275
- }
276
-
277
- // Setup ESLint configuration
278
- function setupESLintConfig(force = false, skipIfExists = false) {
279
- const cwd = process.cwd();
280
- const existingConfig = findESLintConfig();
281
-
282
- if (existingConfig) {
283
- // Read existing config
284
- let content = fs.readFileSync(existingConfig.path, 'utf8');
285
- const isESM = isESModule(existingConfig.path, content);
286
- const format = isESM ? 'ES Module' : 'CommonJS';
287
-
288
- console.log(`${colors.cyan}Found ESLint config:${colors.reset} ${existingConfig.name} (${format})`);
289
-
290
- // Check if already configured
291
- if (hasPaceCoreConfig(content)) {
292
- if (skipIfExists && !force) {
293
- console.log(`${colors.blue}○${colors.reset} ${existingConfig.name} already includes pace-core rules`);
294
- return { action: 'skipped', file: existingConfig.name, format };
295
- }
296
-
297
- if (force) {
298
- console.log(`${colors.yellow}Updating existing ESLint config...${colors.reset}`);
299
- } else {
300
- console.log(`${colors.blue}○${colors.reset} ${existingConfig.name} already configured. Use --force to update.`);
301
- return { action: 'skipped', file: existingConfig.name, format };
302
- }
303
- } else {
304
- console.log(`${colors.cyan}Adding pace-core config to ${existingConfig.name}...${colors.reset}`);
305
- }
306
-
307
- // Backup before modification
308
- const backupPath = backupFile(existingConfig.path);
309
- console.log(`${colors.cyan} Backed up to ${path.basename(backupPath)}${colors.reset}`);
310
-
311
- // Add pace-core config
312
- if (isESM) {
313
- // ES Module format
314
- if (!content.includes('import paceCoreConfig')) {
315
- // Add import at top (after other imports if they exist)
316
- const importLines = content.match(/^(import\s+[^;]+;?\s*\n)+/m);
317
- if (importLines) {
318
- // Add after existing imports
319
- content = content.replace(
320
- importLines[0],
321
- `${importLines[0]}import paceCoreConfig from '@jmruthers/pace-core/eslint-config';\n`
322
- );
323
- } else {
324
- // Add at the beginning
325
- content = `import paceCoreConfig from '@jmruthers/pace-core/eslint-config';\n${content}`;
326
- }
327
- }
328
-
329
- // Add to export default array
330
- if (content.includes('export default [')) {
331
- // Already an array, add paceCoreConfig at the beginning
332
- if (!content.includes('...paceCoreConfig')) {
333
- content = content.replace(
334
- /(export\s+default\s*\[)\s*/,
335
- '$1\n ...paceCoreConfig,'
336
- );
337
- }
338
- } else if (content.includes('export default')) {
339
- // Not an array, wrap it
340
- const exportMatch = content.match(/(export\s+default\s+)(.+?)(;?\s*$)/s);
341
- if (exportMatch) {
342
- content = content.replace(
343
- exportMatch[0],
344
- `${exportMatch[1]}[\n ...paceCoreConfig,\n ${exportMatch[2]}\n];`
345
- );
346
- }
347
- }
348
- } else {
349
- // CommonJS format
350
- if (!content.includes('require(\'@jmruthers/pace-core/eslint-config\')')) {
351
- // Add require at top (after other requires if they exist)
352
- const requireLines = content.match(/^(const\s+\w+\s*=\s*require\([^)]+\);\s*\n)+/m);
353
- if (requireLines) {
354
- content = content.replace(
355
- requireLines[0],
356
- `${requireLines[0]}const paceCoreConfig = require('@jmruthers/pace-core/eslint-config');\n`
357
- );
358
- } else {
359
- content = `const paceCoreConfig = require('@jmruthers/pace-core/eslint-config');\n${content}`;
360
- }
361
- }
362
-
363
- // Add to module.exports
364
- if (content.includes('module.exports = [')) {
365
- // Already an array, add paceCoreConfig at the beginning
366
- if (!content.includes('...paceCoreConfig')) {
367
- content = content.replace(
368
- /(module\.exports\s*=\s*\[)\s*/,
369
- '$1\n ...paceCoreConfig,'
370
- );
371
- }
372
- } else if (content.includes('module.exports =')) {
373
- // Not an array, wrap it
374
- const exportMatch = content.match(/(module\.exports\s*=\s*)(.+?)(;?\s*$)/s);
375
- if (exportMatch) {
376
- content = content.replace(
377
- exportMatch[0],
378
- `${exportMatch[1]}[\n ...paceCoreConfig,\n ${exportMatch[2]}\n];`
379
- );
380
- }
381
- }
382
- }
383
-
384
- // Write updated config
385
- fs.writeFileSync(existingConfig.path, content, 'utf8');
386
- console.log(`${colors.green}✓${colors.reset} Updated ${existingConfig.name}`);
387
- return { action: 'updated', file: existingConfig.name, backup: backupPath, format };
388
- } else {
389
- // Create new ESLint config (default to ES modules)
390
- const configPath = path.join(cwd, 'eslint.config.js');
391
- const configContent = `import paceCoreConfig from '@jmruthers/pace-core/eslint-config';
392
-
393
- export default [
394
- ...paceCoreConfig,
395
- // Your app-specific ESLint configuration
396
- {
397
- // Add your rules here
398
- },
399
- ];
400
- `;
401
-
402
- console.log(`${colors.cyan}No ESLint config found. Creating eslint.config.js...${colors.reset}`);
403
- fs.writeFileSync(configPath, configContent, 'utf8');
404
- console.log(`${colors.green}✓${colors.reset} Created eslint.config.js`);
405
- console.log(`${colors.cyan} Edit eslint.config.js to add your app-specific ESLint rules.${colors.reset}`);
406
- return { action: 'created', file: 'eslint.config.js', format: 'ES Module' };
407
- }
408
- }
409
221
 
410
222
  // Main execution
411
223
  function main() {
412
224
  const force = process.argv.includes('--force');
413
- const skipCursor = process.argv.includes('--skip-cursor');
414
- const skipESLint = process.argv.includes('--skip-eslint');
415
225
 
416
226
  if (force) {
417
227
  console.log(`${colors.yellow}Warning: --force flag is set. This will overwrite existing configurations.${colors.reset}\n`);
418
228
  }
419
229
 
420
230
  try {
421
- let cursorResult = null;
422
- let eslintResult = null;
423
-
424
- // Install cursor rules
425
- if (!skipCursor) {
426
- installCursorRules(force);
427
- cursorResult = { completed: true };
428
- } else {
429
- console.log(`${colors.blue}Skipping cursor rules installation (--skip-cursor)${colors.reset}\n`);
430
- }
431
-
432
- // Setup ESLint config
433
- if (!skipESLint) {
434
- console.log(`\n${colors.cyan}Setting up ESLint configuration...${colors.reset}\n`);
435
- eslintResult = setupESLintConfig(force, true);
436
-
437
- // Output is handled in setupESLintConfig, but ensure we have consistent formatting
438
- } else {
439
- console.log(`\n${colors.blue}Skipping ESLint setup (--skip-eslint)${colors.reset}`);
440
- }
441
-
442
- // Summary
443
- console.log(`\n${colors.bold}Setup Summary:${colors.reset}`);
444
- if (cursorResult) {
445
- console.log(` ${colors.green}Cursor Rules:${colors.reset} Installed`);
446
- }
447
- if (eslintResult) {
448
- if (eslintResult.action === 'created') {
449
- console.log(` ${colors.green}ESLint Config:${colors.reset} Created ${eslintResult.file} (${eslintResult.format})`);
450
- } else if (eslintResult.action === 'updated') {
451
- console.log(` ${colors.green}ESLint Config:${colors.reset} Updated ${eslintResult.file} (${eslintResult.format})`);
452
- console.log(` ${colors.yellow}Backup:${colors.reset} ${path.basename(eslintResult.backup)}`);
453
- } else {
454
- console.log(` ${colors.blue}ESLint Config:${colors.reset} Already configured (${eslintResult.file}, ${eslintResult.format})`);
455
- }
456
- }
231
+ installCursorRules(force);
457
232
 
458
233
  console.log(`\n${colors.cyan}Next steps:${colors.reset}`);
459
- if (!skipCursor) {
460
- console.log(` • Restart Cursor to load the new rules`);
461
- }
462
- if (!skipESLint) {
463
- console.log(` • Run ${colors.bold}npm run lint${colors.reset} to verify ESLint is working`);
464
- console.log(` • Edit your ESLint config to add app-specific rules`);
465
- }
234
+ console.log(` • Restart Cursor to load the new rules`);
235
+ console.log(` • For ESLint setup, run: ${colors.bold}node node_modules/@jmruthers/pace-core/scripts/install-eslint-config.cjs${colors.reset}`);
466
236
 
467
237
  } catch (error) {
468
238
  console.error(`${colors.red}Error during setup:${colors.reset}`);
@@ -481,7 +251,5 @@ if (require.main === module) {
481
251
 
482
252
  module.exports = {
483
253
  installCursorRules,
484
- getCursorRulesTarget,
485
- setupESLintConfig,
486
- findESLintConfig
254
+ getCursorRulesTarget
487
255
  };