Skip to content

Commit b5f3071

Browse files
committed
Some updates
1 parent 02a50db commit b5f3071

File tree

5 files changed

+87
-42
lines changed

5 files changed

+87
-42
lines changed

src/main/api/defineMessage.ts

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,51 @@
11
import buildMessageCreator from '../internal/buildMessageCreator'
2-
import MessageInitializer from '../internal/types/MessageInitializer'
3-
import MessageCreator from '../internal/types/MessageCreator'
42

5-
export default function defineMessage<K extends String, A extends any[]>
6-
(type: string, initializer: MessageInitializer<A> = null): MessageCreator<A, any, any> {
3+
// --- defineMessage ------------------------------------------------
74

8-
return buildMessageCreator(type, initializer)
5+
function defineMessage(
6+
type: string
7+
): () => { type: string }
8+
9+
function defineMessage<A extends any[], P>(
10+
type: string,
11+
getPayload: (...args: A) => P
12+
): (...args: A) => { type: string, payload: P }
13+
14+
function defineMessage<A extends any[], P>(
15+
type: string,
16+
17+
init: {
18+
payload: (...args: A) => P,
19+
validate?: (...args: A) => boolean | null | Error
20+
}
21+
): (...args: A) => { type: string, payload: P }
22+
23+
function defineMessage<A extends any[], M>(
24+
type: string,
25+
26+
init: {
27+
meta: (...args: A) => M,
28+
validate?: (...args: A) => boolean | null | Error
29+
}
30+
): (...args: A) => { type: string, meta: M}
31+
32+
function defineMessage<A extends any[], P, M>(
33+
type: string,
34+
35+
init: {
36+
payload: (...args: A) => P,
37+
meta: (...args: A) => M,
38+
validate?: (...args: A) => boolean | null | Error
39+
}
40+
): (...args: A) => { type: string, payload: P, meta: M }
41+
42+
function defineMessage(
43+
type: string,
44+
init: any = null
45+
): any {
46+
return buildMessageCreator(type, init)
947
}
48+
49+
// --- exports ------------------------------------------------------
50+
51+
export default defineMessage

src/main/api/defineMessages.ts

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
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'
54
import buildMessageCreator from '../internal/buildMessageCreator';
65

76
// --- defineMessages -----------------------------------------------
87

98
function defineMessages<T extends MessagesConfig>(prefix: string, config: T):
10-
{ [K in keyof T]: MessageCreator<Arguments<any, T[K]>, Payload<T[K]>, Meta<T[K]>> }
9+
{ [K in keyof T]: MessageCreatorOf<T[K]> & { type: string }}
1110

1211
function defineMessages<T extends MessagesConfig>(config: T):
13-
{ [K in keyof T]: MessageCreator<Arguments<any, T[K]>, Payload<T[K]>, Meta<T[K]>> }
12+
{ [K in keyof T]: MessageCreatorOf<T[K]> & { type: string } }
1413

1514
function defineMessages(arg1: any, arg2?: any): any {
1615
const
@@ -32,28 +31,28 @@ function defineMessages(arg1: any, arg2?: any): any {
3231

3332
// --- locals -------------------------------------------------------
3433

35-
type Func<A extends any[], R> = (...args: A) => R
36-
37-
type Arguments<A extends any[], I extends MessageInitializer<any>>
38-
= I extends Func<A, any>
39-
? Signature<I>
40-
: (I extends { payload: Func<A, any> }
41-
? Signature<I['payload']>
42-
: [])
43-
44-
type Payload<I extends MessageInitializer<any>>
45-
= I extends Func<any, any>
46-
? ReturnType<I>
47-
: (I extends { payload: Func<any, any> }
48-
? ReturnType<I['payload']>
49-
: any)
50-
51-
type Meta<I extends MessageInitializer<any>>
52-
= I extends Func<any, any>
53-
? ReturnType<I>
54-
: (I extends { meta: Func<any, any> }
55-
? ReturnType<I['meta']>
56-
: any)
34+
type MessageCreatorOf<T> =
35+
T extends {
36+
payload: (...args: infer A) => infer P,
37+
meta: (...args: infer A) => infer M,
38+
validate?: (...args: infer A) => boolean | null | Error
39+
}
40+
? (...args: A) => { type: string, payload: P, meta: M}
41+
: T extends {
42+
meta: (...args: infer A) => infer M,
43+
validate?: (...args: infer A) => boolean | null | Error
44+
}
45+
? (...args: A) => { type: string, meta: M}
46+
: T extends {
47+
payload: (...args: infer A) => infer P,
48+
validate?: (...args: infer A) => boolean | null | Error
49+
}
50+
? (...args: A) => { type: string, payload: P }
51+
: T extends (...args: infer A) => infer P
52+
? (...args: A) => { type: string, payload: P }
53+
: T extends {}
54+
? () => { type: string}
55+
: never
5756

5857
// --- exports ------------------------------------------------------
5958

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1-
type MessageCreator<A extends any[], P, M> = {
2-
readonly type: string,
3-
4-
(...args: A): {
5-
type: string,
6-
payload?: P,
7-
meta?: M
8-
}
9-
}
1+
type MessageCreator<A extends any[], P, M> =
2+
A extends []
3+
? {
4+
readonly type: string,
5+
(): { type: string }
6+
}
7+
: {
8+
readonly type: string,
9+
10+
(...args: A): {
11+
type: string,
12+
payload?: P,
13+
meta?: M
14+
}
15+
}
1016

1117
export default MessageCreator

src/main/internal/types/MessageInitializer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
type PayloadCreator<Args extends any[]> = (...args: Args) => any
22
type MetaCreator<Args extends any[]> = (...args: Args) => any
3-
type Validator<Args extends any[]> = (...args: Args) => true | false | null | Error
3+
type Validator<Args extends any[]> = (...args: Args) => boolean | null | Error
44

55
type MessageInitializer<Args extends any[]> =
66
PayloadCreator<Args>

src/test/api/defineMessages.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ const Actions = defineMessages({
1717
}
1818
})
1919

20-
const x = Actions.action1()
21-
2220
describe('defineMessages', () => {
2321
it('should create messages with neigther payload nor meta', () => {
2422
expect(Actions.action1())

0 commit comments

Comments
 (0)