mirror of
https://github.com/usebruno/bruno.git
synced 2026-07-02 08:58:32 +00:00
fix(#1214): fixed code mirror lint issues
This commit is contained in:
92
packages/bruno-app/src/utils/codemirror/javascript-lint.js
Normal file
92
packages/bruno-app/src/utils/codemirror/javascript-lint.js
Normal file
@@ -0,0 +1,92 @@
|
||||
/**
|
||||
* MIT License
|
||||
* https://github.com/codemirror/codemirror5/blob/master/LICENSE
|
||||
*
|
||||
* Copyright (C) 2017 by Marijn Haverbeke <marijnh@gmail.com> and others
|
||||
*/
|
||||
|
||||
let CodeMirror;
|
||||
const SERVER_RENDERED = typeof navigator === 'undefined' || global['PREVENT_CODEMIRROR_RENDER'] === true;
|
||||
|
||||
if (!SERVER_RENDERED) {
|
||||
CodeMirror = require('codemirror');
|
||||
const { filter } = require('lodash');
|
||||
|
||||
function validator(text, options) {
|
||||
if (!window.JSHINT) {
|
||||
if (window.console) {
|
||||
window.console.error('Error: window.JSHINT not defined, CodeMirror JavaScript linting cannot run.');
|
||||
}
|
||||
return [];
|
||||
}
|
||||
if (!options.indent)
|
||||
// JSHint error.character actually is a column index, this fixes underlining on lines using tabs for indentation
|
||||
options.indent = 1; // JSHint default value is 4
|
||||
JSHINT(text, options, options.globals);
|
||||
var errors = JSHINT.data().errors,
|
||||
result = [];
|
||||
|
||||
/*
|
||||
* Filter out errors due to top level awaits
|
||||
* See https://github.com/usebruno/bruno/issues/1214
|
||||
*
|
||||
* Once JSHINT top level await support is added, this file can be removed
|
||||
* and we can use the default javascript-lint addon from codemirror
|
||||
*/
|
||||
errors = filter(errors, (error) => {
|
||||
if (error.code === 'E058') {
|
||||
if (
|
||||
error.evidence &&
|
||||
error.evidence.includes('await') &&
|
||||
error.reason === 'Missing semicolon.' &&
|
||||
error.scope === '(main)'
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
if (errors) parseErrors(errors, result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
CodeMirror.registerHelper('lint', 'javascript', validator);
|
||||
|
||||
function parseErrors(errors, output) {
|
||||
for (var i = 0; i < errors.length; i++) {
|
||||
var error = errors[i];
|
||||
if (error) {
|
||||
if (error.line <= 0) {
|
||||
if (window.console) {
|
||||
window.console.warn('Cannot display JSHint error (invalid line ' + error.line + ')', error);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
var start = error.character - 1,
|
||||
end = start + 1;
|
||||
if (error.evidence) {
|
||||
var index = error.evidence.substring(start).search(/.\b/);
|
||||
if (index > -1) {
|
||||
end += index;
|
||||
}
|
||||
}
|
||||
|
||||
// Convert to format expected by validation service
|
||||
var hint = {
|
||||
message: error.reason,
|
||||
severity: error.code ? (error.code.startsWith('W') ? 'warning' : 'error') : 'error',
|
||||
from: CodeMirror.Pos(error.line - 1, start),
|
||||
to: CodeMirror.Pos(error.line - 1, end)
|
||||
};
|
||||
|
||||
output.push(hint);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user