import { Frozen, frozenKey } from '../frozen/Frozen'; import { AnyModel } from '../model/BaseModel'; import { modelIdKey, modelTypeKey } from '../model/metadata'; import { ModelFromSnapshot, ModelToSnapshot } from '../modelShared/BaseModelShared'; import { ArraySet, ObjectMap } from '../wrappers'; export type FrozenData = { [frozenKey]: true; data: D; }; export type SnapshotOutOfObject = { [k in keyof T]: SnapshotOutOf extends infer R ? R : never; }; export type SnapshotOutOfModel = ModelToSnapshot; export interface SnapshotOutOfFrozen> extends FrozenData { } export interface SnapshotOutOfObjectMap { items: { [k: string]: SnapshotOutOf; }; [modelTypeKey]?: string; [modelIdKey]: string; } export interface SnapshotOutOfArraySet { items: SnapshotOutOf[]; [modelTypeKey]?: string; [modelIdKey]: string; } export type SnapshotOutOf = T extends ObjectMap ? SnapshotOutOfObjectMap extends infer R ? R : never : T extends ArraySet ? SnapshotOutOfArraySet extends infer R ? R : never : T extends AnyModel ? SnapshotOutOfModel extends infer R ? R : never : T extends Frozen ? SnapshotOutOfFrozen extends infer R ? R : never : T extends object ? SnapshotOutOfObject extends infer R ? R : never : T; export type SnapshotInOfObject = { [k in keyof T]: SnapshotInOf extends infer R ? R : never; }; export type SnapshotInOfModel = ModelFromSnapshot; export interface SnapshotInOfFrozen> extends FrozenData { } export interface SnapshotInOfObjectMap { items?: { [k: string]: SnapshotOutOf; }; [modelTypeKey]?: string; [modelIdKey]: string; } export interface SnapshotInOfArraySet { items?: SnapshotOutOf[]; [modelTypeKey]?: string; [modelIdKey]: string; } export type SnapshotInOf = T extends ObjectMap ? SnapshotInOfObjectMap extends infer R ? R : never : T extends ArraySet ? SnapshotInOfArraySet extends infer R ? R : never : T extends AnyModel ? SnapshotInOfModel extends infer R ? R : never : T extends Frozen ? SnapshotInOfFrozen extends infer R ? R : never : T extends object ? SnapshotInOfObject extends infer R ? R : never : T;