|
1 | 1 | import { IMutation } from 'proxy-state-tree' |
2 | 2 |
|
| 3 | +import { SubType } from './internalTypes' |
| 4 | + |
3 | 5 | export function rehydrateState(target: any, source: any, classes: any = {}) { |
4 | 6 | if (!target || !source) { |
5 | 7 | throw new Error(`You have to pass a "target" and "source" object to rehydrate`) |
@@ -40,18 +42,24 @@ export type Serializable = Serialize | { |
40 | 42 | } |
41 | 43 | } |
42 | 44 |
|
43 | | -type StateNode = { [key: string]: any } |
| 45 | +export type StateNode = { [key: string]: any } |
| 46 | + |
| 47 | +export type SerializableValue = Serializable | Array<Serializable> | { [key: string]: Serializable } |
| 48 | + |
| 49 | +export type Classes<T extends StateNode, U = SubType<T, SerializableValue | null>> = { |
| 50 | + [P in keyof U]?: (data: any) => U[P] |
| 51 | +} |
| 52 | + |
| 53 | +export type RehydrateClasses<T extends StateNode, N = SubType<Omit<T, keyof Classes<T>>, StateNode>> = Classes<T> & SubType<{ |
| 54 | + [P in keyof N]?: Classes<N[P]> |
| 55 | +}, { [key: string]: (data: any) => any}> |
| 56 | + |
| 57 | +/* |
44 | 58 |
|
45 | | -export type RehydrateClasses<T extends StateNode> = Pick<{ |
46 | | - [P in keyof T]: T[P] extends Serializable ? (data: any) => T[P] : |
47 | | - T[P] extends Array<Serializable> ? (data: any) => T[P][keyof T[P]] : |
48 | | - T[P] extends { [key: string]: Serializable } ? (data: any) => T[P][keyof T[P]] : |
49 | | - T[P] extends StateNode ? RehydrateClasses<T[P]> : |
50 | | - never |
51 | | -},{ [Key in keyof T]: T[Key] extends Serializable | Array<Serializable> | { [key: string]: Serializable } ? Key : never }[keyof T]> |
| 59 | +*/ |
52 | 60 |
|
53 | 61 |
|
54 | | -export const rehydrate = <T extends { [key: string]: any }>(state: T, source: IMutation[] | StateNode, classes: RehydrateClasses<T> = {} as any) => { |
| 62 | +export const rehydrate = <T extends StateNode>(state: T, source: IMutation[] | StateNode, classes: RehydrateClasses<T> = {} as any) => { |
55 | 63 | if (Array.isArray(source)) { |
56 | 64 | const mutations = source as IMutation[] |
57 | 65 | mutations.forEach((mutation) => { |
|
0 commit comments