Skip to content

Commit

Permalink
fix(utils): Function to get decorator, introduced typings
Browse files Browse the repository at this point in the history
  • Loading branch information
unlight committed Jan 1, 2018
1 parent 463b5dc commit eaead48
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 10 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
15 changes: 10 additions & 5 deletions src/deprecated-api-modules/deprecated-api-modules.ts
Original file line number Diff line number Diff line change
@@ -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 });
Expand All @@ -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;
}
11 changes: 8 additions & 3 deletions src/parse-int-pipe/parse-int-pipe.ts
Original file line number Diff line number Diff line change
@@ -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 }> = [];
Expand Down Expand Up @@ -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'),
};
}

Expand Down
14 changes: 12 additions & 2 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit eaead48

Please sign in to comment.