balena-sdk
Version:
The Balena JavaScript SDK
69 lines (68 loc) • 5.55 kB
TypeScript
import * as errors from 'balena-errors';
import type { Expand, Filter, ODataOptionsWithoutCount, Resource, ResourceExpand } from 'pinejs-client-core';
import type { StringKeyof } from '../../typings/utils';
export interface BalenaUtils {
mergePineOptions: typeof mergePineOptions;
}
export declare const notImplemented: () => never;
export declare const onlyIf: (condition: boolean) => <T extends (...args: any[]) => any>(fn: T) => (() => never) | T;
export declare const isId: (v?: unknown) => v is number;
export declare const isFullUuid: (v?: unknown) => v is string & {
length: 32 | 62;
};
export declare const withSupervisorLockedError: <T>(fn: () => Promise<T>) => Promise<T>;
export declare const isUnauthorizedResponse: (err: Error) => err is errors.BalenaRequestError;
export declare const isNotFoundResponse: (err: Error) => err is errors.BalenaRequestError;
export type AsArray<T> = T extends string ? [T] : T extends readonly string[] ? T : [];
export type Concat<A extends readonly unknown[], B extends readonly unknown[]> = [...A, ...B];
export type OverrideProp<D, E, K> = K extends keyof E ? E[K] : K extends keyof D ? D[K] : undefined;
export type ExtraKeys = '$select' | '$orderby' | '$skip' | '$top' | '$filter' | '$expand';
export type MergeSelect<R extends Resource['Read'], TDefault extends Readonly<ODataOptionsWithoutCount<R>>, TExtra extends Readonly<ODataOptionsWithoutCount<R>>> = TExtra extends {
$select: infer ESelect;
} ? ESelect extends StringKeyof<R> | ReadonlyArray<StringKeyof<R>> ? TDefault extends {
$select: infer DSelect;
} ? DSelect extends StringKeyof<R> | ReadonlyArray<StringKeyof<R>> ? Concat<AsArray<DSelect>, AsArray<ESelect>> : AsArray<ESelect> : AsArray<ESelect> : never : TDefault extends {
$select: infer DSelect;
} ? DSelect extends StringKeyof<R> | ReadonlyArray<StringKeyof<R>> ? AsArray<DSelect> : undefined : undefined;
export type MergeFilter<R extends Resource['Read'], TDefault extends Readonly<ODataOptionsWithoutCount<R>>, TExtra extends Readonly<ODataOptionsWithoutCount<R>>> = TExtra extends {
$filter: infer EFilter;
} ? EFilter extends Filter<R> ? TDefault extends {
$filter: infer DFilter;
} ? DFilter extends Filter<R> ? {
$and: [DFilter, EFilter];
} : EFilter : EFilter : never : TDefault extends {
$filter: infer DFilter;
} ? DFilter extends Filter<R> ? DFilter : undefined : undefined;
export type ToResourceExpand<R extends Resource['Read'], E extends Expand<R>> = E extends ResourceExpand<R> ? E : E extends Array<StringKeyof<R>> | ReadonlyArray<StringKeyof<R>> ? {
[K in E[number]]: {};
} : E extends Array<ResourceExpand<R>> ? E[number] : never;
export type EnsureODataOptionsWithoutCount<R extends Resource['Read'], T> = T extends Readonly<ODataOptionsWithoutCount<R>> ? T : never;
export type ExtractNavigationResource<R, K extends keyof R> = R[K] extends Array<infer U> ? U extends Resource['Read'] ? U : never : never;
export type SafeMergePineOptions<R extends Resource['Read'], DExpand, EExpand> = MergePineOptions<R, EnsureODataOptionsWithoutCount<R, DExpand>, EnsureODataOptionsWithoutCount<R, EExpand>>;
export type MergeExpandedOptions<R extends Resource['Read'], _DExpand extends Expand<R>, _EExpand extends Expand<R>, DExpand extends ToResourceExpand<R, _DExpand> = ToResourceExpand<R, _DExpand>, EExpand extends ToResourceExpand<R, _EExpand> = ToResourceExpand<R, _EExpand>, AllKeys extends StringKeyof<DExpand> | StringKeyof<EExpand> = StringKeyof<DExpand> | StringKeyof<EExpand>> = {
[K in AllKeys]: K extends StringKeyof<DExpand> ? K extends StringKeyof<EExpand> ? SafeMergePineOptions<ExtractNavigationResource<R, K>, DExpand[K], EExpand[K]> : DExpand[K] : K extends StringKeyof<EExpand> ? EExpand[K] : undefined;
};
export type MergeExpand<R extends Resource['Read'], TDefault extends Readonly<ODataOptionsWithoutCount<R>>, TExtra extends Readonly<ODataOptionsWithoutCount<R>>> = TExtra extends {
$expand: infer EExpand;
} ? EExpand extends Expand<R> ? TDefault extends {
$expand: infer DExpand;
} ? DExpand extends Expand<R> ? MergeExpandedOptions<R, DExpand, EExpand> : EExpand : EExpand : never : TDefault extends {
$expand: infer DExpand;
} ? DExpand extends Expand<R> ? DExpand : undefined : undefined;
export type AliasResourceRead = {
[key: string]: any;
};
export type MergePineOptions<R extends AliasResourceRead, TDefault extends Readonly<ODataOptionsWithoutCount<R>>, TExtra extends Readonly<ODataOptionsWithoutCount<R>>> = {
[K in Extract<keyof TDefault | keyof TExtra, ExtraKeys>]: K extends '$select' ? MergeSelect<R, TDefault, TExtra> : K extends '$top' | '$skip' | '$orderby' ? OverrideProp<TDefault, TExtra, K> : K extends '$filter' ? MergeFilter<R, TDefault, TExtra> : K extends '$expand' ? MergeExpand<R, TDefault, TExtra> : never;
};
export declare function mergePineOptions<R extends AliasResourceRead, TDefault extends Readonly<ODataOptionsWithoutCount<R>>, TExtra extends Readonly<ODataOptionsWithoutCount<R>>>(defaults: TDefault, extras?: TExtra): MergePineOptions<R, TDefault, TExtra>;
/**
* Useful when you want to avoid having to manually parse the key
* or when need order guarantees while iterating the keys.
* @private
*/
export declare const groupByMap: <K, V>(entries: V[], iteratee: (item: V) => K) => Map<K, V[]>;
export declare function delay(ms: number): Promise<void>;
export declare const limitedMap: <T, U>(arr: T[], fn: (currentValue: T, index: number, array: T[]) => Promise<U>, { concurrency, }?: {
concurrency?: number;
}) => Promise<U[]>;