From 3bb9221c27263d7f7b99e181be7f7211a2166505 Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Fri, 26 Aug 2022 15:29:24 -0400 Subject: [PATCH] action shorcuts --- src/Updux.js | 10 ++++++++-- src/actions.test.js | 12 ++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Updux.js b/src/Updux.js index d0ad6df..c239fe6 100644 --- a/src/Updux.js +++ b/src/Updux.js @@ -1,6 +1,10 @@ import R from 'remeda'; -import { Action, ActionGenerator } from './actions.js'; +import { action } from './actions.js'; + +function isActionGen(action) { + return typeof action === "function" && action.type; +} export class Updux { #localInitial = {}; @@ -14,7 +18,9 @@ export class Updux { this.#localInitial = config.initial ?? {}; this.#subduxes = config.subduxes ?? {}; - this.#actions = { ...config.actions }; + this.#actions = R.mapValues( config.actions ?? {}, (arg,name) => + isActionGen(arg) ? arg : action(name,arg) + ); Object.entries(this.#subduxes).forEach( ([slice,sub]) => this.#addSubduxActions(slice,sub) ) } diff --git a/src/actions.test.js b/src/actions.test.js index 1501fd2..c722040 100644 --- a/src/actions.test.js +++ b/src/actions.test.js @@ -67,3 +67,15 @@ test('throw if double action', () => { }) ).toThrow(/action 'foo' already defined/); }); + +test('action definition shortcut', () => { + const foo = new Updux({ + actions: { + foo: null, + bar: x => ({x}), + },} + ); + + expect( foo.actions.foo("hello") ).toEqual({ type: 'foo', payload: 'hello' }); + expect( foo.actions.bar("hello") ).toEqual({ type: 'bar', payload: {x:'hello'} }); +});