@better-auth-ui/core
Version:
Authentication components and data utilities for [Better Auth](https://better-auth.com), available for React and Solid.
92 lines (87 loc) • 2.48 kB
text/typescript
import type {
AuthPluginBase,
AuthPluginLocalizationContext
} from "../../lib/auth-plugin"
import { createAuthPlugin } from "../../lib/create-auth-plugin"
import {
type UsernameLocalization,
usernameLocalization
} from "./username-localization"
export type UsernamePluginOptions = {
/**
* Whether to use displayUsername for the visible username field in the profile.
*/
displayUsername?: boolean
/**
* Whether to check username availability on sign-up and user profile.
*/
isUsernameAvailable?: boolean
/**
* Minimum allowed username length.
* @default 3
*/
minUsernameLength?: number
/**
* Maximum allowed username length.
* @default 30
*/
maxUsernameLength?: number
/**
* Override the plugin's default localization strings.
* @remarks `UsernameLocalization`
*/
localization?: Partial<UsernameLocalization>
/**
* Prefix prepended to usernames.
* @default ""
*/
usernamePrefix?: string
}
export const usernamePlugin = createAuthPlugin(
"username",
(options: UsernamePluginOptions = {}) => {
const minUsernameLength = options.minUsernameLength ?? 3
const maxUsernameLength = options.maxUsernameLength ?? 30
const localization = { ...usernameLocalization, ...options.localization }
const createAdditionalFields = (messages: UsernameLocalization) => [
{
name: "username",
type: "string" as const,
label: messages.username,
placeholder: messages.usernamePlaceholder,
inputType: "input" as const,
signUp: "above" as const,
required: true
},
...(options.displayUsername
? [
{
name: "displayUsername",
type: "string" as const,
label: messages.displayUsername,
placeholder: messages.displayUsernamePlaceholder,
inputType: "input" as const,
signUp: "above" as const
}
]
: [])
]
return {
...options,
minUsernameLength,
maxUsernameLength,
usernamePrefix: options.usernamePrefix ?? "",
localization,
additionalFields: createAdditionalFields(localization),
_localizationResolver: (
plugin: AuthPluginBase,
context: AuthPluginLocalizationContext
) => ({
...plugin,
additionalFields: createAdditionalFields(
context.localization as UsernameLocalization
)
})
}
}
)