@jmruthers/pace-core 0.6.6 → 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 (246) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +12 -13
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +255 -0
  4. package/audit-tool/audits/03-architecture.cjs +196 -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 +544 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +301 -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 +291 -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 +241 -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-7PMH7XN7.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-DlsCaR5v.d.ts} +26 -16
  28. package/dist/{chunk-FENMYN2U.js → chunk-5X4QLXRG.js} +1 -3
  29. package/dist/{chunk-4T7OBVTU.js → chunk-6F3IILHI.js} +1 -1
  30. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  31. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  32. package/dist/{chunk-7TYHROIV.js → chunk-BM4CQ5P3.js} +50 -8
  33. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  34. package/dist/{chunk-OHIK3MIO.js → chunk-GHYHJTYV.js} +2 -2
  35. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  36. package/dist/{chunk-LAZMKTTF.js → chunk-JGWDVX64.js} +281 -347
  37. package/dist/{chunk-MAGBIDNS.js → chunk-L4XMVJKY.js} +2 -2
  38. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  39. package/dist/{chunk-ZS5VO5JB.js → chunk-Q7Q7V5NV.js} +406 -451
  40. package/dist/{chunk-3O3WHILE.js → chunk-VBCS3DUA.js} +236 -60
  41. package/dist/{chunk-BVP2BCJF.js → chunk-ZKAWKYT4.js} +8 -8
  42. package/dist/components.d.ts +5 -4
  43. package/dist/components.js +27 -32
  44. package/dist/eslint-rules/index.cjs +22 -9
  45. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  46. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  47. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  48. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +26 -10
  49. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  50. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  51. package/dist/hooks.d.ts +5 -5
  52. package/dist/hooks.js +6 -6
  53. package/dist/index.d.ts +6 -6
  54. package/dist/index.js +18 -17
  55. package/dist/rbac/index.js +6 -6
  56. package/dist/theming/runtime.d.ts +14 -1
  57. package/dist/theming/runtime.js +1 -1
  58. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  59. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  60. package/dist/utils.d.ts +2 -2
  61. package/dist/utils.js +8 -8
  62. package/docs/README.md +1 -1
  63. package/docs/api/modules.md +47 -31
  64. package/docs/api-reference/components.md +18 -20
  65. package/docs/api-reference/hooks.md +80 -80
  66. package/docs/api-reference/types.md +1 -1
  67. package/docs/api-reference/utilities.md +1 -1
  68. package/docs/architecture/README.md +1 -1
  69. package/docs/core-concepts/events.md +3 -3
  70. package/docs/core-concepts/organisations.md +6 -6
  71. package/docs/core-concepts/permissions.md +6 -6
  72. package/docs/documentation-index.md +12 -18
  73. package/docs/getting-started/documentation-index.md +1 -1
  74. package/docs/getting-started/examples/README.md +4 -4
  75. package/docs/getting-started/examples/full-featured-app.md +1 -1
  76. package/docs/getting-started/faq.md +2 -2
  77. package/docs/getting-started/quick-reference.md +4 -4
  78. package/docs/implementation-guides/authentication.md +15 -15
  79. package/docs/implementation-guides/component-styling.md +1 -1
  80. package/docs/implementation-guides/data-tables.md +126 -33
  81. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  82. package/docs/implementation-guides/dynamic-colors.md +3 -3
  83. package/docs/implementation-guides/file-upload-storage.md +2 -2
  84. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  85. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  86. package/docs/implementation-guides/large-datasets.md +3 -2
  87. package/docs/implementation-guides/organisation-security.md +2 -2
  88. package/docs/implementation-guides/performance.md +2 -2
  89. package/docs/implementation-guides/permission-enforcement.md +1 -1
  90. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  91. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  92. package/docs/rbac/README.md +5 -5
  93. package/docs/rbac/advanced-patterns.md +6 -6
  94. package/docs/rbac/api-reference.md +20 -20
  95. package/docs/rbac/event-based-apps.md +3 -3
  96. package/docs/rbac/examples.md +41 -41
  97. package/docs/rbac/getting-started.md +37 -37
  98. package/docs/rbac/performance.md +1 -1
  99. package/docs/rbac/quick-start.md +52 -52
  100. package/docs/rbac/secure-client-protection.md +1 -1
  101. package/docs/rbac/troubleshooting.md +1 -1
  102. package/docs/security/README.md +5 -5
  103. package/docs/standards/0-standards-overview.md +220 -0
  104. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +204 -185
  105. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  106. package/docs/standards/3-architecture-standards.md +606 -0
  107. package/docs/standards/4-code-quality-standards.md +728 -0
  108. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  109. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  110. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  111. package/docs/standards/8-testing-documentation-standards.md +401 -0
  112. package/docs/standards/9-operations-standards.md +1102 -0
  113. package/docs/standards/README.md +203 -104
  114. package/docs/troubleshooting/README.md +4 -4
  115. package/docs/troubleshooting/common-issues.md +2 -2
  116. package/docs/troubleshooting/debugging.md +9 -9
  117. package/docs/troubleshooting/migration.md +4 -4
  118. package/eslint-config-pace-core.cjs +21 -10
  119. package/package.json +6 -5
  120. package/scripts/install-cursor-rules.cjs +11 -243
  121. package/scripts/install-eslint-config.cjs +284 -0
  122. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  123. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  124. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +10 -10
  125. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  126. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  127. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  128. package/src/__tests__/templates/component.test.template.tsx +18 -15
  129. package/src/components/Calendar/Calendar.tsx +201 -47
  130. package/src/components/ContextSelector/ContextSelector.tsx +137 -153
  131. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  132. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  133. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  134. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  135. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  136. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  137. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  138. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  139. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  140. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  141. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  142. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  143. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  144. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  145. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  146. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  147. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  148. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  149. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  150. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  151. package/src/components/DataTable/components/index.ts +2 -1
  152. package/src/components/DataTable/types.ts +0 -18
  153. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  154. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  155. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  156. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  157. package/src/components/Dialog/Dialog.test.tsx +1 -0
  158. package/src/components/Dialog/Dialog.tsx +25 -8
  159. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  160. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  161. package/src/components/FileUpload/FileUpload.tsx +112 -130
  162. package/src/components/Progress/Progress.tsx +2 -4
  163. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  164. package/src/components/Select/Select.tsx +86 -77
  165. package/src/components/Select/types.ts +3 -0
  166. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  167. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  168. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  169. package/src/hooks/public/usePublicEvent.ts +5 -5
  170. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  171. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  172. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  173. package/src/hooks/useAppConfig.ts +2 -2
  174. package/src/hooks/useEventTheme.test.ts +7 -7
  175. package/src/hooks/useEventTheme.ts +1 -4
  176. package/src/hooks/useFileDisplay.ts +2 -2
  177. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  178. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  179. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  180. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  181. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  182. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  183. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  184. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  185. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  186. package/src/styles/core.css +7 -0
  187. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  188. package/src/theming/parseEventColours.ts +22 -10
  189. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  190. package/src/utils/storage/README.md +1 -1
  191. package/cursor-rules/01-standards-compliance.mdc +0 -285
  192. package/cursor-rules/04-testing-standards.mdc +0 -270
  193. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  194. package/cursor-rules/06-code-quality.mdc +0 -311
  195. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  196. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  197. package/cursor-rules/11-performance-optimization.mdc +0 -169
  198. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  199. package/dist/DataTable-LRJL4IRV.js +0 -15
  200. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  201. package/dist/eslint-rules/rules/components.cjs +0 -113
  202. package/dist/eslint-rules/rules/imports.cjs +0 -102
  203. package/docs/best-practices/README.md +0 -472
  204. package/docs/best-practices/accessibility.md +0 -604
  205. package/docs/best-practices/common-patterns.md +0 -516
  206. package/docs/best-practices/deployment.md +0 -1103
  207. package/docs/best-practices/performance.md +0 -1328
  208. package/docs/best-practices/security.md +0 -940
  209. package/docs/best-practices/testing.md +0 -1034
  210. package/docs/rbac/compliance/compliance-guide.md +0 -544
  211. package/docs/standards/01-standards-compliance.md +0 -188
  212. package/docs/standards/03-solid-principles.md +0 -39
  213. package/docs/standards/04-testing-standards.md +0 -36
  214. package/docs/standards/05-bug-reports-and-features.md +0 -27
  215. package/docs/standards/06-code-quality.md +0 -34
  216. package/docs/standards/07-tech-stack-compliance.md +0 -30
  217. package/docs/standards/10-error-handling-patterns.md +0 -401
  218. package/docs/standards/11-performance-optimization.md +0 -348
  219. package/docs/standards/12-ci-cd-integration.md +0 -370
  220. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  221. package/scripts/audit/audit-compliance.cjs +0 -1295
  222. package/scripts/audit/audit-components.cjs +0 -260
  223. package/scripts/audit/audit-rbac.cjs +0 -954
  224. package/scripts/audit/audit-standards.cjs +0 -1268
  225. package/scripts/audit/index.cjs +0 -1927
  226. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  227. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  228. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  229. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  230. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  231. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  232. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  233. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  234. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  235. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  236. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  237. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  238. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  239. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  240. package/src/components/DataTable/utils/debugTools.ts +0 -514
  241. package/src/eslint-rules/index.cjs +0 -22
  242. package/src/eslint-rules/rules/components.cjs +0 -113
  243. package/src/eslint-rules/rules/imports.cjs +0 -102
  244. package/src/eslint-rules/rules/rbac.cjs +0 -790
  245. package/src/eslint-rules/utils/helpers.cjs +0 -42
  246. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -1,260 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Component Usage Audit Script
5
- *
6
- * MIGRATED TO ESLINT: All component usage checks have been migrated to ESLint rules:
7
- * - Plain <form> tags → ESLint: prefer-pace-core-form
8
- * - Direct react-hook-form usage → ESLint: prefer-pace-core-form
9
- *
10
- * This file is kept for reference but is no longer actively used.
11
- * Use ESLint rules for real-time feedback during development.
12
- *
13
- * Usage:
14
- * const { runComponentAudit } = require('./audit-components.cjs');
15
- * const issues = runComponentAudit(consumingAppPath);
16
- */
17
-
18
- const fs = require('fs');
19
- const path = require('path');
20
-
21
- /**
22
- * Recursively find all TypeScript/JavaScript files in a directory
23
- */
24
- function findSourceFiles(dir, fileList = []) {
25
- const files = fs.readdirSync(dir);
26
-
27
- files.forEach(file => {
28
- const filePath = path.join(dir, file);
29
- const stat = fs.statSync(filePath);
30
-
31
- if (stat.isDirectory()) {
32
- // Skip node_modules, dist, build, .git, etc.
33
- if (!['node_modules', 'dist', 'build', '.git', '.next', '.vite', 'coverage'].includes(file)) {
34
- findSourceFiles(filePath, fileList);
35
- }
36
- } else if (/\.(ts|tsx|js|jsx)$/.test(file)) {
37
- fileList.push(filePath);
38
- }
39
- });
40
-
41
- return fileList;
42
- }
43
-
44
- /**
45
- * Get line number from index in content
46
- */
47
- function getLineNumber(content, index) {
48
- return content.substring(0, index).split('\n').length;
49
- }
50
-
51
- /**
52
- * Check if a file imports Form from pace-core
53
- */
54
- function importsPaceCoreForm(content) {
55
- // Check for imports like:
56
- // import { Form } from '@jmruthers/pace-core
57
- // import { Form } from '@jmruthers/pace-core/components'
58
- // import Form from '@jmruthers/pace-core'
59
- const paceCoreFormPattern = /from\s+['"]@jmruthers\/pace-core(?:\/components)?['"].*Form|import\s+.*Form.*from\s+['"]@jmruthers\/pace-core/;
60
- return paceCoreFormPattern.test(content);
61
- }
62
-
63
- /**
64
- * Check for plain <form> tags in JSX
65
- *
66
- * MIGRATED TO ESLINT: This check is now handled by 'prefer-pace-core-form' ESLint rule.
67
- * Kept for reference only.
68
- */
69
- function checkPlainFormTags_MIGRATED_TO_ESLINT(content, filePath, consumingAppPath) {
70
- const issues = [];
71
-
72
- // Pattern to match <form> tags (but not <Form> component)
73
- // This regex looks for <form followed by whitespace or attributes, but not <Form
74
- const formTagPattern = /<form(\s|>)/g;
75
- let match;
76
-
77
- while ((match = formTagPattern.exec(content)) !== null) {
78
- // Check if this is actually a Form component (capital F)
79
- const beforeMatch = content.substring(Math.max(0, match.index - 10), match.index);
80
- const afterMatch = content.substring(match.index, match.index + 20);
81
-
82
- // Skip if it's a comment or string literal
83
- const beforeContext = content.substring(0, match.index);
84
- const lastComment = beforeContext.lastIndexOf('//');
85
- const lastNewline = beforeContext.lastIndexOf('\n');
86
- const isInComment = lastComment > lastNewline && !beforeContext.substring(lastComment, match.index).includes('\n');
87
-
88
- if (isInComment) continue;
89
-
90
- // Check if it's inside a string literal
91
- const beforeQuote = beforeContext.lastIndexOf('"');
92
- const afterQuote = content.indexOf('"', match.index);
93
- const isInString = beforeQuote > lastNewline && afterQuote > match.index && beforeQuote < match.index;
94
-
95
- if (isInString) continue;
96
-
97
- // This is a plain <form> tag
98
- // Get relative path from consuming app root
99
- const relativePath = path.relative(consumingAppPath || process.cwd(), filePath);
100
-
101
- issues.push({
102
- type: 'plainFormTag',
103
- file: relativePath,
104
- line: getLineNumber(content, match.index),
105
- message: 'Plain <form> tag detected. Use pace-core Form component instead.',
106
- code: content.substring(Math.max(0, match.index - 30), Math.min(content.length, match.index + 50)).trim(),
107
- });
108
- }
109
-
110
- return issues;
111
- }
112
-
113
- /**
114
- * Check for direct react-hook-form imports and usage
115
- *
116
- * MIGRATED TO ESLINT: This check is now handled by 'prefer-pace-core-form' ESLint rule.
117
- * Kept for reference only.
118
- */
119
- function checkReactHookFormUsage_MIGRATED_TO_ESLINT(content, filePath, consumingAppPath) {
120
- const issues = [];
121
-
122
- // Pattern to match imports from react-hook-form
123
- const importPattern = /from\s+['"]react-hook-form['"]/g;
124
- let match;
125
-
126
- while ((match = importPattern.exec(content)) !== null) {
127
- // Get the import statement
128
- const lineStart = content.lastIndexOf('\n', match.index) + 1;
129
- const lineEnd = content.indexOf('\n', match.index);
130
- const importLine = content.substring(lineStart, lineEnd === -1 ? content.length : lineEnd);
131
-
132
- // Check if this file also imports Form from pace-core
133
- // If it does, this might be acceptable (e.g., using useFormContext within Form)
134
- const hasPaceCoreForm = importsPaceCoreForm(content);
135
-
136
- // Extract what's being imported
137
- const importMatch = importLine.match(/import\s+(?:{([^}]+)}|(\w+))\s+from/);
138
- if (importMatch) {
139
- const importedItems = importMatch[1] || importMatch[2] || '';
140
- const items = importedItems.split(',').map(item => item.trim().split(' as ')[0].trim());
141
-
142
- // Check for problematic imports
143
- const problematicImports = [
144
- 'useForm',
145
- 'FormProvider',
146
- 'Controller',
147
- 'useFormContext',
148
- 'useWatch',
149
- 'useFieldArray',
150
- 'useController',
151
- ];
152
-
153
- const foundProblematic = items.filter(item => problematicImports.includes(item));
154
-
155
- if (foundProblematic.length > 0) {
156
- // If they're using useFormContext within a pace-core Form, that's acceptable
157
- // But if they're using useForm or FormProvider, that's not acceptable
158
- const isAcceptable = hasPaceCoreForm &&
159
- foundProblematic.length === 1 &&
160
- foundProblematic[0] === 'useFormContext';
161
-
162
- if (!isAcceptable) {
163
- // Get relative path from consuming app root
164
- const relativePath = path.relative(consumingAppPath || process.cwd(), filePath);
165
-
166
- issues.push({
167
- type: 'reactHookFormImport',
168
- file: relativePath,
169
- line: getLineNumber(content, match.index),
170
- message: `Direct import from 'react-hook-form' detected: ${foundProblematic.join(', ')}. Use pace-core Form component instead.`,
171
- code: importLine.trim(),
172
- imports: foundProblematic,
173
- });
174
- }
175
- }
176
- }
177
- }
178
-
179
- return issues;
180
- }
181
-
182
- /**
183
- * Main audit function - scans source files for component usage issues
184
- */
185
- function runComponentAudit(consumingAppPath = process.cwd()) {
186
- const srcPath = path.join(consumingAppPath, 'src');
187
-
188
- // If src directory doesn't exist, try root directory
189
- const searchPath = fs.existsSync(srcPath) ? srcPath : consumingAppPath;
190
-
191
- if (!fs.existsSync(searchPath)) {
192
- return {
193
- error: `Source directory not found at ${searchPath}`,
194
- issues: { formIssues: [] },
195
- };
196
- }
197
-
198
- // Find all source files
199
- const sourceFiles = findSourceFiles(searchPath);
200
-
201
- if (sourceFiles.length === 0) {
202
- return {
203
- error: `No source files found in ${searchPath}`,
204
- issues: { formIssues: [] },
205
- };
206
- }
207
-
208
- const issues = {
209
- formIssues: [],
210
- };
211
-
212
- // NOTE: All component checks have been migrated to ESLint rules.
213
- // This function now returns empty results as checks are handled by ESLint.
214
- // Kept for API compatibility.
215
- sourceFiles.forEach(filePath => {
216
- // No checks performed - all migrated to ESLint
217
- // (checkPlainFormTags and checkReactHookFormUsage are now ESLint rules)
218
- });
219
-
220
- return {
221
- issues,
222
- };
223
- }
224
-
225
- // Export for use by other scripts
226
- if (typeof module !== 'undefined' && module.exports) {
227
- module.exports = { runComponentAudit };
228
- }
229
-
230
- // If run directly, output results
231
- if (require.main === module) {
232
- const consumingAppPath = process.argv[2] || process.cwd();
233
- const result = runComponentAudit(consumingAppPath);
234
-
235
- if (result.error) {
236
- console.error(`Error: ${result.error}`);
237
- process.exit(1);
238
- }
239
-
240
- const { issues } = result;
241
-
242
- if (issues.formIssues.length === 0) {
243
- console.log('✅ No form usage issues found!');
244
- process.exit(0);
245
- }
246
-
247
- console.log(`\n❌ Found ${issues.formIssues.length} form usage issue(s):\n`);
248
-
249
- issues.formIssues.forEach(issue => {
250
- console.log(`${issue.file}:${issue.line}`);
251
- console.log(` ${issue.message}`);
252
- if (issue.code) {
253
- console.log(` Code: ${issue.code.substring(0, 80)}...`);
254
- }
255
- console.log();
256
- });
257
-
258
- process.exit(1);
259
- }
260
-