Skip to content

Commit d66381e

Browse files
author
Ives van Hoorne
committed
Update lint for codemirror
1 parent 73bf3c5 commit d66381e

File tree

4 files changed

+63
-412
lines changed

4 files changed

+63
-412
lines changed

packages/app/src/app/components/CodeEditor/CodeMirror/index.js

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@ import { getCodeMirror } from 'app/utils/codemirror';
99
import 'codemirror/addon/dialog/dialog';
1010
import 'codemirror/addon/hint/show-hint';
1111
import 'codemirror/addon/tern/tern';
12+
import 'codemirror/addon/lint/lint.css';
13+
import 'codemirror/addon/lint/lint';
1214

1315
import FuzzySearch from '../FuzzySearch';
1416
import { Container, CodeContainer } from './elements';
1517

18+
import LinterWorker from 'worker-loader?name=monaco-linter.[hash].worker.js!../Monaco/workers/linter';
19+
1620
import type { Props, Editor } from '../types';
1721

1822
type State = { fuzzySearchEnabled: boolean };
@@ -90,6 +94,46 @@ class CodemirrorEditor extends React.Component<Props, State> implements Editor {
9094
});
9195
};
9296

97+
linterWorker: ?Worker;
98+
99+
validate = (code: string = '', updateLinting: Function) => {
100+
if (code.trim() === '') {
101+
updateLinting([]);
102+
return;
103+
}
104+
105+
const linterWorker = this.linterWorker;
106+
if (linterWorker) {
107+
linterWorker.postMessage({
108+
code,
109+
title: this.currentModule.title,
110+
version: code,
111+
});
112+
113+
linterWorker.onmessage = (event: MessageEvent) => {
114+
// $FlowIssue
115+
const { markers, version } = event.data;
116+
117+
if (version === code) {
118+
updateLinting(
119+
markers.map(error => ({
120+
message: `eslint: ${error.message}`,
121+
severity: error.severity === 2 ? 'warning' : 'error',
122+
from: new CodeMirror.Pos(
123+
error.startLineNumber - 1,
124+
error.startColumn - 1
125+
),
126+
to: new CodeMirror.Pos(
127+
error.endLineNumber - 1,
128+
error.endColumn - 1
129+
),
130+
}))
131+
);
132+
}
133+
};
134+
}
135+
};
136+
93137
changeSettings = async (settings: $PropertyType<Props, 'settings'>) => {
94138
const defaultKeys = {
95139
'Cmd-/': cm => {
@@ -185,12 +229,13 @@ class CodemirrorEditor extends React.Component<Props, State> implements Editor {
185229
}
186230

187231
if (settings.lintEnabled) {
188-
const initialized = 'eslint' in window;
189-
import(/* webpackChunkName: 'codemirror-eslint' */ 'app/utils/codemirror/eslint-lint')
190-
.then(initializer => !initialized && initializer.default())
191-
.then(() => {
192-
this.codemirror.setOption('lint', true);
232+
if (!this.linterWorker) {
233+
this.linterWorker = new LinterWorker();
234+
this.codemirror.setOption('lint', {
235+
getAnnotations: this.validate,
236+
async: true,
193237
});
238+
}
194239
} else {
195240
this.codemirror.setOption('lint', false);
196241
}

packages/app/src/app/pages/Sandbox/Editor/Content/index.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import getTemplateDefinition from 'common/templates';
88
import type { ModuleError } from 'common/types';
99

1010
import CodeEditor from 'app/components/CodeEditor';
11-
import type { Editor } from 'app/components/CodeEditor/types';
11+
import type { Editor, Settings } from 'app/components/CodeEditor/types';
1212
import DevTools from 'app/components/Preview/DevTools';
1313
import FilePath from 'app/components/CodeEditor/FilePath';
1414
import Preview from './Preview';
@@ -17,16 +17,18 @@ import Tabs from './Tabs';
1717

1818
import { FullSize } from './elements';
1919

20-
const settings = store => ({
21-
fontFamily: store.preferences.settings.fontFamily,
22-
fontSize: store.preferences.settings.fontSize,
23-
lineHeight: store.preferences.settings.lineHeight,
24-
autoCompleteEnabled: store.preferences.settings.autoCompleteEnabled,
25-
autoDownloadTypes: store.preferences.settings.autoDownloadTypes,
26-
vimMode: store.preferences.settings.vimMode,
27-
lintEnabled: store.preferences.settings.lintEnabled,
28-
tabWidth: 2,
29-
});
20+
const settings = store =>
21+
({
22+
fontFamily: store.preferences.settings.fontFamily,
23+
fontSize: store.preferences.settings.fontSize,
24+
lineHeight: store.preferences.settings.lineHeight,
25+
autoCompleteEnabled: store.preferences.settings.autoCompleteEnabled,
26+
autoDownloadTypes: store.preferences.settings.autoDownloadTypes,
27+
vimMode: store.preferences.settings.vimMode,
28+
lintEnabled: store.preferences.settings.lintEnabled,
29+
codeMirror: store.preferences.settings.codeMirror,
30+
tabWidth: 2,
31+
}: Settings);
3032

3133
type Props = {
3234
signals: any,

0 commit comments

Comments
 (0)