UNPKG

balena-sdk

Version:
69 lines (68 loc) • 5.55 kB
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[]>;