# js-code-metric

Visualize JavaScript source complexity with js-code-metric.
Based on the older es5 plato, this is a port to `es6` and `eslint`

## Start in 3 steps.

1. Install.
`npm install --save-dev js-code-metric`

2. Add.
```
"scripts" : {
    "js-code-metric": "./node_modules/.bin/jschecker -r -d ./report src",
}
```

3. Run. 
`npm run js-code-metric`

## Installation

Install the module with: `npm install --save-dev js-code-metric`

## Usage
### From scripts

```js
//be sure and set your src, output, and any options.
let src = "./scripts/**/*.js";
let outputDir = "./artifacts/jschecker";

let jscheckerArgs = {
  title: "example",
  eslint: {}
};

//you can use the reports in the callback.
function callback(reports) {
  let overview = jschecker.getOverviewReport(reports);

  let { total, average } = overview.summary;

  let output = `total
    ----------------------
    eslint: ${total.eslint}
    sloc: ${total.sloc}
    maintainability: ${total.maintainability}
    average
    ----------------------
    eslint: ${average.eslint}
    sloc: ${average.sloc}
    maintainability: ${average.maintainability}`;

  console.log(output);
}

//usage is jschecker.inspect
jschecker.inspect(src, outputDir, jscheckerArgs, callback);
```

# Example Gulpfile

```js
let gulp = require("gulp");
let jschecker = require("jschecker");

let src = "./scripts/**/*.js";
let outputDir = "./artifacts/jschecker";

let lintRules = {
  rules: {
    indent: [2, "tab"],
    quotes: [2, "single"],
    semi: [2, "always"],
    "no-console": [1],
    curly: ["error"],
    "no-dupe-keys": 2,
    "func-names": [1, "always"]
  },
  env: {
    es6: true
  },
  globals: ["require"],
  parserOptions: {
    sourceType: "module",
    ecmaFeatures: {
      jsx: true,
      modules: true
    }
  }
};

let complexityRules = {};

let jscheckerArgs = {
  title: "example",
  eslint: lintRules,
  complexity: complexityRules
};

function analysis() {
  return jschecker.inspect(src, outputDir, jscheckerArgs);
}

gulp.task("analysis", analysis);
```

### From the commandline

```sh
Usage : js-code-metric [options] -d <output_dir> <input files>
  -h, --help
      Display this help text.
  -q, --quiet
      Reduce output to errors only
  -v, --version
      Print the version.
  -x, --exclude : String
      File exclusion regex
  -d, --dir : String *required*
      The output directory
  -r, --recurse
      Recursively search directories
  -l, --jshint : String
      Specify a jshintrc file for JSHint linting
  -t, --title : String
      Title of the report
  -D, --date : String
      Time to use as the report date (seconds, > 9999999999 assumed to be ms)
  -n, --noempty
      Skips empty lines from line count
  -e, --eslint : String
      Specify a eslintrc file for ESLint linting
```

**Example**

```shell
js-code-metric -r -d report src
```


## Data sources

* Complexity from [typhonjs-escomplex](https://github.com/typhonjs-node-escomplex/typhonjs-escomplex)
* Lint data from [eslint](http://eslint.org/)

## Contributors

* [Rajaprabhu]

## Release History

| version     | update                                                                                           |
| ----------- | ------------------------------------------------------------------------------------------------ |
| 1.0.0-alpha | Project works with es6 and eslint                                                                |

## About

This is currently a reimplementation of the older plato, and started as a fork from https://github.com/deedubs/js-code-metric, but has since been heavily modified.
After seeing it was unpublished on npm and also wanting to add more features, 
This project uses eslint, not jshint for default linting.

I have switched to the [typhon-js](https://github.com/typhonjs-node-escomplex/typhonjs-escomplex) module since it properly parses classes.

## License

Copyright (c) 2019 Rajaprabhu
Licensed under the MIT license.
