@jmruthers/pace-core 0.5.193 → 0.6.1
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/CHANGELOG.md +29 -0
- package/README.md +7 -1
- package/cursor-rules/00-pace-core-compliance.mdc +372 -0
- package/cursor-rules/01-standards-compliance.mdc +275 -0
- package/cursor-rules/02-project-structure.mdc +200 -0
- package/cursor-rules/03-solid-principles.mdc +341 -0
- package/cursor-rules/04-testing-standards.mdc +315 -0
- package/cursor-rules/05-bug-reports-and-features.mdc +246 -0
- package/cursor-rules/06-code-quality.mdc +392 -0
- package/cursor-rules/07-tech-stack-compliance.mdc +309 -0
- package/cursor-rules/CHANGELOG.md +101 -0
- package/cursor-rules/README.md +191 -0
- package/dist/{DataTable-Be6dH_dR.d.ts → DataTable-CH1U5Tpy.d.ts} +1 -1
- package/dist/{DataTable-5FU7IESH.js → DataTable-DQ7RSOHE.js} +6 -6
- package/dist/{PublicPageProvider-C0Sm_e5k.d.ts → PublicPageProvider-ce4xlHYA.d.ts} +34 -155
- package/dist/{UnifiedAuthProvider-RGJTDE2C.js → UnifiedAuthProvider-ATAP5UTR.js} +2 -2
- package/dist/{chunk-6C4YBBJM 5.js → chunk-3QRJFVBR.js} +1 -1
- package/dist/chunk-3QRJFVBR.js.map +1 -0
- package/dist/{chunk-IIELH4DL.js → chunk-3XTALGJF.js} +2 -2
- package/dist/{chunk-IIELH4DL.js.map → chunk-3XTALGJF.js.map} +1 -1
- package/dist/{chunk-HWIIPPNI.js → chunk-4N5C5XZU.js} +20 -20
- package/dist/chunk-4N5C5XZU.js.map +1 -0
- package/dist/{chunk-7EQTDTTJ.js → chunk-4ZC4GX36.js} +5 -5
- package/dist/{chunk-7EQTDTTJ.js 2.map → chunk-4ZC4GX36.js.map} +1 -1
- package/dist/{chunk-7FLMSG37.js → chunk-BYFSK72L.js} +22 -22
- package/dist/chunk-BYFSK72L.js.map +1 -0
- package/dist/{chunk-LFNCN2SP.js → chunk-EXUD6RNJ.js} +46 -7
- package/dist/chunk-EXUD6RNJ.js.map +1 -0
- package/dist/{chunk-NOAYCWCX 5.js → chunk-GLK6VM3F.js} +167 -169
- package/dist/chunk-GLK6VM3F.js.map +1 -0
- package/dist/{chunk-HW3OVDUF.js → chunk-J36DSWQK.js} +1 -1
- package/dist/{chunk-HW3OVDUF.js.map → chunk-J36DSWQK.js.map} +1 -1
- package/dist/{chunk-BC4IJKSL.js → chunk-JBKQ3SAO.js} +2 -2
- package/dist/{chunk-QWWZ5CAQ.js → chunk-LXQLPRQ2.js} +2 -2
- package/dist/{chunk-E3SPN4VZ 5.js → chunk-T33XF5ZC.js} +119 -114
- package/dist/chunk-T33XF5ZC.js.map +1 -0
- package/dist/{chunk-XNXXZ43G.js → chunk-XM25TVIE.js} +27 -4
- package/dist/chunk-XM25TVIE.js.map +1 -0
- package/dist/components.d.ts +3 -3
- package/dist/components.js +8 -8
- package/dist/hooks.d.ts +6 -6
- package/dist/hooks.js +17 -22
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.js +15 -16
- package/dist/index.js.map +1 -1
- package/dist/providers.js +1 -1
- package/dist/rbac/index.d.ts +1 -1
- package/dist/rbac/index.js +5 -5
- package/dist/{usePublicRouteParams-TZe0gy-4.d.ts → usePublicRouteParams-BJAlWfuJ.d.ts} +3 -3
- package/dist/{useToast-C8gR5ir4.d.ts → useToast-AyaT-x7p.d.ts} +2 -2
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +3 -3
- package/docs/getting-started/cursor-rules.md +262 -0
- package/docs/getting-started/installation-guide.md +6 -1
- package/docs/getting-started/quick-start.md +6 -1
- package/docs/migration/MIGRATION_GUIDE.md +4 -4
- package/docs/migration/REACT_19_MIGRATION.md +227 -0
- package/docs/standards/README.md +39 -0
- package/docs/troubleshooting/migration.md +4 -4
- package/examples/PublicPages/PublicEventPage.tsx +1 -1
- package/package.json +11 -6
- package/scripts/audit-consuming-app.cjs +961 -0
- package/scripts/check-pace-core-compliance.cjs +34 -15
- package/scripts/install-cursor-rules.cjs +236 -0
- package/src/__tests__/helpers/test-providers.tsx +1 -1
- package/src/__tests__/helpers/test-utils.tsx +1 -1
- package/src/components/Badge/Badge.tsx +2 -4
- package/src/components/Button/Button.tsx +5 -4
- package/src/components/Calendar/Calendar.tsx +1 -1
- package/src/components/DataTable/DataTable.test.tsx +57 -93
- package/src/components/DataTable/DataTable.tsx +2 -2
- package/src/components/DataTable/__tests__/pagination.modes.test.tsx +13 -5
- package/src/components/DataTable/__tests__/ssr.strict-mode.test.tsx +12 -12
- package/src/components/DataTable/components/AccessDeniedPage.tsx +1 -1
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +1 -1
- package/src/components/DataTable/components/DataTableCore.tsx +4 -7
- package/src/components/DataTable/components/DataTableModals.tsx +1 -1
- package/src/components/DataTable/components/EditableRow.tsx +1 -1
- package/src/components/DataTable/components/UnifiedTableBody.tsx +6 -8
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +23 -23
- package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +11 -11
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +36 -36
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +27 -27
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +39 -39
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +33 -33
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +29 -29
- package/src/components/DataTable/hooks/useColumnReordering.ts +2 -2
- package/src/components/DataTable/hooks/useKeyboardNavigation.ts +2 -2
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +8 -14
- package/src/components/Dialog/Dialog.tsx +6 -5
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +1 -1
- package/src/components/EventSelector/EventSelector.tsx +1 -1
- package/src/components/FileDisplay/FileDisplay.test.tsx +2 -2
- package/src/components/Footer/Footer.tsx +1 -1
- package/src/components/Form/Form.test.tsx +36 -15
- package/src/components/Form/Form.tsx +30 -26
- package/src/components/Header/Header.tsx +1 -1
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +40 -40
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +1 -1
- package/src/components/Input/Input.tsx +28 -30
- package/src/components/Label/Label.tsx +1 -1
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +1 -1
- package/src/components/LoginForm/LoginForm.test.tsx +42 -42
- package/src/components/LoginForm/LoginForm.tsx +8 -8
- package/src/components/NavigationMenu/NavigationMenu.tsx +1 -1
- package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +1 -1
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +50 -50
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +1 -1
- package/src/components/PaceAppLayout/README.md +1 -1
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +1 -1
- package/src/components/PasswordChange/PasswordChangeForm.test.tsx +33 -33
- package/src/components/PasswordChange/PasswordChangeForm.tsx +1 -1
- package/src/components/Progress/Progress.tsx +1 -1
- package/src/components/PublicLayout/PublicPageLayout.tsx +1 -1
- package/src/components/Select/Select.tsx +33 -22
- package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +1 -1
- package/src/components/Table/Table.tsx +1 -1
- package/src/components/Textarea/Textarea.tsx +27 -29
- package/src/components/Toast/Toast.tsx +1 -1
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/UserMenu/UserMenu.tsx +1 -1
- package/src/hooks/__tests__/hooks.integration.test.tsx +80 -55
- package/src/hooks/__tests__/useStorage.unit.test.ts +36 -36
- package/src/hooks/public/usePublicEvent.ts +1 -1
- package/src/hooks/public/usePublicEventLogo.ts +1 -1
- package/src/hooks/public/usePublicRouteParams.ts +1 -1
- package/src/hooks/useDataTableState.ts +8 -18
- package/src/hooks/useFocusManagement.ts +2 -2
- package/src/hooks/useFocusTrap.ts +4 -4
- package/src/hooks/useFormDialog.ts +8 -7
- package/src/hooks/useInactivityTracker.ts +1 -1
- package/src/hooks/usePermissionCache.ts +1 -1
- package/src/hooks/useSecureDataAccess.ts +19 -4
- package/src/hooks/useToast.ts +2 -2
- package/src/providers/__tests__/OrganisationProvider.test.tsx +57 -13
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +21 -6
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +10 -10
- package/src/providers/services/UnifiedAuthProvider.tsx +22 -22
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +13 -3
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +24 -24
- package/src/rbac/components/EnhancedNavigationMenu.tsx +1 -1
- package/src/rbac/components/NavigationGuard.tsx +1 -1
- package/src/rbac/components/NavigationProvider.tsx +1 -1
- package/src/rbac/components/PagePermissionGuard.tsx +1 -1
- package/src/rbac/components/PagePermissionProvider.tsx +1 -1
- package/src/rbac/components/PermissionEnforcer.tsx +1 -1
- package/src/rbac/components/RoleBasedRouter.tsx +1 -1
- package/src/rbac/components/SecureDataProvider.tsx +1 -1
- package/src/rbac/secureClient.ts +12 -0
- package/src/utils/security/secureDataAccess.test.ts +31 -20
- package/src/utils/security/secureDataAccess.ts +4 -3
- package/dist/chunk-6C4YBBJM.js +0 -628
- package/dist/chunk-6C4YBBJM.js.map +0 -1
- package/dist/chunk-7D4SUZUM.js 2.map +0 -1
- package/dist/chunk-7EQTDTTJ.js.map +0 -1
- package/dist/chunk-7FLMSG37.js 2.map +0 -1
- package/dist/chunk-7FLMSG37.js.map +0 -1
- package/dist/chunk-E3SPN4VZ.js +0 -12917
- package/dist/chunk-E3SPN4VZ.js.map +0 -1
- package/dist/chunk-E66EQZE6 5.js +0 -37
- package/dist/chunk-E66EQZE6.js 2.map +0 -1
- package/dist/chunk-HWIIPPNI.js.map +0 -1
- package/dist/chunk-I7PSE6JW 5.js +0 -191
- package/dist/chunk-I7PSE6JW.js 2.map +0 -1
- package/dist/chunk-KNC55RTG.js 5.map +0 -1
- package/dist/chunk-KQCRWDSA.js 5.map +0 -1
- package/dist/chunk-LFNCN2SP.js 2.map +0 -1
- package/dist/chunk-LFNCN2SP.js.map +0 -1
- package/dist/chunk-LMC26NLJ 2.js +0 -84
- package/dist/chunk-NOAYCWCX.js +0 -4993
- package/dist/chunk-NOAYCWCX.js.map +0 -1
- package/dist/chunk-QWWZ5CAQ.js.map +0 -1
- package/dist/chunk-QXHPKYJV 3.js +0 -113
- package/dist/chunk-R77UEZ4E 3.js +0 -68
- package/dist/chunk-VBXEHIUJ.js 6.map +0 -1
- package/dist/chunk-XNXXZ43G.js.map +0 -1
- package/dist/chunk-ZSAAAMVR 6.js +0 -25
- package/dist/components.js 5.map +0 -1
- package/dist/styles/index 2.js +0 -12
- package/dist/styles/index.js 5.map +0 -1
- package/dist/theming/runtime 5.js +0 -19
- package/dist/theming/runtime.js 5.map +0 -1
- /package/dist/{DataTable-5FU7IESH.js.map → DataTable-DQ7RSOHE.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-RGJTDE2C.js.map → UnifiedAuthProvider-ATAP5UTR.js.map} +0 -0
- /package/dist/{chunk-BC4IJKSL.js.map → chunk-JBKQ3SAO.js.map} +0 -0
- /package/dist/{chunk-QWWZ5CAQ.js 3.map → chunk-LXQLPRQ2.js.map} +0 -0
- /package/examples/{rbac → RBAC}/CompleteRBACExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/EventBasedApp.tsx +0 -0
- /package/examples/{rbac → RBAC}/PermissionExample.tsx +0 -0
- /package/examples/{rbac → RBAC}/index.ts +0 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# Cursor Rules Quick Start Guide
|
|
2
|
+
|
|
3
|
+
This guide helps you get started with pace-core cursor rules in your consuming app.
|
|
4
|
+
|
|
5
|
+
## What are Cursor Rules?
|
|
6
|
+
|
|
7
|
+
Cursor rules are `.mdc` (Markdown Cursor) files that guide AI assistants (like Cursor) to follow specific patterns and standards when writing code. pace-core provides a comprehensive set of rules that ensure your app maintains quality, consistency, and compliance with pace-core standards.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
### Step 1: Install pace-core
|
|
12
|
+
|
|
13
|
+
Make sure pace-core is installed in your project:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @jmruthers/pace-core
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Step 2: Install Cursor Rules
|
|
20
|
+
|
|
21
|
+
Run the installation script from your app root:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or add to your `package.json`:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"scripts": {
|
|
32
|
+
"setup:cursor-rules": "node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Then run:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm run setup:cursor-rules
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The script will:
|
|
44
|
+
- Create `.cursor/rules/` directory if it doesn't exist
|
|
45
|
+
- Copy all pace-core rules (00-07) to your project
|
|
46
|
+
- **Automatically update** pace-core rules (00-09) if they've changed
|
|
47
|
+
- Preserve any existing custom rules (50+)
|
|
48
|
+
- Skip files that are already up to date
|
|
49
|
+
|
|
50
|
+
## Quick Start Snippet
|
|
51
|
+
|
|
52
|
+
When working with Cursor, you can explicitly reference rules:
|
|
53
|
+
|
|
54
|
+
> "Use pace-core components and follow rules 00–04."
|
|
55
|
+
|
|
56
|
+
This helps Cursor focus on specific rule sets and ensures consistency.
|
|
57
|
+
|
|
58
|
+
## Rule Files Overview
|
|
59
|
+
|
|
60
|
+
The installed rules are numbered for ordering:
|
|
61
|
+
|
|
62
|
+
- **00-pace-core-compliance.mdc** - Enforce pace-core usage patterns
|
|
63
|
+
- **01-standards-compliance.mdc** - Enforce all pace-core standards
|
|
64
|
+
- **02-project-structure.mdc** - Define standard folder structure
|
|
65
|
+
- **03-solid-principles.mdc** - Enforce SOLID architecture principles
|
|
66
|
+
- **04-testing-standards.mdc** - Enforce testing framework consistency
|
|
67
|
+
- **05-bug-reports-and-features.mdc** - Templates for bug reports (guidance-only)
|
|
68
|
+
- **06-code-quality.mdc** - Enforce code quality standards
|
|
69
|
+
- **07-tech-stack-compliance.mdc** - Enforce tech stack versions and patterns
|
|
70
|
+
|
|
71
|
+
## Using Rules with Cursor
|
|
72
|
+
|
|
73
|
+
### Automatic Loading
|
|
74
|
+
|
|
75
|
+
Cursor automatically loads all `.mdc` files from `.cursor/rules/` when:
|
|
76
|
+
- You open a file that matches the rule's `globs` pattern
|
|
77
|
+
- You ask Cursor to write or modify code
|
|
78
|
+
- Cursor needs context for code generation
|
|
79
|
+
|
|
80
|
+
### Explicit References
|
|
81
|
+
|
|
82
|
+
You can explicitly reference rules in your prompts:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
"Create a new component following rules 00, 01, and 03"
|
|
86
|
+
"Refactor this code to follow SOLID principles (rule 03)"
|
|
87
|
+
"Write tests following rule 04"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Rule Semantics
|
|
91
|
+
|
|
92
|
+
Rules use clear semantics:
|
|
93
|
+
- **MUST** - Hard requirement, non-negotiable
|
|
94
|
+
- **SHOULD** - Strong recommendation, best practice
|
|
95
|
+
- **MAY** - Optional, acceptable alternative
|
|
96
|
+
|
|
97
|
+
## Custom Rules
|
|
98
|
+
|
|
99
|
+
### Creating Your Own Rules
|
|
100
|
+
|
|
101
|
+
Create your own rules in `.cursor/rules/` with numbers starting at `50`:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
.cursor/rules/
|
|
105
|
+
├── 00-pace-core-compliance.mdc # pace-core rule
|
|
106
|
+
├── 01-standards-compliance.mdc # pace-core rule
|
|
107
|
+
├── ...
|
|
108
|
+
├── 50-my-custom-rule.mdc # Your custom rule
|
|
109
|
+
└── 51-another-custom-rule.mdc # Your custom rule
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Rule Format
|
|
113
|
+
|
|
114
|
+
Your custom rules should follow the same format:
|
|
115
|
+
|
|
116
|
+
```markdown
|
|
117
|
+
---
|
|
118
|
+
description: Brief description of your rule
|
|
119
|
+
globs: ["targeted/path/**/*.{ts,tsx}"]
|
|
120
|
+
alwaysApply: true
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
# Your Rule Title
|
|
124
|
+
|
|
125
|
+
Content with examples and guidelines.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Running Audits
|
|
129
|
+
|
|
130
|
+
### Comprehensive Audit
|
|
131
|
+
|
|
132
|
+
Run the comprehensive audit tool to check compliance:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Or add to your `package.json`:
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"scripts": {
|
|
143
|
+
"audit:pace-core": "node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs"
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
This generates a timestamped markdown report in `audit/` directory.
|
|
149
|
+
|
|
150
|
+
### Compliance Check
|
|
151
|
+
|
|
152
|
+
For a quick compliance check:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
node node_modules/@jmruthers/pace-core/scripts/check-pace-core-compliance.cjs
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Updating Rules
|
|
159
|
+
|
|
160
|
+
When pace-core is updated, run the installation script again:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
npm run setup:cursor-rules
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
The script will:
|
|
167
|
+
- **Automatically update** pace-core rules (00-09) if they've changed (version or content differs)
|
|
168
|
+
- Preserve your custom rules (50+)
|
|
169
|
+
- Skip files that are already up to date
|
|
170
|
+
|
|
171
|
+
### Force Update
|
|
172
|
+
|
|
173
|
+
To force update all rules (even when versions match):
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs --force
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Note**: Normally, pace-core rules are automatically updated when they change. The `--force` flag forces an update even when versions match (useful if content changed but version metadata wasn't updated).
|
|
180
|
+
|
|
181
|
+
## Monorepo Setup
|
|
182
|
+
|
|
183
|
+
For monorepos, run the installation script from each app's root directory:
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
monorepo/
|
|
187
|
+
├── apps/
|
|
188
|
+
│ ├── app1/
|
|
189
|
+
│ │ └── .cursor/rules/ # Run script here
|
|
190
|
+
│ └── app2/
|
|
191
|
+
│ └── .cursor/rules/ # Run script here
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Each app maintains its own `.cursor/rules/` directory.
|
|
195
|
+
|
|
196
|
+
## Troubleshooting
|
|
197
|
+
|
|
198
|
+
### Rules Not Loading
|
|
199
|
+
|
|
200
|
+
1. Verify rules are in `.cursor/rules/` directory
|
|
201
|
+
2. Check file extensions are `.mdc`
|
|
202
|
+
3. Restart Cursor if rules were just installed
|
|
203
|
+
4. Check rule frontmatter is valid YAML
|
|
204
|
+
|
|
205
|
+
### Rules Conflicting
|
|
206
|
+
|
|
207
|
+
1. Check rule numbering (pace-core: 00-09, yours: 50+)
|
|
208
|
+
2. Verify `globs` patterns don't overlap unnecessarily
|
|
209
|
+
3. Review rule priorities in frontmatter
|
|
210
|
+
|
|
211
|
+
### Installation Fails
|
|
212
|
+
|
|
213
|
+
1. Check you're in the app root directory
|
|
214
|
+
2. Verify `node_modules/@jmruthers/pace-core/` exists
|
|
215
|
+
3. Check file permissions
|
|
216
|
+
4. Try with `--force` flag if needed
|
|
217
|
+
|
|
218
|
+
## Best Practices
|
|
219
|
+
|
|
220
|
+
1. **Run audits regularly** - Check compliance before major commits
|
|
221
|
+
2. **Update rules** - Keep pace-core rules up to date
|
|
222
|
+
3. **Reference rules explicitly** - Tell Cursor which rules to follow
|
|
223
|
+
4. **Create custom rules** - Add app-specific rules starting at 50
|
|
224
|
+
5. **Review audit reports** - Address issues systematically
|
|
225
|
+
|
|
226
|
+
## Example Workflow
|
|
227
|
+
|
|
228
|
+
1. **Initial Setup:**
|
|
229
|
+
```bash
|
|
230
|
+
npm install @jmruthers/pace-core
|
|
231
|
+
npm run setup:cursor-rules
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
2. **Daily Development:**
|
|
235
|
+
- Cursor automatically uses rules when writing code
|
|
236
|
+
- Explicitly reference rules when needed: "Follow rules 00-04"
|
|
237
|
+
|
|
238
|
+
3. **Before Committing:**
|
|
239
|
+
```bash
|
|
240
|
+
npm run audit:pace-core
|
|
241
|
+
```
|
|
242
|
+
Review the generated report in `audit/` directory
|
|
243
|
+
|
|
244
|
+
4. **After pace-core Updates:**
|
|
245
|
+
```bash
|
|
246
|
+
npm update @jmruthers/pace-core
|
|
247
|
+
npm run setup:cursor-rules
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Related Documentation
|
|
251
|
+
|
|
252
|
+
- [Cursor Rules README](../../cursor-rules/README.md)
|
|
253
|
+
- [pace-core Standards](../standards/README.md)
|
|
254
|
+
- [pace-core Exports](../api-reference/README.md)
|
|
255
|
+
|
|
256
|
+
## Support
|
|
257
|
+
|
|
258
|
+
For issues with cursor rules:
|
|
259
|
+
1. Check this guide
|
|
260
|
+
2. Review rule files for guidance
|
|
261
|
+
3. File an issue in pace-core repository
|
|
262
|
+
4. Check pace-core documentation
|
|
@@ -71,7 +71,12 @@ import path from 'path'
|
|
|
71
71
|
|
|
72
72
|
export default defineConfig({
|
|
73
73
|
plugins: [
|
|
74
|
-
react(
|
|
74
|
+
react({
|
|
75
|
+
// React Compiler for automatic optimizations (React 19+)
|
|
76
|
+
babel: {
|
|
77
|
+
plugins: ['babel-plugin-react-compiler'],
|
|
78
|
+
},
|
|
79
|
+
}),
|
|
75
80
|
tailwindcss({
|
|
76
81
|
// CRITICAL: Include pace-core source files for Tailwind scanning
|
|
77
82
|
content: [
|
|
@@ -57,7 +57,12 @@ import path from 'path';
|
|
|
57
57
|
|
|
58
58
|
export default defineConfig({
|
|
59
59
|
plugins: [
|
|
60
|
-
react(
|
|
60
|
+
react({
|
|
61
|
+
// React Compiler for automatic optimizations (React 19+)
|
|
62
|
+
babel: {
|
|
63
|
+
plugins: ['babel-plugin-react-compiler'],
|
|
64
|
+
},
|
|
65
|
+
}),
|
|
61
66
|
tailwindcss({
|
|
62
67
|
content: [
|
|
63
68
|
'./src/**/*.{js,ts,jsx,tsx}',
|
|
@@ -933,8 +933,8 @@ export default defineConfig({
|
|
|
933
933
|
|
|
934
934
|
// New dependencies
|
|
935
935
|
"@jmruthers/pace-core": "^2.0.0",
|
|
936
|
-
"react": "^
|
|
937
|
-
"react-dom": "^
|
|
936
|
+
"react": "^19.2.3",
|
|
937
|
+
"react-dom": "^19.2.3",
|
|
938
938
|
"@supabase/supabase-js": "^2.38.0",
|
|
939
939
|
"zod": "^3.22.0"
|
|
940
940
|
},
|
|
@@ -944,8 +944,8 @@ export default defineConfig({
|
|
|
944
944
|
"@types/react-dom": "^17.0.0",
|
|
945
945
|
|
|
946
946
|
// New dev dependencies
|
|
947
|
-
"@types/react": "^
|
|
948
|
-
"@types/react-dom": "^
|
|
947
|
+
"@types/react": "^19.2.7",
|
|
948
|
+
"@types/react-dom": "^19.2.3",
|
|
949
949
|
"@vitejs/plugin-react": "^4.0.0",
|
|
950
950
|
"vite": "^4.4.0",
|
|
951
951
|
"typescript": "^5.0.0"
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
---
|
|
2
|
+
lastUpdated: 2025-01-28T00:00:00+11:00
|
|
3
|
+
version: 0.5.193
|
|
4
|
+
reviewedBy: react-19-upgrade
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# React 19 Migration Guide
|
|
8
|
+
|
|
9
|
+
This guide documents the React 19 upgrade for `@jmruthers/pace-core` and provides migration instructions for consuming apps.
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
PACE Core has been upgraded from React 18.3.1 to React 19.2.3, including the React Compiler for automatic optimizations. This upgrade provides improved performance, better type safety, and new features.
|
|
14
|
+
|
|
15
|
+
## What Changed
|
|
16
|
+
|
|
17
|
+
### Core Upgrades
|
|
18
|
+
|
|
19
|
+
- **React**: `^18.3.1` → `^19.2.3`
|
|
20
|
+
- **React DOM**: `^18.3.1` → `^19.2.3`
|
|
21
|
+
- **@types/react**: `^18.3.17` → `^19.2.7`
|
|
22
|
+
- **@types/react-dom**: `^18.3.5` → `^19.2.3`
|
|
23
|
+
- **@vitejs/plugin-react**: `^4.5.1` → `^5.1.2`
|
|
24
|
+
- **React Compiler**: Added `babel-plugin-react-compiler@^1.0.0`
|
|
25
|
+
|
|
26
|
+
### React Compiler
|
|
27
|
+
|
|
28
|
+
The React Compiler is now configured in pace-core's build setup. It automatically optimizes React components by:
|
|
29
|
+
- Automatically memoizing components and values
|
|
30
|
+
- Reducing the need for manual `useMemo` and `useCallback`
|
|
31
|
+
- Optimizing re-renders based on actual dependencies
|
|
32
|
+
|
|
33
|
+
## Breaking Changes
|
|
34
|
+
|
|
35
|
+
### TypeScript Type Stricter
|
|
36
|
+
|
|
37
|
+
React 19 has stricter TypeScript types. The main change affects accessing `child.props` in React elements:
|
|
38
|
+
|
|
39
|
+
**Before (React 18)**:
|
|
40
|
+
```tsx
|
|
41
|
+
React.Children.map(children, (child) => {
|
|
42
|
+
if (React.isValidElement(child)) {
|
|
43
|
+
const variant = child.props.variant; // Works
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**After (React 19)**:
|
|
49
|
+
```tsx
|
|
50
|
+
React.Children.map(children, (child) => {
|
|
51
|
+
if (React.isValidElement(child)) {
|
|
52
|
+
const props = child.props as { variant?: string; [key: string]: unknown };
|
|
53
|
+
const variant = props.variant; // Type-safe
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Error Handling
|
|
59
|
+
|
|
60
|
+
React 19 changes how errors are handled:
|
|
61
|
+
- Errors during render are no longer re-thrown
|
|
62
|
+
- Uncaught errors are reported to `window.reportError`
|
|
63
|
+
- Error boundaries continue to work as before
|
|
64
|
+
|
|
65
|
+
### StrictMode Behavior
|
|
66
|
+
|
|
67
|
+
React 19 StrictMode changes:
|
|
68
|
+
- `useMemo` and `useCallback` reuse results from first render during second render
|
|
69
|
+
- Ref callbacks are double-invoked on initial mount
|
|
70
|
+
|
|
71
|
+
## Migration Steps for Consuming Apps
|
|
72
|
+
|
|
73
|
+
### Step 1: Update React Dependencies
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm install react@^19.2.3 react-dom@^19.2.3
|
|
77
|
+
npm install -D @types/react@^19.2.7 @types/react-dom@^19.2.3
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Step 2: Update Vite Plugin
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npm install -D @vitejs/plugin-react@^5.1.2
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Step 3: Install React Compiler (Recommended)
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install -D babel-plugin-react-compiler@latest
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Step 4: Configure React Compiler in Vite
|
|
93
|
+
|
|
94
|
+
Update your `vite.config.ts`:
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { defineConfig } from 'vite'
|
|
98
|
+
import react from '@vitejs/plugin-react'
|
|
99
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
100
|
+
|
|
101
|
+
export default defineConfig({
|
|
102
|
+
plugins: [
|
|
103
|
+
react({
|
|
104
|
+
babel: {
|
|
105
|
+
plugins: ['babel-plugin-react-compiler'],
|
|
106
|
+
},
|
|
107
|
+
}),
|
|
108
|
+
tailwindcss()
|
|
109
|
+
],
|
|
110
|
+
// ... rest of config
|
|
111
|
+
})
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Step 5: Update TypeScript Types
|
|
115
|
+
|
|
116
|
+
If you have custom components that access `child.props`, update them:
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
// Before
|
|
120
|
+
const props = child.props;
|
|
121
|
+
|
|
122
|
+
// After
|
|
123
|
+
const props = child.props as { [key: string]: unknown };
|
|
124
|
+
// Or with specific types
|
|
125
|
+
const props = child.props as { variant?: string; size?: string; [key: string]: unknown };
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Step 6: Test Your Application
|
|
129
|
+
|
|
130
|
+
1. Run your test suite
|
|
131
|
+
2. Check for TypeScript errors
|
|
132
|
+
3. Verify components render correctly
|
|
133
|
+
4. Test error boundaries
|
|
134
|
+
5. Use React DevTools to verify React Compiler is working (look for "Memo ✨" badge)
|
|
135
|
+
|
|
136
|
+
## React Compiler Benefits
|
|
137
|
+
|
|
138
|
+
The React Compiler automatically:
|
|
139
|
+
- Memoizes components that don't need to re-render
|
|
140
|
+
- Optimizes `useMemo` and `useCallback` usage
|
|
141
|
+
- Reduces unnecessary re-renders
|
|
142
|
+
- Improves performance without manual optimization
|
|
143
|
+
|
|
144
|
+
### When to Keep Manual Optimizations
|
|
145
|
+
|
|
146
|
+
You can still use manual `useMemo`/`useCallback` for:
|
|
147
|
+
- Complex dependencies that the compiler can't analyze
|
|
148
|
+
- Performance-critical code where you want explicit control
|
|
149
|
+
- Cases where the compiler optimization doesn't match your needs
|
|
150
|
+
|
|
151
|
+
The compiler will work alongside your manual optimizations.
|
|
152
|
+
|
|
153
|
+
## Verification
|
|
154
|
+
|
|
155
|
+
### Check React Compiler is Working
|
|
156
|
+
|
|
157
|
+
1. Install React DevTools browser extension
|
|
158
|
+
2. Open your app in development mode
|
|
159
|
+
3. Open React DevTools
|
|
160
|
+
4. Look for components with "Memo ✨" badge - these are optimized by the compiler
|
|
161
|
+
|
|
162
|
+
### Build Verification
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Type checking
|
|
166
|
+
npm run type-check
|
|
167
|
+
|
|
168
|
+
# Build
|
|
169
|
+
npm run build
|
|
170
|
+
|
|
171
|
+
# Tests
|
|
172
|
+
npm run test
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Troubleshooting
|
|
176
|
+
|
|
177
|
+
### TypeScript Errors with child.props
|
|
178
|
+
|
|
179
|
+
If you see errors like `'child.props' is of type 'unknown'`, add type assertions:
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
const props = child.props as { [key: string]: unknown };
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### React Compiler Not Working
|
|
186
|
+
|
|
187
|
+
1. Verify `babel-plugin-react-compiler` is installed
|
|
188
|
+
2. Check `vite.config.ts` has the compiler configured
|
|
189
|
+
3. Restart your dev server
|
|
190
|
+
4. Check React DevTools for "Memo ✨" badges
|
|
191
|
+
|
|
192
|
+
### Test Failures
|
|
193
|
+
|
|
194
|
+
If tests fail after upgrading:
|
|
195
|
+
1. Update `@testing-library/react` to latest version
|
|
196
|
+
2. Check for StrictMode-related test issues
|
|
197
|
+
3. Verify error boundaries still work correctly
|
|
198
|
+
|
|
199
|
+
## Rollback Plan
|
|
200
|
+
|
|
201
|
+
If you encounter issues:
|
|
202
|
+
|
|
203
|
+
1. **Disable React Compiler**: Remove from `vite.config.ts`:
|
|
204
|
+
```typescript
|
|
205
|
+
react() // Remove babel config
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
2. **Downgrade React**: Temporarily downgrade to React 18.3.1 if needed
|
|
209
|
+
3. **Report Issues**: Open an issue with details about the problem
|
|
210
|
+
|
|
211
|
+
## Additional Resources
|
|
212
|
+
|
|
213
|
+
- [React 19 Upgrade Guide](https://react.dev/blog/2024/04/25/react-19-upgrade-guide)
|
|
214
|
+
- [React Compiler Documentation](https://react.dev/learn/react-compiler)
|
|
215
|
+
- [PACE Core Installation Guide](../getting-started/installation-guide.md)
|
|
216
|
+
|
|
217
|
+
## Support
|
|
218
|
+
|
|
219
|
+
If you encounter issues migrating to React 19:
|
|
220
|
+
1. Check this guide first
|
|
221
|
+
2. Review [Troubleshooting](../troubleshooting/README.md)
|
|
222
|
+
3. Open an issue on GitHub with:
|
|
223
|
+
- Package version
|
|
224
|
+
- React version
|
|
225
|
+
- Error messages
|
|
226
|
+
- Migration attempt details
|
|
227
|
+
|
package/docs/standards/README.md
CHANGED
|
@@ -33,3 +33,42 @@ This document is the single source of truth for all engineering standards for pa
|
|
|
33
33
|
- Apply Cursor Checklists
|
|
34
34
|
- Prefer pace-core for reusable logic
|
|
35
35
|
- Update docs on API changes
|
|
36
|
+
|
|
37
|
+
## Cursor Rules
|
|
38
|
+
|
|
39
|
+
pace-core provides comprehensive Cursor rules that automatically enforce these standards in consuming apps.
|
|
40
|
+
|
|
41
|
+
### Installation
|
|
42
|
+
|
|
43
|
+
Install cursor rules in your consuming app:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
node node_modules/@jmruthers/pace-core/scripts/install-cursor-rules.cjs
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Rule Files
|
|
50
|
+
|
|
51
|
+
The cursor rules cover:
|
|
52
|
+
- **00-pace-core-compliance** - Enforce pace-core usage patterns
|
|
53
|
+
- **01-standards-compliance** - Enforce all standards (this document)
|
|
54
|
+
- **02-project-structure** - Define standard folder structure
|
|
55
|
+
- **03-solid-principles** - Enforce SOLID architecture
|
|
56
|
+
- **04-testing-standards** - Enforce testing consistency
|
|
57
|
+
- **05-bug-reports-and-features** - Templates for issue reporting
|
|
58
|
+
- **06-code-quality** - Enforce code quality standards
|
|
59
|
+
- **07-tech-stack-compliance** - Enforce tech stack versions
|
|
60
|
+
|
|
61
|
+
### Audit Tool
|
|
62
|
+
|
|
63
|
+
Run comprehensive audits to check compliance:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
node node_modules/@jmruthers/pace-core/scripts/audit-consuming-app.cjs
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
This generates timestamped markdown reports in `audit/` directory.
|
|
70
|
+
|
|
71
|
+
### Documentation
|
|
72
|
+
|
|
73
|
+
- [Cursor Rules Quick Start](../getting-started/cursor-rules.md)
|
|
74
|
+
- [Cursor Rules README](../../cursor-rules/README.md)
|
|
@@ -506,8 +506,8 @@ export default defineConfig({
|
|
|
506
506
|
|
|
507
507
|
// New dependencies
|
|
508
508
|
"@jmruthers/pace-core": "^2.0.0",
|
|
509
|
-
"react": "^
|
|
510
|
-
"react-dom": "^
|
|
509
|
+
"react": "^19.2.3",
|
|
510
|
+
"react-dom": "^19.2.3",
|
|
511
511
|
"@supabase/supabase-js": "^2.38.0",
|
|
512
512
|
"zod": "^3.22.0"
|
|
513
513
|
},
|
|
@@ -517,8 +517,8 @@ export default defineConfig({
|
|
|
517
517
|
"@types/react-dom": "^17.0.0",
|
|
518
518
|
|
|
519
519
|
// New dev dependencies
|
|
520
|
-
"@types/react": "^
|
|
521
|
-
"@types/react-dom": "^
|
|
520
|
+
"@types/react": "^19.2.7",
|
|
521
|
+
"@types/react-dom": "^19.2.3",
|
|
522
522
|
"@vitejs/plugin-react": "^4.0.0",
|
|
523
523
|
"vite": "^4.4.0",
|
|
524
524
|
"typescript": "^5.0.0"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jmruthers/pace-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Clean, modern React component library with Tailwind v4 styling and native utilities",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -71,6 +71,9 @@
|
|
|
71
71
|
"./docs": "./docs/README.md",
|
|
72
72
|
"./package.json": "./package.json",
|
|
73
73
|
"./core-usage-manifest.json": "./core-usage-manifest.json",
|
|
74
|
+
"./cursor-rules": "./cursor-rules",
|
|
75
|
+
"./scripts/install-cursor-rules": "./scripts/install-cursor-rules.cjs",
|
|
76
|
+
"./scripts/audit-consuming-app": "./scripts/audit-consuming-app.cjs",
|
|
74
77
|
"./source": {
|
|
75
78
|
"import": "./src/index.ts",
|
|
76
79
|
"default": "./src/index.ts"
|
|
@@ -138,7 +141,8 @@
|
|
|
138
141
|
"docs",
|
|
139
142
|
"core-usage-manifest.json",
|
|
140
143
|
"eslint-config-pace-core.cjs",
|
|
141
|
-
"scripts"
|
|
144
|
+
"scripts",
|
|
145
|
+
"cursor-rules"
|
|
142
146
|
],
|
|
143
147
|
"scripts": {
|
|
144
148
|
"_comment_build": "Build package and documentation",
|
|
@@ -207,9 +211,9 @@
|
|
|
207
211
|
"@tanstack/react-table": "^8.0.0",
|
|
208
212
|
"clsx": "^2.0.0",
|
|
209
213
|
"lucide-react": "^0.400.0",
|
|
210
|
-
"react": "^
|
|
211
|
-
"react-dom": "^18.0.0",
|
|
214
|
+
"react": "^19.0.0",
|
|
212
215
|
"react-day-picker": "^9.0.0",
|
|
216
|
+
"react-dom": "^19.0.0",
|
|
213
217
|
"react-hook-form": "^7.0.0",
|
|
214
218
|
"react-router-dom": "^6.0.0",
|
|
215
219
|
"tailwind-merge": "^2.0.0",
|
|
@@ -222,8 +226,8 @@
|
|
|
222
226
|
"@testing-library/react": "^16.1.0",
|
|
223
227
|
"@testing-library/user-event": "^14.5.2",
|
|
224
228
|
"@types/papaparse": "^5.3.16",
|
|
225
|
-
"@types/react": "^
|
|
226
|
-
"@types/react-dom": "^
|
|
229
|
+
"@types/react": "^19.0.0",
|
|
230
|
+
"@types/react-dom": "^19.0.0",
|
|
227
231
|
"@types/react-window": "^1.8.8",
|
|
228
232
|
"@vitejs/plugin-react": "^4.5.1",
|
|
229
233
|
"@vitest/coverage-v8": "^3.2.3",
|
|
@@ -236,6 +240,7 @@
|
|
|
236
240
|
"typedoc": "^0.25.13",
|
|
237
241
|
"typedoc-plugin-markdown": "^3.17.1",
|
|
238
242
|
"typedoc-plugin-merge-modules": "^5.1.0",
|
|
243
|
+
"tsup": "^8.5.0",
|
|
239
244
|
"typescript": "^5.4.0",
|
|
240
245
|
"typescript-eslint": "^8.39.0",
|
|
241
246
|
"vite": "^6.0.3"
|