Skip to content

Commit

Permalink
ESLint 3 preparation for master (#178)
Browse files Browse the repository at this point in the history
* Monkey patch eslint, instead of modifying it

- Add access to ESLint docs
- Add support for parametrized Docker builds, building different
  versions of the documentation
- Automatically detect which version of the docs we should be including

* Use eslint-2.4.0

Fixes:

    npm WARN eslint-config-airbnb@6.2.0 requires a peer of eslint@^2.4.0 but none was installed.
    npm WARN codeclimate-eslint@0.0.3 No license field.
    Cloning into 'eslint'...
    npm ERR! peer dep missing: eslint@^2.4.0, required by eslint-config-airbnb@6.2.0
    npm ERR! code 1
    error: pathspec 'vnull' did not match any file(s) known to git.

* Comment loadPackage override

Fixes:

    /usr/src/app/node_modules/meld/meld.js:67
                      if (typeof target[pointcut] === 'function') {
                                        ^

    TypeError: Cannot read property 'loadPackage' of undefined
        at meld (/usr/src/app/node_modules/meld/meld.js:67:23)
        at Function.around (/usr/src/app/node_modules/meld/meld.js:436:12)
        at patcher (/usr/src/app/lib/eslint-patch.js:21:8)
        at Object.<anonymous> (/usr/src/app/bin/eslint.js:11:44)
        at Module._compile (module.js:397:26)
        at Object.Module._extensions..js (module.js:404:10)
        at Module.load (module.js:343:32)
        at Function.Module._load (module.js:300:12)
        at Function.Module.runMain (module.js:429:10)
        at startup (node.js:139:18)

* Update babel-eslint to v6

Fixes #91

* Update dependencies

```
eslint@2.4.0               -> eslint@2.10.2
eslint-config-airbnb@6.0.2 -> eslint-config-airbnb@9.0.1
eslint-plugin-babel@2.1.1  -> eslint-config-airbnb@3.2.0
eslint-plugin-react@4.0.0  -> eslint-config-react@5.1.1
```

* Add standard style plugin and shared config

* Vendor additional Standard Style config packages (#102)

Many users using [Standard Style][] also use these configuration packages when
writing React/JSX.

[Standard Style]: https://github.com/feross/standard

This commit vendors the [eslint-config-standard-react] and
[eslint-config-standard-jsx] packages.

[eslint-config-standard-react]: https://github.com/feross/eslint-config-standard-react
[eslint-config-standard-jsx]: https://github.com/feross/eslint-config-standard-jsx

* Add eslint-config-google as available plugin

* Added supporto for ESLint plugin Flowtype

* Add support for eslint-config-angular

* Add task to update npm-shrinkwrap.json

* Update package.json (#112)

eslint-2: Vendor eslint-plugin-angular package

* add eslint-config-ember package

* Switch base image to avoid Segfault

Related to #111, a Segfault occurs when we hammer STDOUT with issues.
Switching from alpine to a debian-based image seems to behave better in
this scenario.

* Update babel-eslint & eslint-flowtype

We're a bit behind on these. Flowtype in particular has new rules we
weren't supporting.

Looks like we hadn't actually filled in the shrinkwrap file before now,
either, so that's done.

* Add --gecos "" to avoid adduser prompt

* add hapi config support

hapi eslint config is based on eslint-config-hapi
and eslint-plugin-hapi packages

* Add eslint-config-airbnb-base as a top-level dep

eslint-config-airbnb-base is a transitive dependency of
eslint-config-airbnb, but it is useful in its own right and should be
included at the top level such that it has proper support in the eslint
engine.

* Update circle to trigger build

* Upgrade to Node 6.5.0

* Update packages for ESLint 3

* eslint-3: Added ESLint plugins (#131)

* eslint-3: Added ESLint plugins

* Added appropriate eslint-plugin rule categorizations

* Shifted category mappings to individual JSON file

* Alphabetized ESLint plugin rule category mapping

* Bump eslint to 3.6.1 & eslint-plugin-import to 1.16.0 (#136)

The eslint bump was necessitated by `airbnb-config-base` wanting it.
There's also a 2.0.0 of `eslint-plugin-import` available, but attempting
to jump that far gave some peer package errors, so maybe we can't
support that yet.

* Support eslint-plugin-ember-suave. (#140)

* Allow ignoring warnings from configuration.

* Add CONTRIBUTING.md.
The file, for now, shows how to create a local engine image for testing.

* Add ignore_warnings to README

As requested in #144.

* Update README.md

* Update project README

- Update project/documentation links
- Use open source Code Climate badge
- Hard-wrap text
- Fix YAML identation

* Upgrade ESLint & some packages

* We're several point releases behind on ESLint
* After updating just that, I got some errors from shrinkwrap for two
  other packages we support, so I upgraded those too.

* Add support for eslint-plugin-react-intl plugin (#154)

* chore(packages): upgrade eslint

* docs(CONTRIBUTING): fix .codeclimate.yml example

* feat(config): add eslint-config-simplifield

* Switch to yarn for installing dependencies

This seems more intuitive to me today, and I hope will make it easier
for contributors who want to add or upgrade plugins.

Note: this is using nightly yarn, because there's a fix for Circle CI +
Docker + Yarn compatibility that is made but not officially released
yet. We can switch to stable yarn once 0.18.0 leaves pre-release. The
fix was PR 1837 on the Yarn repo.

* Upgrade eslint-config-google to 0.7.1

* Add eslint-plugin-meteor

Close #155

Just ran: `bin/yarn add eslint-plugin-meteor`

* Add eslint-plugin-immutable

`bin/yarn add eslint-plugin-immutable`

* Add eslint-plugin-import-order

`bin/yarn add eslint-plugin-import-order`

* Add eslint-plugin-jasmine

`bin/yarn add eslint-plugin-jasmine`

* Add eslint-config-semistandard

`bin/yarn add eslint-config-semistandard`

* Yarn add eslint-config-react-app
Yarn upgrade babel-eslint ^7.0.0
Yarn upgrade eslint-plugin-flowtype to ^2.21.0
Yarn upgrade eslint-plugin-import to ^2.0.1
Yarn upgrade eslint-plugin-jsx-a11y to ^2.2.3
Yarn upgrade eslint-plugin-react to ^6.4.1

* added eslint-plugin-xogroup plugin

* Upgrade eslint

```
make
bin/yarn upgrade eslint
```

We'd like to pull in a fix for a bug that prevents using this rule:
http://eslint.org/docs/2.0.0/rules/generator-star-spacing

* add support for eslint prettier plugin

* Add config upgrader

Automatically upgrade pre-ESLint 3 config to ESLint 3-compatible format.

* Fix null-config issue with upgrader

When upgrader encountered a project that had no .eslintrc* but had an
unrelated package.json that had no ESLint-related options in it an
exception was thrown.
  • Loading branch information
pointlessone authored and gdiggs committed Feb 28, 2017
1 parent 3edd767 commit 296d78e
Show file tree
Hide file tree
Showing 18 changed files with 2,556 additions and 1,521 deletions.
2 changes: 1 addition & 1 deletion .codeclimate.yml
Expand Up @@ -9,7 +9,7 @@ engines:
ratings:
paths:
- bin/eslint.js
- lib/checks.js
- lib/*.js
exclude_paths:
- "node_modules/**"
- "test/**"
3 changes: 2 additions & 1 deletion .eslintrc
@@ -1,7 +1,8 @@
{
"env": {
"node": true,
"mocha": true
"mocha": true,
"es6": true
},
"rules": {
"block-spacing": 2,
Expand Down
40 changes: 40 additions & 0 deletions CONTRIBUTING.md
@@ -0,0 +1,40 @@
# Contributing

## Adding and upgrading plugins

When adding or upgrading a plugin, we should see changes in both `package.json`
and `yarn.lock`.

Make sure to run `make image` before running these commands.

Add a plugin:

```
bin/yarn add eslint-config-google
```

Upgrade a plugin:

```
bin/yarn upgrade eslint-config-google
```

## Testing Changes

Changes made to the engine can be tested locally.

1. Install [the CodeClimate CLI](https://github.com/codeclimate/codeclimate).
1. Create the image (customizing the `IMAGE_NAME` as needed):
```bash
IMAGE_NAME=codeclimate/codeclimate-eslint-test make image
```
1. Add the engine to your test `.codeclimate.yml`:
```yaml
engines:
eslint-test:
enabled: true
```
1. Run analyze via the CLI:
```bash
codeclimate analyze --dev
```
25 changes: 18 additions & 7 deletions Dockerfile
@@ -1,15 +1,26 @@
FROM mhart/alpine-node:5.4
FROM node:6.5.0-slim
MAINTAINER Code Climate <hello@codeclimate.com>

WORKDIR /usr/src/app
COPY npm-shrinkwrap.json /usr/src/app/
COPY package.json /usr/src/app/
COPY package.json yarn.lock /usr/src/app/

RUN apk --update add git && \
npm install && \
apk del --purge git
RUN apt-key adv --fetch-keys http://dl.yarnpkg.com/debian/pubkey.gpg && \
echo "deb http://nightly.yarnpkg.com/debian/ nightly main" | tee /etc/apt/sources.list.d/yarn-nightly.list && \
apt-get update && \
apt-get install -y git jq yarn && \
yarn install && \
git clone https://github.com/eslint/eslint.git && \
ESLINT_DOCS_VERSION=`npm -j ls eslint | jq -r .dependencies.eslint.version` && \
cd eslint && \
git checkout v$ESLINT_DOCS_VERSION && \
cd .. && \
mkdir -p /usr/src/app/lib/docs/rules/ && \
cp ./eslint/docs/rules/* /usr/src/app/lib/docs/rules/ && \
rm -rf eslint && \
apt-get purge -y git jq && \
apt-get autoremove -y

RUN adduser -u 9000 -D app
RUN adduser -u 9000 --gecos "" --disabled-password app
COPY . /usr/src/app
RUN chown -R app:app /usr/src/app

Expand Down
54 changes: 46 additions & 8 deletions README.md
@@ -1,19 +1,57 @@
# Code Climate ESLint Engine

[![Code Climate](https://codeclimate.com/github/codeclimate/codeclimate-eslint/badges/gpa.svg)](https://codeclimate.com/github/codeclimate/codeclimate-eslint)
[![Code Climate][badge]][repo]

`codeclimate-eslint` is a Code Climate engine that wraps [ESLint](https://github.com/eslint/eslint). You can run it on your command line using the Code Climate CLI, or on our hosted analysis platform.
[badge]: https://codeclimate.com/github/codeclimate/codeclimate-eslint/badges/gpa.svg
[repo]: https://codeclimate.com/repos/github/codeclimate-eslint

ESLint is a tool for identifying and reporting on patterns found in ECMAScript/JavaScript code. It can be configured using a [configuration file](https://github.com/eslint/eslint#usage).
`codeclimate-eslint` is a Code Climate engine that wraps [ESLint][]. You can run
it on your command line using the Code Climate CLI, or on our hosted analysis
platform.

ESLint is a tool for identifying and reporting on patterns found in
ECMAScript/JavaScript code. It can be configured using a [configuration
file][config].

[config]: http://eslint.org/docs/user-guide/configuring#using-configuration-files

### Installation

1. If you haven't already, [install the Code Climate CLI](https://github.com/codeclimate/codeclimate).
2. Run `codeclimate engines:enable eslint`. This command both installs the engine and enables it in your `.codeclimate.yml` file.
3. You're ready to analyze! Browse into your project's folder and run `codeclimate analyze`.
1. If you haven't already, [install the Code Climate CLI][CLI]

2. Run `codeclimate engines:enable eslint`. This command both installs the
engine and enables it in your `.codeclimate.yml` file

3. You're ready to analyze! Browse into your project's folder and run
`codeclimate analyze`

[cli]: https://github.com/codeclimate/codeclimate

### Configuration

#### `ignore_warnings`

By default, this engine will emit both ESLint errors and warnings as Code
Climate issues. If you prefer, you can ignore warning-level violations by
setting the `ignore_warnings` configuration option:

```yaml
eslint:
enabled: true
config:
ignore_warnings: true
```

### Need help?

For help with ESLint, [check out their documentation](https://github.com/eslint/eslint).
For help with ESLint, [check out their documentation][eslint-docs].

If you're running into a Code Climate issue, first look over this project's
[GitHub Issues][issues], as your question may have already been covered. If not,
[go ahead and open a support ticket with us][help].

[issues]: https://github.com/codeclimate/codeclimate-eslint/issues
[help]: https://codeclimate.com/help

If you're running into a Code Climate issue, first look over this project's [GitHub Issues](https://github.com/codeclimate/codeclimate-eslint/issues), as your question may have already been covered. If not, [go ahead and open a support ticket with us](https://codeclimate.com/help).
[eslint]: http://eslint.org
[eslint-docs]: http://eslint.org/docs/user-guide/
19 changes: 17 additions & 2 deletions bin/eslint.js
Expand Up @@ -8,17 +8,22 @@ process.chdir(CODE_DIR);
var stdout = console.log;
console.log = console.error;

var CLIEngine = require("eslint").CLIEngine;
var docs = require("eslint").docs;
var eslint = require('../lib/eslint-patch')(require('eslint'));

var CLIEngine = eslint.CLIEngine;
var docs = eslint.docs;
var fs = require("fs");
var glob = require("glob");
var options = { extensions: [".js"], ignore: true, reset: false, useEslintrc: true };
var cli; // instantiation delayed until after options are (potentially) modified
var debug = false;
var BatchSanitizer = require("../lib/batch_sanitizer");
var ignoreWarnings = false;
var ESLINT_WARNING_SEVERITY = 1;
var checks = require("../lib/checks");
var validateConfig = require("../lib/validate_config");
var computeFingerprint = require("../lib/compute_fingerprint");
const ConfigUpgrader = require("../lib/config_upgrader");

// a wrapper for emitting perf timing
function runWithTiming(name, fn) {
Expand Down Expand Up @@ -172,6 +177,10 @@ runWithTiming("engineConfig", function () {
options.ignorePath = userConfig.ignore_path;
}

if (userConfig.ignore_warnings) {
ignoreWarnings = true;
}

if (userConfig.debug) {
debug = true;
}
Expand Down Expand Up @@ -207,6 +216,8 @@ function analyzeFiles() {
var path = result.filePath.replace(/^\/code\//, "");

result.messages.forEach(function(message) {
if (ignoreWarnings && message.severity === ESLINT_WARNING_SEVERITY) { return; }

var issueJson = buildIssueJson(message, path);
process.stdout.write(issueJson + "\u0000\n");
});
Expand All @@ -225,6 +236,10 @@ function analyzeFiles() {
if (validateConfig(options.configFile)) {
console.error("ESLint is running with the " + cli.getConfigForFile(null).parser + " parser.");

for (const line of ConfigUpgrader.upgradeInstructions(analysisFiles, process.cwd())) {
console.error(line);
}

analyzeFiles();
} else {
console.error("No rules are configured. Make sure you have added a config file with rules enabled.");
Expand Down
6 changes: 6 additions & 0 deletions bin/yarn
@@ -0,0 +1,6 @@
#!/bin/bash

set -e

IMAGE_NAME=${IMAGE_NAME:-codeclimate/codeclimate-eslint}
docker run --rm --volume "$PWD:/usr/src/app" "$IMAGE_NAME" sh -c "cd /usr/src/app && yarn $*"
2 changes: 1 addition & 1 deletion circle.yml
Expand Up @@ -20,7 +20,7 @@ test:

deployment:
registry:
branch: master
branch: /master|channel\/[\w-]+/
commands:
- >
docker run
Expand Down

0 comments on commit 296d78e

Please sign in to comment.