UNPKG

schemind

Version:

Read and write to messages serialized as arrays (indexed keys) by defining a schema, enabling smaller message size when using protocols such as msgpack or JSON.

66 lines (43 loc) 3.16 kB
import { NonNegativeInteger } from 'type-fest'; export declare function buildSchema<TSchema extends IndexedKeysMessageSchema<TSchemaInner>, TSchemaInner>(schema: TSchema): ToValidIndexedKeysMessageSchema<TSchema>; declare const fieldType: unique symbol; export declare function get<const TField>(message: readonly unknown[], schemaField: ValidSchemaLeaf<TField>): TField; declare type IndexedKeysMessageSchema<TSchema> = { [K in keyof TSchema]: TSchema[K] extends SchemaLeaf<infer TField> ? SchemaLeaf<TField> : IndexedKeysMessageSchema<TSchema[K]>; }; declare type IndexesPath = number[]; declare const indexesPathReversed: unique symbol; declare type Invalid<T extends string> = { [invalid]: T; }; declare const invalid: unique symbol; export declare class InvalidSchemaError extends Error { constructor(); } declare const isSchemaLeafTag: unique symbol; declare const isValidSchemaLeafTag: unique symbol; declare type PlainObjectOfSchema<TSchema> = TSchema extends ValidIndexedKeysMessageSchema<unknown> ? { [K in keyof TSchema]: TSchema[K] extends ValidSchemaLeaf<infer TField> ? TField : TSchema[K] extends SchemaLeaf<unknown> ? Invalid<"Schema needs to be validated before you use it!"> : PlainObjectOfSchema<TSchema[K]>; } : never; declare type ReturnedSchemaNode<TField, TNestedSchema> = TNestedSchema extends undefined ? SchemaLeaf<TField> : TNestedSchema; declare type SchemaLeaf<TField> = { [indexesPathReversed]: IndexesPath; [fieldType]: TField; [isSchemaLeafTag]: true; }; export declare function set<const TField>(targetMessage: unknown[], schemaField: ValidSchemaLeaf<TField>, value: TField): void; export declare function toIndexedKeysMessage<TSchema extends ValidIndexedKeysMessageSchema<TSchemaInner>, TSchemaInner>(plainObject: PlainObjectOfSchema<TSchema>, schema: TSchema): unknown[]; export declare function toPlainObject<TSchema extends ValidIndexedKeysMessageSchema<TSchemaInner>, TSchemaInner>(message: readonly unknown[], schema: TSchema): PlainObjectOfSchema<TSchema>; declare type ToValidIndexedKeysMessageSchema<TSchema> = { [K in keyof TSchema]: TSchema[K] extends SchemaLeaf<infer TField> ? ValidSchemaLeaf<TField> : ToValidIndexedKeysMessageSchema<TSchema[K]>; }; export declare type ValidIndexedKeysMessageSchema<TSchema> = { [K in keyof TSchema]: TSchema[K] extends ValidSchemaLeaf<infer TField> ? ValidSchemaLeaf<TField> : TSchema[K] extends SchemaLeaf<unknown> ? Invalid<"Schema needs to be built before you use it, did you forget to call buildSchema()?"> : ToValidIndexedKeysMessageSchema<TSchema[K]>; }; declare type ValidSchemaLeaf<TField> = SchemaLeaf<TField> & { [isValidSchemaLeafTag]: true; get: (message: unknown[]) => TField; set: (message: unknown[], value: TField) => void; }; export declare function withIndex<const TIndex extends number>(index: NonNegativeInteger<TIndex>): <const TField = undefined, TNestedSchema extends IndexedKeysMessageSchema<TNestedSchema> | undefined = undefined>(nestedSchema?: TNestedSchema) => ReturnedSchemaNode<TField, TNestedSchema>; export { }