diff --git a/package.json b/package.json index 791a801..027e875 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@semantic-release/changelog": "^1.0.0", "@semantic-release/git": "^2.0.1", "@semantic-release/npm": "^2.5.0", + "@types/estree": "0.0.38", "@types/mocha": "^2.2.45", "@types/node": "^8.5.2", "chokidar-cli": "^1.2.0", diff --git a/src/deprecated-api-modules/deprecated-api-modules.ts b/src/deprecated-api-modules/deprecated-api-modules.ts index 5ab0e08..2a9e9d0 100644 --- a/src/deprecated-api-modules/deprecated-api-modules.ts +++ b/src/deprecated-api-modules/deprecated-api-modules.ts @@ -1,8 +1,11 @@ +import { ClassDeclaration, CallExpression } from 'estree'; +import { getDecoratorByName } from '../utils'; + export const message = 'Use `imports` property for the list of imported modules'; export const deprecatedApiModules = { create(context) { return { - ClassDeclaration: (node) => { + ClassDeclaration: (node: ClassDeclaration) => { const property = getModuleModulesProperty(node); if (property) { context.report({ node: property, message }); @@ -12,12 +15,14 @@ export const deprecatedApiModules = { } }; -function getModuleModulesProperty(node) { - const decorator = (node.decorators || []).find(d => d.expression && d.expression.callee && d.expression.callee.name === 'Module'); +function getModuleModulesProperty(node: any) { + const decorator = getDecoratorByName(node, 'Module'); if (!decorator) { return false; } - const [argument] = decorator.expression.arguments; - const result = (argument.type === 'ObjectExpression') && (argument.properties || []).find(property => property.key && property.key.name === 'modules'); + const [argument] = (decorator.expression as CallExpression).arguments; + const result = (argument.type === 'ObjectExpression') && (argument.properties || []).find(property => { + return property.key && property.key.type === 'Identifier' && property.key.name === 'modules'; + }); return result; } diff --git a/src/parse-int-pipe/parse-int-pipe.ts b/src/parse-int-pipe/parse-int-pipe.ts index 7e98881..f761b68 100644 --- a/src/parse-int-pipe/parse-int-pipe.ts +++ b/src/parse-int-pipe/parse-int-pipe.ts @@ -1,7 +1,11 @@ +import { getDecoratorByName } from '../utils'; +import { CallExpression } from 'estree'; + export const message = { prefer: 'Prefer transform pipe `ParseIntPipe` in @Param decorator', transformed: 'Redundant coercing to number, parameter `{{name}}` must be a number', }; + export const parseIntPipe = { create(context): any { const parameters: Array<{ name: string, decorator: any }> = []; @@ -44,13 +48,14 @@ export const parseIntPipe = { }; function getDecorator(node) { - const decorator = (node.decorators || []).find(d => d.expression && d.expression.callee && d.expression.callee.name === 'Param'); + // const decorator = (node.decorators || []).find(d => d.expression && d.expression.callee && d.expression.callee.name === 'Param'); + const decorator = getDecoratorByName(node, 'Param'); if (!decorator) { return; } - const [, expr] = decorator.expression.arguments; + const [, expr] = (decorator.expression as CallExpression).arguments; return { - transformed: Boolean(expr && expr.type === 'NewExpression' && expr.callee && expr.callee.name === 'ParseIntPipe'), + transformed: Boolean(expr && expr.type === 'NewExpression' && expr.callee && expr.callee.type === 'Identifier' && expr.callee.name === 'ParseIntPipe'), }; } diff --git a/src/utils.ts b/src/utils.ts index c2fa744..f25e7e6 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,3 +1,13 @@ -export function getDecoratorByName(node, name: string) { - return (node.decorators || []).find(d => d.expression && d.expression.callee && d.expression.callee.name === name); +import { CallExpression, Expression } from 'estree'; + +export type Decorator = { + expression: Expression; +}; + +export function getDecoratorByName(node: any, name: string): Decorator | undefined { + const result: Decorator = (node.decorators || []).find(d => { + const expression = d.expression && d.expression.type === 'CallExpression' && d.expression as CallExpression; + return expression && expression.callee.type === 'Identifier' && expression.callee.name === name; + }); + return result; }