@mui/x-codemod 9.0.0-alpha.2 → 9.0.0-alpha.4
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 +246 -1
- package/README.md +85 -3
- package/package.json +2 -2
- package/util/removeProps.js +2 -1
- package/util/renameClasses.js +86 -0
- package/v9.0.0/charts/preset-safe/index.js +6 -1
- package/v9.0.0/charts/remove-deprecated-series-types/index.js +206 -0
- package/v9.0.0/charts/remove-enable-keyboard-navigation/index.js +49 -0
- package/v9.0.0/charts/remove-is-bar-series-helpers/index.js +98 -0
- package/v9.0.0/charts/remove-stabilized-experimentalFeatures/index.js +41 -0
- package/v9.0.0/charts/rename-classes/index.js +148 -0
- package/v9.0.0/charts/rename-voronoi-max-radius/index.js +38 -0
- package/v9.0.0/data-grid/remove-stabilized-experimentalFeatures/index.js +41 -0
- package/v9.0.0/pickers/preset-safe/index.js +14 -0
- package/v9.0.0/pickers/rename-field-ref/index.js +94 -0
- package/v9.0.0/preset-safe/index.js +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,250 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 9.0.0-alpha.4
|
|
4
|
+
|
|
5
|
+
_Mar 19, 2026_
|
|
6
|
+
|
|
7
|
+
We'd like to extend a big thank you to the 12 contributors who made this release possible. Here are some highlights ✨:
|
|
8
|
+
|
|
9
|
+
- 🐞 Bugfixes and internal improvements
|
|
10
|
+
|
|
11
|
+
The following team members contributed to this release:
|
|
12
|
+
@aemartos, @alexfauquette, @bernardobelchior, @Janpot, @JCQuintas, @LukasTy, @mapache-salvaje, @michelengelen, @noraleonte, @rita-codes, @sai6855, @siriwatknp
|
|
13
|
+
|
|
14
|
+
### Data Grid
|
|
15
|
+
|
|
16
|
+
#### `@mui/x-data-grid@9.0.0-alpha.4`
|
|
17
|
+
|
|
18
|
+
- [DataGrid] Mark charts integration as stable (#21764) @JCQuintas
|
|
19
|
+
- [DataGrid] Move `elementOverrides` to constants and remove duplicates (#21618) @sai6855
|
|
20
|
+
- [DataGrid] Migrate from deprecated Material UI APIs (#21682) @siriwatknp
|
|
21
|
+
|
|
22
|
+
#### `@mui/x-data-grid-pro@9.0.0-alpha.4` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
23
|
+
|
|
24
|
+
Same changes as in `@mui/x-data-grid@9.0.0-alpha.4`.
|
|
25
|
+
|
|
26
|
+
#### `@mui/x-data-grid-premium@9.0.0-alpha.4` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
27
|
+
|
|
28
|
+
Same changes as in `@mui/x-data-grid-pro@9.0.0-alpha.4`.
|
|
29
|
+
|
|
30
|
+
### Date and Time Pickers
|
|
31
|
+
|
|
32
|
+
#### `@mui/x-date-pickers@9.0.0-alpha.4`
|
|
33
|
+
|
|
34
|
+
- [pickers] Avoid stealing focus on click away (#13434) @LukasTy
|
|
35
|
+
- [pickers] Promote `fieldRef` to stable and add `clearValue` method (#21655) @michelengelen
|
|
36
|
+
|
|
37
|
+
#### `@mui/x-date-pickers-pro@9.0.0-alpha.4` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
38
|
+
|
|
39
|
+
Same changes as in `@mui/x-date-pickers@9.0.0-alpha.4`.
|
|
40
|
+
|
|
41
|
+
### Charts
|
|
42
|
+
|
|
43
|
+
#### `@mui/x-charts@9.0.0-alpha.4`
|
|
44
|
+
|
|
45
|
+
- [charts] Add v9 chart series types and helper functions migration (#21009) @bernardobelchior
|
|
46
|
+
- [charts] Extract event listener to the layer container (#21751) @alexfauquette
|
|
47
|
+
- [charts] Fix WebGL print export canvas stretching (#21738) @JCQuintas
|
|
48
|
+
- [charts] Improve deprecation warnings (#21760) @alexfauquette
|
|
49
|
+
- [charts] Improve type safety in `identifierCleaner` (#21719) @bernardobelchior
|
|
50
|
+
- [charts] Make `preferStrictDomainInLineCharts` the default (#21744) @JCQuintas
|
|
51
|
+
- [charts] Move title and description to the layer container (#21757) @alexfauquette
|
|
52
|
+
- [charts] Refactor `FunnelChart` classes structure (#21652) @JCQuintas
|
|
53
|
+
- [charts] Refactor `Heatmap` classes structure (#21653) @JCQuintas
|
|
54
|
+
- [charts] Refactor `RadarChart` classes structure (#21650) @JCQuintas
|
|
55
|
+
- [charts] Refactor `SankeyChart` classes structure (#21654) @JCQuintas
|
|
56
|
+
- [charts] Refactor legend getters to use utility functions (#21628) @sai6855
|
|
57
|
+
- [charts] Remove deprecated `ChartContainer` and `ChartDataProvider` (#21777) @alexfauquette
|
|
58
|
+
- [charts] Remove deprecated `itemId` from `SeriesLegendItemContext` (#21788) @alexfauquette
|
|
59
|
+
- [charts] Remove deprecated `useMouseTracker()` (#21787) @alexfauquette
|
|
60
|
+
- [charts] Remove deprecated classes (#21775) @alexfauquette
|
|
61
|
+
- [charts] Remove deprecated props from PieArcLabel animation (#21789) @alexfauquette
|
|
62
|
+
- [charts] Remove get*UtilityClass from public exports (#21769) @JCQuintas
|
|
63
|
+
- [charts] Remove the deprecated `disableHover` property (#21785) @alexfauquette
|
|
64
|
+
- [charts] Remove the deprecated `message` prop (#21784) @alexfauquette
|
|
65
|
+
- [charts] Remove deprecated props about voronoi (#21796) @alexfauquette
|
|
66
|
+
- [charts] Remove deprecated pieArcClasses (#21795) @alexfauquette
|
|
67
|
+
- [charts] Rename `data-series-id` by `data-series` (#21761) @alexfauquette
|
|
68
|
+
- [charts] Rename `voronoiMaxRadius`/`disableVoronoi` to `hitAreaRadius`/`disableHitArea` (#21750) @bernardobelchior
|
|
69
|
+
- [charts] Update pt-PT locale (#21296) @bernardobelchior
|
|
70
|
+
- [charts] Use different shape per series by default (#21713) @alexfauquette
|
|
71
|
+
- [charts] Add className prop to Radar components (#21794) @JCQuintas
|
|
72
|
+
- [charts] Add className prop to shared chart components (#21792) @JCQuintas
|
|
73
|
+
- [charts] Add className prop to BarPlot (#21791) @JCQuintas
|
|
74
|
+
- [charts] Portal tooltip into ChartsLayerContainer (#21801) @JCQuintas
|
|
75
|
+
|
|
76
|
+
#### `@mui/x-charts-pro@9.0.0-alpha.4` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
77
|
+
|
|
78
|
+
Same changes as in `@mui/x-charts@9.0.0-alpha.4`, plus:
|
|
79
|
+
|
|
80
|
+
- [charts-pro] Allow `brush` interaction to accept `requiredKeys/pointerMode` (#21716) @JCQuintas
|
|
81
|
+
- [charts-pro] Remove deprecated `onAxisClick` for Heatmap (#21786) @alexfauquette
|
|
82
|
+
|
|
83
|
+
#### `@mui/x-charts-premium@9.0.0-alpha.4` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
84
|
+
|
|
85
|
+
Same changes as in `@mui/x-charts-pro@9.0.0-alpha.4`, plus:
|
|
86
|
+
|
|
87
|
+
- [charts-premium] Add candlestick chart (#21129) @bernardobelchior
|
|
88
|
+
|
|
89
|
+
### Tree View
|
|
90
|
+
|
|
91
|
+
#### `@mui/x-tree-view@9.0.0-alpha.4`
|
|
92
|
+
|
|
93
|
+
Internal changes.
|
|
94
|
+
|
|
95
|
+
#### `@mui/x-tree-view-pro@9.0.0-alpha.4` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
96
|
+
|
|
97
|
+
Same changes as in `@mui/x-tree-view@9.0.0-alpha.4`.
|
|
98
|
+
|
|
99
|
+
### Codemod
|
|
100
|
+
|
|
101
|
+
#### `@mui/x-codemod@9.0.0-alpha.4`
|
|
102
|
+
|
|
103
|
+
Internal changes.
|
|
104
|
+
|
|
105
|
+
### Docs
|
|
106
|
+
|
|
107
|
+
- [docs-infra] Exclude `ServerSideLazyLoadingRevalidation` from argos (#21734) @sai6855
|
|
108
|
+
- [docs] Update charts v9 migration guide to include premium package (#21743) @bernardobelchior
|
|
109
|
+
- [docs] Update v9 migration guides to install next tag (#21741) @bernardobelchior
|
|
110
|
+
- [docs] Revise the Pie chart docs (#21565) @mapache-salvaje
|
|
111
|
+
- [docs] Revise the Bar Chart docs (#21482) @mapache-salvaje
|
|
112
|
+
- [docs] Removed a `console.log` from an aggregation demo (#21698) @michelengelen
|
|
113
|
+
|
|
114
|
+
### Core
|
|
115
|
+
|
|
116
|
+
- [code-infra] Add pkg-pr-new as dev dependency (#21754) @Janpot
|
|
117
|
+
- [code-infra] Prevent `combiner` to have default parameters (#21707) @JCQuintas
|
|
118
|
+
- [code-infra] Remove CI coverage collection and upload to Codecov (#21671) @Janpot
|
|
119
|
+
- [internal] Remove @bernardobelchior from Charts CODEOWNERS (#21776) @Copilot
|
|
120
|
+
|
|
121
|
+
### Miscellaneous
|
|
122
|
+
|
|
123
|
+
- [x-license] Fix process.env.MUI_VERSION not being replaced during build (#21727) @aemartos
|
|
124
|
+
- [x-license] Add new watermark license status message (#21720) @aemartos
|
|
125
|
+
|
|
126
|
+
## 9.0.0-alpha.3
|
|
127
|
+
|
|
128
|
+
_Mar 12, 2026_
|
|
129
|
+
|
|
130
|
+
We'd like to extend a big thank you to the 13 contributors who made this release possible. Here are some highlights ✨:
|
|
131
|
+
|
|
132
|
+
- 🐞 Bugfixes and internal improvements
|
|
133
|
+
|
|
134
|
+
The following team members contributed to this release:
|
|
135
|
+
@aemartos, @alexfauquette, @bernardobelchior, @brijeshb42, @cherniavskii, @flaviendelangle, @Janpot, @JCQuintas, @MBilalShafi, @michelengelen, @rita-codes, @sai6855, @siriwatknp
|
|
136
|
+
|
|
137
|
+
### Data Grid
|
|
138
|
+
|
|
139
|
+
#### `@mui/x-data-grid@9.0.0-alpha.3`
|
|
140
|
+
|
|
141
|
+
- [DataGrid] Fix crash when `rows` and `rowModesModel` are updated simultaneously (#21265) @michelengelen
|
|
142
|
+
- [DataGrid] Add missing `resizablePanelHandle` classes to `gridClasses` object (#21538) @sai6855
|
|
143
|
+
- [DataGrid] Refactor `headerAlign` style calls (#21541) @sai6855
|
|
144
|
+
|
|
145
|
+
#### `@mui/x-data-grid-pro@9.0.0-alpha.3` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
146
|
+
|
|
147
|
+
Same changes as in `@mui/x-data-grid@9.0.0-alpha.3`, plus:
|
|
148
|
+
|
|
149
|
+
- [DataGridPro] Add `role="presentation"` to detail panel toggle header content (#21634) @michelengelen
|
|
150
|
+
- [DataGridPro] Fix sorting not reflected in nested server-side data (#21619) @MBilalShafi
|
|
151
|
+
|
|
152
|
+
#### `@mui/x-data-grid-premium@9.0.0-alpha.3` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
153
|
+
|
|
154
|
+
Same changes as in `@mui/x-data-grid-pro@9.0.0-alpha.3`.
|
|
155
|
+
|
|
156
|
+
### Date and Time Pickers
|
|
157
|
+
|
|
158
|
+
#### `@mui/x-date-pickers@9.0.0-alpha.3`
|
|
159
|
+
|
|
160
|
+
- [pickers] Refactor `DateRangePickerDay` overrides to use a centralized `elementOverrides` object (#21426) @sai6855
|
|
161
|
+
- [pickers] Migrate from deprecated props for `PickersModalDialog` (#21702) @siriwatknp
|
|
162
|
+
|
|
163
|
+
#### `@mui/x-date-pickers-pro@9.0.0-alpha.3` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
164
|
+
|
|
165
|
+
Same changes as in `@mui/x-date-pickers@9.0.0-alpha.3`.
|
|
166
|
+
|
|
167
|
+
### Charts
|
|
168
|
+
|
|
169
|
+
#### `@mui/x-charts@9.0.0-alpha.3`
|
|
170
|
+
|
|
171
|
+
- [charts] Differentiate Line Plot roots classes (#21679) @JCQuintas
|
|
172
|
+
- [charts] Enable keyboard navigation by default (#21675) @alexfauquette
|
|
173
|
+
- [charts] Fix keyboard tooltip radar (#21667) @alexfauquette
|
|
174
|
+
- [charts] Fix selector default parameter (#21638) @JCQuintas
|
|
175
|
+
- [charts] Fix tooltip blink between node and pointer anchor (#21611) @alexfauquette
|
|
176
|
+
- [charts] Let tooltip and legend reflect the line shape (#21475) @alexfauquette
|
|
177
|
+
- [charts] Refactor `BarChart` classes structure (#21601) @JCQuintas
|
|
178
|
+
- [charts] Refactor `LineChart` classes structure (#21648) @JCQuintas
|
|
179
|
+
- [charts] Refactor `ScatterChart` classes structure (#21651) @JCQuintas
|
|
180
|
+
- [charts] Refactor `PieChart` classes structure (#21649) @JCQuintas
|
|
181
|
+
- [charts] Remove batch rendering checks in highlight selectors (#21646) @bernardobelchior
|
|
182
|
+
- [charts] Standardize generic arg names to `SeriesType` (#21694) @alexfauquette
|
|
183
|
+
- [charts] Simplify highlight hooks return types (#21695) @alexfauquette
|
|
184
|
+
|
|
185
|
+
#### `@mui/x-charts-pro@9.0.0-alpha.3` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
186
|
+
|
|
187
|
+
Same changes as in `@mui/x-charts@9.0.0-alpha.3`, plus:
|
|
188
|
+
|
|
189
|
+
- [charts-pro] Fix heatmap style override from `arc` to `cell` (#21693) @Copilot
|
|
190
|
+
- [charts-pro] Fix image export truncated when page is zoomed out (#21685) @bernardobelchior
|
|
191
|
+
- [charts-pro] Speed-up heatmap cell search with an index lookup (#21130) @alexfauquette
|
|
192
|
+
- [charts-pro] Fix heatmap highlight not working (#21710) @Copilot
|
|
193
|
+
|
|
194
|
+
#### `@mui/x-charts-premium@9.0.0-alpha.3` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
195
|
+
|
|
196
|
+
Same changes as in `@mui/x-charts-pro@9.0.0-alpha.3`, plus:
|
|
197
|
+
|
|
198
|
+
- [charts-premium] Re-enable WebGL tests (#21708) @bernardobelchior
|
|
199
|
+
|
|
200
|
+
### Tree View
|
|
201
|
+
|
|
202
|
+
#### Breaking changes
|
|
203
|
+
|
|
204
|
+
- Remove `TreeViewBaseItem` type (use `TreeViewDefaultItemModelProperties` or a custom interface)
|
|
205
|
+
- Remove `useTreeViewApiRef` hook (use `useRichTreeViewApiRef`, `useSimpleTreeViewApiRef`, or `useRichTreeViewProApiRef`)
|
|
206
|
+
- Remove `status` from content slot props returned by `getContentProps()` (use `data-*` attributes; `status` on `useTreeItem` return value is unchanged)
|
|
207
|
+
- Remove deprecated CSS state classes from `treeItemClasses`: `expanded`, `selected`, `focused`, `disabled`, `editable`, `editing` (use `[data-expanded]`, `[data-selected]`, etc.)
|
|
208
|
+
- The `<RichTreeViewPro />` component has now virtualization enabled by default.
|
|
209
|
+
- The items used inside the `<RichTreeViewPro />` now have a default height of `32px`.
|
|
210
|
+
- The events of the `<RichTreeViewPro />` are now rendered as a flat list instead of a nested tree.
|
|
211
|
+
|
|
212
|
+
#### `@mui/x-tree-view@9.0.0-alpha.3`
|
|
213
|
+
|
|
214
|
+
- [tree view] Remove deprecated APIs (#21591) @flaviendelangle
|
|
215
|
+
- [tree view] Fix collapsed children not selected with `selectionPropagation.descendants` in `SimpleTreeView` (#21253) @flaviendelangle
|
|
216
|
+
|
|
217
|
+
#### `@mui/x-tree-view-pro@9.0.0-alpha.3` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
218
|
+
|
|
219
|
+
Same changes as in `@mui/x-tree-view@9.0.0-alpha.3`, plus:
|
|
220
|
+
|
|
221
|
+
- [RichTreeViewPro] Make the virtualization opt-out and port the layout doc from the data grid (#21461) @flaviendelangle
|
|
222
|
+
|
|
223
|
+
### Codemod
|
|
224
|
+
|
|
225
|
+
#### `@mui/x-codemod@9.0.0-alpha.3`
|
|
226
|
+
|
|
227
|
+
Internal changes.
|
|
228
|
+
|
|
229
|
+
### Docs
|
|
230
|
+
|
|
231
|
+
- [docs] Fix `AssistantWithDataSource` demo crashing (#21555) @sai6855
|
|
232
|
+
- [docs] Remove `Preview` pill from Sankey (#21623) @bernardobelchior
|
|
233
|
+
- [docs] Migrate internal Material UI deprecated APIs (#21680) @siriwatknp
|
|
234
|
+
- [docs] Remove `New` flag on Tree View and Date and Time Pickers features released before v9 alpha (#21585) @flaviendelangle
|
|
235
|
+
|
|
236
|
+
### Core
|
|
237
|
+
|
|
238
|
+
- [code-infra] Remove checkout step (#21688) @Janpot
|
|
239
|
+
- [code-infra] Fix contributor generation in changelog (#21718) @brijeshb42
|
|
240
|
+
- [docs-infra] Do not point to non-existent v8 subdomain (#21640) @cherniavskii
|
|
241
|
+
|
|
242
|
+
### Miscellaneous
|
|
243
|
+
|
|
244
|
+
- [test] Add missing tests for forwarding props to filter operators in DataGrid (#21441) @siriwatknp
|
|
245
|
+
- [x-license] Export additional license types and constants (#21625) @aemartos
|
|
246
|
+
- [x-license] Refactor license verification to accept package info object and add v9 version gating (#21690) @aemartos
|
|
247
|
+
|
|
3
248
|
## 9.0.0-alpha.2
|
|
4
249
|
|
|
5
250
|
_Mar 5, 2026_
|
|
@@ -92,7 +337,7 @@ Internal changes.
|
|
|
92
337
|
|
|
93
338
|
- [docs] Add backticks and parentheses to all functions and hooks (DX-173) (#21496) @mapache-salvaje
|
|
94
339
|
- [docs] Remove mentions of `mySvgRef` (#21559) @bernardobelchior
|
|
95
|
-
- [docs] Update Roadmap section in the docs
|
|
340
|
+
- [docs] Update Roadmap section in the docs (#20892) @alelthomas
|
|
96
341
|
- [docs] Add tutorial and example app for aggregation with row grouping (DX-162) (#21102) @mapache-salvaje
|
|
97
342
|
- [docs] Fix missing codemod docs (#21604) @JCQuintas
|
|
98
343
|
|
package/README.md
CHANGED
|
@@ -80,6 +80,26 @@ The corresponding sub-sections are listed below
|
|
|
80
80
|
|
|
81
81
|
- [`preset-safe-for-charts`](#preset-safe-for-charts-v900)
|
|
82
82
|
|
|
83
|
+
### Data Grid codemods
|
|
84
|
+
|
|
85
|
+
#### `remove-stabilized-experimentalFeatures`
|
|
86
|
+
|
|
87
|
+
Removes the `charts` property from the `experimentalFeatures` prop of `DataGridPremium`.
|
|
88
|
+
If `charts` is the only property, the entire `experimentalFeatures` prop is removed.
|
|
89
|
+
|
|
90
|
+
<!-- #npm-tag-reference -->
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npx @mui/x-codemod@next v9.0.0/data-grid/remove-stabilized-experimentalFeatures <path|folder>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
```diff
|
|
97
|
+
<DataGridPremium
|
|
98
|
+
- experimentalFeatures={{ charts: true }}
|
|
99
|
+
chartsIntegration
|
|
100
|
+
/>
|
|
101
|
+
```
|
|
102
|
+
|
|
83
103
|
### Charts codemods
|
|
84
104
|
|
|
85
105
|
#### 🚀 `preset-safe` for Charts v9.0.0
|
|
@@ -102,8 +122,12 @@ The list includes these transformers
|
|
|
102
122
|
- [`rename-chart-container`](#rename-chart-container)
|
|
103
123
|
- [`rename-chart-data-provider`](#rename-chart-data-provider)
|
|
104
124
|
- [`rename-chart-zoom-slider`](#rename-chart-zoom-slider)
|
|
125
|
+
- [`remove-enable-keyboard-navigation`](#remove-enable-keyboard-navigation)
|
|
126
|
+
- [`remove-stabilized-experimentalFeatures`](#remove-stabilized-experimentalfeatures)
|
|
127
|
+
- [`remove-deprecated-series-types`](#remove-deprecated-series-types)
|
|
128
|
+
- [`remove-is-bar-series-helpers`](#remove-is-bar-series-helpers)
|
|
105
129
|
|
|
106
|
-
|
|
130
|
+
#### `replace-heatmap-hide-legend-false`
|
|
107
131
|
|
|
108
132
|
The default value of the `hideLegend` prop in the `Heatmap` component has changed from `true` to `false` in v9. This improves consistency across chart components and developer experience.
|
|
109
133
|
|
|
@@ -113,7 +137,7 @@ The default value of the `hideLegend` prop in the `Heatmap` component has change
|
|
|
113
137
|
/>
|
|
114
138
|
```
|
|
115
139
|
|
|
116
|
-
|
|
140
|
+
#### `rename-axis-tooltip-hook`
|
|
117
141
|
|
|
118
142
|
The `useAxisTooltip()` hook has been renamed to `useAxesTooltip()` to better reflect its functionality of handling multiple axes.
|
|
119
143
|
|
|
@@ -138,7 +162,7 @@ After running the codemod to do the renaming make sure to adapt the hook returne
|
|
|
138
162
|
}
|
|
139
163
|
```
|
|
140
164
|
|
|
141
|
-
|
|
165
|
+
#### `rename-chart-api-import`
|
|
142
166
|
|
|
143
167
|
Moves the `ChartApi` type import from `@mui/x-charts/ChartContainer` to `@mui/x-charts/context`.
|
|
144
168
|
|
|
@@ -229,6 +253,64 @@ Renames the `ChartDataProvider` component and related exports to `ChartsDataProv
|
|
|
229
253
|
+import { ChartsDataProviderPro } from '@mui/x-charts-pro/ChartsDataProviderPro';
|
|
230
254
|
```
|
|
231
255
|
|
|
256
|
+
#### `remove-enable-keyboard-navigation`
|
|
257
|
+
|
|
258
|
+
Removes the `enableKeyboardNavigation` props set to `true` since it's now the default behavior.
|
|
259
|
+
|
|
260
|
+
```diff
|
|
261
|
+
<LineChart
|
|
262
|
+
- enableKeyboardNavigation
|
|
263
|
+
/>
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
#### `remove-stabilized-experimentalFeatures`
|
|
267
|
+
|
|
268
|
+
Removes the `preferStrictDomainInLineCharts` property from the `experimentalFeatures` prop since it's now the default behavior.
|
|
269
|
+
If `preferStrictDomainInLineCharts` is the only property in the object, the entire `experimentalFeatures` prop is removed.
|
|
270
|
+
|
|
271
|
+
```diff
|
|
272
|
+
<LineChart
|
|
273
|
+
- experimentalFeatures={{ preferStrictDomainInLineCharts: true }}
|
|
274
|
+
series={[]}
|
|
275
|
+
/>
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
#### `remove-deprecated-series-types`
|
|
279
|
+
|
|
280
|
+
Replaces deprecated series type aliases (`CartesianSeriesType`, `DefaultizedCartesianSeriesType`, `StackableSeriesType`) with their new equivalents using generic types.
|
|
281
|
+
|
|
282
|
+
```diff
|
|
283
|
+
-import { CartesianSeriesType, DefaultizedCartesianSeriesType, StackableSeriesType } from '@mui/x-charts';
|
|
284
|
+
+import { AllSeriesType, DefaultizedSeriesType, CartesianChartSeriesType, StackableChartSeriesType } from '@mui/x-charts';
|
|
285
|
+
|
|
286
|
+
-function processCartesian(series: CartesianSeriesType) {}
|
|
287
|
+
+function processCartesian(series: AllSeriesType<CartesianChartSeriesType>) {}
|
|
288
|
+
|
|
289
|
+
-function processDefaultizedCartesian(series: DefaultizedCartesianSeriesType) {}
|
|
290
|
+
+function processDefaultizedCartesian(series: DefaultizedSeriesType<CartesianChartSeriesType>) {}
|
|
291
|
+
|
|
292
|
+
-function processStackable(series: StackableSeriesType) {}
|
|
293
|
+
+function processStackable(series: DefaultizedSeriesType<StackableChartSeriesType>) {}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
#### `remove-is-bar-series-helpers`
|
|
297
|
+
|
|
298
|
+
Replaces the deprecated `isBarSeries()` and `isDefaultizedBarSeries()` helper functions with direct `series.type === 'bar'` checks and removes the corresponding imports.
|
|
299
|
+
|
|
300
|
+
```diff
|
|
301
|
+
-import { isBarSeries, isDefaultizedBarSeries } from '@mui/x-charts';
|
|
302
|
+
-
|
|
303
|
+
-if (isBarSeries(series)) {
|
|
304
|
+
+if (series.type === 'bar') {
|
|
305
|
+
console.log('bar series');
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
-if (isDefaultizedBarSeries(series)) {
|
|
309
|
+
+if (series.type === 'bar') {
|
|
310
|
+
console.log('defaultized bar series');
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
232
314
|
## v8.0.0
|
|
233
315
|
|
|
234
316
|
### 🚀 `preset-safe` for v8.0.0
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-codemod",
|
|
3
|
-
"version": "9.0.0-alpha.
|
|
3
|
+
"version": "9.0.0-alpha.4",
|
|
4
4
|
"author": "MUI Team",
|
|
5
5
|
"description": "Codemod scripts for MUI X.",
|
|
6
6
|
"keywords": [
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@babel/traverse": "^7.29.0",
|
|
29
29
|
"jscodeshift": "17.3.0",
|
|
30
30
|
"yargs": "^18.0.0",
|
|
31
|
-
"@mui/x-internals": "9.0.0-alpha.
|
|
31
|
+
"@mui/x-internals": "9.0.0-alpha.4"
|
|
32
32
|
},
|
|
33
33
|
"sideEffects": false,
|
|
34
34
|
"publishConfig": {
|
package/util/removeProps.js
CHANGED
|
@@ -11,6 +11,7 @@ function removeProps({
|
|
|
11
11
|
root,
|
|
12
12
|
componentNames,
|
|
13
13
|
props,
|
|
14
|
+
shouldRemove,
|
|
14
15
|
j
|
|
15
16
|
}) {
|
|
16
17
|
return root.find(j.JSXElement).filter(path => {
|
|
@@ -18,7 +19,7 @@ function removeProps({
|
|
|
18
19
|
}).find(j.JSXAttribute).filter(attribute => props.includes(attribute.node.name.name)).forEach(attribute => {
|
|
19
20
|
// Only remove props from components in componentNames. Not nested ones.
|
|
20
21
|
const attributeParent = attribute.parentPath.parentPath;
|
|
21
|
-
if (attributeParent.value.type === 'JSXOpeningElement' && componentNames.includes(attributeParent.value.name.name)) {
|
|
22
|
+
if (attributeParent.value.type === 'JSXOpeningElement' && componentNames.includes(attributeParent.value.name.name) && (!shouldRemove || shouldRemove(attribute.node))) {
|
|
22
23
|
j(attribute).remove();
|
|
23
24
|
}
|
|
24
25
|
});
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.renameClasses = renameClasses;
|
|
7
|
+
/**
|
|
8
|
+
* Renames classes objects and their properties.
|
|
9
|
+
*
|
|
10
|
+
* Handles:
|
|
11
|
+
* - Root imports: `import { lineElementClasses } from '@mui/x-charts'`
|
|
12
|
+
* - Nested imports: `import { lineElementClasses } from '@mui/x-charts/LineChart'`
|
|
13
|
+
* - Aliases: `import { lineElementClasses as lec } from '@mui/x-charts'`
|
|
14
|
+
* (renames imported name but keeps alias, still renames properties on aliased usage)
|
|
15
|
+
* - Member expression property renaming: `lineElementClasses.root` → `lineClasses.elementRoot`
|
|
16
|
+
*/
|
|
17
|
+
function renameClasses(parameters) {
|
|
18
|
+
const {
|
|
19
|
+
j,
|
|
20
|
+
root,
|
|
21
|
+
packageNames
|
|
22
|
+
} = parameters;
|
|
23
|
+
const packageRegExp = new RegExp(`^(${packageNames.join('|')})(/.*)?$`);
|
|
24
|
+
|
|
25
|
+
// Track local names → old class name, so we can rename properties on aliased usages
|
|
26
|
+
const localNameToOldClassName = {};
|
|
27
|
+
// Track non-aliased identifiers that need renaming
|
|
28
|
+
const renamedIdentifiersMap = {};
|
|
29
|
+
// Track name already added to the file
|
|
30
|
+
const alreadyAvailableIdentifiersMap = new Set();
|
|
31
|
+
const importDeclarations = root.find(j.ImportDeclaration).filter(path => {
|
|
32
|
+
const pathStr = path.node.source.value?.toString() ?? '';
|
|
33
|
+
return !!pathStr.match(packageRegExp);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Rename import specifiers and collect local names for property renaming
|
|
37
|
+
importDeclarations.find(j.ImportSpecifier).filter(path => parameters.classes.hasOwnProperty(path.node.imported.name)).forEach(path => {
|
|
38
|
+
const oldName = path.node.imported.name;
|
|
39
|
+
const config = parameters.classes[oldName];
|
|
40
|
+
const localName = path.node.local?.name;
|
|
41
|
+
const hasAlias = localName !== oldName;
|
|
42
|
+
|
|
43
|
+
// Track the local name for property renaming
|
|
44
|
+
localNameToOldClassName[hasAlias ? localName : oldName] = oldName;
|
|
45
|
+
renamedIdentifiersMap[oldName] = config.newClassName;
|
|
46
|
+
if (!hasAlias && alreadyAvailableIdentifiersMap.has(config.newClassName)) {
|
|
47
|
+
path.prune();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
alreadyAvailableIdentifiersMap.add(config.newClassName);
|
|
51
|
+
if (hasAlias) {
|
|
52
|
+
// Keep the alias, only rename the imported name
|
|
53
|
+
path.replace(j.importSpecifier(j.identifier(config.newClassName), j.identifier(localName)));
|
|
54
|
+
} else {
|
|
55
|
+
path.replace(j.importSpecifier(j.identifier(config.newClassName)));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Rename member expression properties (e.g., lineElementClasses.root → lineClasses.elementRoot)
|
|
60
|
+
root.find(j.MemberExpression).filter(path => {
|
|
61
|
+
if (path.node.object.type !== 'Identifier') {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const objectName = path.node.object.name;
|
|
65
|
+
if (!localNameToOldClassName.hasOwnProperty(objectName)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
if (path.node.property.type !== 'Identifier') {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
const oldClassName = localNameToOldClassName[objectName];
|
|
72
|
+
return parameters.classes[oldClassName].properties.hasOwnProperty(path.node.property.name);
|
|
73
|
+
}).replaceWith(path => {
|
|
74
|
+
const objectName = path.node.object.name;
|
|
75
|
+
const oldPropertyName = path.node.property.name;
|
|
76
|
+
const oldClassName = localNameToOldClassName[objectName];
|
|
77
|
+
const newPropertyName = parameters.classes[oldClassName].properties[oldPropertyName];
|
|
78
|
+
return j.memberExpression(path.node.object, j.identifier(newPropertyName));
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Rename identifier usages (non-aliased)
|
|
82
|
+
root.find(j.Identifier).filter(path => renamedIdentifiersMap.hasOwnProperty(path.node.name)).replaceWith(path => {
|
|
83
|
+
return j.identifier(renamedIdentifiersMap[path.node.name]);
|
|
84
|
+
});
|
|
85
|
+
return root;
|
|
86
|
+
}
|
|
@@ -14,9 +14,14 @@ var renameChartZoomSlider = _interopRequireWildcard(require("../rename-chart-zoo
|
|
|
14
14
|
var replaceHeatmapHideLegend = _interopRequireWildcard(require("../replace-heatmap-hide-legend-false"));
|
|
15
15
|
var renameSankeyChart = _interopRequireWildcard(require("../rename-sankey-chart"));
|
|
16
16
|
var replaceShowMarkDefault = _interopRequireWildcard(require("../replace-show-mark-default"));
|
|
17
|
+
var removeEnableKeyboardNavigation = _interopRequireWildcard(require("../remove-enable-keyboard-navigation"));
|
|
18
|
+
var removeStabilizedExperimentalFeatures = _interopRequireWildcard(require("../remove-stabilized-experimentalFeatures"));
|
|
19
|
+
var renameVoronoiMaxRadius = _interopRequireWildcard(require("../rename-voronoi-max-radius"));
|
|
20
|
+
var removeDeprecatedSeriesTypes = _interopRequireWildcard(require("../remove-deprecated-series-types"));
|
|
21
|
+
var removeIsBarSeriesHelpers = _interopRequireWildcard(require("../remove-is-bar-series-helpers"));
|
|
17
22
|
const allModules = [
|
|
18
23
|
// Add other transforms here as they are created
|
|
19
|
-
replaceHeatmapHideLegend, replaceShowMarkDefault, renameIdToSeriesId, renameChartApiImport, renameSankeyChart, renameChartContainer, renameChartDataProvider, renameChartZoomSlider];
|
|
24
|
+
replaceHeatmapHideLegend, replaceShowMarkDefault, removeEnableKeyboardNavigation, removeStabilizedExperimentalFeatures, renameIdToSeriesId, renameChartApiImport, renameSankeyChart, renameChartContainer, renameChartDataProvider, renameChartZoomSlider, renameVoronoiMaxRadius, removeDeprecatedSeriesTypes, removeIsBarSeriesHelpers];
|
|
20
25
|
function transformer(file, api, options) {
|
|
21
26
|
allModules.forEach(module => {
|
|
22
27
|
file.source = module.default(file, api, options);
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = transformer;
|
|
8
|
+
exports.testConfig = void 0;
|
|
9
|
+
var _nodePath = _interopRequireDefault(require("node:path"));
|
|
10
|
+
var _readFile = _interopRequireDefault(require("../../../util/readFile"));
|
|
11
|
+
// Maps from removed type to the replacement info
|
|
12
|
+
const REMOVED_TYPES = {
|
|
13
|
+
CartesianSeriesType: {
|
|
14
|
+
baseType: 'AllSeriesType',
|
|
15
|
+
genericType: 'CartesianChartSeriesType'
|
|
16
|
+
},
|
|
17
|
+
DefaultizedCartesianSeriesType: {
|
|
18
|
+
baseType: 'DefaultizedSeriesType',
|
|
19
|
+
genericType: 'CartesianChartSeriesType'
|
|
20
|
+
},
|
|
21
|
+
StackableSeriesType: {
|
|
22
|
+
baseType: 'DefaultizedSeriesType',
|
|
23
|
+
genericType: 'StackableChartSeriesType'
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const REMOVED_TYPE_NAMES = Object.keys(REMOVED_TYPES);
|
|
27
|
+
function transformer(file, api, options) {
|
|
28
|
+
const j = api.jscodeshift;
|
|
29
|
+
const root = j(file.source);
|
|
30
|
+
const printOptions = options.printOptions || {
|
|
31
|
+
quote: 'single',
|
|
32
|
+
trailingComma: true,
|
|
33
|
+
wrapColumn: 40
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Track local names for removed types and the source they came from
|
|
37
|
+
const removedTypeLocalNames = {};
|
|
38
|
+
let originalImportSource = null;
|
|
39
|
+
|
|
40
|
+
// Find and remove imports of deprecated types
|
|
41
|
+
const packageRegex = /^@mui\/x-charts(-pro|-premium)?(\/(models|internals))?$/;
|
|
42
|
+
root.find(j.ImportDeclaration).forEach(astPath => {
|
|
43
|
+
const source = astPath.node.source.value?.toString() ?? '';
|
|
44
|
+
if (!packageRegex.test(source)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const specifiers = astPath.node.specifiers || [];
|
|
48
|
+
const remainingSpecifiers = [];
|
|
49
|
+
specifiers.forEach(specifier => {
|
|
50
|
+
if (specifier.type === 'ImportSpecifier') {
|
|
51
|
+
const importedName = specifier.imported.name.toString();
|
|
52
|
+
if (REMOVED_TYPE_NAMES.includes(importedName)) {
|
|
53
|
+
// Track the local name used for this import
|
|
54
|
+
const localName = specifier.local?.name.toString() || importedName;
|
|
55
|
+
removedTypeLocalNames[localName] = importedName;
|
|
56
|
+
// Track the original import source (use the first one found)
|
|
57
|
+
if (!originalImportSource) {
|
|
58
|
+
originalImportSource = source;
|
|
59
|
+
}
|
|
60
|
+
} else {
|
|
61
|
+
remainingSpecifiers.push(specifier);
|
|
62
|
+
}
|
|
63
|
+
} else {
|
|
64
|
+
remainingSpecifiers.push(specifier);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
if (remainingSpecifiers.length === 0) {
|
|
68
|
+
// Remove the entire import declaration if no specifiers remain
|
|
69
|
+
j(astPath).remove();
|
|
70
|
+
} else if (remainingSpecifiers.length !== specifiers.length) {
|
|
71
|
+
// Update the import declaration with remaining specifiers
|
|
72
|
+
astPath.node.specifiers = remainingSpecifiers;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// If no relevant imports were found, return the source unchanged to avoid reformatting
|
|
77
|
+
if (Object.keys(removedTypeLocalNames).length === 0) {
|
|
78
|
+
return file.source;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Replace type references with the new types
|
|
82
|
+
// We need to add the necessary imports if they're not already present
|
|
83
|
+
const typesToImport = new Set();
|
|
84
|
+
const genericTypesToImport = new Set();
|
|
85
|
+
Object.entries(removedTypeLocalNames).forEach(([localName, originalName]) => {
|
|
86
|
+
const replacementInfo = REMOVED_TYPES[originalName];
|
|
87
|
+
if (!replacementInfo) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Find all usages of the type as a type reference
|
|
92
|
+
root.find(j.TSTypeReference).forEach(astPath => {
|
|
93
|
+
if (astPath.node.typeName.type === 'Identifier' && astPath.node.typeName.name === localName) {
|
|
94
|
+
typesToImport.add(replacementInfo.baseType);
|
|
95
|
+
genericTypesToImport.add(replacementInfo.genericType);
|
|
96
|
+
|
|
97
|
+
// Replace with the generic type: e.g., AllSeriesType<CartesianChartSeriesType>
|
|
98
|
+
const newTypeReference = j.tsTypeReference(j.identifier(replacementInfo.baseType), j.tsTypeParameterInstantiation([j.tsTypeReference(j.identifier(replacementInfo.genericType))]));
|
|
99
|
+
j(astPath).replaceWith(newTypeReference);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// Helper to check if a type is already imported from a given package pattern
|
|
105
|
+
const isAlreadyImported = (typeName, sourcePattern) => {
|
|
106
|
+
return root.find(j.ImportSpecifier, {
|
|
107
|
+
imported: {
|
|
108
|
+
name: typeName
|
|
109
|
+
}
|
|
110
|
+
}).filter(specPath => {
|
|
111
|
+
const importDecl = specPath.parentPath.parentPath;
|
|
112
|
+
const source = importDecl.node.source.value?.toString() ?? '';
|
|
113
|
+
return sourcePattern.test(source);
|
|
114
|
+
}).size() > 0;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// Collect all types that need to be added to imports
|
|
118
|
+
const allTypesToAdd = new Set([...typesToImport, ...genericTypesToImport]);
|
|
119
|
+
const typesToAdd = Array.from(allTypesToAdd).filter(typeName => !isAlreadyImported(typeName, packageRegex));
|
|
120
|
+
|
|
121
|
+
// Determine where to add types - use original source or default to same pattern
|
|
122
|
+
// If original was '@mui/x-charts', add to '@mui/x-charts'
|
|
123
|
+
// If original was '@mui/x-charts/models', add to '@mui/x-charts/models'
|
|
124
|
+
const importSource = originalImportSource || '@mui/x-charts/models';
|
|
125
|
+
|
|
126
|
+
// Merge duplicate import declarations from the same source before adding new types.
|
|
127
|
+
// Previous codemods may have split imports, leaving multiple declarations from the same source.
|
|
128
|
+
const importsBySource = new Map();
|
|
129
|
+
root.find(j.ImportDeclaration).forEach(astPath => {
|
|
130
|
+
const source = astPath.node.source.value?.toString() ?? '';
|
|
131
|
+
if (!packageRegex.test(source)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (!importsBySource.has(source)) {
|
|
135
|
+
importsBySource.set(source, []);
|
|
136
|
+
}
|
|
137
|
+
importsBySource.get(source).push(astPath);
|
|
138
|
+
});
|
|
139
|
+
importsBySource.forEach(paths => {
|
|
140
|
+
if (paths.length <= 1) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Collect all specifiers from all declarations, deduplicating by name
|
|
145
|
+
const allSpecifiers = [];
|
|
146
|
+
const seenNames = new Set();
|
|
147
|
+
paths.forEach(importPath => {
|
|
148
|
+
(importPath.node.specifiers || []).forEach(specifier => {
|
|
149
|
+
if (specifier.type === 'ImportSpecifier') {
|
|
150
|
+
const name = specifier.imported.name.toString();
|
|
151
|
+
if (!seenNames.has(name)) {
|
|
152
|
+
seenNames.add(name);
|
|
153
|
+
allSpecifiers.push(specifier);
|
|
154
|
+
}
|
|
155
|
+
} else {
|
|
156
|
+
allSpecifiers.push(specifier);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// Keep the first declaration with all specifiers, remove the rest
|
|
162
|
+
paths[0].node.specifiers = allSpecifiers;
|
|
163
|
+
for (let i = 1; i < paths.length; i += 1) {
|
|
164
|
+
j(paths[i]).remove();
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Add all replacement types to the same import source as the original
|
|
169
|
+
if (typesToAdd.length > 0) {
|
|
170
|
+
const existingImport = root.find(j.ImportDeclaration, {
|
|
171
|
+
source: {
|
|
172
|
+
value: importSource
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
if (existingImport.size() > 0) {
|
|
176
|
+
// Add to the existing import
|
|
177
|
+
const specifiers = existingImport.at(0).get().node.specifiers || [];
|
|
178
|
+
typesToAdd.forEach(typeName => {
|
|
179
|
+
specifiers.push(j.importSpecifier(j.identifier(typeName)));
|
|
180
|
+
});
|
|
181
|
+
} else {
|
|
182
|
+
// Create new import
|
|
183
|
+
const newImport = j.importDeclaration(typesToAdd.map(typeName => j.importSpecifier(j.identifier(typeName))), j.stringLiteral(importSource));
|
|
184
|
+
const firstImport = root.find(j.ImportDeclaration).at(0);
|
|
185
|
+
if (firstImport.size() > 0) {
|
|
186
|
+
firstImport.insertBefore(newImport);
|
|
187
|
+
} else {
|
|
188
|
+
root.get().node.program.body.unshift(newImport);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return root.toSource(printOptions);
|
|
193
|
+
}
|
|
194
|
+
const testConfig = () => ({
|
|
195
|
+
name: 'remove-deprecated-series-types',
|
|
196
|
+
specFiles: [{
|
|
197
|
+
name: 'root-imports',
|
|
198
|
+
actual: (0, _readFile.default)(_nodePath.default.join(__dirname, 'actual-root-imports.spec.tsx')),
|
|
199
|
+
expected: (0, _readFile.default)(_nodePath.default.join(__dirname, 'expected-root-imports.spec.tsx'))
|
|
200
|
+
}, {
|
|
201
|
+
name: 'nested-imports',
|
|
202
|
+
actual: (0, _readFile.default)(_nodePath.default.join(__dirname, 'actual-nested-imports.spec.tsx')),
|
|
203
|
+
expected: (0, _readFile.default)(_nodePath.default.join(__dirname, 'expected-nested-imports.spec.tsx'))
|
|
204
|
+
}]
|
|
205
|
+
});
|
|
206
|
+
exports.testConfig = testConfig;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = transformer;
|
|
8
|
+
exports.testConfig = void 0;
|
|
9
|
+
var _path = _interopRequireDefault(require("path"));
|
|
10
|
+
var _removeProps = _interopRequireDefault(require("../../../util/removeProps"));
|
|
11
|
+
var _readFile = _interopRequireDefault(require("../../../util/readFile"));
|
|
12
|
+
const componentNames = ['BarChart', 'LineChart', 'PieChart', 'ScatterChart', 'SparkLineChart', 'RadarChart', 'ChartsContainer', 'BarChartPro', 'LineChartPro', 'PieChartPro', 'ScatterChartPro', 'RadarChartPro', 'FunnelChart', 'Heatmap', 'SankeyChart', 'BarChartPremium', 'HeatmapPremium', 'ChartDataProvider', 'ChartDataProviderPro'];
|
|
13
|
+
function transformer(file, api, options) {
|
|
14
|
+
const j = api.jscodeshift;
|
|
15
|
+
const root = j(file.source);
|
|
16
|
+
const printOptions = options.printOptions || {
|
|
17
|
+
quote: 'single',
|
|
18
|
+
trailingComma: true
|
|
19
|
+
};
|
|
20
|
+
(0, _removeProps.default)({
|
|
21
|
+
root,
|
|
22
|
+
componentNames,
|
|
23
|
+
props: ['enableKeyboardNavigation'],
|
|
24
|
+
shouldRemove: attribute => {
|
|
25
|
+
// Only remove the prop if it's not explicitly set to false or a variable that could be false.
|
|
26
|
+
if (attribute.value === null) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
if (attribute.value?.type === 'JSXExpressionContainer') {
|
|
30
|
+
if (attribute.value.expression.type === 'BooleanLiteral') {
|
|
31
|
+
return attribute.value.expression.value !== false;
|
|
32
|
+
}
|
|
33
|
+
// If it's an expression, we can't be sure of its value, so we keep it.
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
},
|
|
37
|
+
j
|
|
38
|
+
});
|
|
39
|
+
return root.toSource(printOptions);
|
|
40
|
+
}
|
|
41
|
+
const testConfig = () => ({
|
|
42
|
+
name: 'remove-enable-keyboard-navigation',
|
|
43
|
+
specFiles: [{
|
|
44
|
+
name: 'remove enableKeyboardNavigation prop',
|
|
45
|
+
actual: (0, _readFile.default)(_path.default.join(__dirname, 'actual.spec.tsx')),
|
|
46
|
+
expected: (0, _readFile.default)(_path.default.join(__dirname, 'expected.spec.tsx'))
|
|
47
|
+
}]
|
|
48
|
+
});
|
|
49
|
+
exports.testConfig = testConfig;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = transformer;
|
|
8
|
+
exports.testConfig = void 0;
|
|
9
|
+
var _nodePath = _interopRequireDefault(require("node:path"));
|
|
10
|
+
var _readFile = _interopRequireDefault(require("../../../util/readFile"));
|
|
11
|
+
const REMOVED_FUNCTIONS = ['isBarSeries', 'isDefaultizedBarSeries'];
|
|
12
|
+
function transformer(file, api, options) {
|
|
13
|
+
const j = api.jscodeshift;
|
|
14
|
+
const root = j(file.source);
|
|
15
|
+
const printOptions = options.printOptions || {
|
|
16
|
+
quote: 'single',
|
|
17
|
+
trailingComma: true,
|
|
18
|
+
wrapColumn: 40
|
|
19
|
+
};
|
|
20
|
+
const importedFunctions = {};
|
|
21
|
+
|
|
22
|
+
// Find and remove imports of isBarSeries and isDefaultizedBarSeries
|
|
23
|
+
const packageRegex = /^@mui\/x-charts(-pro|-premium)?(\/(models|internals))?$/;
|
|
24
|
+
root.find(j.ImportDeclaration).forEach(astPath => {
|
|
25
|
+
const source = astPath.node.source.value?.toString() ?? '';
|
|
26
|
+
if (!packageRegex.test(source)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const specifiers = astPath.node.specifiers || [];
|
|
30
|
+
const remainingSpecifiers = [];
|
|
31
|
+
specifiers.forEach(specifier => {
|
|
32
|
+
if (specifier.type === 'ImportSpecifier') {
|
|
33
|
+
const importedName = specifier.imported.name.toString();
|
|
34
|
+
if (REMOVED_FUNCTIONS.includes(importedName)) {
|
|
35
|
+
// Track the local name used for this import
|
|
36
|
+
const localName = specifier.local?.name.toString() || importedName;
|
|
37
|
+
importedFunctions[localName] = importedName;
|
|
38
|
+
} else {
|
|
39
|
+
remainingSpecifiers.push(specifier);
|
|
40
|
+
}
|
|
41
|
+
} else {
|
|
42
|
+
remainingSpecifiers.push(specifier);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
if (remainingSpecifiers.length === 0) {
|
|
46
|
+
// Remove the entire import declaration if no specifiers remain
|
|
47
|
+
j(astPath).remove();
|
|
48
|
+
} else if (remainingSpecifiers.length !== specifiers.length) {
|
|
49
|
+
// Update the import declaration with remaining specifiers
|
|
50
|
+
astPath.node.specifiers = remainingSpecifiers;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// If no relevant imports were found, return the source unchanged to avoid reformatting
|
|
55
|
+
if (Object.keys(importedFunctions).length === 0) {
|
|
56
|
+
return file.source;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Replace function calls with series.type === 'bar'
|
|
60
|
+
// isBarSeries(series) -> series.type === 'bar'
|
|
61
|
+
// isDefaultizedBarSeries(series) -> series.type === 'bar'
|
|
62
|
+
Object.keys(importedFunctions).forEach(localName => {
|
|
63
|
+
root.find(j.CallExpression, {
|
|
64
|
+
callee: {
|
|
65
|
+
type: 'Identifier',
|
|
66
|
+
name: localName
|
|
67
|
+
}
|
|
68
|
+
}).replaceWith(astPath => {
|
|
69
|
+
const args = astPath.node.arguments;
|
|
70
|
+
if (args.length !== 1) {
|
|
71
|
+
// If not exactly 1 argument, keep as-is (shouldn't happen)
|
|
72
|
+
return astPath.node;
|
|
73
|
+
}
|
|
74
|
+
const arg = args[0];
|
|
75
|
+
if (arg.type === 'SpreadElement') {
|
|
76
|
+
// Can't handle spread elements
|
|
77
|
+
return astPath.node;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Create: arg.type === 'bar'
|
|
81
|
+
return j.binaryExpression('===', j.memberExpression(arg, j.identifier('type')), j.stringLiteral('bar'));
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
return root.toSource(printOptions);
|
|
85
|
+
}
|
|
86
|
+
const testConfig = () => ({
|
|
87
|
+
name: 'remove-is-bar-series-helpers',
|
|
88
|
+
specFiles: [{
|
|
89
|
+
name: 'root-imports',
|
|
90
|
+
actual: (0, _readFile.default)(_nodePath.default.join(__dirname, 'actual-root-imports.spec.tsx')),
|
|
91
|
+
expected: (0, _readFile.default)(_nodePath.default.join(__dirname, 'expected-root-imports.spec.tsx'))
|
|
92
|
+
}, {
|
|
93
|
+
name: 'nested-imports',
|
|
94
|
+
actual: (0, _readFile.default)(_nodePath.default.join(__dirname, 'actual-nested-imports.spec.tsx')),
|
|
95
|
+
expected: (0, _readFile.default)(_nodePath.default.join(__dirname, 'expected-nested-imports.spec.tsx'))
|
|
96
|
+
}]
|
|
97
|
+
});
|
|
98
|
+
exports.testConfig = testConfig;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = transformer;
|
|
8
|
+
exports.testConfig = void 0;
|
|
9
|
+
var _path = _interopRequireDefault(require("path"));
|
|
10
|
+
var _removeObjectProperty = _interopRequireDefault(require("../../../util/removeObjectProperty"));
|
|
11
|
+
var _readFile = _interopRequireDefault(require("../../../util/readFile"));
|
|
12
|
+
const componentsNames = ['BarChart', 'LineChart', 'PieChart', 'ScatterChart', 'SparkLineChart', 'RadarChart', 'ChartsContainer', 'ChartsDataProvider', 'BarChartPro', 'LineChartPro', 'PieChartPro', 'ScatterChartPro', 'RadarChartPro', 'FunnelChart', 'Heatmap', 'SankeyChart', 'BarChartPremium', 'HeatmapPremium', 'ChartDataProvider', 'ChartDataProviderPro', 'ChartDataProviderPremium', 'ChartsDataProviderPro', 'ChartsDataProviderPremium'];
|
|
13
|
+
const propName = 'experimentalFeatures';
|
|
14
|
+
const propKeys = ['preferStrictDomainInLineCharts'];
|
|
15
|
+
function transformer(file, api, options) {
|
|
16
|
+
const j = api.jscodeshift;
|
|
17
|
+
const root = j(file.source);
|
|
18
|
+
const printOptions = options.printOptions || {
|
|
19
|
+
quote: 'single',
|
|
20
|
+
trailingComma: true
|
|
21
|
+
};
|
|
22
|
+
propKeys.forEach(propKey => {
|
|
23
|
+
(0, _removeObjectProperty.default)({
|
|
24
|
+
root,
|
|
25
|
+
j,
|
|
26
|
+
propName,
|
|
27
|
+
componentsNames,
|
|
28
|
+
propKey
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
return root.toSource(printOptions);
|
|
32
|
+
}
|
|
33
|
+
const testConfig = () => ({
|
|
34
|
+
name: 'remove-stabilized-experimentalFeatures',
|
|
35
|
+
specFiles: [{
|
|
36
|
+
name: 'remove preferStrictDomainInLineCharts from experimentalFeatures',
|
|
37
|
+
actual: (0, _readFile.default)(_path.default.join(__dirname, 'actual.spec.tsx')),
|
|
38
|
+
expected: (0, _readFile.default)(_path.default.join(__dirname, 'expected.spec.tsx'))
|
|
39
|
+
}]
|
|
40
|
+
});
|
|
41
|
+
exports.testConfig = testConfig;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = transformer;
|
|
8
|
+
exports.testConfig = void 0;
|
|
9
|
+
var _path = _interopRequireDefault(require("path"));
|
|
10
|
+
var _readFile = _interopRequireDefault(require("../../../util/readFile"));
|
|
11
|
+
var _renameClasses = require("../../../util/renameClasses");
|
|
12
|
+
function transformer(file, api, options) {
|
|
13
|
+
const j = api.jscodeshift;
|
|
14
|
+
const root = j(file.source);
|
|
15
|
+
const printOptions = options.printOptions || {
|
|
16
|
+
quote: 'single',
|
|
17
|
+
trailingComma: true
|
|
18
|
+
};
|
|
19
|
+
(0, _renameClasses.renameClasses)({
|
|
20
|
+
j,
|
|
21
|
+
root,
|
|
22
|
+
packageNames: ['@mui/x-charts', '@mui/x-charts-pro', '@mui/x-charts-premium'],
|
|
23
|
+
classes: {
|
|
24
|
+
barElementClasses: {
|
|
25
|
+
newClassName: 'barClasses',
|
|
26
|
+
properties: {
|
|
27
|
+
root: 'element'
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
barLabelClasses: {
|
|
31
|
+
newClassName: 'barClasses',
|
|
32
|
+
properties: {
|
|
33
|
+
root: 'label',
|
|
34
|
+
animate: 'labelAnimate'
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
pieArcClasses: {
|
|
38
|
+
newClassName: 'pieClasses',
|
|
39
|
+
properties: {
|
|
40
|
+
root: 'arc'
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
pieArcLabelClasses: {
|
|
44
|
+
newClassName: 'pieClasses',
|
|
45
|
+
properties: {
|
|
46
|
+
root: 'arcLabel'
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
radarSeriesPlotClasses: {
|
|
50
|
+
newClassName: 'radarClasses',
|
|
51
|
+
properties: {
|
|
52
|
+
root: 'seriesRoot',
|
|
53
|
+
area: 'seriesArea',
|
|
54
|
+
mark: 'seriesMark'
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
areaElementClasses: {
|
|
58
|
+
newClassName: 'lineClasses',
|
|
59
|
+
properties: {
|
|
60
|
+
root: 'area'
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
lineElementClasses: {
|
|
64
|
+
newClassName: 'lineClasses',
|
|
65
|
+
properties: {
|
|
66
|
+
root: 'line'
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
markElementClasses: {
|
|
70
|
+
newClassName: 'lineClasses',
|
|
71
|
+
properties: {
|
|
72
|
+
root: 'mark',
|
|
73
|
+
animate: 'markAnimate'
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
lineHighlightElementClasses: {
|
|
77
|
+
newClassName: 'lineClasses',
|
|
78
|
+
properties: {
|
|
79
|
+
root: 'highlight'
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
funnelSectionClasses: {
|
|
83
|
+
newClassName: 'funnelClasses',
|
|
84
|
+
properties: {
|
|
85
|
+
root: 'section',
|
|
86
|
+
filled: 'sectionFilled',
|
|
87
|
+
outlined: 'sectionOutlined',
|
|
88
|
+
label: 'sectionLabel'
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
sankeyPlotClasses: {
|
|
92
|
+
newClassName: 'sankeyClasses',
|
|
93
|
+
properties: {}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Classes that had same name as cartesian classes but only for radar charts.
|
|
99
|
+
(0, _renameClasses.renameClasses)({
|
|
100
|
+
j,
|
|
101
|
+
root,
|
|
102
|
+
packageNames: ['@mui/x-charts/RadarChart', '@mui/x-charts-pro/RadarChart', '@mui/x-charts-premium/RadarChart'],
|
|
103
|
+
classes: {
|
|
104
|
+
chartsAxisHighlightClasses: {
|
|
105
|
+
newClassName: 'radarClasses',
|
|
106
|
+
properties: {
|
|
107
|
+
root: 'axisHighlightRoot',
|
|
108
|
+
line: 'axisHighlightLine',
|
|
109
|
+
dot: 'axisHighlightDot'
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
chartsAxisClasses: {
|
|
113
|
+
newClassName: 'radarClasses',
|
|
114
|
+
properties: {
|
|
115
|
+
root: 'axisRoot',
|
|
116
|
+
line: 'axisLine',
|
|
117
|
+
label: 'axisLabel'
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
chartsGridClasses: {
|
|
121
|
+
newClassName: 'radarClasses',
|
|
122
|
+
properties: {
|
|
123
|
+
radial: 'gridRadial',
|
|
124
|
+
divider: 'gridDivider',
|
|
125
|
+
stripe: 'gridStripe'
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
return root.toSource(printOptions);
|
|
131
|
+
}
|
|
132
|
+
const testConfig = () => ({
|
|
133
|
+
name: 'rename-classes',
|
|
134
|
+
specFiles: [{
|
|
135
|
+
name: 'rename barElementClasses to barClasses',
|
|
136
|
+
actual: (0, _readFile.default)(_path.default.join(__dirname, 'actual-imports.spec.tsx')),
|
|
137
|
+
expected: (0, _readFile.default)(_path.default.join(__dirname, 'expected-imports.spec.tsx'))
|
|
138
|
+
}, {
|
|
139
|
+
name: 'rename radar-specific classes only when imported from RadarChart',
|
|
140
|
+
actual: (0, _readFile.default)(_path.default.join(__dirname, 'actual-radar-imports.spec.tsx')),
|
|
141
|
+
expected: (0, _readFile.default)(_path.default.join(__dirname, 'expected-radar-imports.spec.tsx'))
|
|
142
|
+
}, {
|
|
143
|
+
name: 'do not rename radar-specific classes when imported from root package',
|
|
144
|
+
actual: (0, _readFile.default)(_path.default.join(__dirname, 'actual-not-radar-imports.spec.tsx')),
|
|
145
|
+
expected: (0, _readFile.default)(_path.default.join(__dirname, 'expected-not-radar-imports.spec.tsx'))
|
|
146
|
+
}]
|
|
147
|
+
});
|
|
148
|
+
exports.testConfig = testConfig;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = transformer;
|
|
8
|
+
exports.testConfig = void 0;
|
|
9
|
+
var _path = _interopRequireDefault(require("path"));
|
|
10
|
+
var _readFile = _interopRequireDefault(require("../../../util/readFile"));
|
|
11
|
+
var _renameProps = _interopRequireDefault(require("../../../util/renameProps"));
|
|
12
|
+
function transformer(file, api, options) {
|
|
13
|
+
const j = api.jscodeshift;
|
|
14
|
+
const root = j(file.source);
|
|
15
|
+
const printOptions = options.printOptions || {
|
|
16
|
+
quote: 'single',
|
|
17
|
+
trailingComma: true
|
|
18
|
+
};
|
|
19
|
+
(0, _renameProps.default)({
|
|
20
|
+
j,
|
|
21
|
+
root,
|
|
22
|
+
componentNames: ['ScatterChart', 'ScatterChartPro', 'SparkLineChart', 'ChartsContainer', 'ChartContainer', 'ChartDataProvider', 'ChartsDataProvider', 'ChartDataProviderPro', 'ChartsDataProviderPro', 'ChartDataProviderPremium', 'ChartsDataProviderPremium'],
|
|
23
|
+
props: {
|
|
24
|
+
voronoiMaxRadius: 'hitAreaRadius',
|
|
25
|
+
disableVoronoi: 'disableHitArea'
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return root.toSource(printOptions);
|
|
29
|
+
}
|
|
30
|
+
const testConfig = () => ({
|
|
31
|
+
name: 'rename-voronoi-max-radius',
|
|
32
|
+
specFiles: [{
|
|
33
|
+
name: 'rename voronoiMaxRadius to hitAreaRadius and disableVoronoi to disableHitArea',
|
|
34
|
+
actual: (0, _readFile.default)(_path.default.join(__dirname, 'actual-imports.spec.tsx')),
|
|
35
|
+
expected: (0, _readFile.default)(_path.default.join(__dirname, 'expected-imports.spec.tsx'))
|
|
36
|
+
}]
|
|
37
|
+
});
|
|
38
|
+
exports.testConfig = testConfig;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = transformer;
|
|
8
|
+
exports.testConfig = void 0;
|
|
9
|
+
var _path = _interopRequireDefault(require("path"));
|
|
10
|
+
var _removeObjectProperty = _interopRequireDefault(require("../../../util/removeObjectProperty"));
|
|
11
|
+
var _readFile = _interopRequireDefault(require("../../../util/readFile"));
|
|
12
|
+
const componentsNames = ['DataGridPremium'];
|
|
13
|
+
const propName = 'experimentalFeatures';
|
|
14
|
+
const propKeys = ['charts'];
|
|
15
|
+
function transformer(file, api, options) {
|
|
16
|
+
const j = api.jscodeshift;
|
|
17
|
+
const root = j(file.source);
|
|
18
|
+
const printOptions = options.printOptions || {
|
|
19
|
+
quote: 'single',
|
|
20
|
+
trailingComma: true
|
|
21
|
+
};
|
|
22
|
+
propKeys.forEach(propKey => {
|
|
23
|
+
(0, _removeObjectProperty.default)({
|
|
24
|
+
root,
|
|
25
|
+
j,
|
|
26
|
+
propName,
|
|
27
|
+
componentsNames,
|
|
28
|
+
propKey
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
return root.toSource(printOptions);
|
|
32
|
+
}
|
|
33
|
+
const testConfig = () => ({
|
|
34
|
+
name: 'remove-stabilized-experimentalFeatures',
|
|
35
|
+
specFiles: [{
|
|
36
|
+
name: 'remove charts from experimentalFeatures',
|
|
37
|
+
actual: (0, _readFile.default)(_path.default.join(__dirname, 'actual.spec.tsx')),
|
|
38
|
+
expected: (0, _readFile.default)(_path.default.join(__dirname, 'expected.spec.tsx'))
|
|
39
|
+
}]
|
|
40
|
+
});
|
|
41
|
+
exports.testConfig = testConfig;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = transformer;
|
|
8
|
+
var _renameFieldRef = _interopRequireDefault(require("../rename-field-ref"));
|
|
9
|
+
function transformer(file, api, options) {
|
|
10
|
+
[_renameFieldRef.default].forEach(transform => {
|
|
11
|
+
file.source = transform(file, api, options);
|
|
12
|
+
});
|
|
13
|
+
return file.source;
|
|
14
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = transformer;
|
|
8
|
+
exports.testConfig = void 0;
|
|
9
|
+
var _path = _interopRequireDefault(require("path"));
|
|
10
|
+
var _renameProps = _interopRequireDefault(require("../../../util/renameProps"));
|
|
11
|
+
var _readFile = _interopRequireDefault(require("../../../util/readFile"));
|
|
12
|
+
const fieldNames = ['DateField', 'DateTimeField', 'TimeField', 'DateRangeField', 'DateTimeRangeField', 'TimeRangeField', 'MultiInputDateRangeField', 'MultiInputDateTimeRangeField', 'MultiInputTimeRangeField', 'SingleInputDateRangeField', 'SingleInputDateTimeRangeField', 'SingleInputTimeRangeField'];
|
|
13
|
+
const pickerNames = ['DatePicker', 'DesktopDatePicker', 'MobileDatePicker', 'StaticDatePicker', 'DateTimePicker', 'DesktopDateTimePicker', 'MobileDateTimePicker', 'StaticDateTimePicker', 'TimePicker', 'DesktopTimePicker', 'MobileTimePicker', 'StaticTimePicker', 'DateRangePicker', 'DesktopDateRangePicker', 'MobileDateRangePicker', 'StaticDateRangePicker', 'DateTimeRangePicker', 'DesktopDateTimeRangePicker', 'MobileDateTimeRangePicker', 'TimeRangePicker', 'DesktopTimeRangePicker', 'MobileTimeRangePicker'];
|
|
14
|
+
const props = {
|
|
15
|
+
unstableFieldRef: 'fieldRef',
|
|
16
|
+
unstableStartFieldRef: 'startFieldRef',
|
|
17
|
+
unstableEndFieldRef: 'endFieldRef'
|
|
18
|
+
};
|
|
19
|
+
function transformer(file, api, options) {
|
|
20
|
+
const j = api.jscodeshift;
|
|
21
|
+
const root = j(file.source);
|
|
22
|
+
const printOptions = options.printOptions || {
|
|
23
|
+
quote: 'single',
|
|
24
|
+
trailingComma: true
|
|
25
|
+
};
|
|
26
|
+
(0, _renameProps.default)({
|
|
27
|
+
root,
|
|
28
|
+
j,
|
|
29
|
+
props,
|
|
30
|
+
componentNames: fieldNames
|
|
31
|
+
});
|
|
32
|
+
pickerNames.forEach(componentName => {
|
|
33
|
+
root.find(j.JSXElement, {
|
|
34
|
+
openingElement: {
|
|
35
|
+
name: {
|
|
36
|
+
name: componentName
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}).forEach(elementPath => {
|
|
40
|
+
j(elementPath).find(j.JSXAttribute, {
|
|
41
|
+
name: {
|
|
42
|
+
name: 'slotProps'
|
|
43
|
+
}
|
|
44
|
+
}).forEach(slotPropsAttr => {
|
|
45
|
+
const value = slotPropsAttr.node.value;
|
|
46
|
+
if (value?.type === 'JSXExpressionContainer' && value.expression.type === 'ObjectExpression') {
|
|
47
|
+
const fieldProp = value.expression.properties.find(p => p.key.name === 'field' || p.key.value === 'field');
|
|
48
|
+
if (fieldProp && fieldProp.value.type === 'ObjectExpression') {
|
|
49
|
+
const unstableFieldRefProp = fieldProp.value.properties.find(p => p.key.name === 'unstableFieldRef' || p.key.value === 'unstableFieldRef');
|
|
50
|
+
if (unstableFieldRefProp) {
|
|
51
|
+
unstableFieldRefProp.key.name = 'fieldRef';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
j(elementPath).find(j.JSXAttribute).filter(attrPath => ['fieldRef', 'unstableFieldRef'].includes(attrPath.value.name.name)).forEach(attr => {
|
|
57
|
+
const value = attr.node.value;
|
|
58
|
+
const slotPropsAttr = j(elementPath).find(j.JSXAttribute, {
|
|
59
|
+
name: {
|
|
60
|
+
name: 'slotProps'
|
|
61
|
+
}
|
|
62
|
+
}).at(0);
|
|
63
|
+
const fieldRefProperty = j.objectProperty(j.identifier('fieldRef'), value?.type === 'JSXExpressionContainer' ? value.expression : value);
|
|
64
|
+
if (slotPropsAttr.size() > 0) {
|
|
65
|
+
const slotPropsValue = slotPropsAttr.get().node.value;
|
|
66
|
+
if (slotPropsValue.type === 'JSXExpressionContainer') {
|
|
67
|
+
const expression = slotPropsValue.expression;
|
|
68
|
+
if (expression.type === 'ObjectExpression') {
|
|
69
|
+
const fieldProp = expression.properties.find(p => p.key.name === 'field' || p.key.value === 'field');
|
|
70
|
+
if (fieldProp && fieldProp.value.type === 'ObjectExpression') {
|
|
71
|
+
fieldProp.value.properties.push(fieldRefProperty);
|
|
72
|
+
} else {
|
|
73
|
+
expression.properties.push(j.objectProperty(j.identifier('field'), j.objectExpression([fieldRefProperty])));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
} else {
|
|
78
|
+
elementPath.value.openingElement.attributes?.push(j.jsxAttribute(j.jsxIdentifier('slotProps'), j.jsxExpressionContainer(j.objectExpression([j.objectProperty(j.identifier('field'), j.objectExpression([fieldRefProperty]))]))));
|
|
79
|
+
}
|
|
80
|
+
j(attr).remove();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
return root.toSource(printOptions);
|
|
85
|
+
}
|
|
86
|
+
const testConfig = () => ({
|
|
87
|
+
name: 'rename-field-ref',
|
|
88
|
+
specFiles: [{
|
|
89
|
+
name: 'rename unstable field refs to stable ones',
|
|
90
|
+
actual: (0, _readFile.default)(_path.default.join(__dirname, 'actual.spec.tsx')),
|
|
91
|
+
expected: (0, _readFile.default)(_path.default.join(__dirname, 'expected.spec.tsx'))
|
|
92
|
+
}]
|
|
93
|
+
});
|
|
94
|
+
exports.testConfig = testConfig;
|
|
@@ -6,10 +6,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.default = transformer;
|
|
8
8
|
var _presetSafe = _interopRequireDefault(require("../charts/preset-safe"));
|
|
9
|
+
var _presetSafe2 = _interopRequireDefault(require("../pickers/preset-safe"));
|
|
9
10
|
function transformer(file, api, options) {
|
|
10
11
|
[
|
|
11
12
|
// Add others here as they are created
|
|
12
|
-
_presetSafe.default].forEach(transform => {
|
|
13
|
+
_presetSafe.default, _presetSafe2.default].forEach(transform => {
|
|
13
14
|
file.source = transform(file, api, options);
|
|
14
15
|
});
|
|
15
16
|
return file.source;
|