@mui/codemod 6.3.0 → 6.3.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/README.md CHANGED
@@ -1406,6 +1406,54 @@ npx @mui/codemod@latest deprecations/popper-props <path>
1406
1406
  npx @mui/codemod@latest deprecations/outlined-input-props <path>
1407
1407
  ```
1408
1408
 
1409
+ #### `select-classes`
1410
+
1411
+ JS transforms:
1412
+
1413
+ ```diff
1414
+ import { selectClasses } from '@mui/material/Select';
1415
+
1416
+ MuiSelect: {
1417
+ styleOverrides: {
1418
+ root: {
1419
+ - [`& .${selectClasses.iconFilled}`]: {
1420
+ + [`& .${selectClasses.filled} ~ .${selectClasses.icon}`]: {
1421
+ color: 'red',
1422
+ },
1423
+ - [`& .${selectClasses.iconOutlined}`]: {
1424
+ + [`& .${selectClasses.outlined} ~ .${selectClasses.icon}`]: {
1425
+ color: 'red',
1426
+ },
1427
+ - [`& .${selectClasses.iconStandard}`]: {
1428
+ + [`& .${selectClasses.standard} ~ .${selectClasses.icon}`]: {
1429
+ color: 'red',
1430
+ },
1431
+ },
1432
+ },
1433
+ },
1434
+ ```
1435
+
1436
+ CSS transforms:
1437
+
1438
+ ```diff
1439
+ - .MuiSelect-iconFilled
1440
+ + .MuiSelect-filled ~ .MuiSelect-icon
1441
+ ```
1442
+
1443
+ ```diff
1444
+ - .MuiSelect-iconOutlined
1445
+ + .MuiSelect-outlined ~ .MuiSelect-icon
1446
+ ```
1447
+
1448
+ ```diff
1449
+ - .MuiSelect-iconStandard
1450
+ + .MuiSelect-standard ~ .MuiSelect-icon
1451
+ ```
1452
+
1453
+ ```bash
1454
+ npx @mui/codemod@latest deprecations/select-classes <path>
1455
+ ```
1456
+
1409
1457
  #### `slider-props`
1410
1458
 
1411
1459
  ```diff
@@ -28,6 +28,7 @@ var _outlinedInputProps = _interopRequireDefault(require("../outlined-input-prop
28
28
  var _paginationItemClasses = _interopRequireDefault(require("../pagination-item-classes"));
29
29
  var _speedDialProps = _interopRequireDefault(require("../speed-dial-props"));
30
30
  var _tableSortLabelClasses = _interopRequireDefault(require("../table-sort-label-classes"));
31
+ var _selectClasses = _interopRequireDefault(require("../select-classes"));
31
32
  var _stepConnectorClasses = _interopRequireDefault(require("../step-connector-classes"));
32
33
  var _stepContentProps = _interopRequireDefault(require("../step-content-props"));
33
34
  var _stepLabelProps = _interopRequireDefault(require("../step-label-props"));
@@ -68,6 +69,7 @@ function deprecationsAll(file, api, options) {
68
69
  file.source = (0, _stepLabelProps.default)(file, api, options);
69
70
  file.source = (0, _tableSortLabelClasses.default)(file, api, options);
70
71
  file.source = (0, _textFieldProps.default)(file, api, options);
72
+ file.source = (0, _selectClasses.default)(file, api, options);
71
73
  file.source = (0, _tabClasses.default)(file, api, options);
72
74
  file.source = (0, _toggleButtonGroupClasses.default)(file, api, options);
73
75
  file.source = (0, _tooltipProps.default)(file, api, options);
@@ -33,6 +33,9 @@ const {
33
33
  const {
34
34
  plugin: tableSortLabelClassesPlugin
35
35
  } = require('../table-sort-label-classes/postcss-plugin');
36
+ const {
37
+ plugin: selectClassesPlugin
38
+ } = require('../select-classes/postcss-plugin');
36
39
  module.exports = {
37
- plugins: [accordionSummaryClassesPlugin, alertClassesPlugin, buttonClassesPlugin, buttonGroupClassesPlugin, chipClassesPlugin, circularProgressClassesPlugin, paginationItemClassesPlugin, stepConnectorClassesPlugin, toggleButtonGroupClassesPlugin, tabClassesPlugin, tableSortLabelClassesPlugin]
40
+ plugins: [accordionSummaryClassesPlugin, alertClassesPlugin, buttonClassesPlugin, buttonGroupClassesPlugin, chipClassesPlugin, circularProgressClassesPlugin, paginationItemClassesPlugin, stepConnectorClassesPlugin, toggleButtonGroupClassesPlugin, tabClassesPlugin, tableSortLabelClassesPlugin, selectClassesPlugin]
38
41
  };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ Object.defineProperty(exports, "default", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _selectClasses.default;
11
+ }
12
+ });
13
+ var _selectClasses = _interopRequireDefault(require("./select-classes"));
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ const classes = [{
4
+ deprecatedClass: ' .MuiSelect-iconFilled',
5
+ replacementSelector: ' .MuiSelect-filled ~ .MuiSelect-icon'
6
+ }, {
7
+ deprecatedClass: ' .MuiSelect-iconOutlined',
8
+ replacementSelector: ' .MuiSelect-outlined ~ .MuiSelect-icon'
9
+ }, {
10
+ deprecatedClass: ' .MuiSelect-iconStandard',
11
+ replacementSelector: ' .MuiSelect-standard ~ .MuiSelect-icon'
12
+ }];
13
+ const plugin = () => {
14
+ return {
15
+ postcssPlugin: `Replace deprecated Select classes with new classes`,
16
+ Rule(rule) {
17
+ const {
18
+ selector
19
+ } = rule;
20
+ classes.forEach(({
21
+ deprecatedClass,
22
+ replacementSelector
23
+ }) => {
24
+ const selectorRegex = new RegExp(`${deprecatedClass.trim()}$`);
25
+ if (selector.match(selectorRegex)) {
26
+ rule.selector = selector.replace(selectorRegex, replacementSelector);
27
+ }
28
+ });
29
+ }
30
+ };
31
+ };
32
+ plugin.postcss = true;
33
+ module.exports = {
34
+ plugin,
35
+ classes
36
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ const {
4
+ plugin
5
+ } = require('./postcss-plugin');
6
+ module.exports = {
7
+ plugins: [plugin]
8
+ };
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = transformer;
7
+ var _postcssPlugin = require("./postcss-plugin");
8
+ /**
9
+ * @param {import('jscodeshift').FileInfo} file
10
+ * @param {import('jscodeshift').API} api
11
+ */
12
+ function transformer(file, api, options) {
13
+ const j = api.jscodeshift;
14
+ const root = j(file.source);
15
+ const printOptions = options.printOptions;
16
+ _postcssPlugin.classes.forEach(({
17
+ deprecatedClass,
18
+ replacementSelector
19
+ }) => {
20
+ const replacementSelectorPrefix = '&';
21
+ root.find(j.ImportDeclaration).filter(path => path.node.source.value.match(/^@mui\/material\/Select$/)).forEach(path => {
22
+ path.node.specifiers.forEach(specifier => {
23
+ if (specifier.type === 'ImportSpecifier' && specifier.imported.name === 'selectClasses') {
24
+ const deprecatedAtomicClass = deprecatedClass.replace(`${deprecatedClass.split('-')[0]}-`, '');
25
+ root.find(j.MemberExpression, {
26
+ object: {
27
+ name: specifier.local.name
28
+ },
29
+ property: {
30
+ name: deprecatedAtomicClass
31
+ }
32
+ }).forEach(memberExpression => {
33
+ const parent = memberExpression.parentPath.parentPath.value;
34
+ if (parent.type === j.TemplateLiteral.name) {
35
+ const memberExpressionIndex = parent.expressions.findIndex(expression => expression === memberExpression.value);
36
+ const precedingTemplateElement = parent.quasis[memberExpressionIndex];
37
+ const atomicClasses = replacementSelector.replaceAll('MuiSelect-', '').replaceAll(replacementSelectorPrefix, '').replaceAll(' ~ ', '').split('.').map(className => className.trim()).filter(Boolean);
38
+ if (precedingTemplateElement.value.raw.endsWith(deprecatedClass.startsWith(' ') ? `${replacementSelectorPrefix} .` : `${replacementSelectorPrefix}.`)) {
39
+ const atomicClassesArgs = [memberExpressionIndex, 1, ...atomicClasses.map(atomicClass => j.memberExpression(memberExpression.value.object, j.identifier(atomicClass)))];
40
+ parent.expressions.splice(...atomicClassesArgs);
41
+ if (replacementSelector.includes(' ~ ')) {
42
+ const quasisArgs = [memberExpressionIndex, 1, j.templateElement({
43
+ raw: precedingTemplateElement.value.raw,
44
+ cooked: precedingTemplateElement.value.cooked.replace(' ', '')
45
+ }, false), j.templateElement({
46
+ raw: ' ~ .',
47
+ cooked: ' ~ .'
48
+ }, false)];
49
+ if (atomicClasses.length === 3) {
50
+ quasisArgs.splice(3, 0, j.templateElement({
51
+ raw: '.',
52
+ cooked: '.'
53
+ }, false));
54
+ }
55
+ parent.quasis.splice(...quasisArgs);
56
+ } else {
57
+ parent.quasis.splice(memberExpressionIndex, 1, j.templateElement({
58
+ raw: precedingTemplateElement.value.raw,
59
+ cooked: precedingTemplateElement.value.cooked
60
+ }, false), j.templateElement({
61
+ raw: '.',
62
+ cooked: '.'
63
+ }, false));
64
+ }
65
+ }
66
+ }
67
+ });
68
+ }
69
+ });
70
+ });
71
+ const selectorRegex = new RegExp(`${replacementSelectorPrefix}${deprecatedClass}$`);
72
+ root.find(j.Literal, literal => typeof literal.value === 'string' && literal.value.match(selectorRegex)).forEach(path => {
73
+ path.replace(j.literal(path.value.value.replace(selectorRegex, `${replacementSelectorPrefix}${replacementSelector}`)));
74
+ });
75
+ });
76
+ return root.toSource(printOptions);
77
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ var _Select = require("@mui/material/Select");
4
+ '& .MuiSelect-iconFilled';
5
+ '& .MuiSelect-iconOutlined';
6
+ '& .MuiSelect-iconStandard';
7
+ `& .${_Select.selectClasses.iconFilled}`;
8
+ `& .${_Select.selectClasses.iconOutlined}`;
9
+ `& .${_Select.selectClasses.iconStandard}`;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ var _Select = require("@mui/material/Select");
4
+ "& .MuiSelect-filled ~ .MuiSelect-icon";
5
+ "& .MuiSelect-outlined ~ .MuiSelect-icon";
6
+ "& .MuiSelect-standard ~ .MuiSelect-icon";
7
+ `& .${_Select.selectClasses.filled} ~ .${_Select.selectClasses.icon}`;
8
+ `& .${_Select.selectClasses.outlined} ~ .${_Select.selectClasses.icon}`;
9
+ `& .${_Select.selectClasses.standard} ~ .${_Select.selectClasses.icon}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/codemod",
3
- "version": "6.3.0",
3
+ "version": "6.3.1",
4
4
  "bin": "./codemod.js",
5
5
  "private": false,
6
6
  "author": "MUI Team",