overmind
Version:
Frictionless state management
1 lines • 7.06 kB
Source Map (JSON)
{"version":3,"file":"rehydrate.js","sourceRoot":"","sources":["../src/rehydrate.ts"],"names":[],"mappings":"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","sourcesContent":["import { IMutation } from 'proxy-state-tree'\n\nexport function rehydrateState(target: any, source: any, classes: any = {}) {\n if (!target || !source) {\n throw new Error(\n `You have to pass a \"target\" and \"source\" object to rehydrate`\n )\n }\n\n Object.keys(source).forEach((key) => {\n const value = source[key]\n const classInstance = classes[key]\n\n if (typeof classInstance === 'function' && Array.isArray(target[key])) {\n target[key] = (source[key] as any[]).map((value) => classInstance(value))\n } else if (\n typeof classInstance === 'function' &&\n typeof target[key] === 'object' &&\n target[key] !== null &&\n target[key].constructor.name === 'Object'\n ) {\n target[key] = Object.keys(source[key] as any).reduce((aggr, subKey) => {\n aggr[subKey] = classInstance((source[key] as any)[subKey])\n\n return aggr\n }, {})\n } else if (typeof classInstance === 'function') {\n target[key] = classInstance(source[key])\n } else if (\n typeof value === 'object' &&\n !Array.isArray(value) &&\n value !== null\n ) {\n if (!target[key]) target[key] = {}\n rehydrateState(target[key], source[key], classes[key])\n } else {\n target[key] = source[key]\n }\n })\n}\n\nexport const SERIALIZE = Symbol('SERIALIZE')\n\nexport interface Serialize {\n [SERIALIZE]: boolean\n}\n\nexport type Serializable =\n | Serialize\n | {\n toJSON: () => {\n [SERIALIZE]: boolean\n }\n }\n\ntype SerializableValue =\n | Serializable\n | Array<Serializable>\n | { [key: string]: Serializable }\n | null\n\ntype FilteredKeys<T, U> = {\n [P in keyof T]: T[P] extends U ? P : never\n}[keyof T]\n\ntype ExcludeNever<T extends {}> = {\n [P in keyof T]: T[P] extends never ? never : P\n}[keyof T]\n\ntype ExtracType<T extends {}, K> = {\n [P in FilteredKeys<T, K | {}>]: T[P] extends SerializableValue\n ? (data: any) => Serializable\n : T[P] extends {}\n ? ExtracType<T[P], K> extends { [key: string]: never }\n ? never\n : ExtractDeepType<T[P], K>\n : never\n}\n\ntype ExtractDeepType<T extends {}, K, U extends {} = ExtracType<T, K>> = {\n [P in ExcludeNever<U>]: U[P]\n}\n\ntype StateNode = {\n [key: string]: any\n}\n\nexport const rehydrate = <T extends StateNode>(\n state: T,\n source: IMutation[] | StateNode,\n classes: ExtractDeepType<T, SerializableValue> = {} as any\n) => {\n if (Array.isArray(source)) {\n const mutations = source as IMutation[]\n mutations.forEach((mutation) => {\n const pathArray = mutation.path.split(mutation.delimiter)\n const key = pathArray.pop() as string\n const target = pathArray.reduce((aggr, key) => aggr[key], state as any)\n const classInstance = pathArray.reduce(\n (aggr, key) => aggr && aggr[key],\n classes as any\n )\n\n if (mutation.method === 'set') {\n if (\n typeof classInstance === 'function' &&\n Array.isArray(mutation.args[0])\n ) {\n target[key] = mutation.args[0].map((arg) => classInstance(arg))\n } else if (typeof classInstance === 'function') {\n target[key] = classInstance(mutation.args[0])\n } else {\n target[key] = mutation.args[0]\n }\n } else if (mutation.method === 'unset') {\n delete target[key]\n } else {\n target[key][mutation.method].apply(\n target[key],\n typeof classInstance === 'function'\n ? mutation.args.map((arg) => {\n return typeof arg === 'object' && arg !== null\n ? classInstance(arg)\n : arg\n })\n : mutation.args\n )\n }\n })\n } else {\n rehydrateState(state, source, classes)\n }\n}\n"]}