// @ts-nocheck import type { BaseRequest, BaseResponse } from "../../framework"; import OverrideableBuilder from "supertokens-js-override"; import { SessionContainerInterface } from "../session/types"; import { TypeInput as EmailDeliveryTypeInput, TypeInputWithService as EmailDeliveryTypeInputWithService } from "../../ingredients/emaildelivery/types"; import EmailDeliveryIngredient from "../../ingredients/emaildelivery"; import { GeneralErrorResponse, NormalisedAppinfo, User, UserContext } from "../../types"; import RecipeUserId from "../../recipeUserId"; export type TypeNormalisedInput = { signUpFeature: TypeNormalisedInputSignUp; signInFeature: TypeNormalisedInputSignIn; getEmailDeliveryConfig: (isInServerlessEnv: boolean) => EmailDeliveryTypeInputWithService; resetPasswordUsingTokenFeature: TypeNormalisedInputResetPasswordUsingTokenFeature; override: { functions: (originalImplementation: RecipeInterface, builder: OverrideableBuilder) => RecipeInterface; apis: (originalImplementation: APIInterface, builder: OverrideableBuilder) => APIInterface; }; }; export type TypeInputFormField = { id: string; validate?: (value: any, tenantId: string, userContext: UserContext) => Promise; optional?: boolean; }; export type TypeFormField = { id: string; value: any; }; export type TypeInputSignUp = { formFields?: TypeInputFormField[]; }; export type NormalisedFormField = { id: string; validate: (value: any, tenantId: string, userContext: UserContext) => Promise; optional: boolean; }; export type TypeNormalisedInputSignUp = { formFields: NormalisedFormField[]; }; export type TypeNormalisedInputSignIn = { formFields: NormalisedFormField[]; }; export type TypeNormalisedInputResetPasswordUsingTokenFeature = { formFieldsForGenerateTokenForm: NormalisedFormField[]; formFieldsForPasswordResetForm: NormalisedFormField[]; }; export type TypeInput = { signUpFeature?: TypeInputSignUp; emailDelivery?: EmailDeliveryTypeInput; override?: { functions?: (originalImplementation: RecipeInterface, builder: OverrideableBuilder) => RecipeInterface; apis?: (originalImplementation: APIInterface, builder: OverrideableBuilder) => APIInterface; }; }; export type RecipeInterface = { signUp(input: { email: string; password: string; session: SessionContainerInterface | undefined; shouldTryLinkingWithSessionUser: boolean | undefined; tenantId: string; userContext: UserContext; }): Promise<{ status: "OK"; user: User; recipeUserId: RecipeUserId; } | { status: "EMAIL_ALREADY_EXISTS_ERROR"; } | { status: "LINKING_TO_SESSION_USER_FAILED"; reason: "EMAIL_VERIFICATION_REQUIRED" | "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" | "SESSION_USER_ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; }>; createNewRecipeUser(input: { email: string; password: string; tenantId: string; userContext: UserContext; }): Promise<{ status: "OK"; user: User; recipeUserId: RecipeUserId; } | { status: "EMAIL_ALREADY_EXISTS_ERROR"; }>; signIn(input: { email: string; password: string; session: SessionContainerInterface | undefined; shouldTryLinkingWithSessionUser: boolean | undefined; tenantId: string; userContext: UserContext; }): Promise<{ status: "OK"; user: User; recipeUserId: RecipeUserId; } | { status: "WRONG_CREDENTIALS_ERROR"; } | { status: "LINKING_TO_SESSION_USER_FAILED"; reason: "EMAIL_VERIFICATION_REQUIRED" | "RECIPE_USER_ID_ALREADY_LINKED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" | "ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR" | "SESSION_USER_ACCOUNT_INFO_ALREADY_ASSOCIATED_WITH_ANOTHER_PRIMARY_USER_ID_ERROR"; }>; verifyCredentials(input: { email: string; password: string; tenantId: string; userContext: UserContext; }): Promise<{ status: "OK"; user: User; recipeUserId: RecipeUserId; } | { status: "WRONG_CREDENTIALS_ERROR"; }>; /** * We pass in the email as well to this function cause the input userId * may not be associated with an emailpassword account. In this case, we * need to know which email to use to create an emailpassword account later on. */ createResetPasswordToken(input: { userId: string; email: string; tenantId: string; userContext: UserContext; }): Promise<{ status: "OK"; token: string; } | { status: "UNKNOWN_USER_ID_ERROR"; }>; consumePasswordResetToken(input: { token: string; tenantId: string; userContext: UserContext; }): Promise<{ status: "OK"; email: string; userId: string; } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR"; }>; updateEmailOrPassword(input: { recipeUserId: RecipeUserId; email?: string; password?: string; userContext: UserContext; applyPasswordPolicy?: boolean; tenantIdForPasswordPolicy: string; }): Promise<{ status: "OK" | "UNKNOWN_USER_ID_ERROR" | "EMAIL_ALREADY_EXISTS_ERROR"; } | { status: "EMAIL_CHANGE_NOT_ALLOWED_ERROR"; reason: string; } | { status: "PASSWORD_POLICY_VIOLATED_ERROR"; failureReason: string; }>; }; export type APIOptions = { recipeImplementation: RecipeInterface; appInfo: NormalisedAppinfo; config: TypeNormalisedInput; recipeId: string; isInServerlessEnv: boolean; req: BaseRequest; res: BaseResponse; emailDelivery: EmailDeliveryIngredient; }; export type APIInterface = { emailExistsGET: undefined | ((input: { email: string; tenantId: string; options: APIOptions; userContext: UserContext; }) => Promise<{ status: "OK"; exists: boolean; } | GeneralErrorResponse>); generatePasswordResetTokenPOST: undefined | ((input: { formFields: { id: string; value: unknown; }[]; tenantId: string; options: APIOptions; userContext: UserContext; }) => Promise<{ status: "OK"; } | { status: "PASSWORD_RESET_NOT_ALLOWED"; reason: string; } | GeneralErrorResponse>); passwordResetPOST: undefined | ((input: { formFields: { id: string; value: unknown; }[]; token: string; tenantId: string; options: APIOptions; userContext: UserContext; }) => Promise<{ status: "OK"; email: string; user: User; } | { status: "RESET_PASSWORD_INVALID_TOKEN_ERROR"; } | { status: "PASSWORD_POLICY_VIOLATED_ERROR"; failureReason: string; } | GeneralErrorResponse>); signInPOST: undefined | ((input: { formFields: { id: string; value: unknown; }[]; tenantId: string; session: SessionContainerInterface | undefined; shouldTryLinkingWithSessionUser: boolean | undefined; options: APIOptions; userContext: UserContext; }) => Promise<{ status: "OK"; user: User; session: SessionContainerInterface; } | { status: "SIGN_IN_NOT_ALLOWED"; reason: string; } | { status: "WRONG_CREDENTIALS_ERROR"; } | GeneralErrorResponse>); signUpPOST: undefined | ((input: { formFields: { id: string; value: unknown; }[]; tenantId: string; session: SessionContainerInterface | undefined; shouldTryLinkingWithSessionUser: boolean | undefined; options: APIOptions; userContext: UserContext; }) => Promise<{ status: "OK"; user: User; session: SessionContainerInterface; } | { status: "SIGN_UP_NOT_ALLOWED"; reason: string; } | { status: "EMAIL_ALREADY_EXISTS_ERROR"; } | GeneralErrorResponse>); }; export type TypeEmailPasswordPasswordResetEmailDeliveryInput = { type: "PASSWORD_RESET"; user: { id: string; recipeUserId: RecipeUserId | undefined; email: string; }; passwordResetLink: string; tenantId: string; }; export type TypeEmailPasswordEmailDeliveryInput = TypeEmailPasswordPasswordResetEmailDeliveryInput; export type APIFunction = (input: { apiImplementation: APIInterface; tenantId: string; options: APIOptions; userContext: UserContext; }) => Promise;