import { DataTypes, IdType } from "./DataTypes";
import { ParsedPath } from "./types/ParsedPath";
declare global {
    interface String {
        /**
         * Add parameter to URL
         * @param this URL to add parameter
         * @param name Parameter name
         * @param value Parameter value
         * @param arrayFormat Array format to array style or not to multiple fields
         * @returns New URL
         */
        addUrlParam(this: string, name: string, value: DataTypes.Simple, arrayFormat?: boolean | string): string;
        /**
         * Add parameters to URL
         * @param this URL to add parameters
         * @param data Parameters
         * @param arrayFormat Array format to array style or not to multiple fields
         * @returns New URL
         */
        addUrlParams(this: string, data: DataTypes.SimpleObject, arrayFormat?: boolean | string): string;
        /**
         * Add parameters to URL
         * @param this URL to add parameters
         * @param params Parameters string
         * @returns New URL
         */
        addUrlParams(this: string, params: string): string;
        /**
         * Check the input string contains Chinese character or not
         * @param this Input
         * @param test Test string
         */
        containChinese(this: string): boolean;
        /**
         * Check the input string contains Korean character or not
         * @param this Input
         * @param test Test string
         */
        containKorean(this: string): boolean;
        /**
         * Check the input string contains Japanese character or not
         * @param this Input
         * @param test Test string
         */
        containJapanese(this: string): boolean;
        /**
         * Format string with parameters
         * @param this Input template
         * @param parameters Parameters to fill the template
         */
        format(this: string, ...parameters: string[]): string;
        /**
         * Format inital character to lower case or upper case
         * @param this Input string
         * @param upperCase To upper case or lower case
         */
        formatInitial(this: string, upperCase: boolean): string;
        /**
         * Hide data
         * @param this Input string
         * @param endChar End char
         */
        hideData(this: string, endChar?: string): string;
        /**
         * Hide email data
         * @param this Input email
         */
        hideEmail(this: string): string;
        /**
         * Is digits string
         * @param this Input string
         * @param minLength Minimum length
         */
        isDigits(this: string, minLength?: number): boolean;
        /**
         * Is email string
         * @param this Input string
         */
        isEmail(this: string): boolean;
        /**
         * Remove non letters (0-9, a-z, A-Z)
         * @param this Input string
         */
        removeNonLetters(this: string): string;
    }
}
/**
 * Utilities
 */
export declare namespace Utils {
    const IgnoredProperties: readonly ["changedFields", "id"];
    /**
     * Add blank item to collection
     * @param options Options
     * @param idField Id field, default is id
     * @param labelField Label field, default is label
     * @param blankLabel Blank label, default is ---
     */
    export function addBlankItem<T extends object>(options: T[], idField?: string | keyof T, labelField?: unknown, blankLabel?: string): T[];
    /**
     * Base64 chars to number
     * @param base64Chars Base64 chars
     * @returns Number
     */
    export function charsToNumber(base64Chars: string): number;
    /**
     * Get common prefix from two strings with start index
     * 获取两个字符串从指定起始位置的公共前缀
     * @param a Input string a
     * @param b Input string b
     * @param start Start index to check
     * @returns Result
     */
    export function commonPrefixFrom(a: string, b: string, start?: number): string;
    /**
     * Correct object's property value type
     * @param input Input object
     * @param fields Fields to correct
     */
    export function correctTypes<T extends object, F extends {
        [P in keyof T]?: DataTypes.BasicNames;
    }>(input: T, fields: F): void;
    /**
     * Exclude specific items
     * @param items Items
     * @param field Filter field
     * @param excludedValues Excluded values
     * @returns Result
     */
    export function exclude<T extends {
        [P in D]: IdType;
    }, D extends string = "id">(items: T[], field: D, ...excludedValues: T[D][]): T[];
    /**
     * Async exclude specific items
     * @param items Items
     * @param field Filter field
     * @param excludedValues Excluded values
     * @returns Result
     */
    export function excludeAsync<T extends {
        [P in D]: IdType;
    }, D extends string = "id">(items: Promise<T[] | undefined>, field: D, ...excludedValues: T[D][]): Promise<T[] | undefined>;
    /**
     * Format name
     * @param name Input name
     * @param maxChars Max chars
     * @param maxParts Max parts (optional)
     * @returns Formatted name
     */
    export function formatName(name: string, maxChars: number, maxParts?: number): string;
    /**
     * Format inital character to lower case or upper case
     * @param input Input string
     * @param upperCase To upper case or lower case
     */
    export function formatInitial(input: string, upperCase?: boolean): string;
    /**
     * Format string with parameters
     * @param template Template with {0}, {1}, ...
     * @param parameters Parameters to fill the template
     * @returns Result
     */
    export function formatString(template: string, ...parameters: string[]): string;
    /**
     * Get data changed fields (ignored changedFields) with input data updated
     * @param input Input data
     * @param initData Initial data
     * @param ignoreFields Ignore fields, default is ['changedFields', 'id']
     * @returns
     */
    export function getDataChanges<T extends object, const I extends (keyof T & string)[] | undefined = undefined>(input: T, initData: object, ignoreFields?: I): Exclude<keyof T & string, I extends undefined ? (typeof IgnoredProperties)[number] : Exclude<I, undefined>[number]>[];
    /**
     * Get longest common substring (dynamic programming instead of recursion)
     * 获取最长公共子串 (动态编程而不是递归)
     * @param s1 First string
     * @param s2 Second string
     * @returns Result - the longest common substring
     */
    export function getLCS(s1: string, s2: string): string;
    /**
     * Get nested value from object
     * @param data Data
     * @param name Field name, support property chain like 'jsonData.logSize'
     * @returns Result
     */
    export function getNestedValue(data: object, name: string): any;
    /**
     * Get input function or value result
     * @param input Input function or value
     * @param args Arguments
     * @returns Result
     */
    export const getResult: <R, T = DataTypes.Func<R> | R>(input: T, ...args: T extends DataTypes.Func<R> ? Parameters<typeof input> : never | []) => R;
    /**
     * Get same parts (dynamic programming instead of recursion)
     * 获取相同部分 (动态编程而不是递归)
     * @param s1 First string
     * @param s2 Second string
     * @param minChars Minimum characters to consider a part (default: 1)
     * @returns Array of common substrings
     */
    export function getSameParts(s1: string, s2: string, minChars?: number): string[];
    /**
     * Get time zone
     * @param tz Default timezone, default is UTC
     * @returns Timezone
     */
    export const getTimeZone: (tz?: string) => string;
    /**
     * Check the input string contains HTML entity or not
     * @param input Input string
     * @returns Result
     */
    export function hasHtmlEntity(input: string): boolean;
    /**
     * Check the input string contains HTML tag or not
     * @param input Input string
     * @returns Result
     */
    export function hasHtmlTag(input: string): boolean;
    /**
     * Is digits string
     * @param input Input string
     * @param minLength Minimum length
     * @returns Result
     */
    export const isDigits: (input?: string, minLength?: number) => boolean;
    /**
     * Is email string
     * @param input Input string
     * @returns Result
     */
    export const isEmail: (input?: string) => boolean;
    /**
     * Check if the input object is empty or not, ignore null, undefined or specified fields
     * @param input Input object
     * @param ignoreFields Ignored fields for the check
     * @returns Result
     */
    export const isEmptyObject: (input: Record<string, unknown> | null | undefined, ignoreFields?: string[]) => boolean;
    /**
     * Join items as a string
     * @param items Items
     * @param joinPart Join string
     */
    export const joinItems: (items: (string | undefined)[], joinPart?: string) => string;
    /**
     * Merge class names
     * @param classNames Class names
     */
    export const mergeClasses: (...classNames: (string | undefined)[]) => string;
    /**
     * Create a GUID
     */
    export function newGUID(): string;
    /**
     * Number to base64 chars
     * @param num Input number
     * @returns Result
     */
    export function numberToChars(num: number): string;
    /**
     * Test two objects are equal or not
     * @param obj1 Object 1
     * @param obj2 Object 2
     * @param ignoreFields Ignored fields
     * @param isStrict Strict or not, false: loose equal, undefined === but null equal undefined, NaN equal NaN, true: strict equal
     * @returns Result
     */
    export function objectEqual(obj1: object, obj2: object, ignoreFields?: string[], isStrict?: boolean): boolean;
    /**
     * Get two object's unqiue properties
     * @param obj1 Object 1
     * @param obj2 Object 2
     * @param ignoreFields Ignored fields
     * @returns Unique properties
     */
    export function objectKeys(obj1: object, obj2: object, ignoreFields?: string[]): Set<string>;
    /**
     * Get the new object's updated fields contrast to the previous object
     * @param objNew New object
     * @param objPre Previous object
     * @param ignoreFields Ignored fields
     * @param isStrict Strict or not, false: loose equal, undefined === but null equal undefined, NaN equal NaN, true: strict equal
     * @returns Updated fields
     */
    export function objectUpdated(objNew: object, objPrev: object, ignoreFields?: string[], isStrict?: boolean): string[];
    /**
     * Try to parse JSON input to array
     * @param input JSON input
     * @param checkValue Type check value
     * @returns Result
     */
    export function parseJsonArray<T>(input: string, checkValue?: T): T[] | undefined;
    /**
     * Parse string (JSON) to specific type, no type conversion
     * For type conversion, please use DataTypes.convert
     * @param input Input string
     * @returns Parsed value
     */
    export function parseString<T>(input: string | undefined | null): T | undefined;
    /**
     * Parse string (JSON) to specific type, no type conversion
     * For type conversion, please use DataTypes.convert
     * @param input Input string
     * @param defaultValue Default value
     * @returns Parsed value
     */
    export function parseString<T>(input: string | undefined | null, defaultValue: T): T;
    /**
     * Remove empty values (null, undefined, '') from the input object
     * @param input Input object
     */
    export function removeEmptyValues(input: object): void;
    /**
     * Remove non letters
     * @param input Input string
     * @returns Result
     */
    export const removeNonLetters: (input?: string) => string | undefined;
    /**
     * Replace null or empty with default value
     * @param input Input string
     * @param defaultValue Default value
     * @returns Result
     */
    export const replaceNullOrEmpty: (input: string | null | undefined, defaultValue: string) => string;
    /**
     * Set source with new labels
     * @param source Source
     * @param labels Labels
     * @param reference Key reference dictionary
     */
    export const setLabels: (source: DataTypes.StringRecord, labels: DataTypes.StringRecord, reference?: Readonly<DataTypes.StringDictionary>) => void;
    /**
     * Snake name to works, 'snake_name' to 'Snake Name'
     * @param name Name text
     * @param firstOnly Only convert the first word to upper case
     */
    export const snakeNameToWord: (name: string, firstOnly?: boolean) => string;
    /**
     * Set nested value to object
     * @param data Data
     * @param name Field name, support property chain like 'jsonData.logSize'
     * @param value Value
     * @param keepNull Keep null value or not
     */
    export function setNestedValue(data: object, name: string, value: unknown, keepNull?: boolean): void;
    /**
     * Parse name
     * @param name Name
     * @returns Result
     */
    export function parseName(name: string): {
        familyName: string | undefined;
        givenName: string | undefined;
    };
    /**
     * Parse path similar with node.js path.parse
     * @param path Input path
     */
    export const parsePath: (path: string) => ParsedPath;
    /**
     * Sort array by favored values
     * @param items Items
     * @param favored Favored values
     * @returns Sorted array
     */
    export const sortByFavor: <T>(items: T[], favored: T[]) => T[];
    /**
     * Sort array by favored field values
     * @param items Items
     * @param field Field to sort
     * @param favored Favored field values
     * @returns Sorted array
     */
    export const sortByFieldFavor: <T, F extends keyof T>(items: T[], field: F, favored: T[F][]) => T[];
    /**
     * Trim chars
     * @param input Input string
     * @param chars Trim chars
     * @returns Result
     */
    export const trim: (input: string, ...chars: string[]) => string;
    /**
     * Trim end chars
     * @param input Input string
     * @param chars Trim chars
     * @returns Result
     */
    export const trimEnd: (input: string, ...chars: string[]) => string;
    /**
     * Trim start chars
     * @param input Input string
     * @param chars Trim chars
     * @returns Result
     */
    export const trimStart: (input: string, ...chars: string[]) => string;
    export {};
}
