diff --git a/.bithoundrc b/.bithoundrc new file mode 100644 index 0000000..d1fbecb --- /dev/null +++ b/.bithoundrc @@ -0,0 +1,5 @@ +{ + "ignore": [ + "es5/**/*.js" + ] +} diff --git a/.codeclimate.yml b/.codeclimate.yml index 8e97a69..a7c7506 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,9 +1,4 @@ -# Save as .codeclimate.yml (note leading .) in project root directory languages: JavaScript: true - Ruby: false - PHP: false - Python: false - -# exclude_paths: -# - "foo/bar.rb" \ No newline at end of file +exclude_paths: + - es5/* diff --git a/.gitignore b/.gitignore index 123ae94..7070605 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ build/Release # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules + +# lcov file +lcov.info diff --git a/.karma.conf.js b/.karma.conf.js index e700a43..2012f6f 100644 --- a/.karma.conf.js +++ b/.karma.conf.js @@ -58,31 +58,13 @@ let configOptions = { // Continuous Integration mode // if true, Karma captures browsers, runs the tests and exits - singleRun: false + singleRun: true }; /** * Special Options For SauceLabs */ -if (process.env.SAUCE_USERNAME) { - /** - * If SauceLabs credentials are available, - * set up the tests to run through them. - */ - configOptions.sauceLabs = { - testName: "Forbin.js" - }; - const customLaunchers = require("./.sauce.json").platforms; - configOptions.customLaunchers = customLaunchers; - configOptions.browsers = Object.keys(customLaunchers); - reporters.push("saucelabs"); -} else { - /** - * If there are no SauceLabs credentials available, - * detect the browsers that we *can* use. - */ - frameworks.push("detectBrowsers"); -} +frameworks.push("detectBrowsers"); module.exports = function(config) { // level of logging diff --git a/LICENSE b/LICENSE index 9525e21..17debf0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015 Free All Media LLC +Copyright (c) 2015 Free All Media, LLC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/es5/lib/forbin.js b/es5/lib/forbin.js index be776db..684c03b 100644 --- a/es5/lib/forbin.js +++ b/es5/lib/forbin.js @@ -21,8 +21,8 @@ var setupFilters = Symbol("setupFilters"), processFilters = Symbol("processFilters"), processBeforeFilters = Symbol("processBeforeFilters"), processAfterFilters = Symbol("processAfterFilters"), - actions = Symbol("actions"), - addFilter = Symbol("addFilter"); + addFilter = Symbol("addFilter"), + getFilters = Symbol("getFilters"); /** * Request/Response controller with filters. @@ -144,9 +144,10 @@ var Controller = (function () { options[_key5 - 1] = arguments[_key5]; } + var filter = null; switch (options.length) { case 1: - var filter = options[0]; + filter = options[0]; // Filter to run before all actions, no skip available this.actionNames.forEach(function (actionName) { owner.push({ @@ -157,25 +158,23 @@ var Controller = (function () { break; case 2: if (Array.isArray(options[0])) { - (function () { - // A. Filter to run before all actions, with skip available - var actionArray = options[0], - filter = options[1]; - actionArray.forEach(function (action) { - owner.push({ - action: action, - filter: filter - }); - }, _this2); - })(); + // A. Filter to run before all actions, with skip available + var actionArray = options[0]; + filter = options[1]; + actionArray.forEach(function (action) { + owner.push({ + action: action, + filter: filter + }); + }, this); } else { // B. Filter to run before a specific action, no skip available - var action = options[0], - _filter = options[1]; + var action = options[0]; + filter = options[1]; owner.push({ action: action, - filter: _filter + filter: filter }); } break; @@ -248,24 +247,23 @@ var Controller = (function () { }); } }, { - key: processBeforeFilters, - value: function (action, request, response, callback) { + key: getFilters, + value: function (action, filterObject) { var _this4 = this; - var applicableFilters = this._filters.before.filter(function (filter) { + return filterObject.filter(function (filter) { return filter.action === _this4[action]; }); - this[processFilters](applicableFilters, request, response, callback); + } + }, { + key: processBeforeFilters, + value: function (action, request, response, callback) { + this[processFilters](this[getFilters](action, this._filters.before), request, response, callback); } }, { key: processAfterFilters, value: function (action, request, response, callback) { - var _this5 = this; - - var applicableFilters = this._filters.after.filter(function (filter) { - return filter.action === _this5[action]; - }); - this[processFilters](applicableFilters, request, response, callback); + this[processFilters](this[getFilters](action, this._filters.after), request, response, callback); } }, { key: actionNames, diff --git a/es6/lib/forbin.js b/es6/lib/forbin.js index ab2920f..e734431 100644 --- a/es6/lib/forbin.js +++ b/es6/lib/forbin.js @@ -7,8 +7,8 @@ const setupFilters = Symbol("setupFilters"), processFilters = Symbol("processFilters"), processBeforeFilters = Symbol("processBeforeFilters"), processAfterFilters = Symbol("processAfterFilters"), - actions = Symbol("actions"), - addFilter = Symbol("addFilter"); + addFilter = Symbol("addFilter"), + getFilters = Symbol("getFilters"); /** * Request/Response controller with filters. @@ -93,9 +93,10 @@ export default class Controller { /* Private Methods */ [addFilter](owner, ...options) { + let filter = null; switch(options.length) { case 1: - const filter = options[0]; + filter = options[0]; // Filter to run before all actions, no skip available this.actionNames.forEach((actionName) => { owner.push({ @@ -107,8 +108,8 @@ export default class Controller { case 2: if (Array.isArray(options[0])) { // A. Filter to run before all actions, with skip available - const actionArray = options[0], - filter = options[1]; + const actionArray = options[0]; + filter = options[1]; actionArray.forEach((action) => { owner.push({ action: action, @@ -117,8 +118,8 @@ export default class Controller { }, this); } else { // B. Filter to run before a specific action, no skip available - const action = options[0], - filter = options[1]; + const action = options[0]; + filter = options[1]; owner.push({ action: action, @@ -210,18 +211,18 @@ export default class Controller { ); } - [processBeforeFilters](action, request, response, callback) { - const applicableFilters = this._filters.before.filter((filter) => { + [getFilters](action, filterObject) { + return filterObject.filter((filter) => { return (filter.action === this[action]); }); - this[processFilters](applicableFilters, request, response, callback); + } + + [processBeforeFilters](action, request, response, callback) { + this[processFilters](this[getFilters](action, this._filters.before), request, response, callback); } [processAfterFilters](action, request, response, callback) { - const applicableFilters = this._filters.after.filter((filter) => { - return (filter.action === this[action]); - }); - this[processFilters](applicableFilters, request, response, callback); + this[processFilters](this[getFilters](action, this._filters.after), request, response, callback); } [actionNames]() { diff --git a/gulpfile.babel.js b/gulpfile.babel.js index 12555ac..52034bb 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -1,6 +1,10 @@ +import "./tasks/suppress-errors.js"; import "./tasks/build-spec.js"; +import "./tasks/build-spec-assets.js"; import "./tasks/build-lib.js"; +import "./tasks/build-lib-assets.js"; import "./tasks/build.js"; import "./tasks/test-local.js"; import "./tasks/test-browsers.js"; import "./tasks/test.js"; +import "./tasks/test-watch.js"; diff --git a/lcov.info b/lcov.info deleted file mode 100644 index 67f766e..0000000 --- a/lcov.info +++ /dev/null @@ -1,216 +0,0 @@ -TN: -SF:/home/intag/workspace/fam/forbin/es5/lib/forbin.js -FN:7,(anonymous_1) -FN:7,defineProperties -FN:7,(anonymous_3) -FN:9,_interopRequireDefault -FN:11,_classCallCheck -FN:33,(anonymous_6) -FN:39,Controller -FN:62,before -FN:75,after -FN:84,skip -FN:110,(anonymous_11) -FN:114,(anonymous_12) -FN:126,setup -FN:129,initialize -FN:132,prefilters -FN:135,filters -FN:140,(anonymous_17) -FN:151,(anonymous_18) -FN:160,(anonymous_19) -FN:164,(anonymous_20) -FN:186,(anonymous_21) -FN:195,(anonymous_22) -FN:211,(anonymous_23) -FN:215,(anonymous_24) -FN:217,beforeFilters -FN:219,action -FN:222,(anonymous_27) -FN:231,afterFilters -FN:238,(anonymous_29) -FN:239,processFilter -FN:246,finalizeFilters -FN:252,(anonymous_32) -FN:255,(anonymous_33) -FN:262,(anonymous_34) -FN:265,(anonymous_35) -FN:272,(anonymous_36) -FN:273,(anonymous_37) -FNF:37 -FNH:37 -FNDA:1,(anonymous_1) -FNDA:1,defineProperties -FNDA:1,(anonymous_3) -FNDA:1,_interopRequireDefault -FNDA:35,_classCallCheck -FNDA:1,(anonymous_6) -FNDA:35,Controller -FNDA:25,before -FNDA:12,after -FNDA:7,skip -FNDA:23,(anonymous_11) -FNDA:10,(anonymous_12) -FNDA:26,setup -FNDA:26,initialize -FNDA:26,prefilters -FNDA:1,filters -FNDA:37,(anonymous_17) -FNDA:54,(anonymous_18) -FNDA:5,(anonymous_19) -FNDA:10,(anonymous_20) -FNDA:35,(anonymous_21) -FNDA:35,(anonymous_22) -FNDA:78,(anonymous_23) -FNDA:35,(anonymous_24) -FNDA:35,beforeFilters -FNDA:35,action -FNDA:35,(anonymous_27) -FNDA:35,afterFilters -FNDA:70,(anonymous_29) -FNDA:39,processFilter -FNDA:62,finalizeFilters -FNDA:35,(anonymous_32) -FNDA:84,(anonymous_33) -FNDA:35,(anonymous_34) -FNDA:24,(anonymous_35) -FNDA:54,(anonymous_36) -FNDA:189,(anonymous_37) -DA:3,1 -DA:7,15 -DA:9,1 -DA:11,35 -DA:13,1 -DA:15,1 -DA:17,1 -DA:33,1 -DA:39,1 -DA:40,35 -DA:41,70 -DA:44,35 -DA:46,35 -DA:47,35 -DA:49,35 -DA:50,35 -DA:51,35 -DA:52,35 -DA:55,1 -DA:63,25 -DA:64,37 -DA:67,25 -DA:76,12 -DA:77,19 -DA:80,12 -DA:85,7 -DA:87,7 -DA:88,10 -DA:91,7 -DA:94,7 -DA:97,4 -DA:98,4 -DA:99,4 -DA:102,3 -DA:103,3 -DA:104,3 -DA:105,2 -DA:107,3 -DA:110,7 -DA:111,23 -DA:112,8 -DA:114,15 -DA:115,10 -DA:116,4 -DA:141,37 -DA:143,37 -DA:144,56 -DA:147,37 -DA:149,18 -DA:151,18 -DA:152,54 -DA:157,18 -DA:159,19 -DA:160,5 -DA:162,5 -DA:164,5 -DA:165,10 -DA:173,14 -DA:176,14 -DA:181,19 -DA:187,35 -DA:196,35 -DA:207,35 -DA:212,78 -DA:213,78 -DA:215,78 -DA:216,35 -DA:217,35 -DA:218,35 -DA:220,35 -DA:222,35 -DA:223,35 -DA:224,0 -DA:227,35 -DA:228,35 -DA:230,35 -DA:232,35 -DA:239,70 -DA:241,39 -DA:242,27 -DA:244,12 -DA:247,62 -DA:253,35 -DA:255,35 -DA:256,84 -DA:258,35 -DA:263,35 -DA:265,35 -DA:266,24 -DA:268,35 -DA:273,54 -DA:274,189 -DA:278,54 -DA:280,135 -DA:286,1 -DA:289,1 -DA:290,1 -LF:97 -LH:96 -BRDA:7,1,0,15 -BRDA:7,1,1,15 -BRDA:7,2,0,15 -BRDA:7,2,1,0 -BRDA:7,3,0,1 -BRDA:7,3,1,0 -BRDA:7,4,0,0 -BRDA:7,4,1,1 -BRDA:9,5,0,0 -BRDA:9,5,1,1 -BRDA:9,6,0,1 -BRDA:9,6,1,1 -BRDA:11,7,0,0 -BRDA:11,7,1,35 -BRDA:94,8,0,4 -BRDA:94,8,1,3 -BRDA:104,9,0,2 -BRDA:104,9,1,1 -BRDA:111,10,0,8 -BRDA:111,10,1,15 -BRDA:111,11,0,23 -BRDA:111,11,1,15 -BRDA:115,12,0,4 -BRDA:115,12,1,6 -BRDA:115,13,0,10 -BRDA:115,13,1,10 -BRDA:147,14,0,18 -BRDA:147,14,1,19 -BRDA:159,15,0,5 -BRDA:159,15,1,14 -BRDA:241,16,0,27 -BRDA:241,16,1,12 -BRDA:274,17,0,54 -BRDA:274,17,1,54 -BRDA:274,17,2,54 -BRDA:274,17,3,135 -BRF:36 -BRH:31 -end_of_record diff --git a/package.json b/package.json index 36291ff..de657b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "forbin", - "version": "0.1.0", + "version": "0.1.2", "description": "ES6 Component for controllers with filter support.", "main": "index.js", "scripts": { @@ -38,12 +38,15 @@ }, "devDependencies": { "babel": "^5.5.6", + "babel-eslint": "^3.1.26", "chai": "^3.0.0", "coveralls": "^2.11.2", + "eslint": "^0.24.1", "gulp": "^3.9.0", "gulp-babel": "^5.1.0", "gulp-istanbul": "^0.10.0", "gulp-mocha": "^2.1.1", + "gulp-util": "^3.0.6", "karma": "^0.12.36", "karma-browserify": "^4.2.1", "karma-chai": "^0.1.0", @@ -51,6 +54,8 @@ "karma-mocha": "^0.1.10", "karma-sauce-launcher": "^0.2.11", "mocha": "^2.2.5", - "sinon": "^1.15.3" - } + "sinon": "^1.15.3", + "superstack": "0.0.4" + }, + "generatorVersion": "0.2.20" } diff --git a/paths.json b/paths.json index 1780085..ff6bfa3 100644 --- a/paths.json +++ b/paths.json @@ -1,7 +1,13 @@ { "source": { "lib": "./es6/lib/**/*.js", - "spec": "./es6/spec/**/*.spec.js" + "spec": "./es6/spec/**/*.spec.js", + "specAssets": [ + "./es6/spec/**/*.json" + ], + "libAssets": [ + "./es6/lib/**/*.json" + ] }, "build": { diff --git a/tasks/build-lib-assets.js b/tasks/build-lib-assets.js new file mode 100644 index 0000000..9df19aa --- /dev/null +++ b/tasks/build-lib-assets.js @@ -0,0 +1,9 @@ +import gulp from "gulp"; +//import babel from "gulp-babel"; + +import paths from "../paths.json"; + +gulp.task("build-lib-assets", () => { + return gulp.src(paths.source.specAssets) + .pipe(gulp.dest(paths.build.directories.spec)); +}); diff --git a/tasks/build-spec-assets.js b/tasks/build-spec-assets.js new file mode 100644 index 0000000..2ececa8 --- /dev/null +++ b/tasks/build-spec-assets.js @@ -0,0 +1,9 @@ +import gulp from "gulp"; +//import babel from "gulp-babel"; + +import paths from "../paths.json"; + +gulp.task("build-spec-assets", () => { + return gulp.src(paths.source.specAssets) + .pipe(gulp.dest(paths.build.directories.spec)); +}); diff --git a/tasks/build.js b/tasks/build.js index f6afedf..e3b50be 100644 --- a/tasks/build.js +++ b/tasks/build.js @@ -1,3 +1,3 @@ import gulp from "gulp"; -gulp.task("build", ["build-lib", "build-spec"]); +gulp.task("build", ["build-lib", "build-spec", "build-lib-assets", "build-spec-assets"]); diff --git a/tasks/suppress-errors.js b/tasks/suppress-errors.js new file mode 100644 index 0000000..fcfa22c --- /dev/null +++ b/tasks/suppress-errors.js @@ -0,0 +1,31 @@ +import gulp from "gulp"; +import gutil from "gulp-util"; + +// Watch tasks should depend on suppress-errors - it will force all stream pipes to print but not crash on error +gulp.task("suppress-errors", function(){ + function monkeyPatchPipe(o){ + while(!o.hasOwnProperty("pipe")){ + o = Object.getPrototypeOf(o); + if(!o){ + return; + } + } + var originalPipe = o.pipe; + var newPipe = function(){ + var result = originalPipe.apply(this, arguments); + result.setMaxListeners(0); + if(!result.pipe["monkey patched for suppress-errors"]){ + monkeyPatchPipe(result); + } + + return result.on("error", function (err) { + gutil.log(gutil.colors.yellow(err)); + gutil.beep(); + this.emit("end"); + }); + }; + newPipe["monkey patched for suppress-errors"] = true; + o.pipe = newPipe; + } + monkeyPatchPipe(gulp.src("")); +}); diff --git a/tasks/test-browsers.js b/tasks/test-browsers.js index b04b195..11c16b9 100644 --- a/tasks/test-browsers.js +++ b/tasks/test-browsers.js @@ -1,7 +1,7 @@ var gulp = require("gulp"); var karma = require("karma").server; -gulp.task("test-browsers", function (done) { +gulp.task("test-browsers", ["build"], function (done) { /** * This ensures that the browser tests only run on the first job, * instead of wastefully running the browser tests on every job. @@ -19,7 +19,6 @@ gulp.task("test-browsers", function (done) { function runKarma(done) { karma.start({ - configFile: __dirname + "/../.karma.conf.js", - singleRun: true + configFile: __dirname + "/../.karma.conf.js" }, done); } diff --git a/tasks/test-local.js b/tasks/test-local.js index f156af2..381da73 100644 --- a/tasks/test-local.js +++ b/tasks/test-local.js @@ -1,7 +1,7 @@ import gulp from "gulp"; import mocha from "gulp-mocha"; +import "superstack"; import istanbul from "gulp-istanbul"; -import codeClimate from "./codeClimate"; import paths from "../paths.json"; import chai from "chai"; diff --git a/tasks/test-watch.js b/tasks/test-watch.js new file mode 100644 index 0000000..9c32b8c --- /dev/null +++ b/tasks/test-watch.js @@ -0,0 +1,11 @@ +import gulp from "gulp"; +import paths from "../paths.json"; + +gulp.task("test-watch", ["suppress-errors"], () => { + gulp.watch([ + paths.source.lib, + paths.source.spec, + paths.source.specAssets, + paths.source.libAssets + ], ["test-local"]); +});