Détail du package

criticizer

mgechev12MIT2.0.0

Linting for Angular applications, following angular.io/styleguide.

Angular, style guide, styleguide, nglint

readme

Build Status Build status Gitter Chat

Codelyzer

A set of tslint rules for static code analysis of Angular TypeScript projects.

You can run the static code analyzer over web apps, NativeScript, Ionic, etc.

How to use?

Angular CLI

Angular CLI has support for codelyzer. In order to validate your code with CLI and the custom Angular specific rules just use:

ng new codelyzer
ng lint

Note that by default all components are aligned with the style guide so you won't see any errors in the console.

Angular Seed

Another project which has out of the box integration with codelyzer is angular-seed. In order to run the linter you should:

# Skip if you've already cloned Angular Seed
git clone https://github.com/mgechev/angular-seed

# Skip if you've already installed all the dependencies of Angular Seed
cd angular-seed && npm i

# Run all the tslint and codelyzer rules
npm run lint

Note that by default all components are aligned with the style guide so you won't see any errors in the console.

Custom Setup

You can easily use codelyzer with your custom setup:

Installation

npm i codelyzer@2.0.0-beta.4 tslint@4.0.0 typescript@2.0.9 @angular/core@2.4.0 @angular/compiler@2.4.0 rxjs@5.0.1 zone.js@0.7.2

Now create the following tslint.json file where your node_modules directory is:

{
  "rulesDirectory": [
    "node_modules/codelyzer"
  ],
  "rules":{
    "directive-selector": [true, "attribute", "sg", "camelCase"],
    "component-selector": [true, "element", "sg", "kebab-case"],
    "use-input-property-decorator": true,
    "use-output-property-decorator": true,
    "use-host-property-decorator": true,
    "no-attribute-parameter-decorator": true,
    "no-input-rename": true,
    "no-output-rename": true,
    "no-forward-ref": true,
    "use-life-cycle-interface": true,
    "use-pipe-transform-interface": true,
    "pipe-naming": [true, "camelCase", "sg"],
    "component-class-suffix": true,
    "directive-class-suffix": true,
    "import-destructuring-spacing": true,
    "templates-use-public": true,
    "no-access-missing-member": true,
    "invoke-injectable": true
  }
}

Next you can create a component file in the same directory with name component.ts and the following content:

import { Component } from '@angular/core';

@Component({
  selector: 'codelyzer',
  template: `
    <h1>Hello {{ nme }}!</h1>
  `
})
class Codelyzer {
  name: string = 'World';

  ngOnInit() {
    console.log('Initialized');
  }
}

As last step you can execute all the rules against your code with tslint:

$ ./node_modules/.bin/tslint -c tslint.json component.ts

You should see the following output:

component.ts[4, 13]: The selector of the component "Codelyzer" should have prefix "sg" (https://goo.gl/cix8BY)
component.ts[12, 3]: Implement lifecycle hook interface OnInit for method ngOnInit in class Codelyzer (https://goo.gl/w1Nwk3)
component.ts[9, 7]: The name of the class Codelyzer should end with the suffix Component (https://goo.gl/5X1TE7)
component.ts[6, 18]: The property "nme" that you're trying to access does not exist in the class declaration. Probably you mean: "name".

Editor Configuration

Note that you need to have tslint plugin install on your editor.

Codelyzer should work out of the box with Atom but for VSCode you will have to open Code > Preferences > User Settings, and enter the following config:

{
  "tslint.rulesDirectory": "./node_modules/codelyzer",
  "typescript.tsdk": "node_modules/typescript/lib"
}

Now you should have the following result:

VSCode Codelyzer

Enjoy!

Changelog

You can find it here.

Recommended configuration

Below you can find a recommended configuration which is based on the Angular Style Guide.

{
  // The rule have the following arguments:
  // [ENABLED, "attribute" | "element", "selectorPrefix" | ["listOfPrefixes"], "camelCase" | "kebab-case"]
  "directive-selector": [true, "attribute", ["dir-prefix1", "dir-prefix2"], "camelCase"],
  "component-selector": [true, "element", ["cmp-prefix1", "cmp-prefix2"], "kebab-case"],

  "use-input-property-decorator": true,
  "use-output-property-decorator": true,
  "use-host-property-decorator": true,
  "no-attribute-parameter-decorator": true,
  "no-input-rename": true,
  "no-output-rename": true,
  "no-forward-ref": true,
  "use-life-cycle-interface": true,
  "use-pipe-transform-interface": true,

  // [ENABLED, "SUFFIX"]
  // Where "SUFFIX" is your custom suffix, for instance "Page" for Ionic 2 components.
  "component-class-suffix": [true, "Component"],
  "directive-class-suffix": [true, "Directive"],
  "import-destructuring-spacing": true,
  "templates-use-public": true,
  "no-access-missing-member": true,
  "invoke-injectable": true
}

Advanced configuration

Codelyzer supports any template and style language by custom hooks. If you're using Sass for instance, you can allow codelyzer to analyze your styles by creating a file .codelyzer.js in the root of your project (where the node_modules directory is). In the configuration file can implement custom pre-processing and template resolution logic:

// Demo of transforming Sass styles
var sass = require('node-sass');

module.exports = {

  // Definition of custom interpolation strings
  interpolation: ['{{', '}}'],

  // You can transform the urls of your external styles and templates
  resolveUrl(url, decorator) {
    return url;
  },

  // Transformation of the templates. This hooks is quite useful
  // if you're using any other templating language, for instance
  // jade, markdown, haml, etc.
  // 
  // NOTE that this method WILL NOT throw an error in case of invalid template.
  //
  transformTemplate(code, url, decorator) {
    return { code: code, url: url };
  },

  // Transformation of styles. This hook is useful is you're using
  // any other style language, for instance Sass, Less, etc.
  //
  // NOTE that this method WILL NOT throw an error in case of invalid style.
  //
  transformStyle(code, url, decorator) {
    var result = { code: code, url: url };
    if (url && /\.scss$/.test(url)) {
      var transformed = sass.renderSync({ data: code, sourceMap: true, outFile: '/dev/null' });
      result.source = code;
      result.code = transformed.css.toString();
      result.map = transformed.map.toString();
    }
    return result;
  },

  // Custom predefined directives in case you get error for
  // missing property and you are using a template reference
  predefinedDirectives: [
    { selector: 'form', exportAs: 'ngForm' }
  ],

  // None = 0b000, Error = 0b001, Info = 0b011, Debug = 0b111
  logLevel: 0b111
};

Contributors

mgechev preslavsh eppsilon ghsyeung Kobzol clydin
mgechev preslavsh eppsilon ghsyeung Kobzol clydin
Foxandxss Hotell nexus-uw Manduro scttcper laco0416
Foxandxss Hotell nexus-uw Manduro scttcper laco0416

License

MIT

changelog

2.0.0

Bug Fixes

  • The rule for binding to publich members breaks for readonly properties #206 cc3ed9a
  • Add checks for ngIf and ngSwitch #193 0118b56
  • Support for tslint@^4.3.1 (4.3.0 was broken) 3e7edfa
  • Support for Angular 4 #214 4d79933

Refactoring

  • Refactoring readTemplate and readStyle to use Maybe<T> 373b152

2.0.0-beta.4

Features

  • Allow multiple suffixes for better compatibility with Ionic #194 08fdaf0
  • Add declarations of frequiently used directive declarations #199 36f5cb4
  • Support for Angular 2.4.x #201 ad81f2d
  • Support for tslint@^4.1.0 #204 13b722e

Bug Fixes

  • Warn when component element selector doesn't have a dash #192 36f5cb4

2.0.0-beta.3

Bug Fixes

  • Restrict peerDependencies to Angular <=2.3 >=2.2.0 #188 08a0029

2.0.0-beta.2

Features

Bug Fixes

2.0.0-beta.1

Breaking Changes

  • The rules directive-selector-name, component-selector-name, directive-selector-type, component-selector-type, component-selector-prefix, directive-selector-prefix no longer exist. Instead use:

      // The rule have the following arguments:
      // [ENABLED, "attribute" | "element", "selectorPrefix" | ["listOfPrefixes"], "camelCase" | "kebab-case"]
      "directive-selector": [true, "attribute", "sg", "camelCase"],
      "component-selector": [true, "element", "sg", "kebab-case"],

Features

  • External template support via command line interface. Note that the VSCode tslint plugin cannot report warnings in CSS and HTML files yet #94 67d5a07
  • Support for custom hooks for transpilation of languages which transpile to HTML, CSS #164 1ca7068
  • Source map support. You can have pug templates and get error reporting in the correct position if inside of the hook you return not only the transpiled version of the template but also the source map 1ca7068
  • Optional configuration file .codelyzer.js which should be located in the root of your project (the directory where node_modules is) 1ca7068
  • Support for tslint ^4.0.0 #157 8c5dbf6
  • Improve no-unused-css 0a9d9014

Bug Fixes

  • Do not throw error when validating @Pipes without metadata #111 eb6ccc0d
  • Use proper syntax types for TypeScript 2.1.x #145 d49cc26
  • More consistent naming for selector-related rules #79 3373dff
  • Support for templateRefs #151 52ba382
  • Support for properties declared inline into the constructor #153 23fe633
  • Report missing styles in the correct position #166 e9575fb
  • Proper selector prefix matching #103 7285121
  • Selectors compatible with the spec #15 3373dffe

1.0.0-beta.4

Bug Fixes

  • Migrate to the compiler API changes introduced by Angular 2.2 #152 fe3083b

1.0.0-beta.3

Features

  • Introduce support for unused CSS styles in components.

Bug Fixes

  • Migrate to API changes introduced by Angular 2.1.1 #128 787ff3b.
  • Do not consider $event as non-declared variable #129 8751184.
  • Consider template variables such as let foo of bars #123 cbd86e1.
  • Consider getters and setters when listing all the declared in controller symbols #118 6060ce0.

1.0.0-beta.2

Bug Fixes

  • Migrate to the compiler API changes introduced by Angular 2.1.

1.0.0-beta.1

Features

Bug Fixes

  • Do not process webpack dynamically injected templates #106 ff2dc85.
  • Do not process @Component decorators which are not invoked as expressions #110 5ee2422
  • Preserve the original interpolation expression #99 5ee2422.
  • Consider both property access and method invocation when deciding if property is used or not #97 da15305.
  • Migrate to the changes introduced by Angular 2.0.2 #107 06483ce.

1.0.0-beta.0

Features

  • Linting over inline templates #90 4347d09.
  • Use Injectable() instead of Injectable #70 c84df93.
  • Show warning when binding to non-public class members #87 c849808.
  • Support for TypeScript 2.1.0 #72 a002661.

Bug Fixes

  • On non-implemented life-cycle hook/PipeTransform interface, mark only the corresponding method #89 a9104b2.
  • Do not throw error when interface is implemented but under a namespace #91 a9104b2.

Refactoring

  • Migrate from typings to @types f9cc498.