UNPKG

json-joy

Version:

Collection of libraries for building collaborative editing apps.

24 lines (23 loc) 2.35 kB
import type { ExtensionId } from '../../json-crdt-extensions'; import type { MvalNode } from '../../json-crdt-extensions/mval/MvalNode'; import type { PeritextNode, QuillDeltaNode } from '../../json-crdt-extensions'; import type { nodes as builder } from '../../json-crdt-patch'; import type { ExtNode } from '../extensions/ExtNode'; import type * as nodes from '../nodes'; export type SchemaToJsonNode<S> = S extends builder.str<infer T> ? nodes.StrNode<T> : S extends builder.bin ? nodes.BinNode : S extends builder.con<infer T> ? nodes.ConNode<T> : S extends builder.val<infer T> ? nodes.ValNode<SchemaToJsonNode<T>> : S extends builder.vec<infer T> ? nodes.VecNode<{ [K in keyof T]: SchemaToJsonNode<T[K]>; }> : S extends builder.obj<infer T> ? nodes.ObjNode<{ [K in keyof T]: SchemaToJsonNode<T[K]>; }> : S extends builder.arr<infer T> ? nodes.ArrNode<SchemaToJsonNode<T>> : S extends builder.ext<ExtensionId.peritext, any> ? nodes.VecNode<ExtensionVecData<PeritextNode>> : S extends builder.ext<ExtensionId.quill, any> ? nodes.VecNode<ExtensionVecData<QuillDeltaNode>> : S extends builder.ext<ExtensionId.mval, any> ? nodes.VecNode<ExtensionVecData<MvalNode>> : nodes.JsonNode; export type ExtensionVecData<EDataNode extends ExtNode<any, any>> = { __BRAND__: 'ExtVecData'; } & [ header: nodes.ConNode<Uint8Array>, data: EDataNode ]; export type VecNodeExtensionData<N> = N extends nodes.VecNode<infer T> ? VecNodeExtensionData<T> : N extends ExtensionVecData<infer EDataNode> ? EDataNode : undefined; export type JsonNodeToSchema<N> = N extends nodes.StrNode<infer T> ? builder.str<T> : N extends nodes.BinNode ? builder.bin : N extends nodes.ConNode<infer T> ? builder.con<T> : N extends nodes.ValNode<infer T> ? builder.val<JsonNodeToSchema<T>> : N extends nodes.VecNode<infer T> ? T extends ExtensionVecData<infer EDataNode> ? EDataNode extends PeritextNode ? builder.ext<ExtensionId.peritext, any> : EDataNode extends QuillDeltaNode ? builder.ext<ExtensionId.quill, any> : EDataNode extends MvalNode ? builder.ext<ExtensionId.mval, any> : builder.ext<number, any> : builder.vec<{ [K in keyof T]: JsonNodeToSchema<T[K]>; }> : N extends nodes.ObjNode<infer T> ? builder.obj<{ [K in keyof T]: JsonNodeToSchema<T[K]>; }> : N extends nodes.ArrNode<infer T> ? builder.arr<JsonNodeToSchema<T>> : builder.con<undefined>;