@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.
- package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +240 -0
- package/audit-tool/audits/03-architecture.cjs +224 -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 +554 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +355 -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 +295 -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 +380 -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-6RMSCQJ6.js +15 -0
- package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
- package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
- package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
- package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
- package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
- package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
- package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
- package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
- package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
- package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
- package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
- package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
- package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
- package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
- package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
- package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
- package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
- package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
- package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
- package/dist/components.d.ts +5 -4
- package/dist/components.js +29 -34
- 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 +346 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +8 -8
- package/dist/index.d.ts +7 -7
- package/dist/index.js +21 -20
- package/dist/providers.js +2 -2
- package/dist/rbac/index.d.ts +1 -1
- package/dist/rbac/index.js +8 -8
- package/dist/theming/runtime.d.ts +61 -1
- package/dist/theming/runtime.js +1 -1
- package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
- package/dist/types.d.ts +2 -2
- 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 +106 -41
- 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/dependencies.md +23 -0
- 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/app-layout.md +1 -1
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +127 -34
- 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} +241 -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 +50 -20
- package/package.json +50 -19
- package/scripts/eslint-audit.cjs +123 -0
- package/scripts/install-cursor-rules.cjs +11 -243
- package/scripts/install-eslint-config.cjs +349 -0
- package/scripts/validate-dependencies.cjs +248 -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 +30 -18
- 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 +10 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/AddressField/AddressField.tsx +26 -1
- package/src/components/Alert/Alert.test.tsx +86 -22
- package/src/components/Alert/Alert.tsx +19 -11
- package/src/components/Badge/Badge.tsx +1 -1
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/Checkbox/Checkbox.test.tsx +2 -1
- package/src/components/ContextSelector/ContextSelector.tsx +108 -126
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/DataTable.tsx +1 -19
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
- 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 +11 -10
- 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 +45 -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 +1 -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 +45 -16
- package/src/components/FileUpload/FileUpload.tsx +141 -130
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
- package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
- 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__/useDataTablePerformance.unit.test.ts +8 -5
- package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
- package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
- 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 +13 -9
- package/src/hooks/useAddressAutocomplete.test.ts +18 -18
- package/src/hooks/useAppConfig.ts +2 -2
- package/src/hooks/useEventTheme.test.ts +7 -7
- package/src/hooks/useEventTheme.ts +2 -1
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/hooks/useFileUrl.ts +52 -8
- package/src/hooks/useOrganisationSecurity.test.ts +2 -1
- 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 +38 -38
- 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/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
- package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
- package/src/rbac/api.test.ts +104 -0
- package/src/rbac/engine.ts +1 -1
- package/src/rbac/hooks/useCan.test.ts +2 -2
- package/src/rbac/secureClient.ts +1 -1
- package/src/rbac/types/functions.ts +1 -1
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +118 -3
- package/src/theming/parseEventColours.ts +77 -11
- package/src/types/supabase.ts +2 -3
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
- package/src/utils/formatting/formatDate.test.ts +3 -2
- package/src/utils/formatting/formatDateTime.test.ts +2 -2
- package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
- package/src/utils/storage/README.md +1 -1
- package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
- package/src/utils/storage/helpers.test.ts +69 -3
- 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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jmruthers/pace-core",
|
|
3
|
-
"version": "0.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.
|
|
222
|
+
"react": "^19.2.3",
|
|
221
223
|
"react-day-picker": "^9.0.0",
|
|
222
|
-
"react-dom": "^19.
|
|
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.
|
|
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.
|
|
232
|
-
"@testing-library/user-event": "^14.
|
|
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.
|
|
235
|
-
"@types/react-dom": "^19.
|
|
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": "^
|
|
238
|
-
"@vitest/coverage-v8": "^
|
|
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.
|
|
246
|
-
"typedoc": "^0.
|
|
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.
|
|
280
|
+
"typescript": "^5.9.3",
|
|
250
281
|
"typescript-eslint": "^8.39.0",
|
|
251
|
-
"vite": "^
|
|
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
|
|
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
|
|
9
|
-
*
|
|
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
|
|
16
|
-
* node install-cursor-rules.cjs --
|
|
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
|
-
|
|
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
|
-
|
|
460
|
-
|
|
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
|
};
|