diff --git a/.gitignore b/.gitignore index af197af..07966d4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ /test/playground.html eruda* /script/icomoon/ +/src/**/*.js.map npm-debug.log \ No newline at end of file diff --git a/doc/CONTRIBUTING.md b/doc/CONTRIBUTING.md index 7603bd3..98b3643 100644 --- a/doc/CONTRIBUTING.md +++ b/doc/CONTRIBUTING.md @@ -22,6 +22,8 @@ npm run dev npm run build # lint, build and test. npm run ci +# check test coverage. +npm run cov ``` ## Project Structure diff --git a/karma.conf.js b/karma.conf.js index 391d3da..2f47399 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,4 +1,5 @@ -var webpackCfg = require('./script/webpack.release'); +var webpackCfg = require('./script/webpack.dev'); +webpackCfg.devtool = 'inline-source-map'; module.exports = function (config) { @@ -28,16 +29,26 @@ module.exports = function (config) 'karma-phantomjs-launcher', 'karma-wrap-preprocessor', 'karma-coverage', - 'karma-webpack' + 'karma-webpack', + 'karma-sourcemap-loader', + 'karma-sourcemap-writer' ], + webpackServer: { + noInfo: true + }, preprocessors: { 'test/*.js': ['wrap'], - 'src/index.js': ['webpack', 'coverage'] + 'src/index.js': ['webpack', 'sourcemap', 'sourcemap-writer', 'coverage'] }, webpack: webpackCfg, wrapPreprocessor: { template: '(function () { <%= contents %> })()' }, + coverageReporter: { + type: 'json', + subdir: '.', + file: 'coverage-final.json' + }, reporters: ['progress', 'coverage'], port: 9876, colors: true, diff --git a/package.json b/package.json index 3716a7a..c3cdc6f 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "ci": "npm run lint && npm run test && npm run build", "build": "webpack --config script/webpack.dev.js && webpack -p --config script/webpack.release.js", + "cov": "npm run test && remap-istanbul -i coverage/coverage-final.json -o coverage/coverage-remapped.json -t json && node script/coverage", "dev": "webpack-dev-server --config script/webpack.dev.js --host 0.0.0.0", "test": "karma start", "setup": "node script/cpTestLib", @@ -59,6 +60,7 @@ "eslint": "^4.5.0", "handlebars": "^4.0.5", "handlebars-loader": "^1.1.4", + "istanbul": "^0.4.5", "jasmine-core": "^2.4.1", "jasmine-jquery": "^2.1.1", "jquery": "^3.1.0", @@ -69,12 +71,15 @@ "karma-jasmine": "^1.1.0", "karma-jquery": "^0.2.2", "karma-phantomjs-launcher": "^1.0.4", + "karma-sourcemap-loader": "^0.3.7", + "karma-sourcemap-writer": "^0.1.2", "karma-webpack": "^2.0.5", "karma-wrap-preprocessor": "^0.1.0", "modernizr": "^3.3.1", "node-sass": "^4.5.0", "postcss-class-prefix": "^0.3.0", "postcss-loader": "^2.0.6", + "remap-istanbul": "^0.9.5", "sass-loader": "^6.0.3", "webpack": "^3.5.4", "webpack-dev-server": "^2.7.1" diff --git a/script/coverage.js b/script/coverage.js new file mode 100644 index 0000000..cdadd4f --- /dev/null +++ b/script/coverage.js @@ -0,0 +1,30 @@ +var path = require('path'), + util = require('./util'), + istanbul = require('istanbul'); + +var collector = new istanbul.Collector(), + reporter = new istanbul.Reporter(); + +var remappedJson = require('../coverage/coverage-remapped.json'); + +var coverage = util.reduce(util.keys(remappedJson), function (result, source) +{ + if (source.match(/src.*\.js$/) && source.indexOf('node_modules') < 0) + { + var correctPath = source.replace(path.resolve(__dirname, '../src'), path.resolve(__dirname, '../')); + + var val = remappedJson[source]; + val.path = correctPath; + result[correctPath] = val; + } + + return result; +}, {}); + +collector.add(coverage); + +reporter.add('html'); +reporter.write(collector, true, function () +{ + console.log('open coverage/index.html to see the coverage report.'); +}); \ No newline at end of file diff --git a/script/util.js b/script/util.js index 9af1fc7..a6f7a11 100644 --- a/script/util.js +++ b/script/util.js @@ -145,6 +145,12 @@ * |------|-------|-------------------------------------| * |value |* |Value to check | * |return|boolean|True if value is correctly classified| + * + * ```javascript + * isNum(5); // -> true + * isNum(5.1); // -> true + * isNum({}); // -> false + * ``` */ /* dependencies @@ -499,5 +505,66 @@ return exports; })(); + /* ------------------------------ reduce ------------------------------ */ + + _.reduce = (function () + { + /* Turn a list of values into a single value. + * + * |Name |Type |Desc | + * |-------------------|------------|------------------------------| + * |obj |object array|Collection to iterate over | + * |[iteratee=identity]|function |Function invoked per iteration| + * |[initial] |* |Initial value | + * |[ctx] |* |Function context | + * |return |* |Accumulated value | + * + * ```javascript + * reduce([1, 2, 3], function (sum, n) { return sum + n }, 0); // -> 6 + * ``` + */ + + /* dependencies + * optimizeCb isArrLike isUndef keys + */ + + function exports(obj, iteratee, initial, ctx) + { + iteratee = optimizeCb(iteratee, ctx); + + var i = 0, len, key; + + if (isArrLike(obj)) + { + if (isUndef(initial)) + { + initial = obj[0]; + i = 1; + } + for (len = obj.length; i < len; i++) + { + initial = iteratee(initial, obj[i], i, obj); + } + } else + { + var _keys = keys(obj); + if (isUndef(initial)) + { + initial = obj[_keys[0]]; + i = 1; + } + for (len = _keys.length; i < len; i++) + { + key = _keys[i]; + initial = iteratee(initial, obj[key], key, obj); + } + } + + return initial; + } + + return exports; + })(); + return _; })); \ No newline at end of file diff --git a/src/index.js b/src/index.js index ce370a0..525af1e 100644 --- a/src/index.js +++ b/src/index.js @@ -191,3 +191,5 @@ module.exports = { }; extraUtil(util); + +//# sourceMappingURL=index.js.map \ No newline at end of file