@mui/codemod
Version:
Codemod scripts for Material UI.
84 lines (82 loc) • 2.82 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = transformer;
var _movePropIntoSlots = _interopRequireDefault(require("../utils/movePropIntoSlots"));
var _movePropIntoSlotProps = _interopRequireDefault(require("../utils/movePropIntoSlotProps"));
var _findComponentJSX = _interopRequireDefault(require("../../util/findComponentJSX"));
var _findComponentDefaultProps = _interopRequireDefault(require("../../util/findComponentDefaultProps"));
const slotKeyRenames = {
StartScrollButtonIcon: 'startScrollButtonIcon',
EndScrollButtonIcon: 'endScrollButtonIcon'
};
function renameSlotKey(property) {
const name = property.key?.name || property.key?.value;
if (name && slotKeyRenames[name]) {
property.key.name = slotKeyRenames[name];
}
}
function renameJsxSlotKeys(j, element, attributeName) {
element.openingElement.attributes.forEach(attr => {
if (attr.type === 'JSXAttribute' && attr.name?.name === attributeName && attr.value?.expression?.type === 'ObjectExpression') {
attr.value.expression.properties.forEach(renameSlotKey);
}
});
}
function renameDefaultPropsSlotKeys(j, defaultPropsPathCollection, attributeName) {
defaultPropsPathCollection.find(j.ObjectProperty, {
key: {
name: attributeName
}
}).forEach(path => {
if (path.value.value.type === 'ObjectExpression') {
path.value.value.properties.forEach(renameSlotKey);
}
});
}
/**
* @param {import('jscodeshift').FileInfo} file
* @param {import('jscodeshift').API} api
*/
function transformer(file, api, options) {
const j = api.jscodeshift;
const root = j(file.source);
const printOptions = options.printOptions;
(0, _movePropIntoSlots.default)(j, {
root,
packageName: options.packageName,
componentName: 'Tabs',
propName: 'ScrollButtonComponent',
slotName: 'scrollButtons'
});
(0, _movePropIntoSlotProps.default)(j, {
root,
packageName: options.packageName,
componentName: 'Tabs',
propName: 'TabScrollButtonProps',
slotName: 'scrollButtons'
});
(0, _movePropIntoSlotProps.default)(j, {
root,
packageName: options.packageName,
componentName: 'Tabs',
propName: 'TabIndicatorProps',
slotName: 'indicator'
});
(0, _findComponentJSX.default)(j, {
root,
packageName: options.packageName,
componentName: 'Tabs'
}, elementPath => {
renameJsxSlotKeys(j, elementPath.node, 'slots');
});
const defaultPropsPathCollection = (0, _findComponentDefaultProps.default)(j, {
root,
packageName: options.packageName,
componentName: 'Tabs'
});
renameDefaultPropsSlotKeys(j, defaultPropsPathCollection, 'slots');
return root.toSource(printOptions);
}