import * as Lint from 'tslint'; import * as ts from 'typescript'; import {sprintf} from 'sprintf-js'; import {ComponentMetadata} from 'codelyzer/angular/metadata'; import {Failure} from 'codelyzer/walkerFactory/walkerFactory'; import {all, validateComponent} from 'codelyzer/walkerFactory/walkerFn'; import {Maybe, F2} from 'codelyzer/util/function'; import {IOptions} from 'tslint'; import {NgWalker} from 'codelyzer/angular/ngWalker'; export class Rule extends Lint.Rules.AbstractRule { public static metadata: Lint.IRuleMetadata = { ruleName: 'adf-class-name', type: 'maintainability', description: `Enforce consistent name avoid prefix`, descriptionDetails: `See more at https://angular.io/styleguide#style-05-13.`, rationale: `Consistent conventions make it easy to quickly identify class when you search with autocomplete.`, options: null, optionsDescription: "Not configurable.", typescriptOnly: true, }; public static FAILURE_STRING = 'The name of the class should not start with ADF Alfresco or Activiti prefix '; static walkerBuilder: F2 = all( validateComponent((meta: ComponentMetadata, suffixList?: string[]) => Maybe.lift(meta.controller) .fmap(controller => controller.name) .fmap(name => { const className = name.text; if (Rule.invalidName(className)) { return [new Failure(name, sprintf(Rule.FAILURE_STRING + className , className, suffixList))]; } }) )); static invalidName(className: string): boolean { var whiteList = ['ActivitiContentComponent', 'ActivitiForm']; var classNameReg = /^(alfresco|activiti|adf|activity)/ig; var classNameMatch = classNameReg.exec(className); var isWhiteListName = whiteList.find((currentWhiteListName)=>{ return currentWhiteListName === className; }); if (classNameMatch && !isWhiteListName) { return true; } return false; } public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { return this.applyWithWalker( Rule.walkerBuilder(sourceFile, this.getOptions()) ); } }