eslint-rails-ee 1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +216 -0
- data/Rakefile +1 -0
- data/app/controllers/eslint_controller.rb +23 -0
- data/app/views/eslint/show.html.erb +55 -0
- data/app/views/eslint/source.html.erb +80 -0
- data/build-plugins.sh +21 -0
- data/config/eslint.json +160 -0
- data/config/routes.rb +7 -0
- data/eslint-rails-ee.gemspec +30 -0
- data/lib/eslint-rails-ee.rb +8 -0
- data/lib/eslint-rails-ee/config.rb +29 -0
- data/lib/eslint-rails-ee/engine.rb +4 -0
- data/lib/eslint-rails-ee/runner.rb +113 -0
- data/lib/eslint-rails-ee/text_formatter.rb +43 -0
- data/lib/eslint-rails-ee/version.rb +3 -0
- data/lib/eslint-rails-ee/warning.rb +34 -0
- data/lib/tasks/eslint.rake +50 -0
- data/vendor/assets/javascripts/eslint.js +107296 -0
- data/vendor/assets/javascripts/plugins/eslint-plugin-react.js +12862 -0
- metadata +154 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5f8dda485adf47335a2d7ee6ea66b17fd5b0ee2b
|
4
|
+
data.tar.gz: 35e48b79e17394be368e491dfb630d63bd2912cd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9c66719fc1886b05d35c0730f46fbd00217bbae09889a1decdb19dc352d22795fd04af935aaaf045f43e9b15897be4f674fa3f85b6d4cc1d9ad9804c6be1b20
|
7
|
+
data.tar.gz: 5d80f57cb3436a70132dc29aaddc7432707bccaa3dadc138e1f02269e94da44b7a594bbf4714736b7d2a3301fc2f63751763fb726784cadb420c54eb4215aaf6
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 AppFolio, Inc.
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
# eslint-rails-ee: a fork of eslint-rails with enhanced features
|
2
|
+
|
3
|
+
Run [ESLint][] against your Rails repo, and even auto-correct issues! The supported javascript file extensions are the following:
|
4
|
+
|
5
|
+
- _.js_
|
6
|
+
- _.jsx_
|
7
|
+
- _.es6_
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'eslint-rails-ee'
|
15
|
+
gem 'therubyracer'
|
16
|
+
gem 'execjs'
|
17
|
+
```
|
18
|
+
|
19
|
+
This uses TheRubyRacer as a runtime. For most environments, this works fine. However if you run windows do this to your gemfile:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
gem 'eslint-rails-ee'
|
23
|
+
gem 'therubyracer', :platforms => :ruby
|
24
|
+
gem 'execjs'
|
25
|
+
```
|
26
|
+
|
27
|
+
## Configuration
|
28
|
+
|
29
|
+
To customize configuration, place an eslint config file in your app's
|
30
|
+
`config/eslint.json`.
|
31
|
+
|
32
|
+
You can print the configuration thusly:
|
33
|
+
|
34
|
+
```sh
|
35
|
+
# Print the configuration that we're using. If there's a custom configuration
|
36
|
+
# present, print that; if not, print the default configuration.
|
37
|
+
rake eslint:print_config
|
38
|
+
|
39
|
+
# Or print the default configuration even if a custom one exists.
|
40
|
+
rake eslint:print_config[true]
|
41
|
+
```
|
42
|
+
|
43
|
+
You can also retrieve the current eslint.json by visiting `/eslint/eslint.json`
|
44
|
+
in your browser. To force retrieval of the default conguration, use
|
45
|
+
`/eslint/eslint.json?force_default=true`.
|
46
|
+
|
47
|
+
## Usage
|
48
|
+
|
49
|
+
### CLI
|
50
|
+
|
51
|
+
![rake-eslint-rails-run][]
|
52
|
+
|
53
|
+
This will analyze all of the javascript files in the project:
|
54
|
+
|
55
|
+
```sh
|
56
|
+
rake eslint:run_all
|
57
|
+
```
|
58
|
+
|
59
|
+
Or you can run it on a single file. This will analyze `application.js`:
|
60
|
+
|
61
|
+
```sh
|
62
|
+
rake eslint:run
|
63
|
+
```
|
64
|
+
|
65
|
+
Or, you can supply a filename to the task, using several different formats, and it will lint just that file. For example, to analyze `app/assets/javascripts/components/utilities.js`, you can run any of the following:
|
66
|
+
|
67
|
+
```sh
|
68
|
+
rake eslint:run[components/utilities]
|
69
|
+
rake eslint:run[components/utilities.js]
|
70
|
+
rake eslint:run[app/assets/javascripts/components/utilities]
|
71
|
+
rake eslint:run[app/assets/javascripts/components/utilities.js]
|
72
|
+
```
|
73
|
+
|
74
|
+
To auto-correct files in either execution of the above rake tasks just add `true` to the arguments like so:
|
75
|
+
|
76
|
+
```sh
|
77
|
+
rake eslint:run_all[true]
|
78
|
+
```
|
79
|
+
or
|
80
|
+
|
81
|
+
```sh
|
82
|
+
rake eslint:run[test.js,true]
|
83
|
+
```
|
84
|
+
|
85
|
+
### Web interface
|
86
|
+
|
87
|
+
On non-production environments, visit these URLs on your application:
|
88
|
+
|
89
|
+
Path | Description
|
90
|
+
------------------------------------- | -------------------------------------------------
|
91
|
+
`/eslint` | Optionally supply a filename parameter to analyze a file other than `application.js`, e.g. `/eslint?filename=foo` to analyze foo.js.
|
92
|
+
`/eslint/source?filename=application` | Optionally replace `application` with the name of another JavaScript file, e.g. `eslint/source?filename=button_stuff` can show you `button_stuff.js`, and `eslint/source?filename=components/buttons/icon_button` can show you `components/buttons/icon_button.js.coffee.erb`. This returns the source code with syntax highlighting
|
93
|
+
`/eslint?filename=<path+filename>` | Providing you give a correct path/filename, it will run the eslint report and show you the errors
|
94
|
+
`/eslint?filename=<path+filename>&should_autocorrect=true` | Same as above, but will report errors AFTER auto-correcting any auto-correct-able issues
|
95
|
+
|
96
|
+
![eslint-rails-web][]
|
97
|
+
|
98
|
+
![eslint-rails-web-source][]
|
99
|
+
|
100
|
+
# Contributing
|
101
|
+
|
102
|
+
It's easiest to contribute by forking the repo and creating a pull request. For
|
103
|
+
help with this, see this [helpful article][fork a repo].
|
104
|
+
|
105
|
+
For all of the example shell commands below, I'm going to assume that you've set
|
106
|
+
these two variables, so go ahead and customize these and set them before you
|
107
|
+
start.
|
108
|
+
|
109
|
+
```sh
|
110
|
+
ESLINT=~/src/eslint
|
111
|
+
ESLINT_RAILS=~/src/eslint-rails
|
112
|
+
```
|
113
|
+
|
114
|
+
## Cloning the repository
|
115
|
+
|
116
|
+
```sh
|
117
|
+
git clone https://github.com/appfolio/eslint-rails-ee $ESLINT_RAILS
|
118
|
+
```
|
119
|
+
|
120
|
+
## Updating ESLint version
|
121
|
+
|
122
|
+
### Summary
|
123
|
+
|
124
|
+
1. [Clone the ESLint repository](#clone-the-eslint-repository)
|
125
|
+
2. [Install dependencies](#install-dependencies)
|
126
|
+
3. [Render `eslint.js`](#render-eslintjs)
|
127
|
+
4. [Copy `eslint.js` into `eslint-rails`](#copy-eslintjs-into-eslint-rails)
|
128
|
+
5. [Update the file in git](#update-the-file-in-git)
|
129
|
+
6. [Commit, push, and create a pull request](#commit-push-and-create-a-pull-request)
|
130
|
+
|
131
|
+
### Step-by-step instructions
|
132
|
+
|
133
|
+
First, make sure you set the environment variables [as suggested above](#contributing).
|
134
|
+
|
135
|
+
#### Clone the [ESLint repository][]
|
136
|
+
|
137
|
+
I would recommend only trying this with a released version unless you have a
|
138
|
+
good reason to. In this example, I'm going to check out v1.10.1 and work with
|
139
|
+
that.
|
140
|
+
|
141
|
+
```sh
|
142
|
+
git clone https://github.com/eslint/eslint $ESLINT
|
143
|
+
cd $ESLINT
|
144
|
+
git checkout v1.10.1
|
145
|
+
```
|
146
|
+
|
147
|
+
#### Install dependencies
|
148
|
+
|
149
|
+
```sh
|
150
|
+
cd $ESLINT
|
151
|
+
npm install
|
152
|
+
```
|
153
|
+
|
154
|
+
#### Render `eslint.js`
|
155
|
+
|
156
|
+
```sh
|
157
|
+
cd $ESLINT
|
158
|
+
node Makefile.js browserify
|
159
|
+
```
|
160
|
+
|
161
|
+
#### Copy `eslint.js` into `eslint-rails`
|
162
|
+
|
163
|
+
```sh
|
164
|
+
# Assuming you cloned eslint into a repository next to eslint-rails
|
165
|
+
cp $ESLINT/build/eslint.js $ESLINT_RAILS/vendor/assets/javascripts/eslint.js
|
166
|
+
```
|
167
|
+
|
168
|
+
#### Update the file in git
|
169
|
+
|
170
|
+
```sh
|
171
|
+
cd $ESLINT_RAILS
|
172
|
+
git add vendor/assets/javascripts/eslint.js
|
173
|
+
```
|
174
|
+
|
175
|
+
#### Commit, push, and create a pull request
|
176
|
+
|
177
|
+
The details of how to create your own branch, commit, push, and create a pull
|
178
|
+
request are outside the scope of this README. If you need help with this part,
|
179
|
+
here's a [helpful article][fork a repo]. This is the gist.
|
180
|
+
|
181
|
+
```sh
|
182
|
+
cd $ESLINT_RAILS
|
183
|
+
# Make your changes
|
184
|
+
git add :/
|
185
|
+
git commit
|
186
|
+
git push origin master
|
187
|
+
# Open a pull request
|
188
|
+
```
|
189
|
+
# Fork Authors
|
190
|
+
|
191
|
+
Since the original repo lacked some features I wanted and hasn't seen support/PRs in over a year, I decided to make this repo. Future maintenance of this gem will exist in
|
192
|
+
the new eslint-rails-ee repo:
|
193
|
+
|
194
|
+
- David Valentine <[davidlewisrogers3@gmail.com][]>
|
195
|
+
|
196
|
+
# Original Authors
|
197
|
+
|
198
|
+
This repo was orignially written by the following people:
|
199
|
+
|
200
|
+
- Jon Kessler <[jon.kessler@appfolio.com][]>
|
201
|
+
- Justin Force <[justin.force@appfolio.com][]>
|
202
|
+
|
203
|
+
# License
|
204
|
+
|
205
|
+
[MIT License][].
|
206
|
+
|
207
|
+
[ESLint]: http://eslint.org/
|
208
|
+
[fork a repo]: https://help.github.com/articles/fork-a-repo/
|
209
|
+
[ESLint repository]: https://github.com/eslint/eslint
|
210
|
+
[justin.force@appfolio.com]: mailto:justin.force@appfolio.com
|
211
|
+
[jon.kessler@appfolio.com]: mailto:jon.kessler@appfolio.com
|
212
|
+
[MIT License]: http://www.opensource.org/licenses/MIT)
|
213
|
+
|
214
|
+
[rake-eslint-rails-run]: https://cloud.githubusercontent.com/assets/324632/6672146/9d1f278e-cbc7-11e4-9f56-5a4511d35921.png
|
215
|
+
[eslint-rails-web-source]: https://cloud.githubusercontent.com/assets/324632/6671965/33d6819c-cbc6-11e4-9a64-30be84f20b96.png
|
216
|
+
[eslint-rails-web]: https://cloud.githubusercontent.com/assets/324632/6671966/33d8cc86-cbc6-11e4-904d-3379907c429d.png
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class EslintController < ActionController::Base
|
2
|
+
|
3
|
+
before_action :set_options
|
4
|
+
|
5
|
+
def show
|
6
|
+
@warnings = ESLintRails::Runner.new(@filename).run(@should_autocorrect)
|
7
|
+
end
|
8
|
+
|
9
|
+
def source
|
10
|
+
@source = Rails.application.assets[@filename].to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
def config_file
|
14
|
+
render json: ESLintRails::Config.read(force_default: params[:force_default] || false)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def set_options
|
20
|
+
@filename = params[:filename] || 'application'
|
21
|
+
@should_autocorrect = ['true'].include?(params[:should_autocorrect]) ? true : false
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
|
5
|
+
<style>
|
6
|
+
.container {
|
7
|
+
margin: 0 auto;
|
8
|
+
width: 980px;
|
9
|
+
}
|
10
|
+
</style>
|
11
|
+
</head>
|
12
|
+
<body>
|
13
|
+
<div class="container">
|
14
|
+
<h1>
|
15
|
+
ESLint Report <%= "(after auto-corrections)" if params[:should_autocorrect] %>
|
16
|
+
<small>
|
17
|
+
<%= link_to 'eslint.json', config_file_path %>
|
18
|
+
</small>
|
19
|
+
</h1>
|
20
|
+
<table class="table">
|
21
|
+
<thead>
|
22
|
+
<tr>
|
23
|
+
<th>Location</th>
|
24
|
+
<th>Severity</th>
|
25
|
+
<th>Rule</th>
|
26
|
+
<th>Message</th>
|
27
|
+
</tr>
|
28
|
+
</thead>
|
29
|
+
<tbody>
|
30
|
+
<% @warnings.each do |warning| %>
|
31
|
+
<%
|
32
|
+
row_class = case warning.severity
|
33
|
+
when :low
|
34
|
+
'warning'
|
35
|
+
when :high
|
36
|
+
'danger'
|
37
|
+
else
|
38
|
+
''
|
39
|
+
end
|
40
|
+
%>
|
41
|
+
<tr class="<%= row_class %>">
|
42
|
+
<td><%= link_to(
|
43
|
+
"#{warning.line}:#{warning.column}",
|
44
|
+
eslint_source_path(filename: @filename, anchor: warning.line)
|
45
|
+
) %></td>
|
46
|
+
<td><%= warning.severity.to_s.capitalize %></td>
|
47
|
+
<td><%= link_to warning.rule_id, "http://eslint.org/docs/rules/#{warning.rule_id}.html" %></td>
|
48
|
+
<td><%= warning.message %></td>
|
49
|
+
</tr>
|
50
|
+
<% end %>
|
51
|
+
</tbody>
|
52
|
+
</table>
|
53
|
+
</div>
|
54
|
+
</body>
|
55
|
+
</html>
|
@@ -0,0 +1,80 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/styles/github.min.css">
|
5
|
+
<style>
|
6
|
+
.container {
|
7
|
+
display: flex;
|
8
|
+
}
|
9
|
+
|
10
|
+
.line-numbers {
|
11
|
+
padding-right: 0.5em;
|
12
|
+
}
|
13
|
+
|
14
|
+
.line-numbers > a {
|
15
|
+
color: #000;
|
16
|
+
display: block;
|
17
|
+
font-family: monospace;
|
18
|
+
text-align: right;
|
19
|
+
text-decoration: none;
|
20
|
+
}
|
21
|
+
|
22
|
+
.line-numbers > a.current {
|
23
|
+
color: orangered;
|
24
|
+
outline: none;
|
25
|
+
}
|
26
|
+
|
27
|
+
.line-numbers > a.current:after {
|
28
|
+
content: '';
|
29
|
+
position: absolute;
|
30
|
+
left: 0;
|
31
|
+
right: 100%;
|
32
|
+
width: 100vw;
|
33
|
+
height: 12px;
|
34
|
+
background: #ff9;
|
35
|
+
z-index: -1;
|
36
|
+
}
|
37
|
+
|
38
|
+
.the-code {
|
39
|
+
flex: 1;
|
40
|
+
margin: 0;
|
41
|
+
}
|
42
|
+
|
43
|
+
.hljs {
|
44
|
+
background: rgba(0,0,0,0.01);
|
45
|
+
padding: 0;
|
46
|
+
}
|
47
|
+
</style>
|
48
|
+
</head>
|
49
|
+
<body>
|
50
|
+
<div class="container">
|
51
|
+
<div class="line-numbers">
|
52
|
+
<% 1.upto(@source.lines.size) do |line_number| %>
|
53
|
+
<a id="<%= line_number %>" href="#<%= line_number %>" class="line-number"><%= line_number %></a>
|
54
|
+
<% end %>
|
55
|
+
</div>
|
56
|
+
<pre class="the-code hljs javascript"><code><%= @source %></code></pre>
|
57
|
+
</div>
|
58
|
+
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/highlight.min.js"></script>
|
59
|
+
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/languages/javascript.min.js"></script>
|
60
|
+
<script>
|
61
|
+
(function() {
|
62
|
+
hljs.initHighlightingOnLoad();
|
63
|
+
|
64
|
+
function selectCurrentLine() {
|
65
|
+
var hash = location.hash
|
66
|
+
, currentLineNumber = hash.replace(/#/, '');
|
67
|
+
Array.prototype.slice.call(document.querySelectorAll('.line-number')).forEach(function(lineNumber) {
|
68
|
+
lineNumber.classList.remove('current');
|
69
|
+
});
|
70
|
+
document.getElementById(currentLineNumber).classList.add('current');
|
71
|
+
}
|
72
|
+
|
73
|
+
if (location.hash) {
|
74
|
+
selectCurrentLine();
|
75
|
+
}
|
76
|
+
window.addEventListener('hashchange', selectCurrentLine);
|
77
|
+
}())
|
78
|
+
</script>
|
79
|
+
</body>
|
80
|
+
</html>
|
data/build-plugins.sh
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
ESLINT_RAILS_DIR=$(pwd)
|
4
|
+
PLUGINS=(yannickcr/eslint-plugin-react) # Add new plugins here.
|
5
|
+
GIT_URL_PREFIX="git@github.com:"
|
6
|
+
GIT_URL_SUFFIX=".git"
|
7
|
+
|
8
|
+
mkdir -p /tmp/eslint-rails-plugins
|
9
|
+
cd /tmp/eslint-rails-plugins
|
10
|
+
|
11
|
+
for plugin in ${PLUGINS[@]}; do
|
12
|
+
git_url=$GIT_URL_PREFIX$plugin$GIT_URL_SUFFIX
|
13
|
+
git clone $git_url
|
14
|
+
plugin_name=$(basename $git_url .git)
|
15
|
+
cd $plugin_name
|
16
|
+
npm install
|
17
|
+
browserify index.js -o $plugin_name.js
|
18
|
+
cp $plugin_name.js $ESLINT_RAILS_DIR/vendor/assets/javascripts/plugins/
|
19
|
+
done
|
20
|
+
|
21
|
+
rm -rf /tmp/eslint-rails-plugins
|