@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.
- package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +12 -13
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
- package/cursor-rules/02-project-structure.mdc +37 -5
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
- package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +26 -16
- package/dist/{chunk-FENMYN2U.js → chunk-5X4QLXRG.js} +1 -3
- package/dist/{chunk-4T7OBVTU.js → chunk-6F3IILHI.js} +1 -1
- package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
- package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
- package/dist/{chunk-7TYHROIV.js → chunk-BM4CQ5P3.js} +50 -8
- package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
- package/dist/{chunk-OHIK3MIO.js → chunk-GHYHJTYV.js} +2 -2
- package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
- package/dist/{chunk-LAZMKTTF.js → chunk-JGWDVX64.js} +281 -347
- package/dist/{chunk-MAGBIDNS.js → chunk-L4XMVJKY.js} +2 -2
- package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
- package/dist/{chunk-ZS5VO5JB.js → chunk-Q7Q7V5NV.js} +406 -451
- package/dist/{chunk-3O3WHILE.js → chunk-VBCS3DUA.js} +236 -60
- package/dist/{chunk-BVP2BCJF.js → chunk-ZKAWKYT4.js} +8 -8
- package/dist/components.d.ts +5 -4
- package/dist/components.js +27 -32
- package/dist/eslint-rules/index.cjs +22 -9
- package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +26 -10
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +18 -17
- package/dist/rbac/index.js +6 -6
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +1 -1
- package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
- package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +8 -8
- package/docs/README.md +1 -1
- package/docs/api/modules.md +47 -31
- package/docs/api-reference/components.md +18 -20
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +1 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/README.md +5 -5
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -1
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +204 -185
- package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
- package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +203 -104
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/eslint-config-pace-core.cjs +21 -10
- package/package.json +6 -5
- package/scripts/install-cursor-rules.cjs +11 -243
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +10 -10
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +137 -153
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
- package/src/components/DataTable/components/EditableRow.tsx +5 -7
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/types.ts +0 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +7 -8
- package/src/components/Dialog/Dialog.test.tsx +1 -0
- package/src/components/Dialog/Dialog.tsx +25 -8
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +86 -77
- package/src/components/Select/types.ts +3 -0
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/public/usePublicEvent.ts +5 -5
- package/src/hooks/public/usePublicEventLogo.ts +5 -5
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +2 -2
- package/src/hooks/useEventTheme.test.ts +7 -7
- package/src/hooks/useEventTheme.ts +1 -4
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/storage/README.md +1 -1
- package/cursor-rules/01-standards-compliance.mdc +0 -285
- package/cursor-rules/04-testing-standards.mdc +0 -270
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
- package/cursor-rules/06-code-quality.mdc +0 -311
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
- package/cursor-rules/10-error-handling-patterns.mdc +0 -179
- package/cursor-rules/11-performance-optimization.mdc +0 -169
- package/cursor-rules/12-ci-cd-integration.mdc +0 -150
- package/dist/DataTable-LRJL4IRV.js +0 -15
- package/dist/eslint-rules/rules/compliance.cjs +0 -348
- package/dist/eslint-rules/rules/components.cjs +0 -113
- package/dist/eslint-rules/rules/imports.cjs +0 -102
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -604
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-standards-compliance.md +0 -188
- package/docs/standards/03-solid-principles.md +0 -39
- package/docs/standards/04-testing-standards.md +0 -36
- package/docs/standards/05-bug-reports-and-features.md +0 -27
- package/docs/standards/06-code-quality.md +0 -34
- package/docs/standards/07-tech-stack-compliance.md +0 -30
- package/docs/standards/10-error-handling-patterns.md +0 -401
- package/docs/standards/11-performance-optimization.md +0 -348
- package/docs/standards/12-ci-cd-integration.md +0 -370
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
- package/scripts/audit/audit-compliance.cjs +0 -1295
- package/scripts/audit/audit-components.cjs +0 -260
- package/scripts/audit/audit-rbac.cjs +0 -954
- package/scripts/audit/audit-standards.cjs +0 -1268
- package/scripts/audit/index.cjs +0 -1927
- package/src/components/DataTable/components/DataTableBody.tsx +0 -478
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/index.cjs +0 -22
- package/src/eslint-rules/rules/components.cjs +0 -113
- package/src/eslint-rules/rules/imports.cjs +0 -102
- package/src/eslint-rules/rules/rbac.cjs +0 -790
- package/src/eslint-rules/utils/helpers.cjs +0 -42
- 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
|
-
|