pailingual-odata
Version:
TypeScript client for OData v4 services
197 lines (196 loc) • 13.9 kB
TypeScript
import * as metadata from "./metadata";
import { Options, ExtendOptions } from "./options";
import { CollectionSource } from "./collectionSource";
import { SingleSource } from "./singleSource";
import { Query } from "./query";
import * as serialization from "./serialization";
export { loadMetadata } from "./metadata";
export { metadata, serialization, Options, ExtendOptions, CollectionSource, SingleSource, Query };
export declare class Pailingual {
static use(plugin: {
register: () => ExtendOptions | void;
}): void;
static createApiContext<T extends IApiContextBase>(metadata: metadata.ApiMetadata, options?: Options): ApiContext<T>;
static createApiContext<T extends IApiContextBase>(apiRoot: string, options?: Options): Promise<ApiContext<T>>;
static loadMetadata(apiRoot: string, options?: Options, cache?: boolean): Promise<metadata.ApiMetadata>;
}
export default Pailingual;
/** @deprecated Use Palingual.createApiContext function */
export declare var ApiContextFactory: typeof Pailingual.createApiContext;
export interface IEntityBase extends IActionsSupport, IFunctionsSupport {
$$EntityBaseMarker: never;
$$EntitySetActions: {};
$$EntitySetFunctions: {};
}
export interface IComplexBase {
$$ComplexBaseMarker: never;
}
export interface IApiContextBase extends IActionsSupport, IFunctionsSupport {
}
declare type PrimitiveTypes = string | number | Date | boolean;
export declare type EntityArray<T extends IEntityBase> = Array<T>;
export declare type ComplexArray<T extends IComplexBase> = Array<T>;
declare type Unwrap<T> = T extends Array<infer A> ? A : T;
declare type Markers = keyof IEntityBase | keyof IComplexBase;
declare type Result<T, R = {}> = R extends Array<infer A> ? {} extends A ? Entity<T>[] : R : {} extends R ? Entity<T> & R : R;
export interface IExecutable<T, R = {}> {
$exec(opt?: Options): Promise<Result<T, R>>;
$url(opt?: Options & {
queryParams?: boolean;
}): string;
}
export interface IExecutableWithCount<T, R> extends IExecutable<T, R> {
$execWithCount(opt?: Options): Promise<{
count: number;
value: Result<T, R>;
}>;
$urlWithCount(opt?: Options): string;
}
export declare type Entity<T> = {
[P in (PrimitiveProps<T> | ComplexProps<T>) & RequiredProps<T>]: T[P] extends IComplexBase ? Entity<T[P]> : T[P];
} & {
[P in (PrimitiveProps<T> | ComplexProps<T>) & OptionalProps<T>]?: T[P] extends IComplexBase | undefined ? Entity<Exclude<T[P], undefined>> : T[P];
};
export declare type ApiContext<T extends IApiContextBase> = NavigationSource<T> & Actions<T> & Functions<T>;
export declare type EntitySet<T> = IEntitySetSource<T> & EntitySetActions<T> & EntitySetFunctions<T> & {
$byKey(key: PrimitiveTypes | Pick<Partial<T>, PrimitiveProps<T>>): Singleton<T>;
$cast<T2 extends T>(fullTypeName: string): EntitySet<T2>;
$insert(insert: InsertParameter<T>): IExecutable<T>;
$delete(key: PrimitiveTypes | Partial<Pick<T, PrimitiveProps<T>>>): IExecutable<void, void>;
$update(key: PrimitiveTypes | Partial<Pick<T, PrimitiveProps<T>>>, obj: UpdateParameter<T>): IExecutable<void, void>;
$patch(key: PrimitiveTypes | Partial<Pick<T, PrimitiveProps<T>>>, obj: PatchParameter<T>): IExecutable<void, void>;
};
export declare type Singleton<T> = {
$cast<T2 extends T>(fullTypeName: string): EntitySet<T2>;
} & ISingleEntitySource<T> & Actions<T> & Functions<T> & NavigationSource<T>;
declare type ExtractPropertyNames<T, U> = {
[P in keyof T]-?: T[P] extends U | undefined ? P extends Markers ? never : P : never;
}[keyof T];
/** List of primitive properties names*/
export declare type PrimitiveProps<T> = ExtractPropertyNames<T, PrimitiveTypes>;
/** List of complex properties names*/
export declare type ComplexProps<T> = ExtractPropertyNames<T, IComplexBase>;
/** List of navigation single-value properties names*/
export declare type NavigationEntityProps<T> = T extends IEntityBase | IApiContextBase ? ExtractPropertyNames<T, IEntityBase> : never;
/** List of navigation multiple-value properties names*/
export declare type NavigationSetProps<T> = T extends IEntityBase | IApiContextBase ? ExtractPropertyNames<T, IEntityBase[]> : never;
/** List of navigation properties names*/
export declare type NavigationProps<T> = NavigationEntityProps<T> | NavigationSetProps<T>;
/** List of all entity properties names*/
export declare type AllProps<T> = Exclude<keyof T, Markers>;
declare type OptionalProps<T> = {
[K in keyof T]-?: undefined extends T[K] ? K : never;
}[keyof T];
declare type RequiredProps<T> = {
[K in keyof T]-?: undefined extends T[K] ? never : K;
}[keyof T];
declare type NavigationSource<T> = {
[P in NavigationProps<T>]: T[P] extends EntityArray<infer E> | undefined ? EntitySet<E> : T[P] extends IEntityBase | undefined ? Singleton<Exclude<T[P], undefined>> : never;
};
export interface IEntitySetSource<T, R = {}> extends IEntitySetFunctionSourceBase<T>, IExecutableWithCount<T, R[]> {
$count(): IExecutable<number>;
$unsafeExpand(exp: string): this;
$expand<P extends NavigationProps<T>>(navProp: P): IEntitySetSource<T, R & ExpandedProperty<T, P>>;
$expand<P extends NavigationEntityProps<T>, E extends T[P], ER>(navProp: P, exp?: ExpandSingleExpression<E, ER>): IEntitySetSource<T, R & ExpandedProperty<T, P, ER>>;
$expand<P extends NavigationSetProps<T>, E extends T[P], ER>(navProp: P, exp: ExpandSetExpression<E, ER>): IEntitySetSource<T, R & ExpandedProperty<T, P, ER[]>>;
$select(): IExecutableWithCount<T, (Entity<T> & R)[]>;
$select<F extends PrimitiveProps<T> | ComplexProps<T> | (keyof R & keyof T)>(...props: F[]): IExecutableWithCount<T, (R & Pick<T, F>)[]>;
}
export interface ICastableEntitySetFunctionSource<T, R = {}> extends IEntitySetFunctionSource<T, R> {
$cast<T2 extends T>(fullTypeName: string): ICastableEntitySetFunctionSource<T2>;
}
export interface IEntitySetFunctionSource<T, R = {}> extends IEntitySetFunctionSourceBase<T>, IExecutableWithCount<T, R[]> {
$expand<P extends NavigationProps<T>>(navProp: P): IEntitySetFunctionSource<T, R & ExpandedProperty<T, P>>;
$expand<P extends NavigationEntityProps<T>, E extends T[P], ER>(navProp: P, exp?: ExpandSingleExpression<E, ER>): IEntitySetFunctionSource<T, R & ExpandedProperty<T, P, ER>>;
$expand<P extends NavigationSetProps<T>, E extends T[P], ER>(navProp: P, exp: ExpandSetExpression<E, ER>): IEntitySetFunctionSource<T, R & ExpandedProperty<T, P, ER[]>>;
$select(): IExecutableWithCount<T, Entity<T> & R>;
$select<F extends PrimitiveProps<T> | ComplexProps<T> | (keyof R & keyof T)>(...props: F[]): IExecutableWithCount<T, R & Pick<T, F>>;
}
export interface IEntitySetFunctionSourceBase<T> {
$filter(expression: string): this;
$orderBy(...key: (PrimitiveProps<T> | ((e: OrderbySource<T>) => PrimitiveTypes))[]): this;
$orderByDesc(...key: (PrimitiveProps<T> | ((e: OrderbySource<T>) => PrimitiveTypes))[]): this;
$skip(num: number): this;
$search(expr: string): this;
$top(num: number): this;
}
export interface IComplexSetFunctionSource<T, R = {}> extends IEntitySetFunctionSourceBase<T>, IExecutableWithCount<T, R[]> {
}
export interface ISingleEntitySource<T, R = {}> extends IExecutable<T, R> {
$unsafeExpand(exp: string): this;
$expand<P extends NavigationProps<T>>(navProp: P): ISingleEntitySource<T, R & ExpandedProperty<T, P>>;
$expand<P extends NavigationEntityProps<T>, E extends T[P], ER>(navProp: P, exp?: ExpandSingleExpression<E, ER>): ISingleEntitySource<T, R & ExpandedProperty<T, P, ER>>;
$expand<P extends NavigationSetProps<T>, E extends T[P], ER>(navProp: P, exp: ExpandSetExpression<E, ER>): ISingleEntitySource<T, R & ExpandedProperty<T, P, ER[]>>;
$select(): IExecutable<T, Entity<T> & R>;
$select<F extends PrimitiveProps<T> | ComplexProps<T> | (keyof R & keyof T)>(...props: F[]): IExecutable<T, R & Pick<T, F>>;
$delete(): IExecutable<void, void>;
$update(obj: UpdateParameter<T>): IExecutable<void, void>;
$patch(obj: PatchParameter<T>): IExecutable<void, void>;
}
export interface ISingleEntityFunctionSource<T, R = {}> extends IExecutable<T, R> {
$expand<P extends NavigationProps<T>>(navProp: P): ISingleEntityFunctionSource<T, R & ExpandedProperty<T, P>>;
$expand<P extends NavigationEntityProps<T>, E extends T[P], ER>(navProp: P, exp?: ExpandSingleExpression<E, ER>): ISingleEntityFunctionSource<T, R & ExpandedProperty<T, P, ER>>;
$expand<P extends NavigationSetProps<T>, E extends T[P], ER>(navProp: P, exp: ExpandSetExpression<E, ER>): ISingleEntityFunctionSource<T, R & ExpandedProperty<T, P, ER[]>>;
$select(): IExecutable<T, Entity<T> & R>;
$select<F extends PrimitiveProps<T> | ComplexProps<T> | (keyof R & keyof T)>(...props: F[]): IExecutable<T, R & Pick<T, F>>;
}
declare type ExpandedPropertyResult<T> = T extends Array<infer A> ? Entity<A>[] : Entity<T>;
/** Represent expanded property */
export declare type ExpandedProperty<T, P extends NavigationProps<T>, R = ExpandedPropertyResult<Exclude<T[P], undefined>>> = {
[K in P]: Result<Unwrap<Exclude<T[P], undefined>>, R>;
};
export declare type ExpandSingleExpression<T, R> = (e: IExpandebleEntity<Exclude<T, undefined>, {}>) => IExpandSelectResult<R> | IExpandebleEntity<Exclude<T, undefined>, R>;
export declare type ExpandSetExpression<T, R> = (e: IExpandebleSet<Unwrap<Exclude<T, undefined>>, {}>) => IExpandSelectResult<R> | IExpandebleSet<Unwrap<Exclude<T, undefined>>, R>;
/** Functions for expand expressions of navigation property return single entity*/
export interface IExpandebleEntity<T, R> {
$expand<P extends NavigationProps<T>>(navProp: P): IExpandebleEntity<T, R & ExpandedProperty<T, P>>;
$expand<P extends NavigationSetProps<T>, E extends T[P], ER>(navProp: P, exp: ExpandSingleExpression<E, ER>): IExpandebleEntity<T, R & ExpandedProperty<T, P, ER[]>>;
$expand<P extends NavigationEntityProps<T>, E extends T[P], ER>(navProp: P, exp?: ExpandSetExpression<E, ER>): IExpandebleEntity<T, R & ExpandedProperty<T, P, ER>>;
$select<F extends PrimitiveProps<T> | ComplexProps<T> | (keyof R & keyof T)>(...props: F[]): IExpandSelectResult<R & Pick<T, F>>;
}
/** Functions for expand expressions of navigation property return entity set*/
export interface IExpandebleSet<T, R> extends IEntitySetFunctionSourceBase<T> {
$expand<P extends NavigationProps<T>>(navProp: P): IExpandebleSet<T, R & ExpandedProperty<T, P>>;
$expand<P extends NavigationSetProps<T>, E extends T[P], ER>(navProp: P, exp: ExpandSingleExpression<E, ER>): IExpandebleSet<T, R & ExpandedProperty<T, P, ER[]>>;
$expand<P extends NavigationEntityProps<T>, E extends T[P], ER>(navProp: P, exp?: ExpandSetExpression<E, ER>): IExpandebleSet<T, R & ExpandedProperty<T, P, ER>>;
$select<F extends PrimitiveProps<T> | ComplexProps<T> | (keyof R & keyof T)>(...props: F[]): IExpandSelectResult<R & Pick<T, F>>;
}
interface IExpandSelectResult<R> {
interfaceMarker: never;
}
export declare type OrderbySource<T> = {
[P in PrimitiveProps<T> | ComplexProps<T> | NavigationEntityProps<T>]-?: T[P] extends IEntityBase ? OrderbySource<T[P]> : Exclude<T[P], undefined>;
};
export declare type InsertParameter<T> = {
[P in (PrimitiveProps<T> | ComplexProps<T>) & OptionalProps<T>]?: undefined extends T[P] ? T[P] extends IComplexBase | undefined ? InsertParameter<Exclude<T[P], undefined>> : T[P] : never;
} & {
[P in (PrimitiveProps<T> | ComplexProps<T>) & RequiredProps<T>]: undefined extends T[P] ? never : T[P] extends IComplexBase ? InsertParameter<T[P]> : T[P];
} & {
[P in NavigationProps<T>]?: T[P] extends EntityArray<infer U> ? Array<InsertParameter<U>> : T[P] extends IEntityBase | IComplexBase ? InsertParameter<T[P]> : never;
};
export declare type UpdateParameter<T> = InsertParameter<T>;
export declare type PatchParameter<T> = {
[P in PrimitiveProps<T> | ComplexProps<T>]?: T[P] extends EntityArray<infer U> ? Array<PatchParameter<U>> : T[P] extends IEntityBase | IComplexBase ? PatchParameter<T[P]> : T[P];
};
interface IActionsSupport {
$$Actions: {};
}
interface IFunctionsSupport {
$$Functions: {};
}
declare type EntitySetActions<T> = T extends IEntityBase ? {
[P in keyof T["$$EntitySetActions"]]: ActionDelegate<T["$$EntitySetActions"][P]>;
} : {};
declare type EntitySetFunctions<T> = T extends IEntityBase ? {
[P in keyof T["$$EntitySetFunctions"]]: FuncDelegate<T["$$EntitySetFunctions"][P]>;
} : {};
declare type Actions<T> = T extends IActionsSupport ? {
[P in keyof T["$$Actions"]]: ActionDelegate<T["$$Actions"][P]>;
} : {};
declare type Functions<T> = T extends IFunctionsSupport ? {
[P in keyof T["$$Functions"]]: FuncDelegate<T["$$Functions"][P]>;
} : {};
export declare type FuncRetType<T> = T extends PrimitiveTypes | PrimitiveTypes[] ? IExecutable<T, T> : T extends IComplexBase ? IExecutable<T, T> : T extends ComplexArray<infer U> ? IComplexSetFunctionSource<U> : T extends IEntityBase ? ISingleEntityFunctionSource<T> : T extends EntityArray<infer U> ? ICastableEntitySetFunctionSource<U> : never;
declare type FuncDelegate<T> = T extends () => (infer R) ? () => FuncRetType<R> : T extends (...a: infer A) => (infer R) ? (...a: A) => FuncRetType<R> : T;
export declare type ActionRetType<T> = T extends PrimitiveTypes | PrimitiveTypes[] ? IExecutable<T, T> : T extends IComplexBase ? IExecutable<T, T> : T extends ComplexArray<infer U> ? IExecutable<T, U[]> : T extends IEntityBase ? IExecutable<T, T> : T extends EntityArray<infer U> ? IExecutable<T, U[]> : IExecutable<T, void>;
declare type ActionDelegate<T> = T extends () => (infer R) ? () => ActionRetType<R> : T extends (...a: infer A) => (infer R) ? (...a: A) => ActionRetType<R> : T;