import type { Frozen, frozenKey } from "../frozen/Frozen" import type { AnyModel } from "../model/BaseModel" import type { modelIdKey, modelTypeKey } from "../model/metadata" import type { ModelFromSnapshot, ModelToSnapshot } from "../modelShared/BaseModelShared" import type { ArraySet, ObjectMap } from "../wrappers" // this must be a type rather than an interface to ensure compatibility with index signatures // (e.g. PlainObject) export type FrozenData = { [frozenKey]: true data: D } // snapshot out // infer is there just to cache type generation 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 // snapshot in 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