diff --git a/.editorconfig b/.editorconfig index b5e97cb..06825f2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,3 +13,4 @@ charset = utf-8 end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true +ensure_newline_at_eof_on_save = true diff --git a/.eslintrc.json b/.eslintrc.json index 8ee72e1..b8ab662 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,8 @@ +/** + * This config is based on JavaScript Standard Style. + * https://standardjs.com/ + * https://github.com/standard/eslint-config-standard + */ { "extends": [ "eslint:recommended", @@ -7,7 +12,8 @@ "browser": true, "commonjs": true, "es6": true, - "node": true + "node": true, + "amd": true }, "parserOptions": { "ecmaFeatures": { @@ -16,9 +22,32 @@ "sourceType": "module" }, "rules": { - "space-before-function-paren": ["error", "never"], - "semi": ["error", "always", { - "omitLastInOneLineBlock": true - }] + "no-irregular-whitespace": [ + "error", + { + "skipComments": true + } + ], + "space-before-function-paren": [ + "error", + { + "anonymous": "always", + "named": "never", + "asyncArrow": "always" + } + ], + "semi": [ + "error", + "always", + { + "omitLastInOneLineBlock": true + } + ], + "valid-jsdoc": [ + "error" + ], + "no-console": [ + "warn" + ] } } diff --git a/.gitignore b/.gitignore index 6fd68ba..51991ab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,37 @@ -/node_modules/ -/assets/css/ -/assets/js-build/ -/.vscode/ +# Ignore the nodemodules folder +node_modules/ +assets/css/ +assets/js-build/ + +# Ignore OS generated files # +.DS_Store* +ehthumbs.db +Icon\? +Thumbs.db + +# Ignore editor specific files # +.vscode/ + +# Always-ignore files and folders # +*.diff +*.err *.log +*.orig +*.rej +*.swn +*.swo +*.swp +._* +*~ +s3_website.yml + +# Ignore packages # +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.iml diff --git a/Gruntfile.js b/Gruntfile.js index 5fd0c8e..073f478 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -12,102 +12,34 @@ module.exports = function (grunt) { 'use strict'; + // Load the task config files. + function loadConfig(path) { + var glob = require('glob'), + object = {}, + key; + + glob.sync('*', { + 'cwd': path + }).forEach(function (option) { + key = option.replace(/\.js$/, ''); + var gruntTask = require(path + option); + object[key] = (typeof gruntTask == "function") ? gruntTask() : gruntTask; + }); + return object; + }; + + // Initial config/paths. + var config = { + 'pkg': grunt.file.readJSON('package.json') + }; + + grunt.util._.extend(config, loadConfig('./grunt/')); + grunt.initConfig(config); + // Load the npm plugins. require('load-grunt-tasks')(grunt); - grunt.initConfig({ - 'pkg': grunt.file.readJSON('package.json'), - - // JS build configurations. - 'qunit': { - 'all': { - 'options': { - 'urls': [ - 'http://localhost:<%= connect.server.options.port %>/tests/js/example/example.html' - ] - } - } - }, - - 'eslint': { - 'options': { - 'format': 'stylish' - }, - 'target': ['./assets/js/**/*.js'] - }, - - 'browserify': { - 'options': { - 'transform': ["babelify"] - }, - 'dist': { - 'src': ['./assets/js/**/*.js'], - 'dest': './assets/js-build/main.js' - } - }, - - 'uglify': { - 'options': { - 'sourceMap': true, - }, - 'dist': { - 'src': ['./assets/js-build/main.js'], - 'dest': './assets/js-build/main.min.js' - } - }, - - // CSS build configurations. - 'sasslint': { - 'options': { - 'cacheConfig': true, - 'configFile': '.sass-lint.yml', - 'formatter': 'stylish' - }, - 'target': ['./assets/scss/**/*.scss'] - }, - - 'sass': { - 'options': { - 'sourceMap': true, - 'outputStyle': 'compressed' - }, - 'dist': { - 'files': [{ - 'expand': true, - 'cwd': './assets/scss/', - 'src': ['**/*.scss'], - 'dest': './assets/css/', - 'ext': '.css' - }] - } - }, - - // Post CSS build configurations. - 'postcss': { - 'options': { - 'processors': [ - require('autoprefixer'), - require('postcss-import'), - require('cssnano') - ] - }, - 'dist': { - 'src': './assets/css/*.css' - } - }, - - // Static webserver. - 'connect': { - 'server': { - 'options': { - 'port': 8000, - 'base': '.' - } - } - } - }); - - // Register tasks. + // Register tasks as npm scripts. See package.json. grunt.task.registerTask('test', ['connect', 'qunit', 'eslint', 'sasslint']); grunt.task.registerTask('build-js', ['connect', 'qunit', 'eslint', 'browserify', 'uglify']); grunt.task.registerTask('build-css', ['sasslint', 'sass', 'postcss']); diff --git a/grunt/browserify.js b/grunt/browserify.js new file mode 100644 index 0000000..f98af13 --- /dev/null +++ b/grunt/browserify.js @@ -0,0 +1,11 @@ +module.exports = function (grunt) { + return { + 'options': { + 'transform': ["babelify"] + }, + 'dist': { + 'src': ['./assets/js/**/*.js'], + 'dest': './assets/js-build/main.js' + } + } +}; diff --git a/grunt/connect.js b/grunt/connect.js new file mode 100644 index 0000000..4387bed --- /dev/null +++ b/grunt/connect.js @@ -0,0 +1,10 @@ +module.exports = function (grunt) { + return { + 'server': { + 'options': { + 'port': 8000, + 'base': '.' + } + } + } +}; diff --git a/grunt/eslint.js b/grunt/eslint.js new file mode 100644 index 0000000..af43f82 --- /dev/null +++ b/grunt/eslint.js @@ -0,0 +1,8 @@ +module.exports = function (grunt) { + return { + 'options': { + 'format': 'stylish' + }, + 'target': ['./assets/js/**/*.js'] + } +}; diff --git a/grunt/postcss.js b/grunt/postcss.js new file mode 100644 index 0000000..65a05dc --- /dev/null +++ b/grunt/postcss.js @@ -0,0 +1,14 @@ +module.exports = function (grunt) { + return { + 'options': { + 'processors': [ + require('autoprefixer'), + require('postcss-import'), + require('cssnano') + ] + }, + 'dist': { + 'src': './assets/css/*.css' + } + } +}; diff --git a/grunt/qunit.js b/grunt/qunit.js new file mode 100644 index 0000000..a73c7c4 --- /dev/null +++ b/grunt/qunit.js @@ -0,0 +1,11 @@ +module.exports = function (grunt) { + return { + 'all': { + 'options': { + 'urls': [ + 'http://localhost:<%= connect.server.options.port %>/tests/js/example/example.html' + ] + } + } + } +}; diff --git a/grunt/sass.js b/grunt/sass.js new file mode 100644 index 0000000..aedb2b0 --- /dev/null +++ b/grunt/sass.js @@ -0,0 +1,17 @@ +module.exports = function (grunt) { + return { + 'options': { + 'sourceMap': true, + 'outputStyle': 'compressed' + }, + 'dist': { + 'files': [{ + 'expand': true, + 'cwd': './assets/scss/', + 'src': ['**/*.scss'], + 'dest': './assets/css/', + 'ext': '.css' + }] + } + } +}; diff --git a/grunt/sasslint.js b/grunt/sasslint.js new file mode 100644 index 0000000..b47d496 --- /dev/null +++ b/grunt/sasslint.js @@ -0,0 +1,10 @@ +module.exports = function (grunt) { + return { + 'options': { + 'cacheConfig': true, + 'configFile': '.sass-lint.yml', + 'formatter': 'stylish' + }, + 'target': ['./assets/scss/**/*.scss'] + } +}; diff --git a/grunt/uglify.js b/grunt/uglify.js new file mode 100644 index 0000000..dd3299b --- /dev/null +++ b/grunt/uglify.js @@ -0,0 +1,11 @@ +module.exports = function (grunt) { + return { + 'options': { + 'sourceMap': true, + }, + 'dist': { + 'src': ['./assets/js-build/main.js'], + 'dest': './assets/js-build/main.min.js' + } + } +}; diff --git a/package.json b/package.json index 8298d2b..0af9ed7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "frontend-starter-kit", "title": "Front-End Starter Kit", "description": "Front-end starter kit for automated web development", - "version": "1.3.0", + "version": "1.3.1", "repository": { "type": "git", "url": "https://github.com/bijoyanupam/frontend-starter-kit.git"