molstar
Version:
A comprehensive macromolecular library.
75 lines (74 loc) • 4.69 kB
TypeScript
/**
* Copyright (c) 2023-2024 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Adam Midlik <midlik@gmail.com>
* @author David Sehnal <david.sehnal@gmail.com>
*/
import { Field, OptionalField, RequiredField, ValueFor } from './field-schema';
type Fields = {
[key in string]: Field;
};
/** Type of `ParamsSchema` where all fields are completely independent */
export interface SimpleParamsSchema<TFields extends Fields = Fields> {
type: 'simple';
/** Parameter fields */
fields: TFields;
}
export declare function SimpleParamsSchema<TFields extends Fields>(fields: TFields): SimpleParamsSchema<TFields>;
type ValuesForFields<F extends Fields> = {
[key in keyof F as (F[key] extends RequiredField<any> ? key : never)]: ValueFor<F[key]>;
} & {
[key in keyof F as (F[key] extends OptionalField<any> ? key : never)]?: ValueFor<F[key]>;
};
type ValuesForSimpleParamsSchema<TSchema extends SimpleParamsSchema> = ValuesForFields<TSchema['fields']>;
type AllRequiredFields<F extends Fields> = {
[key in keyof F]: F[key] extends Field<infer V> ? RequiredField<V> : never;
};
type AllRequiredSimple<TSchema extends SimpleParamsSchema> = SimpleParamsSchema<AllRequiredFields<TSchema['fields']>>;
type Cases = {
[case_ in string]: SimpleParamsSchema;
};
/** Type of `ParamsSchema` where one field (discriminator) determines what other fields are allowed (i.e. discriminated union type) */
export interface UnionParamsSchema<TDiscriminator extends string = string, TCases extends Cases = Cases> {
type: 'union';
/** Name of parameter field that determines the rest (allowed values are defined by keys of `cases`) */
discriminator: TDiscriminator;
/** Description for the discriminator parameter field */
discriminatorDescription: string;
/** `ParamsSchema` for the rest, for each case of discriminator value */
cases: TCases;
}
export declare function UnionParamsSchema<TDiscriminator extends string, TCases extends Cases>(discriminator: TDiscriminator, discriminatorDescription: string, cases: TCases): UnionParamsSchema<TDiscriminator, TCases>;
type ValuesForUnionParamsSchema<TSchema extends UnionParamsSchema, TCase extends keyof TSchema['cases'] = keyof TSchema['cases']> = TCase extends keyof TSchema['cases'] ? {
[discriminator in TSchema['discriminator']]: TCase;
} & ValuesFor<TSchema['cases'][TCase]> : never;
type AllRequiredUnion<TSchema extends UnionParamsSchema> = UnionParamsSchema<TSchema['discriminator'], {
[case_ in keyof TSchema['cases']]: AllRequired<TSchema['cases'][case_]>;
}>;
/** Schema for "params", i.e. a flat collection of key-value pairs */
export type ParamsSchema = SimpleParamsSchema | UnionParamsSchema;
/** Type of values for a params schema (optional fields can be missing) */
export type ValuesFor<P extends ParamsSchema> = P extends SimpleParamsSchema ? ValuesForSimpleParamsSchema<P> : P extends UnionParamsSchema ? ValuesForUnionParamsSchema<P> : never;
/** Variation of a params schema where all fields are required */
export type AllRequired<P extends ParamsSchema> = P extends SimpleParamsSchema ? AllRequiredSimple<P> : P extends UnionParamsSchema ? AllRequiredUnion<P> : never;
declare function AllRequiredSimple<TSchema extends SimpleParamsSchema>(schema: TSchema): AllRequired<TSchema>;
declare function AllRequiredUnion<TSchema extends UnionParamsSchema>(schema: TSchema): AllRequired<TSchema>;
export declare function AllRequired<TSchema extends ParamsSchema>(schema: TSchema): AllRequired<TSchema>;
/** Type of full values for a params schema, i.e. including all optional fields */
export type FullValuesFor<P extends ParamsSchema> = ValuesFor<AllRequired<P>>;
interface ValidationOptions {
/** Check that all parameters (including optional) have a value provided. */
requireAll?: boolean;
/** Check there are extra parameters other that those defined in the schema. */
noExtra?: boolean;
}
/** Return `undefined` if `values` contains correct value types for `schema`,
* return description of validation issues, if `values` have wrong type.
* If `options.requireAll`, all parameters (including optional) must have a value provided.
* If `options.noExtra` is true, presence of any extra parameters is treated as an issue. */
export declare function paramsValidationIssues<P extends ParamsSchema>(schema: P, values: {
[k: string]: any;
}, options?: ValidationOptions): string[] | undefined;
/** Add default parameter values to `values` based on a parameter schema (only for optional parameters) */
export declare function addParamDefaults<P extends ParamsSchema>(schema: P, values: ValuesFor<P>): FullValuesFor<P>;
export {};