Skip to content

Commit d9485bd

Browse files
authored
Use babel-eslint as linter parser (codesandbox#214)
* Use babel-eslint as linter parser * Remove console.log
1 parent 391c816 commit d9485bd

File tree

11 files changed

+902
-156
lines changed

11 files changed

+902
-156
lines changed

config/babel.dev.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module.exports = {
1818
require.resolve('babel-plugin-lodash'),
1919
require.resolve('babel-plugin-syntax-dynamic-import'),
2020
require.resolve('babel-plugin-styled-components'),
21+
require.resolve('babel-macros'),
2122
[
2223
require.resolve('react-loadable/babel'),
2324
{

config/babel.prod.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ module.exports = {
1717
require.resolve('babel-plugin-lodash'),
1818
require.resolve('babel-plugin-syntax-dynamic-import'),
1919
require.resolve('babel-plugin-styled-components'),
20+
require.resolve('babel-macros'),
2021
[
2122
require.resolve('react-loadable/babel'),
2223
{

config/paths.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ module.exports = {
4141
appNodeModules: resolveApp('node_modules'),
4242
ownNodeModules: resolveApp('node_modules'),
4343
nodePaths,
44+
config: resolveApp('config'),
4445
};

config/stubs/load-rules.compiled.js

Lines changed: 378 additions & 0 deletions
Large diffs are not rendered by default.

config/stubs/load-rules.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const codegen = require('babel-plugin-codegen/macro');
2+
3+
// TODO automate generation:
4+
// babel --plugins babel-macros config/stubs/load-rules.js > config/stubs/load-rules.compiled.js
5+
6+
module.exports = function loadRules() {
7+
// Create list of require statements of all rules during compile time
8+
codegen`
9+
const path = require("path");
10+
const find = require("shelljs").find;
11+
12+
let output = "var rules = Object.create(null);\\n";
13+
14+
find(path.resolve("./node_modules/eslint/lib/rules")).filter(f => path.extname(f) === '.js').forEach((filename) => {
15+
const basename = path.basename(filename, '.js');
16+
17+
output += \`rules["\${basename}"] = require("eslint/lib/rules/\${basename}");\\n\`
18+
});
19+
20+
output += "\\n return rules;\\n";
21+
22+
module.exports = output;
23+
`;
24+
};

config/webpack.common.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,14 @@ module.exports = {
206206
// a plugin that prints an error when you attempt to do this.
207207
// See https://github.com/facebookincubator/create-react-app/issues/240
208208
new CaseSensitivePathsPlugin(),
209+
210+
// With this plugin we override the load-rules of eslint, this function prevents
211+
// us from using eslint in the browser, therefore we need to stop it!
212+
new webpack.NormalModuleReplacementPlugin(
213+
/eslint\/lib\/load-rules/,
214+
'../../../config/stubs/load-rules.compiled.js'
215+
),
216+
209217
// If you require a missing module and then `npm install` it, you still have
210218
// to restart the development server for Webpack to discover it. This plugin
211219
// makes the discovery automatic so you don't have to restart.

package.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
"babel-eslint": "^7.2.3",
1010
"babel-jest": "^20.0.3",
1111
"babel-loader": "^7.1.0",
12+
"babel-macros": "^1.0.2",
13+
"babel-plugin-codegen": "^1.2.0",
1214
"babel-plugin-lodash": "^3.2.11",
1315
"babel-plugin-styled-components": "^1.1.7",
1416
"babel-plugin-syntax-dynamic-import": "^6.18.0",
@@ -30,7 +32,7 @@
3032
"cross-spawn": "^5.0.1",
3133
"css-loader": "^0.28.1",
3234
"detect-port": "^1.1.1",
33-
"eslint": "^3.19.0",
35+
"eslint": "CompuIves/eslint#add/define-parser",
3436
"eslint-config-airbnb": "^15.0.1",
3537
"eslint-config-prettier": "^2.1.1",
3638
"eslint-import-resolver-webpack": "^0.8.1",
@@ -60,8 +62,10 @@
6062
"object-assign": "^4.1.1",
6163
"opn": "4.0.2",
6264
"path-exists": "3.0.0",
65+
"path-override-webpack-plugin": "^0.1.2",
6366
"postcss-loader": "^1.2.1",
6467
"prettier": "^1.6.1",
68+
"preval.macro": "^1.0.1",
6569
"promise": "7.1.1",
6670
"raw-loader": "^0.5.1",
6771
"react-hot-loader": "^3.0.0-beta.6",
@@ -150,6 +154,7 @@
150154
"redbox-react": "^1.4.3",
151155
"redux": "^3.7.1",
152156
"reselect": "^3.0.1",
157+
"shelljs": "^0.7.8",
153158
"store": "^2.0.12",
154159
"styled-components": "^2.1.1",
155160
"svg-react-loader": "^0.4.4",

src/app/components/sandbox/CodeEditor/monaco/workers/linter.js

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
if (!self.eslint) {
2-
self.importScripts(['/static/js/eslint.4.1.0.min.js']);
3-
}
1+
import Linter from 'eslint/lib/linter';
2+
3+
import monkeypatch from './utils/monkeypatch-babel-eslint';
44

55
/* eslint-disable global-require */
66
const allRules = {
@@ -113,6 +113,7 @@ const defaultConfig = {
113113
globalReturn: false,
114114
impliedStrict: true,
115115
experimentalObjectRestSpread: true,
116+
modules: true,
116117
},
117118
},
118119
parser: 'babel-eslint',
@@ -305,7 +306,14 @@ const defaultConfig = {
305306
},
306307
};
307308

308-
const linter = new self.eslint(); // eslint-disable-line new-cap
309+
monkeypatch({}, defaultConfig.parserOptions);
310+
311+
const linter = new Linter();
312+
313+
linter.defineParser('babel-eslint', {
314+
parse: require('babel-eslint').parseNoPatch, // eslint-disable-line global-require
315+
});
316+
309317
linter.defineRules(allRules);
310318

311319
function getPos(error, from) {
@@ -334,24 +342,12 @@ function getSeverity(error) {
334342
}
335343
}
336344

337-
const oldRequire = self.require;
338-
self.require = (...args) => {
339-
const [requireDep] = args;
340-
341-
if (requireDep === 'babel-eslint') {
342-
const babelEslint = require('babel-eslint'); // eslint-disable-line global-require
343-
344-
return { parse: babelEslint.parseNoPatch };
345-
}
346-
347-
return oldRequire(...args);
348-
};
349-
350345
// Respond to message from parent thread
351346
self.addEventListener('message', event => {
352347
const { code, version } = event.data;
353348

354349
const validations = linter.verify(code, defaultConfig);
350+
355351
const markers = validations.map(error => {
356352
const { line: startL, column: startCol } = getPos(error, true);
357353
const { line: endL, column: endCol } = getPos(error, false);

0 commit comments

Comments
 (0)