UNPKG

@xtrek/ts-migrate-plugins

Version:

Set of codemods, which are doing transformation of js/jsx to ts/tsx

85 lines 4.5 kB
"use strict"; 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