diff --git a/.babelrc b/.babelrc index 86a1a91..0558174 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,3 @@ { - stage: "1", - loose: "all" + "presets": ["es2015", "stage-2"] } diff --git a/.eslintrc b/.eslintrc index c5b0c3d..82b0144 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,172 +1,6 @@ { - "parser": "babel-eslint", // https://github.com/babel/babel-eslint - "env": { // http://eslint.org/docs/user-guide/configuring.html#specifying-environments - "browser": true, // browser global variables - "node": true, // Node.js global variables and Node.js-specific rules - "mocha": true - }, + "extends": "airbnb/base", "ecmaFeatures": { - "arrowFunctions": true, - "blockBindings": true, - "classes": true, - "defaultParams": true, - "destructuring": true, - "forOf": true, - "generators": false, - "modules": true, - "objectLiteralComputedProperties": true, - "objectLiteralDuplicateProperties": false, - "objectLiteralShorthandMethods": true, - "objectLiteralShorthandProperties": true, - "spread": true, - "superInFunctions": true, - "templateStrings": true, - "jsx": true + "experimentalObjectRestSpread": true, }, - "rules": { - /** - * Strict mode - */ - // babel inserts "use strict"; for us - "strict": [2, "never"], // http://eslint.org/docs/rules/strict - - /** - * ES6 - */ - "no-var": 2, // http://eslint.org/docs/rules/no-var - "prefer-const": 2, // http://eslint.org/docs/rules/prefer-const - - /** - * Variables - */ - "no-shadow": 2, // http://eslint.org/docs/rules/no-shadow - "no-shadow-restricted-names": 2, // http://eslint.org/docs/rules/no-shadow-restricted-names - "no-unused-vars": [2, { // http://eslint.org/docs/rules/no-unused-vars - "vars": "local", - "args": "after-used" - }], - "no-use-before-define": 2, // http://eslint.org/docs/rules/no-use-before-define - - /** - * Possible errors - */ - "comma-dangle": [2, "always-multiline"], // http://eslint.org/docs/rules/comma-dangle - "no-cond-assign": [2, "always"], // http://eslint.org/docs/rules/no-cond-assign - "no-console": 1, // http://eslint.org/docs/rules/no-console - "no-debugger": 1, // http://eslint.org/docs/rules/no-debugger - "no-alert": 1, // http://eslint.org/docs/rules/no-alert - "no-constant-condition": 1, // http://eslint.org/docs/rules/no-constant-condition - "no-dupe-keys": 2, // http://eslint.org/docs/rules/no-dupe-keys - "no-duplicate-case": 2, // http://eslint.org/docs/rules/no-duplicate-case - "no-empty": 2, // http://eslint.org/docs/rules/no-empty - "no-ex-assign": 2, // http://eslint.org/docs/rules/no-ex-assign - "no-extra-boolean-cast": 0, // http://eslint.org/docs/rules/no-extra-boolean-cast - "no-extra-semi": 2, // http://eslint.org/docs/rules/no-extra-semi - "no-func-assign": 2, // http://eslint.org/docs/rules/no-func-assign - "no-inner-declarations": 2, // http://eslint.org/docs/rules/no-inner-declarations - "no-invalid-regexp": 2, // http://eslint.org/docs/rules/no-invalid-regexp - "no-irregular-whitespace": 2, // http://eslint.org/docs/rules/no-irregular-whitespace - "no-obj-calls": 2, // http://eslint.org/docs/rules/no-obj-calls - "no-sparse-arrays": 2, // http://eslint.org/docs/rules/no-sparse-arrays - "no-unreachable": 2, // http://eslint.org/docs/rules/no-unreachable - "use-isnan": 2, // http://eslint.org/docs/rules/use-isnan - "block-scoped-var": 0, // http://eslint.org/docs/rules/block-scoped-var - - /** - * Best practices - */ - "consistent-return": 2, // http://eslint.org/docs/rules/consistent-return - "curly": [2, "multi-line"], // http://eslint.org/docs/rules/curly - "default-case": 2, // http://eslint.org/docs/rules/default-case - "dot-notation": [2, { // http://eslint.org/docs/rules/dot-notation - "allowKeywords": true - }], - "eqeqeq": 2, // http://eslint.org/docs/rules/eqeqeq - "guard-for-in": 2, // http://eslint.org/docs/rules/guard-for-in - "no-caller": 2, // http://eslint.org/docs/rules/no-caller - "no-else-return": 2, // http://eslint.org/docs/rules/no-else-return - "no-eq-null": 2, // http://eslint.org/docs/rules/no-eq-null - "no-eval": 2, // http://eslint.org/docs/rules/no-eval - "no-extend-native": 2, // http://eslint.org/docs/rules/no-extend-native - "no-extra-bind": 2, // http://eslint.org/docs/rules/no-extra-bind - "no-fallthrough": 2, // http://eslint.org/docs/rules/no-fallthrough - "no-floating-decimal": 2, // http://eslint.org/docs/rules/no-floating-decimal - "no-implied-eval": 2, // http://eslint.org/docs/rules/no-implied-eval - "no-lone-blocks": 2, // http://eslint.org/docs/rules/no-lone-blocks - "no-loop-func": 2, // http://eslint.org/docs/rules/no-loop-func - "no-multi-str": 2, // http://eslint.org/docs/rules/no-multi-str - "no-native-reassign": 2, // http://eslint.org/docs/rules/no-native-reassign - "no-new": 2, // http://eslint.org/docs/rules/no-new - "no-new-func": 2, // http://eslint.org/docs/rules/no-new-func - "no-new-wrappers": 2, // http://eslint.org/docs/rules/no-new-wrappers - "no-octal": 2, // http://eslint.org/docs/rules/no-octal - "no-octal-escape": 2, // http://eslint.org/docs/rules/no-octal-escape - "no-param-reassign": 2, // http://eslint.org/docs/rules/no-param-reassign - "no-proto": 2, // http://eslint.org/docs/rules/no-proto - "no-redeclare": 2, // http://eslint.org/docs/rules/no-redeclare - "no-return-assign": 2, // http://eslint.org/docs/rules/no-return-assign - "no-script-url": 2, // http://eslint.org/docs/rules/no-script-url - "no-self-compare": 2, // http://eslint.org/docs/rules/no-self-compare - "no-sequences": 2, // http://eslint.org/docs/rules/no-sequences - "no-throw-literal": 2, // http://eslint.org/docs/rules/no-throw-literal - "no-with": 2, // http://eslint.org/docs/rules/no-with - "radix": 2, // http://eslint.org/docs/rules/radix - "vars-on-top": 2, // http://eslint.org/docs/rules/vars-on-top - "wrap-iife": [2, "any"], // http://eslint.org/docs/rules/wrap-iife - "yoda": 2, // http://eslint.org/docs/rules/yoda - - /** - * Style - */ - "indent": [2, 2], // http://eslint.org/docs/rules/indent - "brace-style": [2, // http://eslint.org/docs/rules/brace-style - "1tbs", { - "allowSingleLine": true - }], - "quotes": [ - 2, "single", "avoid-escape" // http://eslint.org/docs/rules/quotes - ], - "camelcase": [2, { // http://eslint.org/docs/rules/camelcase - "properties": "never" - }], - "comma-spacing": [2, { // http://eslint.org/docs/rules/comma-spacing - "before": false, - "after": true - }], - "comma-style": [2, "last"], // http://eslint.org/docs/rules/comma-style - "eol-last": 2, // http://eslint.org/docs/rules/eol-last - "func-names": 1, // http://eslint.org/docs/rules/func-names - "key-spacing": [2, { // http://eslint.org/docs/rules/key-spacing - "beforeColon": false, - "afterColon": true - }], - "new-cap": [2, { // http://eslint.org/docs/rules/new-cap - "newIsCap": true - }], - "no-multiple-empty-lines": [2, { // http://eslint.org/docs/rules/no-multiple-empty-lines - "max": 2 - }], - "no-nested-ternary": 2, // http://eslint.org/docs/rules/no-nested-ternary - "no-new-object": 2, // http://eslint.org/docs/rules/no-new-object - "no-spaced-func": 2, // http://eslint.org/docs/rules/no-spaced-func - "no-trailing-spaces": 2, // http://eslint.org/docs/rules/no-trailing-spaces - "no-extra-parens": [2, "functions"], // http://eslint.org/docs/rules/no-extra-parens - "no-underscore-dangle": 0, // http://eslint.org/docs/rules/no-underscore-dangle - "one-var": [2, "never"], // http://eslint.org/docs/rules/one-var - "padded-blocks": [2, "never"], // http://eslint.org/docs/rules/padded-blocks - "semi": [2, "always"], // http://eslint.org/docs/rules/semi - "semi-spacing": [2, { // http://eslint.org/docs/rules/semi-spacing - "before": false, - "after": true - }], - "space-after-keywords": 2, // http://eslint.org/docs/rules/space-after-keywords - "space-before-blocks": 2, // http://eslint.org/docs/rules/space-before-blocks - "space-before-function-paren": [2, "never"], // http://eslint.org/docs/rules/space-before-function-paren - "space-infix-ops": 2, // http://eslint.org/docs/rules/space-infix-ops - "space-return-throw-case": 2, // http://eslint.org/docs/rules/space-return-throw-case - "spaced-comment": [2, "always", {// http://eslint.org/docs/rules/spaced-comment - "exceptions": ["-", "+"], - "markers": ["=", "!"] // space here to support sprockets directives - }] - } } diff --git a/gulpfile.js b/gulpfile.js index f89194d..babeba3 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -17,42 +17,42 @@ var createWebpackConfig = require('./createWebpackConfig.js'); // when they're loaded require('babel-core/register'); -gulp.task('clean', function(cb) { +gulp.task('clean', function (cb) { rimraf('./dist', cb); }); -gulp.task('static', function() { +gulp.task('static', function () { return gulp.src(['*.js', 'lib/**/*.js', 'test/**/*.js']) .pipe(eslint()) .pipe(eslint.format()) .pipe(eslint.failAfterError()); }); -gulp.task('nsp', function(cb) { +gulp.task('nsp', function (cb) { nsp({ package: path.join(__dirname, 'package.json') }, cb); }); gulp.task('test', ['test:karma', 'test:node']); -gulp.task('test:node', function() { +gulp.task('test:node', function () { return gulp.src('test/**/*.js') - .pipe(mocha({reporter: 'dot'})); + .pipe(mocha({ reporter: 'dot' })); }); -gulp.task('test:karma', function(done) { +gulp.task('test:karma', function (done) { new KarmaServer({ configFile: path.join(__dirname, 'karma.conf.js'), singleRun: true, }, done).start(); }); -gulp.task('babel', function() { +gulp.task('babel', function () { return gulp.src('lib/**/*.js') .pipe(babel()) .pipe(gulp.dest('dist')); }); -gulp.task('watch', function() { +gulp.task('watch', function () { gulp.start(['test:node']); gulp.watch(['lib/**/*.js', 'test/**/*.js'], ['test:node']); new KarmaServer({ @@ -62,7 +62,7 @@ gulp.task('watch', function() { gulp.task('webpack', ['webpack:standalone', 'webpack:standalone:min']); -gulp.task('webpack:standalone', function() { +gulp.task('webpack:standalone', function () { var config = createWebpackConfig({ filename: 'updeep-standalone.js' }); return gulp.src('lib/index.js') @@ -70,7 +70,7 @@ gulp.task('webpack:standalone', function() { .pipe(gulp.dest('dist/umd/')); }); -gulp.task('webpack:standalone:min', function() { +gulp.task('webpack:standalone:min', function () { var config = createWebpackConfig({ filename: 'updeep-standalone.min.js', minify: true, @@ -84,7 +84,7 @@ gulp.task('webpack:standalone:min', function() { gulp.task('build', ['babel', 'webpack']); -gulp.task('build:clean', ['clean'], function(done) { +gulp.task('build:clean', ['clean'], function (done) { gulp.start('build', done); }); diff --git a/karma.conf.js b/karma.conf.js index 87e6be3..9544a4c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -2,7 +2,7 @@ var createWebpackConfig = require('./createWebpackConfig'); -module.exports = function(config) { +module.exports = function (config) { config.set({ // base path that will be used to resolve all patterns (eg. files, exclude) @@ -52,7 +52,8 @@ module.exports = function(config) { // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || + // config.LOG_INFO || config.LOG_DEBUG logLevel: config.LOG_INFO, // start these browsers diff --git a/lib/is.js b/lib/is.js index 0e3eb6d..2551245 100644 --- a/lib/is.js +++ b/lib/is.js @@ -5,9 +5,9 @@ function is(path, predicate, object) { const parts = splitPath(path); let rest = object; - let part; - for (part of parts) { + for (let i = 0; i < parts.length; ++i) { if (typeof rest === 'undefined') return false; + const part = parts[i]; rest = rest[part]; } diff --git a/lib/update.js b/lib/update.js index 72c85c9..b1edacf 100644 --- a/lib/update.js +++ b/lib/update.js @@ -16,13 +16,13 @@ function resolveUpdates(updates, object) { let updatedValue = value; if (!Array.isArray(value) && value !== null && typeof value === 'object') { - updatedValue = update(value, object[key]); + updatedValue = update(value, object[key]); // eslint-disable-line no-use-before-define } else if (typeof value === 'function') { updatedValue = value(object[key]); } if (object[key] !== updatedValue) { - acc[key] = updatedValue; + acc[key] = updatedValue; // eslint-disable-line no-param-reassign } return acc; diff --git a/lib/util/curry.js b/lib/util/curry.js index 2f9157c..0fbc810 100644 --- a/lib/util/curry.js +++ b/lib/util/curry.js @@ -13,7 +13,8 @@ function countArguments(args, max) { } export function curry1(fn) { - return function curried(a, ...[b, c]) { + return function curried(a, ...args) { + const [b, c] = args; const n = countArguments(arguments); if (n >= 1) return fn(a, b, c); @@ -22,7 +23,8 @@ export function curry1(fn) { } export function curry2(fn) { - return function curried(a, b, ...[c, d]) { + return function curried(a, b, ...args) { + const [c, d] = args; const n = countArguments(arguments, 2); if (b === _ || c === _ || d === _) { @@ -40,7 +42,8 @@ export function curry2(fn) { } export function curry3(fn) { - return function curried(a, b, c, ...[d, e]) { + return function curried(a, b, c, ...args) { + const [d, e] = args; const n = countArguments(arguments, 3); if (c === _ || d === _ || e === _) { @@ -68,11 +71,14 @@ export function curry3(fn) { } export function curry4(fn) { - return function curried(a, b, c, d, ...[e, f]) { + return function curried(a, b, c, d, ...args) { + const [e, f] = args; const n = countArguments(arguments, 4); if (d === _ || e === _ || f === _) { - throw new Error('Can only use placeholder on first, second or third argument of this function.'); + throw new Error( + 'Can only use placeholder on first, second or third argument of this function.' + ); } if (n >= 4) { diff --git a/package.json b/package.json index 0ed7c4d..ecd588f 100644 --- a/package.json +++ b/package.json @@ -32,22 +32,22 @@ "lodash": "^3.0.0" }, "devDependencies": { - "babel": "^5.8.21", - "babel-core": "^5.5.0", - "babel-eslint": "^4.0.5", - "babel-loader": "^5.3.2", + "babel-core": "^6.4.0", + "babel-loader": "^6.2.1", + "babel-preset-es2015": "^6.3.13", + "babel-preset-stage-2": "^6.3.13", "benchmark": "^1.0.0", "chai": "^3.2.0", - "eslint": "^0.24.1", - "eslint-config-airbnb": "0.0.7", + "eslint": "^1.10.3", + "eslint-config-airbnb": "3.1.0", "exports-loader": "^0.6.2", "gulp": "^3.6.0", - "gulp-babel": "^5.1.0", - "gulp-eslint": "^0.15.0", + "gulp-babel": "^6.1.1", + "gulp-eslint": "^1.1.1", "gulp-mocha": "^2.0.0", "gulp-nsp": "^2.0.0", "karma": "^0.13.3", - "karma-babel-preprocessor": "^5.2.1", + "karma-babel-preprocessor": "^6.0.1", "karma-chrome-launcher": "^0.2.0", "karma-mocha": "^0.2.0", "karma-mocha-reporter": "^1.0.4", diff --git a/perf/index.js b/perf/index.js index 553d872..f17b92a 100644 --- a/perf/index.js +++ b/perf/index.js @@ -76,9 +76,9 @@ const fnDestructure = (...args) => { return fn(a, b, c, d, e); }; const applyVsDestructure = createSuite('apply vs destructure', { - 'control': () => fnControl(1, 2, 3, 4, 5), - 'apply': () => fnApply(1, 2, 3, 4, 5), - 'destructure': () => fnDestructure(1, 2, 3, 4, 5), + control: () => fnControl(1, 2, 3, 4, 5), + apply: () => fnApply(1, 2, 3, 4, 5), + destructure: () => fnDestructure(1, 2, 3, 4, 5), }); curryVsLodash(); diff --git a/test/.eslintrc b/test/.eslintrc index 3a2e250..19e6180 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -1,4 +1,7 @@ { + "env": { + "mocha": true + }, "rules": { "no-unused-expressions": 0 } diff --git a/test/if-spec.js b/test/if-spec.js index 7f7f485..1a9a480 100644 --- a/test/if-spec.js +++ b/test/if-spec.js @@ -7,7 +7,7 @@ describe('u.if', () => { let result = u.if(false, { b: 1 }, object); expect(result).to.eql(object); - result = u({ x: u.if(false, 1)}, {}); + result = u({ x: u.if(false, 1) }, {}); expect(result).to.eql({}); }); diff --git a/test/map-spec.js b/test/map-spec.js index 198c00b..eafa004 100644 --- a/test/map-spec.js +++ b/test/map-spec.js @@ -46,7 +46,7 @@ describe('u.map', () => { const setToKey = (_, key) => key; const result = u.map(u.map(setToKey), object); - expect(result).to.eql( { + expect(result).to.eql({ a: { x: 'x' }, b: [0, 1], }); @@ -61,7 +61,7 @@ describe('u.map', () => { b: u.map(setToKey), }, object); - expect(result).to.eql( { + expect(result).to.eql({ b: [0, 1], }); }); diff --git a/test/updeep-spec.js b/test/updeep-spec.js index 22ea60f..91bdbd7 100644 --- a/test/updeep-spec.js +++ b/test/updeep-spec.js @@ -108,7 +108,7 @@ describe('updeep', () => { }); it('assigns null values', () => { - expect(u({isNull: null}, {})).to.eql({isNull: null}); + expect(u({ isNull: null }, {})).to.eql({ isNull: null }); }); it('can use a placeholder to partially apply', () => {