/// 
import * as Hoek from '@hapi/hoek';
export namespace domain {
    /**
     * Analyzes a string to verify it is a valid domain name.
     * 
     * @param domain - the domain name to validate.
     * @param options - optional settings.
     * 
     * @return - undefined when valid, otherwise an object with single error key with a string message value.
     */
    function analyze(domain: string, options?: Options): Analysis | null;
    /**
     * Analyzes a string to verify it is a valid domain name.
     * 
     * @param domain - the domain name to validate.
     * @param options - optional settings.
     * 
     * @return - true when valid, otherwise false.
     */
    function isValid(domain: string, options?: Options): boolean;
    interface Options {
        /**
         * Determines whether Unicode characters are allowed.
         * 
         * @default true
         */
        readonly allowUnicode?: boolean;
        /**
         * The minimum number of domain segments (e.g. `x.y.z` has 3 segments) required.
         * 
         * @default 2
         */
        readonly minDomainSegments?: number;
        /**
         * Top-level-domain options
         * 
         * @default true
         */
        readonly tlds?: Tlds.Allow | Tlds.Deny | boolean;
    }
    namespace Tlds {
        interface Allow {
            readonly allow: Set | true;
        }
        interface Deny {
            readonly deny: Set;
        }
    }
}
export namespace email {
    /**
     * Analyzes a string to verify it is a valid email address.
     * 
     * @param email - the email address to validate.
     * @param options - optional settings.
     * 
     * @return - undefined when valid, otherwise an object with single error key with a string message value.
     */
    function analyze(email: string, options?: Options): Analysis | null;
    /**
     * Analyzes a string to verify it is a valid email address.
     * 
     * @param email - the email address to validate.
     * @param options - optional settings.
     * 
     * @return - true when valid, otherwise false.
     */
    function isValid(email: string, options?: Options): boolean;
    interface Options extends domain.Options {
        /**
         * Determines whether to ignore the standards maximum email length limit.
         * 
         * @default false
         */
        readonly ignoreLength?: boolean;
    }
}
export interface Analysis {
    /**
     * The reason validation failed.
     */
    error: string;
    /**
     * The error code.
     */
    code: string;
}
export const errors: Record;
export namespace ip {
    /**
     * Generates a regular expression used to validate IP addresses.
     * 
     * @param options - optional settings.
     * 
     * @returns an object with the regular expression and meta data.
     */
    function regex(options?: Options): Expression;
    interface Options {
        /**
         * The required CIDR mode.
         * 
         * @default 'optional'
         */
        readonly cidr?: Cidr;
        /**
         * The allowed versions.
         * 
         * @default ['ipv4', 'ipv6', 'ipvfuture']
         */
        readonly version?: Version | Version[];
    }
    type Cidr = 'optional' | 'required' | 'forbidden';
    type Version = 'ipv4' | 'ipv6' | 'ipvfuture';
    interface Expression {
        /**
         * The CIDR mode.
         */
        cidr: Cidr;
        /**
         * The raw regular expression string.
         */
        raw: string;
        /**
         * The regular expression.
         */
        regex: RegExp;
        /**
         * The array of versions allowed.
         */
        versions: Version[];
    }
}
export namespace uri {
    /**
     * Faster version of decodeURIComponent() that does not throw.
     * 
     * @param string - the URL string to decode.
     * 
     * @returns the decoded string or null if invalid.
     */
    function decode(string: string): string | null;
    /**
     * Generates a regular expression used to validate URI addresses.
     *
     * @param options - optional settings.
     *
     * @returns an object with the regular expression and meta data.
     */
    function regex(options?: Options): Expression;
    type Options = Hoek.ts.XOR;
    namespace Options {
        interface Query {
            /**
             * Allow the use of [] in query parameters.
             * 
             * @default false
             */
            readonly allowQuerySquareBrackets?: boolean;
        }
        interface Relative extends Query {
            /**
             * Requires the URI to be relative.
             * 
             * @default false
             */
            readonly relativeOnly?: boolean;
        }
        interface Options extends Query {
            /**
             * Allow relative URIs.
             * 
             * @default false
             */
            readonly allowRelative?: boolean;
            /**
             * Capture domain segment ($1).
             * 
             * @default false
             */
            readonly domain?: boolean;
            /**
             * The allowed URI schemes.
             */
            readonly scheme?: Scheme | Scheme[];
        }
        type Scheme = string | RegExp;
    }
    interface Expression {
        /**
         * The raw regular expression string.
         */
        raw: string;
        /**
         * The regular expression.
         */
        regex: RegExp;
    }
}