/**
 * `helpers.ts`
 * - helper functions used globally in project
 *
 *
 * @author      Steve Jung <steve@lemoncloud.io>
 * @date        2020-12-22 initial version
 * @date        2021-12-21 protocol support `//self` url.
 * @date        2021-12-23 optimize types of $protocol.
 * @date        2022-03-17 addition text processing. (S2, P)
 *
 * @copyright (C) 2021 LemonCloud Co Ltd. - All Rights Reserved.
 */
import { APIHeaders, ApiHttpProxy, NextContext } from '../cores/';
import { SimpleSet } from '../cores/';
import { sigV4ClientConfig } from '../extended/libs/sig-v4';
/**
 * Helpers to transform data-types.
 */
export declare const $T: {
    /**
     * transform to string w/ trim()
     */
    S: (val: any, def?: string) => string;
    /**
     * as string w/o white-space.
     */
    S2: (val: any, def?: string, delim?: string) => string;
    /**
     * transform to string[]
     */
    SS: (val: any, def?: string[]) => string[];
    /**
     * text to Plain text (remove html tag)
     */
    P: (text: string, max?: number) => string;
    /**
     * transform to number(integer).
     */
    N: (val: any, def?: number) => number;
    /**
     * number array
     */
    NN: (val: any, def?: number[]) => number[];
    /**
     * transform to number(float)
     */
    F: (val: any, def?: number) => number;
    /**
     * transform to number(float)[]
     */
    FF: (val: any, def?: number[]) => number[];
    /**
     * float w/ fixed len=3
     */
    F3: (n: number, e?: number) => number;
    /**
     * transform to boolean.
     */
    B: (val: any, def?: 0 | 1) => 0 | 1;
    /**
     * transform to Time number via string | number.
     */
    T: (val: any, def?: number) => number;
    /**
     * transform to Date formatted string
     */
    D: (val: any, def?: string) => string;
    /**
     * date-time format
     */
    DT: (val: any, def?: string) => string;
    /**
     * Extract Text
     */
    EX: (data: string, txt1: string, txt2: string) => string;
    /**
     * transform to simple-set.
     * @param val json object.
     */
    simples: (val: any, throws?: boolean) => SimpleSet;
    /**
     * catch string between txt1 and txt2
     * @param data string
     * @param txt1 head
     * @param txt2 tail
     */
    catch: (data: any, txt1: string, txt2: string) => any;
    /**
     * merge simple-set from $org to $new
     * @param $org the origin set
     * @param $new the update set.
     */
    merge: ($org: SimpleSet, $new: SimpleSet) => SimpleSet;
    /**
     * replace message with template.
     */
    template: (msg: string, set: {
        [key: string]: string | number;
    }) => string;
    /**
     * make random-code by length
     * @param size   length of code
     * @param rand  flag to use random (0 => 0, 1 => max)
     */
    makeRandomCode: (size?: number, rand?: boolean | number) => {
        val: number;
        min: number;
        max: number;
    };
    /**
     * 객체 정규화 시킴.
     * - null 에 대해서는 특별히 처리.
     */
    normal: <T = object>(N: T) => T;
    /**
     * transform list to map by `id`
     */
    asMap: <T_1>(list: T_1[], id?: string) => {
        [key: string]: T_1;
    };
    /**
     * compare object, and extract the only diff properties.
     */
    diff: <T_2 = any>(A: T_2, B: T_2, onlyValid?: boolean) => T_2;
    /**
     * get $perf instance.
     * ```ts
     * const p = $T.perf()
     * ...
     * const took = p.took(); // elapsed time in seconds
     */
    perf: () => {
        /** the initial timestamp (msec) */
        readonly t0: number;
        /** get elapsed time (sec) */
        took: () => number;
    };
    /**
     * parse `.meta` property as object.
     * @param meta any
     */
    parseMeta: <T_3 extends {
        [key: string]: any;
        type?: string;
        value?: any;
        error?: string;
        list?: any[];
    }>(meta: any) => T_3;
    /**
     * clear the undefined properties from the cloned object.
     * - applied only to 1st depth.
     *
     * @param N object
     * @param $def default if not valid object.
     * @returns cloned object
     */
    onlyDefined: <T_4 extends object>(N: T_4, $def?: T_4) => T_4;
};
/**
 * random number generator
 */
export declare const $rand: {
    /**
     * list of number[] in n-size.
     */
    range: (n: number) => number[];
    /**
     * generate random number
     */
    float: (from: number, to: number) => number;
    /**
     * generate multiple float numbers
     */
    floats: (from: number, to: number, n: number) => number[];
    /**
     * generate an integer
     */
    integer: (from: number, to: number) => number;
    /**
     * generate multiple integers
     */
    integers: (from: number, to: number, n: number) => number[];
};
/**
 * builder to support protocol-service.
 * @param context   the current context (or service name).
 * @param service   service name
 * @param options   additional options.
 */
export declare const $protocol: (context?: NextContext | string, service?: string, options?: {
    param?: any;
    body?: any;
    isProd?: boolean;
}) => {
    hello: () => string;
    asTargetUrl: () => string;
    execute: <T = any>(param?: any, body?: any, mode?: string) => Promise<T>;
    enqueue: <T_1 = any>(param?: any, body?: any, mode?: string, callback?: string, delaySeconds?: number) => Promise<string>;
    notify: (param?: any, body?: any, mode?: string, callback?: string) => Promise<string>;
};
/**
 * get the current config info
 */
export declare const $info: () => {
    service: string;
    version: string;
    stage: import("../cores/core-services").STAGE;
};
/**
 * send message to slack/public
 *
 * @param title 헤터 타이틀
 * @param text object or 텍스트 내용
 * @param pretext (optional) 텍스트 미리보기용.
 * @param params (optional) customize more options.
 */
export declare const $slack: (title?: string, text?: string | object, pretext?: string, params?: {
    channel?: string;
    color?: string;
    scope?: string;
    fields?: {
        title: string;
        value: string;
        short?: boolean;
    }[];
    footer?: string;
    context?: NextContext;
    ts?: number;
}) => Promise<string>;
/**
 * event producer builder
 * @param context   current context
 * @param defEndpoint (optional) the default endpoint.
 */
export declare const $event: (context: NextContext, defEndpoint?: string) => {
    publish: (body: {
        [key: string]: any;
    }) => Promise<string>;
};
/**
 * authentication helper - get identity-id from context
 * @param context the current context
 */
export declare function getIdentityId(context?: NextContext | null): string | undefined;
/**
 * authentication helper - check user is authorized
 * - 이 메서드는 AWS IAM 인증 여부만을 확인한다.
 * - 따라서 true를 반환한다고 하여 회원 가입이 되어있다는 의미는 아니다.
 *
 * @param context the current context
 * @params params (optional) to override `identity` when running local.
 */
export declare function isUserAuthorized(context: NextContext, params?: any): boolean;
/**
 * parse range expression
 * @param exp   range expression (e.g. '[63100 TO 224000]' or '[* TO 150000}')
 */
export declare function parseRange(exp: string): any;
/**
 * customized of `do_parallel` for safe error-handling.
 * - use `.error` to report the internal error.
 *
 * @param list list of model.
 * @param func callback to process of each
 * @param params (optional) size of parallel (default 10) or options. (for comparibility with `do_parallel()`)
 */
export declare const my_parallel: <T extends {
    id?: string;
    error?: string | null;
}, U extends {
    id?: string;
    error?: string | null;
}>(list: T[], func: (item: T, index: number) => Promise<U>, params?: number | {
    /** size of parallel execution (default 10) */
    size?: number;
    /** throw error if any item fails (default: false) */
    throwable?: boolean;
    /** error scope for context tracking */
    errScope?: string;
    /** report to slack when completed (default: false) - TODO */
    reportSlack?: boolean;
    /** context for slack reporting */
    context?: NextContext;
}) => Promise<U[]>;
/**
 * alias of `my_parallel`
 * - compatibility for typo in previous version.
 */
export declare const my_parrallel: <T extends {
    id?: string;
    error?: string | null;
}, U extends {
    id?: string;
    error?: string | null;
}>(list: T[], func: (item: T, index: number) => Promise<U>, params?: number | {
    /** size of parallel execution (default 10) */
    size?: number;
    /** throw error if any item fails (default: false) */
    throwable?: boolean;
    /** error scope for context tracking */
    errScope?: string;
    /** report to slack when completed (default: false) - TODO */
    reportSlack?: boolean;
    /** context for slack reporting */
    context?: NextContext;
}) => Promise<U[]>;
/**
 * run in sequence order
 * - same as `my_parallel(list, func, 1)`;
 *
 * 주의) 내부 error를 throw 하지 않으니, list 를 전부 처리할때까지 안끝남.
 *
 * @param list list of model.
 * @param func callback to process of each
 */
export declare const my_sequence: <T extends {
    id?: string;
    error?: string | null;
}, U = T>(list: T[], func: (item: T, index?: number) => Promise<U>) => Promise<U[]>;
/**
 * create api-http-proxy with sig-v4 agent, which using endpoint as proxy server.
 *
 * # as cases.
 * as proxy agent: GET <endpoint>/<host?>/<path?>
 * as direct agent: GET <endpoint>/<id?>/<cmd?>
 *
 * @param name              client-name
 * @param endpoint          service url (or backbone proxy-url)
 * @param sigConfig         sig-v4 client-config
 * @param options           optional parameters
 */
export declare const createSigV4Proxy: (name: string, endpoint: string, sigConfig?: sigV4ClientConfig, options?: {
    /** headers */
    headers?: APIHeaders;
    /** path encoder (default encodeURIComponent) */
    encoder?: (name: string, path: string) => string;
    /** relay-key in headers for proxy. */
    relayHeaderKey?: string;
    /** resultKey in response */
    resultKey?: string;
    /** flag to print log (default false) */
    verbose?: boolean;
}) => ApiHttpProxy;
