import { SessionStorage } from "@remix-run/server-runtime";
import { AuthenticateOptions, Strategy, StrategyVerifyCallback } from "remix-auth";
import { VerificationInstance } from "twilio/lib/rest/verify/v2/service/verification";
import { VerificationCheckInstance } from "twilio/lib/rest/verify/v2/service/verificationCheck";
type SendCodeFunction = ({ phone, }: {
    phone: string;
}) => Promise<VerificationInstance>;
type ValidateCodeFunction = ({ code, phone, }: {
    code: string;
    phone: string;
}) => Promise<VerificationCheckInstance>;
type FormatPhoneNumberFunction = (phone: string) => string;
export type TwilioStrategyOptions = {
    /**
     * Twilio Account SID
     */
    accountSID: string;
    /**
     * Twilio Auth Token
     */
    authToken: string;
    /**
     * Twilio Verify Service SID
     */
    serviceSID: string;
    /**
     * A function that sends a verification code to the user.
     */
    sendCode?: SendCodeFunction;
    /**
     * A function that validates the verification code provided by the user.
     */
    validateCode?: ValidateCodeFunction;
    /**
     * A function that formats the phone number provided by the user.
     * This library uses the `phone` package to validate phone numbers.
     * You can optionally provide your own validation function here.
     */
    formatPhoneNumber?: FormatPhoneNumberFunction;
};
export interface TwilioStrategyParams {
    /**
     * The phone number provided by the user.
     */
    phone: string;
    /**
     * A FormData object that contains the form
     * used to trigger the authentication.
     */
    formData: FormData;
    /**
     * The Request object.
     */
    request: Request;
}
export declare class TwilioStrategy<User> extends Strategy<User, TwilioStrategyParams> {
    name: string;
    private readonly sessionPhoneKey;
    private readonly client;
    private readonly options;
    private readonly sendCode;
    private readonly validateCode;
    private readonly formatPhoneNumber;
    constructor(options: TwilioStrategyOptions, verify: StrategyVerifyCallback<User, TwilioStrategyParams>);
    authenticate(request: Request, sessionStorage: SessionStorage, options: AuthenticateOptions): Promise<User>;
    private defaultSendCode;
    private defaultValidateCode;
    private defaultFormatPhoneNumber;
}
export {};
