From eb4615604095dbc2d30658344ce8a267ba3b39bc Mon Sep 17 00:00:00 2001 From: Justin Gordon Date: Sun, 29 Mar 2015 12:02:44 -1000 Subject: [PATCH] First pass at eslint * Passes in Webstorm * However, running `eslint .` from commannd line misses long lines --- .eslintrc | 155 +++++++++++++++++++++ bootstrap-sass-no-customizations.config.js | 78 +++++------ bootstrap-sass-scripts.loader.js | 24 ++-- bootstrap-sass-styles.loader.js | 130 ++++++++--------- bootstrap-sass.config.js | 90 ++++++------ bootstrapSassPath.js | 26 ++-- index.js | 2 +- index.loader.js | 36 +++-- logger.js | 18 ++- 9 files changed, 368 insertions(+), 191 deletions(-) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..9d4dc67 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,155 @@ +# ESLint documentation can be found at http://eslint.org/docs/ +env: + browser: true + node: true + amd: false + mocha: true + jasmine: false +rules: + no-alert: 2 + no-array-constructor: 2 + no-bitwise: 0 + no-caller: 2 + no-catch-shadow: 2 + no-comma-dangle: 2 + no-cond-assign: [2, 'always'] + no-console: 0 + no-constant-condition: 2 + no-control-regex: 2 + no-debugger: 2 + no-delete-var: 2 + no-div-regex: 0 + no-dupe-keys: 2 + no-dupe-args: 2 + no-duplicate-case: 2 + no-else-return: 2 + no-empty: 2 + no-empty-class: 2 + no-empty-label: 2 + no-eq-null: 2 + no-eval: 2 + no-ex-assign: 2 + no-extend-native: 2 + no-extra-bind: 2 + no-extra-boolean-cast: 2 + no-extra-parens: 0 + no-extra-semi: 2 + no-fallthrough: 2 + no-floating-decimal: 0 + no-func-assign: 2 + no-implied-eval: 2 + no-inline-comments: 0 + no-inner-declarations: [2, 'functions'] + no-invalid-regexp: 2 + no-irregular-whitespace: 2 + no-iterator: 2 + no-label-var: 2 + no-labels: 2 + no-lone-blocks: 2 + no-lonely-if: 2 + no-loop-func: 2 + no-mixed-requires: [0, false] + no-mixed-spaces-and-tabs: [2, false] + no-multi-spaces: 2 + no-multi-str: 2 + no-multiple-empty-lines: [2, {max: 2}] + no-native-reassign: 2 + no-negated-in-lhs: 2 + no-nested-ternary: 0 + no-new: 2 + no-new-func: 2 + no-new-object: 2 + no-new-require: 0 + no-new-wrappers: 2 + no-obj-calls: 2 + no-octal: 2 + no-octal-escape: 2 + no-path-concat: 0 + no-plusplus: 0 + no-process-env: 0 + no-process-exit: 0 + no-proto: 2 + no-redeclare: 2 + no-regex-spaces: 2 + no-reserved-keys: 0 + no-restricted-modules: 0 + no-return-assign: 2 + no-script-url: 2 + no-self-compare: 2 + no-sequences: 2 + no-shadow: 2 + no-shadow-restricted-names: 2 + no-space-before-semi: 2 + no-spaced-func: 2 + no-sparse-arrays: 2 + no-sync: 0 + no-ternary: 0 + no-trailing-spaces: 2 + no-undef: 2 + no-undef-init: 2 + no-undefined: 0 + no-underscore-dangle: 0 + no-unreachable: 2 + no-unused-expressions: 2 + no-unused-vars: [2, {vars: 'all', args: 'none'}] + no-use-before-define: 2 + no-void: 2 + no-var: 0 + no-warning-comments: [0, {terms: ['todo', 'fixme', 'xxx'], location: 'start'}] + no-with: 2 + no-wrap-func: 2 + block-scoped-var: 2 + brace-style: 2 + camelcase: 0 + comma-spacing: 2 + comma-style: 2 + complexity: [0, 11] + consistent-return: 2 + consistent-this: [2, 'self'] + curly: [2, 'all'] + default-case: 0 + dot-notation: [2, {allowKeywords: true}] + eol-last: 2 + eqeqeq: 2 + func-names: 0 + func-style: [2, 'declaration'] + generator-star: 0 + guard-for-in: 0 + handle-callback-err: 2 + indent: [2, 2] + key-spacing: [2, {beforeColon: false, afterColon: true}] + max-depth: [1, 4] + max-len: [2, 100] + max-nested-callbacks: [1, 2] + max-params: [1, 4] + max-statements: [0, 10] + new-cap: 2 + new-parens: 2 + one-var: 0 + operator-assignment: [0, 'always'] + padded-blocks: 0 + quote-props: 0 + quotes: [2, 'single'] + radix: 2 + semi: 2 + sort-vars: 0 + space-after-function-name: [0, 'never'] + space-after-keywords: 2 + space-before-blocks: 2 + space-before-function-parentheses: [2, 'never'] + space-in-brackets: 2 + space-in-parens: 2 + space-infix-ops: 2 + space-return-throw-case: 2 + space-unary-ops: [2, {words: true, nonwords: false}] + spaced-line-comment: 2 + strict: [2, 'never'] + use-isnan: 2 + valid-jsdoc: 2 + valid-typeof: 2 + vars-on-top: 0 + wrap-iife: 0 + wrap-regex: 0 + yoda: [2, 'never'] +globals: + Promise: true diff --git a/bootstrap-sass-no-customizations.config.js b/bootstrap-sass-no-customizations.config.js index 3c614b0..69cbf3a 100644 --- a/bootstrap-sass-no-customizations.config.js +++ b/bootstrap-sass-no-customizations.config.js @@ -1,6 +1,6 @@ module.exports = { verbose: true, - styleLoader: "style-loader!css-loader!sass-loader", + styleLoader: 'style-loader!css-loader!sass-loader', scripts: { 'transition': true, @@ -17,48 +17,48 @@ module.exports = { 'affix': true }, styles: { - "mixins": true, + 'mixins': true, - "normalize": true, - "print": true, - "glyphicons": true, + 'normalize': true, + 'print': true, + 'glyphicons': true, - "scaffolding": true, - "type": true, - "code": true, - "grid": true, - "tables": true, - "forms": true, - "buttons": true, + 'scaffolding': true, + 'type': true, + 'code': true, + 'grid': true, + 'tables': true, + 'forms': true, + 'buttons': true, - "component-animations": true, - "dropdowns": true, - "button-groups": true, - "input-groups": true, - "navs": true, - "navbar": true, - "breadcrumbs": true, - "pagination": true, - "pager": true, - "labels": true, - "badges": true, - "jumbotron": true, - "thumbnails": true, - "alerts": true, - "progress-bars": true, - "media": true, - "list-group": true, - "panels": true, - "wells": true, - "responsive-embed": true, - "close": true, + 'component-animations': true, + 'dropdowns': true, + 'button-groups': true, + 'input-groups': true, + 'navs': true, + 'navbar': true, + 'breadcrumbs': true, + 'pagination': true, + 'pager': true, + 'labels': true, + 'badges': true, + 'jumbotron': true, + 'thumbnails': true, + 'alerts': true, + 'progress-bars': true, + 'media': true, + 'list-group': true, + 'panels': true, + 'wells': true, + 'responsive-embed': true, + 'close': true, - "modals": true, - "tooltip": true, - "popovers": true, - "carousel": true, + 'modals': true, + 'tooltip': true, + 'popovers': true, + 'carousel': true, - "utilities": true, - "responsive-utilities": true + 'utilities': true, + 'responsive-utilities': true } }; diff --git a/bootstrap-sass-scripts.loader.js b/bootstrap-sass-scripts.loader.js index abfd759..529139d 100644 --- a/bootstrap-sass-scripts.loader.js +++ b/bootstrap-sass-scripts.loader.js @@ -13,22 +13,22 @@ var scripts = [ 'affix' ]; -var bootstrapSassPath = require("./bootstrapSassPath"); -var path = require("path"); +var bootstrapSassPath = require('./bootstrapSassPath'); +var path = require('path'); -module.exports = function () {}; +module.exports = function() { +}; -// Create a list of require("path/to/boostrap.js"); -module.exports.pitch = function (configPath) { +// Create a list of require('path/to/boostrap.js'); +module.exports.pitch = function(configPath) { var pathToBootstrapSass = bootstrapSassPath.getPath(this.context); - this.cacheable(true); var config = require(configPath); - var result = scripts.filter(function (script) { + this.cacheable(true); + return scripts.filter(function(script) { return config.scripts[script]; - }).map(function (script) { - var pathToBootstrapJsFile = JSON.stringify(path.join(pathToBootstrapSass, "javascripts", "bootstrap", script)); - return "require(" + pathToBootstrapJsFile + ");"; - }).join("\n"); - return result; + }).map(function(script) { + var pathToBootstrapJsFile = JSON.stringify(path.join(pathToBootstrapSass, 'javascripts', 'bootstrap', script)); + return 'require(' + pathToBootstrapJsFile + ');'; + }).join('\n'); }; diff --git a/bootstrap-sass-styles.loader.js b/bootstrap-sass-styles.loader.js index e5e27f7..a219804 100644 --- a/bootstrap-sass-styles.loader.js +++ b/bootstrap-sass-styles.loader.js @@ -1,105 +1,107 @@ var partials = [ - "mixins", + 'mixins', - "normalize", - "print", - "glyphicons", + 'normalize', + 'print', + 'glyphicons', - "scaffolding", - "type", - "code", - "grid", - "tables", - "forms", - "buttons", + 'scaffolding', + 'type', + 'code', + 'grid', + 'tables', + 'forms', + 'buttons', - "component-animations", - "dropdowns", - "button-groups", - "input-groups", - "navs", - "navbar", - "breadcrumbs", - "pagination", - "pager", - "labels", - "badges", - "jumbotron", - "thumbnails", - "alerts", - "progress-bars", - "media", - "list-group", - "panels", - "wells", - "responsive-embed", - "close", + 'component-animations', + 'dropdowns', + 'button-groups', + 'input-groups', + 'navs', + 'navbar', + 'breadcrumbs', + 'pagination', + 'pager', + 'labels', + 'badges', + 'jumbotron', + 'thumbnails', + 'alerts', + 'progress-bars', + 'media', + 'list-group', + 'panels', + 'wells', + 'responsive-embed', + 'close', - "modals", - "tooltip", - "popovers", - "carousel", + 'modals', + 'tooltip', + 'popovers', + 'carousel', - "utilities", - "responsive-utilities" + 'utilities', + 'responsive-utilities' ]; -var path = require("path"); +var path = require('path'); var fs = require('fs'); -var bootstrapSassPath = require("./bootstrapSassPath"); -var logger = require("./logger"); +var bootstrapSassPath = require('./bootstrapSassPath'); +var logger = require('./logger'); function addImportReturnDependency(loader, config, propertyName) { + var msg; + var fileNameResolved; var fileName = config[propertyName]; if (fileName && fileName.length > 0) { - var fileNameResolved = path.resolve(fileName); - if (fs.existsSync(fileNameResolved)) { - logger.verbose(config, "fileName for %s: %s", propertyName, fileNameResolved); - loader.addDependency(fileNameResolved); - return "@import \"" + fileNameResolved + "\";\n"; - } else { - var msg = "Could not find path to config." + propertyName + ": " + fileNameResolved; - console.error("ERROR: " + msg); + fileNameResolved = path.resolve(fileName); + if (!fs.existsSync(fileNameResolved)) { + msg = 'Could not find path to config.' + propertyName + ': ' + fileNameResolved; + console.error('ERROR: ' + msg); throw new Error(msg); } + + logger.verbose(config, 'fileName for %s: %s', propertyName, fileNameResolved); + loader.addDependency(fileNameResolved); + return '@import \'' + fileNameResolved + '\';\n'; } } -module.exports = function (content) { - this.cacheable(true); +module.exports = function(content) { + var source; var config = this.exec(content, this.resourcePath); var pathToBootstrapSass = bootstrapSassPath.getPath(this.context); - logger.verbose(config, "bootstrap-sass location: %s", pathToBootstrapSass); - var relativePath = path.relative(this.context, pathToBootstrapSass); - var start = ""; + var start = ''; // This needs to be relative - var iconFontPath = "$icon-font-path: \"" + path.join(relativePath, "fonts/bootstrap/") + "\";"; - logger.verbose(config, "Setting: %s", iconFontPath); + var iconFontPath = '$icon-font-path: \'' + path.join(relativePath, 'fonts/bootstrap/') + '\';'; + this.cacheable(true); + logger.verbose(config, 'bootstrap-sass location: %s', pathToBootstrapSass); + logger.verbose(config, 'Setting: %s', iconFontPath); if (config.preBootstrapCustomizations) { - start += addImportReturnDependency(this, config, "preBootstrapCustomizations"); + start += addImportReturnDependency(this, config, 'preBootstrapCustomizations'); } start += // Absolute paths as these are created at build time. - "@import \"" + path.join(pathToBootstrapSass, "stylesheets/bootstrap/variables") + "\";\n" + iconFontPath + "\n"; + '@import \'' + path.join(pathToBootstrapSass, 'stylesheets/bootstrap/variables') + '\';\n' + iconFontPath + '\n'; if (config.bootstrapCustomizations) { - start += addImportReturnDependency(this, config, "bootstrapCustomizations"); + start += addImportReturnDependency(this, config, 'bootstrapCustomizations'); } - var source = start + partials.filter(function(partial) { + source = start + partials.filter(function(partial) { return config.styles[partial]; }).map(function(partial) { - return "@import \"" + path.join(pathToBootstrapSass, "stylesheets/bootstrap", partial) + "\";"; - }).join("\n"); + return '@import \'' + path.join(pathToBootstrapSass, 'stylesheets/bootstrap', partial) + '\';'; + }).join('\n'); if (config.mainSass) { - source += "\n" + addImportReturnDependency(this, config, "mainSass"); + source += '\n' + addImportReturnDependency(this, config, 'mainSass'); } source = source.replace(/\\/g, '/'); - logger.debug(config, "Generated scss file is:\n" + source); + logger.debug(config, 'Generated scss file is:\n' + source); return source; }; diff --git a/bootstrap-sass.config.js b/bootstrap-sass.config.js index f7eee02..77cbc60 100644 --- a/bootstrap-sass.config.js +++ b/bootstrap-sass.config.js @@ -1,5 +1,5 @@ // Example file. Copy this to your project. Change then names of the referenced files or comment them out. -// Convention is to name sass partials to start with an "_" +// Convention is to name sass partials to start with an '_' module.exports = { verbose: true, // Set to true to show diagnostic information @@ -10,23 +10,23 @@ module.exports = { // Use preBootstrapCustomizations to change $brand-primary. Ensure this preBootstrapCustomizations does not // depend on other bootstrap variables. - preBootstrapCustomizations: "./_pre-bootstrap-customizations.scss", + preBootstrapCustomizations: './_pre-bootstrap-customizations.scss', // Use bootstrapCustomizations to utilize other sass variables defined in preBootstrapCustomizations or the // _variables.scss file. This is useful to set one customization value based on another value. - bootstrapCustomizations: "./_bootstrap-customizations.scss", + bootstrapCustomizations: './_bootstrap-customizations.scss', - mainSass: "./_main.scss", + mainSass: './_main.scss', // Default for the style loading - styleLoader: "style-loader!css-loader!sass-loader", + styleLoader: 'style-loader!css-loader!sass-loader', // // If you want to use the ExtractTextPlugin // and you want compressed - // styleLoader: ExtractTextPlugin.extract("style-loader", "css-loader!sass-loader"), + // styleLoader: ExtractTextPlugin.extract('style-loader', 'css-loader!sass-loader'), // // If you want expanded CSS - // styleLoader: ExtractTextPlugin.extract("style-loader", "css-loader!sass?outputStyle=expanded"), + // styleLoader: ExtractTextPlugin.extract('style-loader', 'css-loader!sass?outputStyle=expanded'), scripts: { 'transition': true, @@ -43,49 +43,49 @@ module.exports = { 'affix': true }, styles: { - "mixins": true, + 'mixins': true, - "normalize": true, - "print": true, - "glyphicons": true, + 'normalize': true, + 'print': true, + 'glyphicons': true, - "scaffolding": true, - "type": true, - "code": true, - "grid": true, - "tables": true, - "forms": true, - "buttons": true, + 'scaffolding': true, + 'type': true, + 'code': true, + 'grid': true, + 'tables': true, + 'forms': true, + 'buttons': true, - "component-animations": true, - "dropdowns": true, - "button-groups": true, - "input-groups": true, - "navs": true, - "navbar": true, - "breadcrumbs": true, - "pagination": true, - "pager": true, - "labels": true, - "badges": true, - "jumbotron": true, - "thumbnails": true, - "alerts": true, - "progress-bars": true, - "media": true, - "list-group": true, - "panels": true, - "wells": true, - "responsive-embed": true, - "close": true, + 'component-animations': true, + 'dropdowns': true, + 'button-groups': true, + 'input-groups': true, + 'navs': true, + 'navbar': true, + 'breadcrumbs': true, + 'pagination': true, + 'pager': true, + 'labels': true, + 'badges': true, + 'jumbotron': true, + 'thumbnails': true, + 'alerts': true, + 'progress-bars': true, + 'media': true, + 'list-group': true, + 'panels': true, + 'wells': true, + 'responsive-embed': true, + 'close': true, - "modals": true, - "tooltip": true, - "popovers": true, - "carousel": true, + 'modals': true, + 'tooltip': true, + 'popovers': true, + 'carousel': true, - "utilities": true, - "responsive-utilities": true + 'utilities': true, + 'responsive-utilities': true } }; diff --git a/bootstrapSassPath.js b/bootstrapSassPath.js index 83ab8b0..acfcc65 100644 --- a/bootstrapSassPath.js +++ b/bootstrapSassPath.js @@ -1,26 +1,26 @@ var fs = require('fs'); -var path = require("path"); +var path = require('path'); function bootstrapNotFound() { - var msg = "Could not find path to bootstrap-sass. Check to see that it's in a parent directory of config file " + - "containing node_modules/bootstrap-sass"; - console.error("ERROR: " + msg); + var msg = 'Could not find path to bootstrap-sass. Check to see that it is in a parent directory of config file ' + + 'containing node_modules/bootstrap-sass'; + console.error('ERROR: ' + msg); throw new Error(msg); } -function createTestBootstrapSassParentPath(configPath, nLevelsUp) { +function createTestParentPath(configPath, nLevelsUp) { + var parentPath; var i; var levelsUp = configPath; for (i = 0; i < nLevelsUp; i++) { - levelsUp += "/.."; + levelsUp += '/..'; } - var parentPath = path.resolve(levelsUp); - if (parentPath === "/") { + parentPath = path.resolve(levelsUp); + if (parentPath === '/') { bootstrapNotFound(); } - var result = path.resolve(path.join(levelsUp, "node_modules", "bootstrap-sass")); - return result; + return path.resolve(path.join(levelsUp, 'node_modules', 'bootstrap-sass')); } module.exports = { @@ -28,13 +28,13 @@ module.exports = { var bootstrapSassParentPath; var i = 0; do { - bootstrapSassParentPath = createTestBootstrapSassParentPath(configPath, i); + bootstrapSassParentPath = createTestParentPath(configPath, i); i += 1; } while (!fs.existsSync(bootstrapSassParentPath) && i < 10); if (i === 10) { bootstrapNotFound(); } - return path.join(bootstrapSassParentPath, "assets"); + return path.join(bootstrapSassParentPath, 'assets'); } -}; \ No newline at end of file +}; diff --git a/index.js b/index.js index 42abecd..4d485ae 100644 --- a/index.js +++ b/index.js @@ -1 +1 @@ -require("./bootstrap-sass-no-customizations.config"); \ No newline at end of file +require('./bootstrap-sass-no-customizations.config'); diff --git a/index.loader.js b/index.loader.js index 012c221..779d083 100644 --- a/index.loader.js +++ b/index.loader.js @@ -1,27 +1,33 @@ -var logger = require("./logger"); +var logger = require('./logger'); -module.exports = function (content) { +module.exports = function() { }; -module.exports.pitch = function (remainingRequest) { - this.cacheable(true); +module.exports.pitch = function(remainingRequest) { + var result; + var jsLoaderCommand; + var styleLoaderCommand; + var styleLoader; + var config; + var msg; // Webpack 1.7.3 uses this.resourcePath. Leaving in remaining request for possibly older versions of Webpack var configFilePath = this.resourcePath || remainingRequest; + this.cacheable(true); - if (!configFilePath || configFilePath == null || configFilePath == "") { - var msg = "You specified the bootstrap-sass-loader with no configuration file. Please specify the configuration " - + "file, like: 'bootstrap-sass!./bootstrap-sass.config.js' or use require('bootstrap-sass-loader')."; - console.error("ERROR: " + msg); + if (!configFilePath || configFilePath.trim() === '') { + msg = 'You specified the bootstrap-sass-loader with no configuration file. Please specify the configuration ' + + 'file, like: \'bootstrap-sass!./bootstrap-sass.config.js\' or use require(\'bootstrap-sass-loader\').'; + console.error('ERROR: ' + msg); throw new Error(msg); } - - var config = require(configFilePath); - var styleLoader = config.styleLoader || "style-loader!css-loader!sass-loader"; - logger.verbose(config, "styleLoader: %s", styleLoader); - var styleLoaderCommand = 'require(' + JSON.stringify('-!' + styleLoader + '!' + require.resolve("./bootstrap-sass-styles.loader.js") + '!' + configFilePath) + ');'; - var jsLoaderCommand = 'require(' + JSON.stringify('-!' + require.resolve('./bootstrap-sass-scripts.loader.js') + '!' + configFilePath) + ');'; - var result = [styleLoaderCommand, jsLoaderCommand].join("\n"); + config = require(configFilePath); + styleLoader = config.styleLoader || 'style-loader!css-loader!sass-loader'; + logger.verbose(config, 'styleLoader: %s', styleLoader); + + styleLoaderCommand = 'require(' + JSON.stringify('-!' + styleLoader + '!' + require.resolve('./bootstrap-sass-styles.loader.js') + '!' + configFilePath) + ');'; + jsLoaderCommand = 'require(' + JSON.stringify('-!' + require.resolve('./bootstrap-sass-scripts.loader.js') + '!' + configFilePath) + ');'; + result = [styleLoaderCommand, jsLoaderCommand].join('\n'); return result; }; diff --git a/logger.js b/logger.js index 474812e..c780d14 100644 --- a/logger.js +++ b/logger.js @@ -2,18 +2,32 @@ module.exports = { log: function() { var msg = arguments[1]; var args = Array.prototype.slice.call(arguments); - var a = ["[boostrap-sass-loader]: " + msg]; + var a = ['[boostrap-sass-loader]: ' + msg]; a = a.concat(args.slice(2)); console.log.apply(null, a); }, + /** + * Print verbose level message. + * @param {object} config Configuration object + * @param {string} msg Message to display, can contain %O, %s, etc. + * @returns {void} + * Add additional arguments as needed for formatting of msg + */ verbose: function(config, msg) { if (config.verbose) { this.log.apply(this, arguments); } }, + /** + * Print debug level message. + * @param {object} config Configuration object + * @param {string} msg Message to display, can contain %O, %s, etc. + * @returns {void} + * Add additional arguments as needed for formatting of msg + */ debug: function(config, msg) { if (config.debug) { this.log.apply(this, arguments); } } -}; \ No newline at end of file +};