11import type {
22 ComponentType ,
3- Context ,
43 ForwardRefExoticComponent ,
54 MemoExoticComponent ,
65 NamedExoticComponent ,
@@ -13,7 +12,8 @@ import type {
1312 Changes as BaseChanges ,
1413 Connection ,
1514 Immutable ,
16- Value ,
15+ KeyType ,
16+ Value
1717} from '@webkrafters/auto-immutable' ;
1818
1919import { FULL_STATE_SELECTOR } from './constants' ;
@@ -36,16 +36,12 @@ export type {
3636
3737export type State = Value ;
3838
39- export type ObservableContext < T extends State > = IObservableContext < T > | PublicObservableContext < T > ;
40-
41- export type PublicObservableContext < T extends State > = WithObservableProvider < Context < Store < T > > , T > ;
42-
43- export type IObservableContext < T extends State > = WithObservableProvider < Context < IStore > , T > ;
44-
45- export type WithObservableProvider <
46- LOCAL_DATA extends Record < any , any > = { } ,
47- T extends State = State
48- > = LOCAL_DATA & { Provider : ObservableProvider < T > } ;
39+ export type Listener < T extends State = { } > = (
40+ changes : Readonly < T > ,
41+ hasChangedPath : (
42+ pathTokens : Array < string >
43+ ) => boolean
44+ ) => void ;
4945
5046export type ObservableProvider < T extends State > = ForwardRefExoticComponent <
5147 ProviderProps < T > &
@@ -81,7 +77,12 @@ export type PropsExtract<C, STATE extends State, SELECTOR_MAP extends SelectorMa
8177 ? U extends OwnProps ? U : IProps
8278 : IProps ;
8379
84- export type InjectedProps < P extends IProps = IProps > = { [ K in keyof P ] : P [ K ] } ;
80+ export type ExtractInjectedProps <
81+ STATE extends State = State ,
82+ SELECTOR_MAP extends SelectorMap = SelectorMap ,
83+ ALL_PROPS extends OwnProps = OwnProps
84+ > = Omit < ALL_PROPS , keyof Store < STATE > | keyof SELECTOR_MAP >
85+
8586
8687export interface IProps { ref ?: unknown }
8788
@@ -97,12 +98,51 @@ export type ArraySelector = Array<Text | FullStateSelector>;
9798
9899export type SelectorMap = ObjectSelector | ArraySelector | void ;
99100
100- export type Data < SELECTOR_MAP extends SelectorMap > = (
101+ type ReplacePathSeps <
102+ P extends Text ,
103+ T extends string ,
104+ > = P extends `${infer U } ${T } ${infer V } `
105+ ? ReplacePathSeps < `${U } .${V } `, T >
106+ : P ;
107+
108+ type TrimPathSep < P extends Text > = P extends `${infer U } ]${never } ` ? U : P ;
109+
110+ type NormalizePath < P extends Text > = TrimPathSep <
111+ ReplacePathSeps <
112+ ReplacePathSeps <
113+ ReplacePathSeps <
114+ P ,
115+ ']['
116+ > ,
117+ '].'
118+ > ,
119+ '['
120+ >
121+ > ;
122+
123+ type Datum <
124+ P extends Text ,
125+ S extends Record < Text , any > = State
126+ > = P extends `${infer K } .${infer P_1 } `
127+ ? Datum < P_1 , S [ K ] >
128+ : P extends ''
129+ ? S
130+ : any ;
131+
132+ type DataPoint <
133+ P extends Text ,
134+ S extends State
135+ > = P extends FullStateSelector ? S : Datum < NormalizePath < P > , S > ;
136+
137+ export type Data <
138+ SELECTOR_MAP extends SelectorMap ,
139+ STATE extends State = State
140+ > = (
101141 SELECTOR_MAP extends ObjectSelector
102- ? { [ selectorKey in keyof SELECTOR_MAP ] : Readonly < any > }
142+ ? { [ S_KEY in keyof SELECTOR_MAP ] : DataPoint < SELECTOR_MAP [ S_KEY ] , STATE > }
103143 : SELECTOR_MAP extends ArraySelector
104- ? { [ selectorKey : number ] : Readonly < any > }
105- : never
144+ ? { [ S_NUM : number ] : DataPoint < SELECTOR_MAP [ number ] , STATE > }
145+ : Array < any >
106146) ;
107147
108148export type Changes < T extends State = State > = BaseChanges < T > ;
@@ -116,9 +156,7 @@ export interface IStorage<T extends State = State> {
116156
117157export type NonReactUsageReport = ( ...args : Array < unknown > ) => void ;
118158
119- export type Listener = < T extends State > ( changes : Changes < T > ) => void ;
120-
121- export type PartialState < T extends State > = Partial < T > ;
159+ export type PartialState < T extends State > = T extends Partial < infer U > ? T : Partial < T > ;
122160
123161export interface Prehooks < T extends State = State > {
124162 resetState ?: (
@@ -131,6 +169,8 @@ export interface Prehooks<T extends State = State> {
131169 setState ?: ( newChanges : Changes < T > ) => boolean ;
132170} ;
133171
172+ export type Subscribe = < T extends State > ( listener : Listener < T > ) => Unsubscribe ;
173+
134174export type Unsubscribe = ( ...args : Array < unknown > ) => void ;
135175
136176export interface IStore {
@@ -152,10 +192,10 @@ export interface Store<
152192} ;
153193
154194export interface StoreInternal < T extends State > extends IStoreInternal {
155- cache : Immutable < T > ,
195+ cache : Immutable < Partial < T > > ,
156196 resetState : ( connection : Connection < T > , propertyPaths ?: Array < string > ) => void ;
157197 setState : ( connection : Connection < T > , changes : Changes < T > ) => void ;
158- subscribe : ( listener : Listener ) => Unsubscribe ;
198+ subscribe : Subscribe ;
159199} ;
160200
161201export interface StorePlaceholder extends IStoreInternal {
@@ -169,7 +209,7 @@ export interface StoreRef<T extends State = State> extends StorePlaceholder {
169209 getState : ( ) => T ,
170210 resetState : ( propertyPaths ?: string [ ] ) => void ;
171211 setState : ( changes : Changes < T > ) => void ;
172- subscribe : ( listener : Listener ) => Unsubscribe ;
212+ subscribe : Subscribe ;
173213}
174214
175215export {
@@ -188,6 +228,7 @@ export {
188228export {
189229 connect ,
190230 createContext ,
231+ ObservableContext ,
191232 UsageError ,
192233 useContext
193- } from './main' ;
234+ } from './main' ;
0 commit comments