Skip to content

Commit bf704cf

Browse files
committed
Some updates
1 parent 2bd77f8 commit bf704cf

File tree

8 files changed

+111
-43
lines changed

8 files changed

+111
-43
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "js-messages",
3-
"version": "0.1.15",
3+
"version": "0.1.16",
44
"license": "LGPL-3.0",
55
"homepage": "https://github.com/js-works/js-messages",
66
"main": "index.js",

src/main/api/defineMessage.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import buildMessageCreator from '../internal/buildMessageCreator'
2+
import MessageInitializer from '../internal/types/MessageInitializer'
3+
import MessageCreator from '../internal/types/MessageCreator'
4+
5+
export default function defineMessage<K extends String, A extends any[]>
6+
(type: K, initializer: MessageInitializer<A> = null): MessageCreator<K, A, any, any> {
7+
8+
return buildMessageCreator(type, initializer)
9+
}

src/main/api/defineMessages.ts

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
import Signature from '../internal/types/Signature'
22
import MessagesConfig from '../internal/types/MessagesConfig'
33
import MessageInitializer from '../internal/types/MessageInitializer'
4+
import MessageCreator from '../internal/types/MessageCreator'
5+
import buildMessageCreator from '../internal/buildMessageCreator';
46

57
type Func<A extends any[], R> = (...args: A) => R
68

7-
type MessageCreator<K, A extends any[], P, M> = {
8-
readonly type: K,
9-
10-
(...args: A): {
11-
type: K,
12-
payload?: P,
13-
meta?: M
14-
}
15-
}
16-
179
type Arguments<A extends any[], I extends MessageInitializer<any>>
1810
= I extends Func<A, any>
1911
? Signature<I>
@@ -45,38 +37,7 @@ function defineMessages<T extends MessagesConfig>(config: T):
4537
for (let i = 0; i < keys.length; ++i) {
4638
const key = keys[i]
4739

48-
if (typeof config[key] === 'function') {
49-
const getPayload = config[key] as Function
50-
51-
ret[key] = function (/* arguments */) {
52-
const payload = getPayload.apply(null, arguments)
53-
54-
return { type: key, payload }
55-
}
56-
} else {
57-
const
58-
messageConfig = config[key] as { payload?: Function, meta?: Function },
59-
getPayload = messageConfig.payload,
60-
getMeta = messageConfig.meta
61-
62-
ret[key] = function (/* arguments */) {
63-
const msg: any = { type: key }
64-
65-
if (getPayload) {
66-
msg.payload = getPayload.apply(null, arguments)
67-
}
68-
69-
if (getMeta) {
70-
msg.meta = getMeta.apply(null, arguments)
71-
}
72-
73-
return msg
74-
}
75-
}
76-
77-
Object.defineProperty(ret[key], 'type', {
78-
value: key
79-
})
40+
ret[key] = buildMessageCreator(key, config[key])
8041
}
8142

8243
return ret
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import MessageInitializer from './types/MessageInitializer'
2+
import MessageCreator from './types/MessageCreator'
3+
4+
export default function buildMessageCreator<K extends String, A extends any[]>
5+
(type: K, initializer: MessageInitializer<A> = null): MessageCreator<K, A, any, any> {
6+
7+
let ret: any
8+
9+
if (!initializer) {
10+
const msg = Object.freeze({ type })
11+
12+
ret = () => msg
13+
} else if (typeof initializer === 'function') {
14+
const getPayload = initializer as Function
15+
16+
ret = function (/* arguments */) {
17+
const payload = getPayload.apply(null, arguments)
18+
19+
return { type, payload }
20+
}
21+
} else {
22+
const { payload: getPayload, meta: getMeta } = initializer as { payload?: Function, meta?: Function }
23+
24+
ret = function (/* arguments */) {
25+
const msg: any = { type: type }
26+
27+
if (getPayload) {
28+
msg.payload = getPayload.apply(null, arguments)
29+
}
30+
31+
if (getMeta) {
32+
msg.meta = getMeta.apply(null, arguments)
33+
}
34+
35+
return msg
36+
}
37+
}
38+
39+
Object.defineProperty(ret, 'type', {
40+
value: type
41+
})
42+
43+
return ret
44+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
type MessageCreator<K, A extends any[], P, M> = {
2+
readonly type: K,
3+
4+
(...args: A): {
5+
type: K,
6+
payload?: P,
7+
meta?: M
8+
}
9+
}
10+
11+
export default MessageCreator

src/main/js-messages.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import defineMessage from './api/defineMessage'
12
import defineMessages from './api/defineMessages'
23

34
export {
5+
defineMessage,
46
defineMessages
57
}

src/test/api/defineMessage.test.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { describe, it } from 'mocha'
2+
import { expect } from 'chai'
3+
4+
import defineMessage from '../../main/api/defineMessage'
5+
6+
const
7+
action1 = defineMessage('ACTION1'),
8+
action2 = defineMessage('ACTION2', (value: number = 0) => value),
9+
action3 = defineMessage('ACTION3', (value: number = 21) => ({ value })),
10+
11+
action4 = defineMessage('ACTION4', {
12+
payload: (value: number = 42) => ({ value }),
13+
meta: (value: number = 42) => ({ half: value / 2})
14+
})
15+
16+
describe('defineMessage', () => {
17+
it('should create messages with neigther payload nor meta', () => {
18+
expect(action1())
19+
.to.eql({ type: 'ACTION1' })
20+
})
21+
22+
it('should create messages properly with payload getter', () => {
23+
expect(action2())
24+
.to.eql({ type: 'ACTION2', payload: 0 })
25+
26+
expect(action2(2))
27+
.to.eql({ type: 'ACTION2', payload: 2 })
28+
29+
expect(action3())
30+
.to.eql({ type: 'ACTION3', payload: { value: 21 } })
31+
32+
expect(action3(2))
33+
.to.eql({ type: 'ACTION3', payload: { value: 2 } })
34+
35+
expect(action4())
36+
.to.eql({ type: 'ACTION4', payload: { value: 42 }, meta: { half: 21 } })
37+
38+
expect(action4(2))
39+
.to.eql({ type: 'ACTION4', payload: { value: 2 }, meta: { half: 1 } })
40+
})
41+
})

0 commit comments

Comments
 (0)