json-joy
Version:
Collection of libraries for building collaborative editing apps.
24 lines (23 loc) • 2.35 kB
TypeScript
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>;