UNPKG

@phoenix-plugin-registry/brackets-fixmyjs

Version:

Automagically fix JSHint lint warnings

235 lines (202 loc) 6.77 kB
/* * Copyright (c) 2014 Drew Fyock */ define(function(require, exports, module) { 'use strict'; /* Globals */ var COMMAND_ID = 'steelbisondev.fixmyjs', COMMAND_SAVE_ID = COMMAND_ID + '.autosave', COMMAND_TIMESTAMP = COMMAND_ID + '-timeStamp', CONTEXTUAL_COMMAND_ID = COMMAND_ID + 'Contextual'; var Menus = brackets.getModule('command/Menus'), AppInit = brackets.getModule('utils/AppInit'), Commands = brackets.getModule('command/Commands'), Editor = brackets.getModule('editor/Editor').Editor, FileSystem = brackets.getModule('filesystem/FileSystem'), EditorManager = brackets.getModule('editor/EditorManager'), CommandManager = brackets.getModule('command/CommandManager'), ProjectManager = brackets.getModule('project/ProjectManager'), DocumentManager = brackets.getModule('document/DocumentManager'), PreferencesManager = brackets.getModule('preferences/PreferencesManager'); /* thirdparty */ require('thirdparty/fixmyjs/lib/legacy'); var fixmyjs = fixMyJS; require('thirdparty/jshint/dist/jshint'); var jshint = JSHINT; /* Variables */ var fixmyjsOnSave, settingsFileName = '.fixmyjsrc', menu = Menus.getMenu(Menus.AppMenuBar.EDIT_MENU), settings = JSON.parse(require('text!settings.json')), debugPreferences = PreferencesManager.getExtensionPrefs('debug'), fixmyjsPreferences = PreferencesManager.getExtensionPrefs(COMMAND_ID), windowsCommand = { key: 'Alt-Shift-L', platform: 'win' }, macCommand = { key: 'Alt-Shift-L', platform: 'mac' }, command = [windowsCommand, macCommand]; // Brackets debug mode var DEBUG_MODE = debugPreferences.get('showErrorsInStatusBar'); fixmyjsOnSave = fixmyjsPreferences.get('on_save') || false; if (!fixmyjsOnSave) { fixmyjsPreferences.set('on_save', false); fixmyjsPreferences.save(); } function __debug(msg, code) { if (DEBUG_MODE) { var m = '[brackets-fixmyjs] :: ' + msg; if (typeof msg !== 'string') { m = msg; } if (code === 0) { console.log(m); } else { console.error(m); } } } /** * * @param {String} unformattedText * @param {String} indentChar * @param {String} indentSize */ function _fixmyjs(unformattedText, indentChar, indentSize) { var options = { 'indent_size': indentSize, 'indent_char': indentChar }; var data = unformattedText; var opts = $.extend(options, settings); try { if (opts.legacy) { jshint(data, opts); return fixmyjs(jshint.data(), data, opts).run(); } else { return fixmyjs.fix(data, opts); } } catch (err) { throw err; } } function batchUpdate(formattedText, isSelection) { var editor = EditorManager.getCurrentFullEditor(); var cursor = editor.getCursorPos(); var scroll = editor.getScrollPos(); var doc = DocumentManager.getCurrentDocument(); var selection = editor.getSelection(); doc.batchOperation(function() { if (isSelection) { doc.replaceRange(formattedText, selection.start, selection.end); } else { doc.setText(formattedText); } editor.setCursorPos(cursor); editor.setScrollPos(scroll.x, scroll.y); }); } /** * Format */ function format(autoSave) { var indentChar, indentSize, formattedText; var unformattedText, isSelection = false; var useTabs = Editor.getUseTabChar(); __debug(settings, 0); if (useTabs) { indentChar = '\t'; indentSize = 1; } else { indentChar = ' '; indentSize = Editor.getSpaceUnits(); } var editor = EditorManager.getCurrentFullEditor(); var selectedText = editor.getSelectedText(); if (selectedText.length > 0) { isSelection = true; unformattedText = selectedText; } else { unformattedText = DocumentManager.getCurrentDocument().getText(); } var doc = DocumentManager.getCurrentDocument(); var language = doc.getLanguage(); var fileType = language._id; switch (fileType) { case 'javascript': case 'json': formattedText = _fixmyjs(unformattedText, indentChar, indentSize); batchUpdate(formattedText, isSelection); break; default: if (!autoSave) { alert('Could not determine file type'); } return; } } function onSave(event, doc) { if ((event.timeStamp - localStorage.getItem(COMMAND_TIMESTAMP)) > 1000) { format(true); localStorage.setItem(COMMAND_TIMESTAMP, event.timeStamp); CommandManager.execute(Commands.FILE_SAVE, { doc: doc }); } } function loadConfig() { var settingsFile = FileSystem.getFileForPath(ProjectManager.getProjectRoot().fullPath + settingsFileName); settingsFile.read(function(err, content) { if (content) { try { settings = JSON.parse(content); __debug('settings loaded' + settings, 0); } catch (e) { __debug('error parsing ' + settingsFile + '. Details: ' + e); return; } } }); } function toggle(command, fromCheckbox) { var newValue = (typeof fromCheckbox === 'undefined') ? fixmyjsOnSave : fromCheckbox; $(DocumentManager)[newValue ? 'on' : 'off']('documentSaved', onSave); command.setChecked(newValue); fixmyjsPreferences.set('on_save', newValue); fixmyjsPreferences.save(); } /** * File menu */ CommandManager.register('FixMyJS', COMMAND_ID, format); var commandOnSave = CommandManager.register('FixMyJS on save', COMMAND_SAVE_ID, function() { toggle(this, !this.getChecked()); if (this.getChecked()) { localStorage.setItem(COMMAND_TIMESTAMP, 0); } }); /** * Contextual menu */ CommandManager.register('FixMyJS', CONTEXTUAL_COMMAND_ID, format); var contextMenu = Menus.getContextMenu(Menus.ContextMenuIds.EDITOR_MENU); contextMenu.addMenuItem(CONTEXTUAL_COMMAND_ID); toggle(commandOnSave); menu.addMenuDivider(); menu.addMenuItem(COMMAND_ID, command); menu.addMenuItem(COMMAND_SAVE_ID); AppInit.appReady(function() { $(DocumentManager).on('documentRefreshed.fixmyjs', function(e, document) { if (document.file.fullPath === ProjectManager.getProjectRoot().fullPath + settingsFileName) { loadConfig(); } }); $(ProjectManager).on('projectOpen.fixmyjs', function() { loadConfig(); }); loadConfig(); }); });