diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..5760be5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..25fbf5a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +coverage/ diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..a82f753 --- /dev/null +++ b/.npmignore @@ -0,0 +1,3 @@ +coverage/ +node_modules/ +.travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..19f3445 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: node_js +node_js: + - "0.12" + - "iojs" +script: "npm run-script test-travis" +# Send coverage data to Coveralls +after_script: "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js" diff --git a/README.md b/README.md new file mode 100644 index 0000000..04be79f --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +redux-create-reducer +=== + +[![NPM version][npm-image]][npm-url] +[![Build status][travis-image]][travis-url] +[![Test coverage][coveralls-image]][coveralls-url] +[![Downloads][downloads-image]][downloads-url] + +[This code packaged as a node module](https://github.com/rackt/redux/blob/9b0630fe9ea8209777fed7cac78fee7ee76fce67/docs/recipes/ReducingBoilerplate.md#generating-reducers) + +Usage: + +```js +import { createReducer } from 'redux-create-reducer'; +import * as ActionTypes from '../constants/ActionTypes'; + +const initialState = []; + + +export const todos = createReducer(initialState, { + [ActionTypes.ADD_TODO](state, action) { + let text = action.text.trim(); + return [...state, text]; + } +}) +``` + + + +[npm-image]: https://img.shields.io/npm/v/redux-create-reducer.svg?style=flat-square +[npm-url]: https://npmjs.org/package/redux-create-reducer +[travis-image]: https://img.shields.io/travis/kolodny/redux-create-reducer.svg?style=flat-square +[travis-url]: https://travis-ci.org/kolodny/redux-create-reducer +[coveralls-image]: https://img.shields.io/coveralls/kolodny/redux-create-reducer.svg?style=flat-square +[coveralls-url]: https://coveralls.io/r/kolodny/redux-create-reducer +[downloads-image]: http://img.shields.io/npm/dm/redux-create-reducer.svg?style=flat-square +[downloads-url]: https://npmjs.org/package/redux-create-reducer diff --git a/index.js b/index.js new file mode 100644 index 0000000..e38438b --- /dev/null +++ b/index.js @@ -0,0 +1,13 @@ +"use strict"; + +exports.createReducer = function createReducer(initialState, handlers) { + return function reducer(state, action) { + if (state === undefined) state = initialState; + + if (handlers.hasOwnProperty(action.type)) { + return handlers[action.type](state, action); + } else { + return state; + } + }; +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..eae6c58 --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "redux-create-reducer", + "version": "1.0.0", + "description": "Publishing createReducer from http://rackt.github.io/redux/docs/recipes/ReducingBoilerplate.html", + "main": "./lib/index.js", + "scripts": { + "test-cov": "node ./node_modules/istanbul/lib/cli.js cover node_modules/mocha/bin/_mocha 'test/**/*.js' -- --reporter dot", + "test-travis": "node ./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha 'test/**/*.js' -- -R spec", + "test": "mocha" + }, + "author": "Moshe Kolodny", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/kolodny/redux-create-reducer.git" + }, + "keywords": [ + "redux", + "reducer" + ], + "bugs": { + "url": "https://github.com/kolodny/redux-create-reducer/issues" + }, + "homepage": "https://github.com/kolodny/redux-create-reducer#readme", + "devDependencies": { + "babel": "^5.8.23", + "babel-core": "^5.8.22", + "coveralls": "^2.11.4", + "expect": "^1.9.0", + "istanbul": "^0.3.19", + "mocha": "^2.3.1" + } +} diff --git a/test.js b/test.js new file mode 100644 index 0000000..aaa1c88 --- /dev/null +++ b/test.js @@ -0,0 +1,40 @@ +var expect = require('expect'); +var createReducer = require('./').createReducer; + +describe('createReducer', function() { + + it('returns the inital state on the first call with no matches', function() { + const reducerMap = {}; + const reducer = createReducer('theintialstate', reducerMap); + expect(reducer(undefined, {type: 'YOLO'})).toEqual('theintialstate'); + }); + + it('returns the correct state on the first call with a matche', function() { + const reducerMap = { + YOLO() { + return 'theproperstate'; + } + }; + const reducer = createReducer('theintialstate', reducerMap); + expect(reducer(undefined, {type: 'YOLO'})).toEqual('theproperstate'); + }); + + it('returns the same state if no value matched', function() { + const reducerMap = {}; + const reducer = createReducer({someObj: true}, reducerMap); + const state = reducer(undefined, {type: 'YOLO'}); + expect(reducer(state, {type: 'YOLO'})).toEqual(state); + }); + + it('returns a new state if a value matched', function() { + const reducerMap = { + YOLO() { + return {someObj: 2}; + } + }; + const reducer = createReducer({someObj: 1}, reducerMap); + const state = reducer(undefined, {}); + expect(reducer(state, {type: 'YOLO'})).toEqual({someObj: 2}); + }); + +});