@mui/codemod 7.0.0-alpha.1 → 7.0.0-alpha.2

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
@@ -1289,6 +1289,60 @@ npx @mui/codemod@latest deprecations/image-list-item-bar-classes <path>
1289
1289
  npx @mui/codemod@latest deprecations/input-base-props <path>
1290
1290
  ```
1291
1291
 
1292
+ #### `input-base-classes`
1293
+
1294
+ JS transforms:
1295
+
1296
+ ```diff
1297
+ import { inputBaseClasses } from '@mui/material/InputBase';
1298
+
1299
+ MuiInputBase: {
1300
+ styleOverrides: {
1301
+ root: {
1302
+ - [`& .${inputBaseClasses.inputSizeSmall}`]: {
1303
+ + [`&.${inputBaseClasses.sizeSmall} > .${inputBaseClasses.input}`]: {
1304
+ color: 'red',
1305
+ },
1306
+ - [`& .${inputBaseClasses.inputMultiline}`]: {
1307
+ + [`&.${inputBaseClasses.multiline} > .${inputBaseClasses.input}`]: {
1308
+ color: 'red',
1309
+ },
1310
+ - [`& .${inputBaseClasses.inputAdornedStart}`]: {
1311
+ + [`&.${inputBaseClasses.adornedStart} > .${inputBaseClasses.input}`]: {
1312
+ color: 'red',
1313
+ },
1314
+ - [`& .${inputBaseClasses.inputAdornedEnd}`]: {
1315
+ + [`&.${inputBaseClasses.adornedEnd} > .${inputBaseClasses.input}`]: {
1316
+ color: 'red',
1317
+ },
1318
+ - [`& .${inputBaseClasses.inputHiddenLabel}`]: {
1319
+ + [`&.${inputBaseClasses.hiddenLabel} > .${inputBaseClasses.input}`]: {
1320
+ color: 'red',
1321
+ },
1322
+ },
1323
+ },
1324
+ },
1325
+ ```
1326
+
1327
+ CSS transforms:
1328
+
1329
+ ```diff
1330
+ -.MuiInputBase-root .MuiInputBase-inputSizeSmall
1331
+ +.MuiInputBase-root.MuiInputBase-sizeSmall > .MuiInputBase-input
1332
+ -.MuiInputBase-root .MuiInputBase-inputMultiline
1333
+ +.MuiInputBase-root.MuiInputBase-multiline > .MuiInputBase-input
1334
+ -.MuiInputBase-root .MuiInputBase-inputAdornedStart
1335
+ +.MuiInputBase-root.MuiInputBase-adornedStart > .MuiInputBase-input
1336
+ -.MuiInputBase-root .MuiInputBase-inputAdornedEnd
1337
+ +.MuiInputBase-root.MuiInputBase-adornedEnd > .MuiInputBase-input
1338
+ -.MuiInputBase-root .MuiInputBase-inputHiddenLabel
1339
+ +.MuiInputBase-root.MuiInputBase-hiddenLabel > .MuiInputBase-input
1340
+ ```
1341
+
1342
+ ```bash
1343
+ npx @mui/codemod@latest deprecations/input-base-classes <path>
1344
+ ```
1345
+
1292
1346
  #### `input-props`
1293
1347
 
1294
1348
  ```diff
@@ -2058,6 +2112,25 @@ As well as default and named imports from component-level files:
2058
2112
  + import Alert, { alertClasses } from '@mui/material/Alert';
2059
2113
  ```
2060
2114
 
2115
+ #### `input-label-size-normal-medium`
2116
+
2117
+ Updates the `InputLabel`'s `size` value from `normal` to `medium`.
2118
+
2119
+ ```diff
2120
+ -<InputLabel size="normal">Label</InputLabel>
2121
+ +<InputLabel size="medium">Label</InputLabel>
2122
+ ```
2123
+
2124
+ <!-- #npm-tag-reference -->
2125
+
2126
+ ```bash
2127
+ npx @mui/codemod@next v7.0.0/input-label-size-normal-medium <path>
2128
+ ```
2129
+
2130
+ <!-- #host-reference -->
2131
+
2132
+ You can find more details about this breaking change in [the migration guide](https://next.mui.com/material-ui/migration/upgrade-to-v7/#inputlabel).
2133
+
2061
2134
  ### v6.0.0
2062
2135
 
2063
2136
  #### `sx-prop`
@@ -22,6 +22,7 @@ var _filledInputProps = _interopRequireDefault(require("../filled-input-props"))
22
22
  var _formControlLabelProps = _interopRequireDefault(require("../form-control-label-props"));
23
23
  var _imageListItemBarClasses = _interopRequireDefault(require("../image-list-item-bar-classes"));
24
24
  var _inputBaseProps = _interopRequireDefault(require("../input-base-props"));
25
+ var _inputBaseClasses = _interopRequireDefault(require("../input-base-classes"));
25
26
  var _inputProps = _interopRequireDefault(require("../input-props"));
26
27
  var _listItemTextProps = _interopRequireDefault(require("../list-item-text-props"));
27
28
  var _linearProgressClasses = _interopRequireDefault(require("../linear-progress-classes"));
@@ -69,6 +70,7 @@ function deprecationsAll(file, api, options) {
69
70
  file.source = (0, _formControlLabelProps.default)(file, api, options);
70
71
  file.source = (0, _imageListItemBarClasses.default)(file, api, options);
71
72
  file.source = (0, _inputBaseProps.default)(file, api, options);
73
+ file.source = (0, _inputBaseClasses.default)(file, api, options);
72
74
  file.source = (0, _inputProps.default)(file, api, options);
73
75
  file.source = (0, _listItemTextProps.default)(file, api, options);
74
76
  file.source = (0, _linearProgressClasses.default)(file, api, options);
@@ -30,6 +30,9 @@ const {
30
30
  const {
31
31
  plugin: circularProgressClassesPlugin
32
32
  } = require('../circular-progress-classes/postcss-plugin');
33
+ const {
34
+ plugin: inputBaseClassesPlugin
35
+ } = require('../input-base-classes/postcss-plugin');
33
36
  const {
34
37
  plugin: linearProgressClassesPlugin
35
38
  } = require('../linear-progress-classes/postcss-plugin');
@@ -46,5 +49,5 @@ const {
46
49
  plugin: sliderClassesPlugin
47
50
  } = require('../slider-classes/postcss-plugin');
48
51
  module.exports = {
49
- plugins: [accordionSummaryClassesPlugin, alertClassesPlugin, buttonClassesPlugin, buttonGroupClassesPlugin, chipClassesPlugin, circularProgressClassesPlugin, linearProgressClassesPlugin, drawerClassesPlugin, paginationItemClassesPlugin, stepConnectorClassesPlugin, toggleButtonGroupClassesPlugin, tabClassesPlugin, tableSortLabelClassesPlugin, selectClassesPlugin, sliderClassesPlugin]
52
+ plugins: [accordionSummaryClassesPlugin, alertClassesPlugin, buttonClassesPlugin, buttonGroupClassesPlugin, chipClassesPlugin, circularProgressClassesPlugin, inputBaseClassesPlugin, linearProgressClassesPlugin, drawerClassesPlugin, paginationItemClassesPlugin, stepConnectorClassesPlugin, toggleButtonGroupClassesPlugin, tabClassesPlugin, tableSortLabelClassesPlugin, selectClassesPlugin, sliderClassesPlugin]
50
53
  };
@@ -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 _inputBaseClasses.default;
11
+ }
12
+ });
13
+ var _inputBaseClasses = _interopRequireDefault(require("./input-base-classes"));
@@ -0,0 +1,69 @@
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\/InputBase$/)).forEach(path => {
22
+ path.node.specifiers.forEach(specifier => {
23
+ if (specifier.type === 'ImportSpecifier' && specifier.imported.name === 'inputBaseClasses') {
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('MuiInputBase-', '').replaceAll(replacementSelectorPrefix, '').replaceAll(' > ', '').split('.').filter(Boolean);
38
+ if (precedingTemplateElement.value.raw.endsWith(deprecatedClass.startsWith(' ') ? `${replacementSelectorPrefix} .` : `${replacementSelectorPrefix}.`)) {
39
+ parent.expressions.splice(memberExpressionIndex, 1, j.memberExpression(memberExpression.value.object, j.identifier(atomicClasses[0])), j.memberExpression(memberExpression.value.object, j.identifier(atomicClasses[1])));
40
+ if (replacementSelector.includes(' > ')) {
41
+ parent.quasis.splice(memberExpressionIndex, 1, j.templateElement({
42
+ raw: precedingTemplateElement.value.raw.replace(' ', ''),
43
+ cooked: precedingTemplateElement.value.cooked.replace(' ', '')
44
+ }, false), j.templateElement({
45
+ raw: ' > .',
46
+ cooked: ' > .'
47
+ }, false));
48
+ } else {
49
+ parent.quasis.splice(memberExpressionIndex, 1, j.templateElement({
50
+ raw: precedingTemplateElement.value.raw,
51
+ cooked: precedingTemplateElement.value.cooked
52
+ }, false), j.templateElement({
53
+ raw: '.',
54
+ cooked: '.'
55
+ }, false));
56
+ }
57
+ }
58
+ }
59
+ });
60
+ }
61
+ });
62
+ });
63
+ const selectorRegex = new RegExp(`^${replacementSelectorPrefix}${deprecatedClass}`);
64
+ root.find(j.Literal, literal => typeof literal.value === 'string' && literal.value.match(selectorRegex)).forEach(path => {
65
+ path.replace(j.literal(path.value.value.replace(selectorRegex, `${replacementSelectorPrefix}${replacementSelector}`)));
66
+ });
67
+ });
68
+ return root.toSource(printOptions);
69
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ const classes = [{
4
+ deprecatedClass: ' .MuiInputBase-inputSizeSmall',
5
+ replacementSelector: '.MuiInputBase-sizeSmall > .MuiInputBase-input'
6
+ }, {
7
+ deprecatedClass: ' .MuiInputBase-inputMultiline',
8
+ replacementSelector: '.MuiInputBase-multiline > .MuiInputBase-input'
9
+ }, {
10
+ deprecatedClass: ' .MuiInputBase-inputAdornedStart',
11
+ replacementSelector: '.MuiInputBase-adornedStart > .MuiInputBase-input'
12
+ }, {
13
+ deprecatedClass: ' .MuiInputBase-inputAdornedEnd',
14
+ replacementSelector: '.MuiInputBase-adornedEnd > .MuiInputBase-input'
15
+ }, {
16
+ deprecatedClass: ' .MuiInputBase-inputHiddenLabel',
17
+ replacementSelector: '.MuiInputBase-hiddenLabel > .MuiInputBase-input'
18
+ }];
19
+ const plugin = () => {
20
+ return {
21
+ postcssPlugin: `Replace deprecated InputBase classes with new classes`,
22
+ Rule(rule) {
23
+ const {
24
+ selector
25
+ } = rule;
26
+ classes.forEach(({
27
+ deprecatedClass,
28
+ replacementSelector
29
+ }) => {
30
+ const selectorRegex = new RegExp(`${deprecatedClass}`);
31
+ if (selector.match(selectorRegex)) {
32
+ rule.selector = selector.replace(selectorRegex, replacementSelector);
33
+ }
34
+ });
35
+ }
36
+ };
37
+ };
38
+ plugin.postcss = true;
39
+ module.exports = {
40
+ plugin,
41
+ classes
42
+ };
@@ -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,13 @@
1
+ "use strict";
2
+
3
+ var _InputBase = require("@mui/material/InputBase");
4
+ '& .MuiInputBase-inputHiddenLabel';
5
+ '& .MuiInputBase-inputMultiline';
6
+ '& .MuiInputBase-inputAdornedStart';
7
+ '& .MuiInputBase-inputAdornedEnd';
8
+ '& .MuiInputBase-inputSizeSmall';
9
+ `& .${_InputBase.inputBaseClasses.inputHiddenLabel}`;
10
+ `& .${_InputBase.inputBaseClasses.inputMultiline}`;
11
+ `& .${_InputBase.inputBaseClasses.inputAdornedStart}`;
12
+ `& .${_InputBase.inputBaseClasses.inputAdornedEnd}`;
13
+ `& .${_InputBase.inputBaseClasses.inputSizeSmall}`;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ var _InputBase = require("@mui/material/InputBase");
4
+ "&.MuiInputBase-hiddenLabel > .MuiInputBase-input";
5
+ "&.MuiInputBase-multiline > .MuiInputBase-input";
6
+ "&.MuiInputBase-adornedStart > .MuiInputBase-input";
7
+ "&.MuiInputBase-adornedEnd > .MuiInputBase-input";
8
+ "&.MuiInputBase-sizeSmall > .MuiInputBase-input";
9
+ `&.${_InputBase.inputBaseClasses.hiddenLabel} > .${_InputBase.inputBaseClasses.input}`;
10
+ `&.${_InputBase.inputBaseClasses.multiline} > .${_InputBase.inputBaseClasses.input}`;
11
+ `&.${_InputBase.inputBaseClasses.adornedStart} > .${_InputBase.inputBaseClasses.input}`;
12
+ `&.${_InputBase.inputBaseClasses.adornedEnd} > .${_InputBase.inputBaseClasses.input}`;
13
+ `&.${_InputBase.inputBaseClasses.sizeSmall} > .${_InputBase.inputBaseClasses.input}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/codemod",
3
- "version": "7.0.0-alpha.1",
3
+ "version": "7.0.0-alpha.2",
4
4
  "bin": "./codemod.js",
5
5
  "private": false,
6
6
  "author": "MUI Team",
@@ -24,12 +24,12 @@
24
24
  "url": "https://opencollective.com/mui-org"
25
25
  },
26
26
  "dependencies": {
27
- "@babel/core": "^7.26.8",
28
- "@babel/runtime": "^7.26.7",
29
- "@babel/traverse": "^7.26.8",
27
+ "@babel/core": "^7.26.9",
28
+ "@babel/runtime": "^7.26.9",
29
+ "@babel/traverse": "^7.26.9",
30
30
  "jscodeshift": "^17.1.2",
31
31
  "jscodeshift-add-imports": "^1.0.11",
32
- "postcss": "^8.5.1",
32
+ "postcss": "^8.5.2",
33
33
  "postcss-cli": "^11.0.0",
34
34
  "yargs": "^17.7.2"
35
35
  },
@@ -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 _inputLabelSizeNormalMedium.default;
11
+ }
12
+ });
13
+ var _inputLabelSizeNormalMedium = _interopRequireDefault(require("./input-label-size-normal-medium"));
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = transformer;
7
+ /**
8
+ * @param {import('jscodeshift').FileInfo} file
9
+ * @param {import('jscodeshift').API} api
10
+ */
11
+ function transformer(file, api, options) {
12
+ const j = api.jscodeshift;
13
+ const printOptions = options.printOptions;
14
+ return j(file.source).findJSXElements('InputLabel').forEach(path => {
15
+ path.node.openingElement.attributes.forEach(node => {
16
+ if (node.type === 'JSXAttribute' && node.name.name === 'size' && (node.value.value === 'normal' || node.value.expression?.value === 'normal')) {
17
+ node.value = j.literal('medium');
18
+ }
19
+ });
20
+ }).toSource(printOptions);
21
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ var _jsxRuntime = require("react/jsx-runtime");
4
+ /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
5
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(InputLabel, {
6
+ size: "normal",
7
+ children: "Label"
8
+ })
9
+ });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ var _jsxRuntime = require("react/jsx-runtime");
4
+ /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
5
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(InputLabel, {
6
+ size: "medium",
7
+ children: "Label"
8
+ })
9
+ });