Comparing version 2.2.0-beta.4 to 2.2.0-beta.5
@@ -330,2 +330,5 @@ 'use strict'; | ||
try { | ||
// TODO: This will return "undefined" in the next major/breaking version of kea. | ||
// The TypeScript types already say "void" for actions. | ||
// ... even if this still returns the dispatched "actionCreator" output | ||
return getContext().store.dispatch(builtAction); | ||
@@ -332,0 +335,0 @@ } finally { |
@@ -0,1 +1,2 @@ | ||
export * from './types'; | ||
export { kea, connect } from './kea'; | ||
@@ -2,0 +3,0 @@ export { useValues, useAllValues, useActions, useMountedLogic, useKea } from './react/hooks'; |
@@ -326,2 +326,5 @@ import { createSelector } from 'reselect'; | ||
try { | ||
// TODO: This will return "undefined" in the next major/breaking version of kea. | ||
// The TypeScript types already say "void" for actions. | ||
// ... even if this still returns the dispatched "actionCreator" output | ||
return getContext().store.dispatch(builtAction); | ||
@@ -328,0 +331,0 @@ } finally { |
@@ -55,5 +55,5 @@ import { Reducer, Store, Action as ReduxAction } from 'redux'; | ||
export declare type LogicWrapper = Logic & LogicWrapperAdditions; | ||
declare type ActionDefinitions<LogicType extends Logic> = Record<string, any | (() => any)>; | ||
declare type ActionDefinitions<LogicType extends Logic> = Record<string, any | (() => any)> | LogicType['actionCreators']; | ||
declare type ReducerActions<LogicType extends Logic, ReducerType> = { | ||
[K in keyof LogicType['actions']]?: (state: ReducerType, payload: ReturnType<LogicType['actions'][K]>['payload']) => ReducerType; | ||
[K in keyof LogicType['actionCreators']]?: (state: ReducerType, payload: ReturnType<LogicType['actionCreators'][K]>['payload']) => ReducerType; | ||
} | { | ||
@@ -65,9 +65,12 @@ [K in keyof LogicType['__keaTypeGenInternalReducerActions']]?: (state: ReducerType, payload: ReturnType<LogicType['__keaTypeGenInternalReducerActions'][K]>['payload']) => ReducerType; | ||
}; | ||
declare type SelectorDefinition<Selectors, S extends Selector, SelectorFunction extends any> = [(s: Selectors) => [] | [Selector] | [Selector, Selector] | [Selector, Selector, Selector] | [Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector], SelectorFunction]; | ||
declare type SelectorTuple = [] | [Selector] | [Selector, Selector] | [Selector, Selector, Selector] | [Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector]; | ||
declare type SelectorDefinition<Selectors, SelectorFunction extends any> = [(s: Selectors) => SelectorTuple, SelectorFunction]; | ||
declare type SelectorDefinitions<LogicType extends Logic> = { | ||
[K in keyof LogicType['selectors']]?: SelectorDefinition<LogicType['selectors'], LogicType['selectors'][K], LogicType['__keaTypeGenInternalSelectorTypes'][K]>; | ||
[K in keyof LogicType['selectors']]?: SelectorDefinition<LogicType['selectors'], LogicType['__keaTypeGenInternalSelectorTypes'][K]>; | ||
} | { | ||
[key: string]: SelectorDefinition<LogicType['selectors'], any>; | ||
}; | ||
declare type BreakPointFunction = (() => void) & ((ms: number) => Promise<void>); | ||
declare type ListenerDefinitions<LogicType extends Logic> = { | ||
[K in keyof LogicType['actions']]?: ((payload: ReturnType<LogicType['actions'][K]>['payload'], breakpoint: BreakPointFunction, action: ReturnType<LogicType['actions'][K]>, previousState: any) => void | Promise<void>) | (() => void | Promise<void>); | ||
[K in keyof LogicType['actionCreators']]?: ((payload: ReturnType<LogicType['actionCreators'][K]>['payload'], breakpoint: BreakPointFunction, action: ReturnType<LogicType['actionCreators'][K]>, previousState: any) => void | Promise<void>) | (() => void | Promise<void>); | ||
} | { | ||
@@ -78,3 +81,3 @@ [K in keyof LogicType['__keaTypeGenInternalReducerActions']]?: ((payload: ReturnType<LogicType['__keaTypeGenInternalReducerActions'][K]>['payload'], breakpoint: BreakPointFunction, action: ReturnType<LogicType['__keaTypeGenInternalReducerActions'][K]>, previousState: any) => void | Promise<void>) | (() => void | Promise<void>); | ||
declare type LoaderFunctions<LogicType extends Logic, ReducerReturnType> = { | ||
[K in keyof LogicType['actions']]?: (payload: ReturnType<LogicType['actions'][K]>['payload'], breakpoint: BreakPointFunction, action: ReturnType<LogicType['actions'][K]>) => ReducerReturnType | Promise<ReducerReturnType>; | ||
[K in keyof LogicType['actionCreators']]?: (payload: ReturnType<LogicType['actionCreators'][K]>['payload'], breakpoint: BreakPointFunction, action: ReturnType<LogicType['actionCreators'][K]>) => ReducerReturnType | Promise<ReducerReturnType>; | ||
}; | ||
@@ -114,2 +117,35 @@ declare type LoaderDefinitions<LogicType extends Logic> = { | ||
}; | ||
export interface MakeLogicType<Values = Record<string, unknown>, Actions = Record<string, AnyFunction>> extends Logic { | ||
actionCreators: { | ||
[ActionKey in keyof Actions]: Actions[ActionKey] extends AnyFunction ? ActionCreatorForPayloadBuilder<Actions[ActionKey]> : never; | ||
}; | ||
actionKeys: Record<string, string>; | ||
actionTypes: { | ||
[ActionKey in keyof Actions]: string; | ||
}; | ||
actions: Actions; | ||
cache: Record<string, unknown>; | ||
constants: Record<string, string>; | ||
defaults: Values; | ||
path: string[]; | ||
pathString: string; | ||
reducerOptions: Record<string, unknown>; | ||
reducer: (state: Values, action: () => any, fullState: any) => Values; | ||
reducers: { | ||
[Value in keyof Values]?: (state: Values[Value], action: () => any, fullState: any) => Values[Value]; | ||
}; | ||
selector: (state: any, props: any) => Values; | ||
selectors: { | ||
[Value in keyof Values]?: (state: any, props: any) => Values[Value]; | ||
}; | ||
values: Values; | ||
__keaTypeGenInternalSelectorTypes: { | ||
[K in keyof Values]: (...args: any) => Values[K]; | ||
}; | ||
} | ||
declare type AnyFunction = (...args: any) => any; | ||
declare type ActionCreatorForPayloadBuilder<B extends AnyFunction> = (...args: Parameters<B>) => { | ||
type: string; | ||
payload: ReturnType<B>; | ||
}; | ||
interface CreateStoreOptions { | ||
@@ -116,0 +152,0 @@ paths?: string[]; |
{ | ||
"name": "kea", | ||
"version": "2.2.0-beta.4", | ||
"version": "2.2.0-beta.5", | ||
"description": "Smart front-end architecture", | ||
@@ -5,0 +5,0 @@ "author": "Marius Andra", |
@@ -120,3 +120,3 @@ /* global test, expect, beforeEach */ | ||
store.dispatch(firstLogic.actions.updateName('derpy')) | ||
store.dispatch(firstLogic.actionCreators.updateName('derpy')) | ||
expect(firstLogic.selectors.name(store.getState())).toBe('derpy') | ||
@@ -211,3 +211,3 @@ | ||
store.dispatch(firstLogic.actions.updateName('derpy')) | ||
store.dispatch(firstLogic.actionCreators.updateName('derpy')) | ||
expect(firstLogic.values.name).toBe('derpy') | ||
@@ -214,0 +214,0 @@ |
@@ -27,2 +27,5 @@ import { getContext } from '../../context' | ||
try { | ||
// TODO: This will return "undefined" in the next major/breaking version of kea. | ||
// The TypeScript types already say "void" for actions. | ||
// ... even if this still returns the dispatched "actionCreator" output | ||
return getContext().store.dispatch(builtAction) | ||
@@ -29,0 +32,0 @@ } finally { |
@@ -0,1 +1,3 @@ | ||
export * from './types' | ||
import { resetContext } from './context' | ||
@@ -2,0 +4,0 @@ |
115
src/types.ts
@@ -62,11 +62,11 @@ import { Reducer, Store, Action as ReduxAction } from 'redux' | ||
// input helpers (using the kea-typegen generated logic type as input) | ||
// input helpers (using the generated logic type as input) | ||
type ActionDefinitions<LogicType extends Logic> = Record<string, any | (() => any)> | ||
type ActionDefinitions<LogicType extends Logic> = Record<string, any | (() => any)> | LogicType['actionCreators'] | ||
type ReducerActions<LogicType extends Logic, ReducerType> = | ||
| { | ||
[K in keyof LogicType['actions']]?: ( | ||
[K in keyof LogicType['actionCreators']]?: ( | ||
state: ReducerType, | ||
payload: ReturnType<LogicType['actions'][K]>['payload'], | ||
payload: ReturnType<LogicType['actionCreators'][K]>['payload'], | ||
) => ReducerType | ||
@@ -90,29 +90,29 @@ } | ||
type SelectorDefinition<Selectors, S extends Selector, SelectorFunction extends any> = [ | ||
( | ||
s: Selectors, | ||
) => | ||
| [] | ||
| [Selector] | ||
| [Selector, Selector] | ||
| [Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector], | ||
SelectorFunction, | ||
] | ||
type SelectorTuple = | ||
| [] | ||
| [Selector] | ||
| [Selector, Selector] | ||
| [Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | ||
| [Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector, Selector] | ||
type SelectorDefinitions<LogicType extends Logic> = { | ||
[K in keyof LogicType['selectors']]?: SelectorDefinition< | ||
LogicType['selectors'], | ||
LogicType['selectors'][K], | ||
LogicType['__keaTypeGenInternalSelectorTypes'][K] | ||
> | ||
} | ||
type SelectorDefinition<Selectors, SelectorFunction extends any> = [(s: Selectors) => SelectorTuple, SelectorFunction] | ||
type SelectorDefinitions<LogicType extends Logic> = | ||
| { | ||
[K in keyof LogicType['selectors']]?: SelectorDefinition< | ||
LogicType['selectors'], | ||
LogicType['__keaTypeGenInternalSelectorTypes'][K] | ||
> | ||
} | ||
| { | ||
[key: string]: SelectorDefinition<LogicType['selectors'], any> | ||
} | ||
type BreakPointFunction = (() => void) & ((ms: number) => Promise<void>) | ||
@@ -122,7 +122,7 @@ | ||
| { | ||
[K in keyof LogicType['actions']]?: | ||
[K in keyof LogicType['actionCreators']]?: | ||
| (( | ||
payload: ReturnType<LogicType['actions'][K]>['payload'], | ||
payload: ReturnType<LogicType['actionCreators'][K]>['payload'], | ||
breakpoint: BreakPointFunction, | ||
action: ReturnType<LogicType['actions'][K]>, | ||
action: ReturnType<LogicType['actionCreators'][K]>, | ||
previousState: any, | ||
@@ -146,6 +146,6 @@ ) => void | Promise<void>) | ||
type LoaderFunctions<LogicType extends Logic, ReducerReturnType> = { | ||
[K in keyof LogicType['actions']]?: ( | ||
payload: ReturnType<LogicType['actions'][K]>['payload'], | ||
[K in keyof LogicType['actionCreators']]?: ( | ||
payload: ReturnType<LogicType['actionCreators'][K]>['payload'], | ||
breakpoint: BreakPointFunction, | ||
action: ReturnType<LogicType['actions'][K]>, | ||
action: ReturnType<LogicType['actionCreators'][K]>, | ||
) => ReducerReturnType | Promise<ReducerReturnType> | ||
@@ -202,2 +202,47 @@ } | ||
// MakeLogicType: | ||
// - create a close-enough approxmiation of the logic's types if passed two interfaces: | ||
// | ||
// MakeLogicType<Values, Actions> | ||
// - Values = { valueKey: type } | ||
// - Actions = { actionKey: (id) => void } // <- this works | ||
// - Actions = { actionKey: (id) => { id } } // <- adds type completion in reducers | ||
export interface MakeLogicType<Values = Record<string, unknown>, Actions = Record<string, AnyFunction>> extends Logic { | ||
actionCreators: { | ||
[ActionKey in keyof Actions]: Actions[ActionKey] extends AnyFunction | ||
? ActionCreatorForPayloadBuilder<Actions[ActionKey]> | ||
: never | ||
} | ||
actionKeys: Record<string, string> | ||
actionTypes: { | ||
[ActionKey in keyof Actions]: string | ||
} | ||
actions: Actions | ||
cache: Record<string, unknown> | ||
constants: Record<string, string> | ||
defaults: Values | ||
path: string[] | ||
pathString: string | ||
reducerOptions: Record<string, unknown> | ||
reducer: (state: Values, action: () => any, fullState: any) => Values | ||
reducers: { | ||
[Value in keyof Values]?: (state: Values[Value], action: () => any, fullState: any) => Values[Value] | ||
} | ||
selector: (state: any, props: any) => Values | ||
selectors: { | ||
[Value in keyof Values]?: (state: any, props: any) => Values[Value] | ||
} | ||
values: Values | ||
__keaTypeGenInternalSelectorTypes: { | ||
[K in keyof Values]: (...args: any) => Values[K] | ||
} | ||
} | ||
type AnyFunction = (...args: any) => any | ||
type ActionCreatorForPayloadBuilder<B extends AnyFunction> = ( | ||
...args: Parameters<B> | ||
) => { type: string; payload: ReturnType<B> } | ||
// kea setup stuff | ||
@@ -204,0 +249,0 @@ |
464293
13773