@xtrek/ts-migrate-plugins
Version:
Set of codemods, which are doing transformation of js/jsx to ts/tsx
85 lines • 4.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getNumComponentsInSourceFile = exports.getReactComponentHeritageType = exports.isReactForwardRefName = exports.isReactSfcArrowFunction = exports.isReactSfcFunctionDeclaration = exports.isReactClassComponent = void 0;
/* eslint-disable no-use-before-define, @typescript-eslint/no-use-before-define */
const typescript_1 = __importDefault(require("typescript"));
function isReactClassComponentName(name) {
return name === 'Component' || name === 'PureComponent';
}
function isReactClassComponent(classDeclaration) {
const heritageType = getReactComponentHeritageType(classDeclaration);
if (heritageType) {
if (typescript_1.default.isPropertyAccessExpression(heritageType.expression) &&
typescript_1.default.isIdentifier(heritageType.expression.expression) &&
heritageType.expression.expression.text === 'React' &&
isReactClassComponentName(heritageType.expression.name.text)) {
return true;
}
if (typescript_1.default.isIdentifier(heritageType.expression) &&
isReactClassComponentName(heritageType.expression.text)) {
return true;
}
}
return false;
}
exports.isReactClassComponent = isReactClassComponent;
function isReactSfcFunctionDeclaration(functionDeclaration) {
return (functionDeclaration.name != null &&
/^[A-Z]\w*$/.test(functionDeclaration.name.text) &&
functionDeclaration.parameters.length <= 2);
}
exports.isReactSfcFunctionDeclaration = isReactSfcFunctionDeclaration;
function isReactSfcArrowFunction(variableStatement) {
return variableStatement.declarationList.declarations.length === 1 &&
typescript_1.default.isIdentifier(variableStatement.declarationList.declarations[0].name) &&
/^[A-Z]\w*$/.test(variableStatement.declarationList.declarations[0].name.text) &&
variableStatement.declarationList.declarations[0].initializer != null &&
typescript_1.default.isCallExpression(variableStatement.declarationList.declarations[0].initializer) &&
isReactForwardRefName(variableStatement.declarationList.declarations[0].initializer)
? true
: variableStatement.declarationList.declarations[0].initializer != null &&
typescript_1.default.isArrowFunction(variableStatement.declarationList.declarations[0].initializer) &&
variableStatement.declarationList.declarations[0].initializer.parameters.length <= 2;
}
exports.isReactSfcArrowFunction = isReactSfcArrowFunction;
function isReactForwardRefName(initializer) {
var _a;
const { expression } = initializer;
if (typescript_1.default.isIdentifier(expression)) {
return /forwardRef/gi.test(expression.escapedText.toString());
}
if (typescript_1.default.isPropertyAccessExpression(expression)) {
return /forwardRef/gi.test((_a = expression.name) === null || _a === void 0 ? void 0 : _a.escapedText.toString());
}
return false;
}
exports.isReactForwardRefName = isReactForwardRefName;
function getReactComponentHeritageType(classDeclaration) {
if (classDeclaration.heritageClauses &&
classDeclaration.heritageClauses.length === 1 &&
classDeclaration.heritageClauses[0].types.length === 1 &&
typescript_1.default.isExpressionWithTypeArguments(classDeclaration.heritageClauses[0].types[0])) {
return classDeclaration.heritageClauses[0].types[0];
}
return undefined;
}
exports.getReactComponentHeritageType = getReactComponentHeritageType;
function getNumComponentsInSourceFile(sourceFile) {
const reactClassDeclarations = sourceFile.statements
.filter(typescript_1.default.isClassDeclaration)
.filter(isReactClassComponent);
const reactSfcFunctionDeclarations = sourceFile.statements
.filter(typescript_1.default.isFunctionDeclaration)
.filter(isReactSfcFunctionDeclaration);
const reactSfcArrowFunctions = sourceFile.statements
.filter(typescript_1.default.isVariableStatement)
.filter(isReactSfcArrowFunction);
return (reactClassDeclarations.length +
reactSfcFunctionDeclarations.length +
reactSfcArrowFunctions.length);
}
exports.getNumComponentsInSourceFile = getNumComponentsInSourceFile;
//# sourceMappingURL=react.js.map