brackets-eslint
Version:
Adds ESLint support to Brackets
84 lines (83 loc) • 3.99 kB
JavaScript
;
define(function (require, exports, module) {
var CodeInspection = brackets.getModule('language/CodeInspection');
var ProjectManager = brackets.getModule('project/ProjectManager');
var ExtensionUtils = brackets.getModule('utils/ExtensionUtils');
var NodeDomain = brackets.getModule('utils/NodeDomain');
var CommandManager = brackets.getModule('command/CommandManager');
var Menus = brackets.getModule('command/Menus');
var DocumentManager = brackets.getModule('document/DocumentManager');
var EditorManager = brackets.getModule('editor/EditorManager');
var PreferencesManager = brackets.getModule('preferences/PreferencesManager');
var EXTENSION_NAME = 'brackets-eslint';
var EXTENSION_UNIQUE_NAME = 'zaggino.' + EXTENSION_NAME;
var AUTOFIX_COMMAND_ID = EXTENSION_UNIQUE_NAME + '.autofix';
var AUTOFIX_COMMAND_NAME = 'Auto-fix with ESLint';
var log = require('./log');
var preferences = PreferencesManager.getExtensionPrefs(EXTENSION_NAME);
preferences.definePreference('gutterMarks', 'boolean', true);
preferences.set('gutterMarks', preferences.get('gutterMarks'));
preferences.definePreference('useLocalESLint', 'boolean', false);
preferences.set('useLocalESLint', preferences.get('useLocalESLint'));
var LINTER_NAME = 'ESLint';
var nodeDomain = new NodeDomain(EXTENSION_UNIQUE_NAME, ExtensionUtils.getModulePath(module, './node/domain'));
function handleLintSync(text, fullPath) {
throw new Error('ESLint sync is not available, use async for ' + fullPath);
}
function handleLintAsync(text, fullPath) {
var deferred = $.Deferred();
var projectRoot = ProjectManager.getProjectRoot().fullPath;
var useLocalESLint = preferences.get('useLocalESLint');
nodeDomain.exec('lintFile', projectRoot, fullPath, text, useLocalESLint)
.then(function (report) {
var w = window;
if (w.bracketsInspectionGutters) {
w.bracketsInspectionGutters.set(EXTENSION_UNIQUE_NAME, fullPath, report, preferences.get('gutterMarks', projectRoot));
}
else {
log.error("No bracketsInspectionGutters found on window, gutters disabled.");
}
deferred.resolve(report);
}, function (err) {
deferred.reject(err);
});
return deferred.promise();
}
function handleAutoFix() {
var doc = DocumentManager.getCurrentDocument();
var language = doc.getLanguage();
var fileType = language._id;
var fullPath = doc.file.fullPath;
var editor = EditorManager.getCurrentFullEditor();
var cursor = editor.getCursorPos();
var scroll = editor.getScrollPos();
if (fileType !== 'javascript') {
return;
}
var projectRoot = ProjectManager.getProjectRoot().fullPath;
nodeDomain.exec('fixFile', projectRoot, fullPath, doc.getText())
.then(function (response) {
var text = response && response.results[0] ? response.results[0].output : '';
if (text) {
doc.setText(text);
}
editor.setCursorPos(cursor);
editor.setScrollPos(scroll.x, scroll.y);
}, function (err) {
log.error("fixFile -> error: " + err);
});
}
CommandManager.register(AUTOFIX_COMMAND_NAME, AUTOFIX_COMMAND_ID, handleAutoFix);
var editMenu = Menus.getMenu(Menus.AppMenuBar.EDIT_MENU);
editMenu.addMenuDivider();
editMenu.addMenuItem(AUTOFIX_COMMAND_ID);
var contextMenu = Menus.getContextMenu(Menus.ContextMenuIds.EDITOR_MENU);
contextMenu.addMenuItem(AUTOFIX_COMMAND_ID);
['javascript', 'jsx', 'typescript', 'tsx', 'vue'].forEach(function (langId) {
CodeInspection.register(langId, {
name: LINTER_NAME,
scanFile: handleLintSync,
scanFileAsync: handleLintAsync
});
});
});