From d3ba07076145b569540f99d07e1300bddf8139a0 Mon Sep 17 00:00:00 2001 From: Arve Knudsen Date: Wed, 14 Dec 2016 20:27:53 +0100 Subject: [PATCH] Qualify name of not found action with namespace --- index.js | 57 ++++++++++++++++++++++++++++++-------------------------- test.js | 8 ++++++++ 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/index.js b/index.js index 74a6a9b..cd04658 100644 --- a/index.js +++ b/index.js @@ -212,30 +212,40 @@ function dispatcher (hooks) { assert.equal(typeof caller, 'string', 'barracks._send: caller should be a string') assert.equal(typeof cb, 'function', 'barracks._send: cb should be a function') + // validate if a namespace exists. Namespaces are delimited by ':'. + var actionName = name + if (/:/.test(name)) { + var arr = name.split(':') + var ns = arr.shift() + actionName = arr.join(':') + } + + var isNamespaced = !!ns + var _reducers = isNamespaced ? reducers[ns] : reducers + var _effects = isNamespaced ? effects[ns] : effects + var reducer, effect + if (_reducers && _reducers[actionName]) { + reducer = _reducers[actionName] + } else if (_effects && _effects[actionName]) { + effect = _effects[actionName] + } else { + const qualifiedActionName = isNamespaced ? ns + ':' + actionName : actionName + throw new Error('Could not find action \'' + qualifiedActionName + '\'') + } + ;(tick(function () { - var reducersCalled = false - var effectsCalled = false var newState = xtend(_state) if (onActionHooks.length) { applyHook(onActionHooks, _state, data, name, caller, createSend) } - // validate if a namespace exists. Namespaces are delimited by ':'. - var actionName = name - if (/:/.test(name)) { - var arr = name.split(':') - var ns = arr.shift() - actionName = arr.join(':') - } - - var _reducers = ns ? reducers[ns] : reducers - if (_reducers && _reducers[actionName]) { - if (ns) { - var reducedState = _reducers[actionName](_state[ns], data) + if (reducer) { + if (isNamespaced) { + var reducedState = reducer(_state[ns], data) newState[ns] = xtend(_state[ns], reducedState) } else { - mutate(newState, reducers[actionName](_state, data)) + mutate(newState, reducer(_state, data)) } reducersCalled = true if (onStateChangeHooks.length) { @@ -243,18 +253,13 @@ function dispatcher (hooks) { } _state = newState cb(null, newState) - } - - var _effects = ns ? effects[ns] : effects - if (!reducersCalled && _effects && _effects[actionName]) { + } else { var send = createSend('effect: ' + name) - if (ns) _effects[actionName](_state[ns], data, send, cb) - else _effects[actionName](_state, data, send, cb) - effectsCalled = true - } - - if (!reducersCalled && !effectsCalled) { - throw new Error('Could not find action ' + actionName) + if (ns) { + effect(_state[ns], data, send, cb) + } else { + effect(_state, data, send, cb) + } } }))() } diff --git a/test.js b/test.js index fecdeb2..69fe5a7 100644 --- a/test.js +++ b/test.js @@ -245,6 +245,14 @@ tape('api: send(name, data?)', (t) => { const send = createSend('test') t.throws(send.bind(null, 123), /string/, 'non-string should throw') }) + + t.test('should validate action name', (t) => { + t.plan(1) + const store = barracks() + const createSend = store.start() + const send = createSend('test') + t.throws(send, 'namespace:test', 'Could not find action namespace:test') + }) }) tape('api: stop()', (t) => {