@better-auth-ui/core
Version:
Authentication components and data utilities for [Better Auth](https://better-auth.com), available for React and Solid.
354 lines (353 loc) • 13.1 kB
TypeScript
import { AdditionalFields } from '../../config/additional-fields-config';
import { AvatarConfig } from '../../config/avatar-config';
import { AuthPluginBase, AuthPluginLocalizationContext } from '../../lib/auth-plugin';
import { OrganizationLocalization } from './organization-localization';
import { OrganizationViewPaths } from './organization-view-paths';
declare module "../../lib/view-paths" {
/** Widens `AuthViewPaths` with the organization invitation path when this plugin is imported. */
interface AuthViewPaths {
/** @default "accept-invitation" */
acceptInvitation?: string;
}
/** Widens `SettingsViewPaths` by adding the `"organizations"` path when this plugin is imported. */
interface SettingsViewPaths {
/** @default "organizations" */
organizations?: string;
}
}
declare module "../../lib/auth-plugin" {
interface AuthPluginViewPaths {
organization?: Partial<OrganizationViewPaths>;
}
}
export type OrganizationPluginOptions = {
/** Role Better Auth assigns to organization creators. @default "owner" */
creatorRole?: string;
/**
* Whether to call `organization.checkSlug` when entering an organization slug.
* @default true
*/
checkSlug?: boolean;
/**
* Override the plugin's default localization strings.
* @remarks `OrganizationLocalization`
*/
localization?: Partial<OrganizationLocalization>;
/**
* Override URL segments contributed by this plugin.
*
* - `auth.acceptInvitation` — segment for the direct invitation acceptance view (default `"accept-invitation"`).
* - `settings.organizations` — segment for the organizations settings view (default `"organizations"`).
* - `organization.settings` — segment for the `/organization/...` profile and danger zone tab (default `"settings"`).
* - `organization.people` — segment for the `/organization/...` members and invitations tab (default `"people"`).
* - `organization.teams` — segment for the `/organization/...` teams tab (default `"teams"`).
* - `organization.roles` — segment for the dynamic roles tab (default `"roles"`).
*/
viewPaths?: {
auth?: {
/** @default "accept-invitation" */
acceptInvitation?: string;
};
settings?: {
/** @default "organizations" */
organizations?: string;
};
organization?: Partial<OrganizationViewPaths>;
};
/**
* Organization logo upload, optimization, and deletion configuration.
* Same shape as {@link AvatarConfig} used for user avatars (`AuthConfig.avatar`).
* @remarks `AvatarConfig`
* @default { enabled: true, resize: resizeAvatar, size: 256, extension: "png" }
*/
logo?: Partial<AvatarConfig>;
/**
* Map of role keys to display labels. When omitted, defaults to localized
* labels for `owner`, `admin`, and `member` (from `localization.owner`
* etc.) plus {@link OrganizationPluginOptions.additionalRoles}. When set,
* replaces that default map entirely; use {@link OrganizationPluginOptions.additionalRoles}
* to add more labels on top. Looked up at render time via `roles?.[role]`.
* @remarks `Record<string, string>`
*/
roles?: Record<string, string>;
/**
* Extra role labels merged after the effective role map (either
* {@link OrganizationPluginOptions.roles} when provided, or the localized
* defaults). Use this for custom server roles without redefining built-in
* labels.
* @remarks `Record<string, string>`
*/
additionalRoles?: Record<string, string>;
/**
* Enable runtime organization roles and configure the permission editor.
* The Better Auth client must also enable `dynamicAccessControl`.
*/
dynamicAccessControl?: {
/** @default true */
enabled?: boolean;
/** Resources and actions available in the role permission matrix. */
permissions: OrganizationPermissionRegistry;
};
slug?: string | null;
/** Hide slugs in organization forms and views. Switchers hide slugs by default. */
hideSlug?: boolean;
/**
* Prefix prepended to organization slugs.
* @default ""
*/
slugPrefix?: string;
/** Additional organization fields rendered during creation and profile editing. */
additionalFields?: AdditionalFields;
/**
* Additional fields grouped by the Better Auth organization model that
* owns them. `organization` overrides the legacy `additionalFields` array.
*/
modelFields?: OrganizationAdditionalFields;
/** Maximum organizations the current user can create. */
organizationLimit?: number;
/** Maximum members per organization. */
membershipLimit?: number;
/** Maximum pending invitations per organization. */
invitationLimit?: number;
/**
* Whether members and invitations can have more than one role.
* @default true
*/
allowMultipleRoles?: boolean;
/** Whether organization creation controls are available. @default true */
allowOrganizationCreation?: boolean;
/** Enable Better Auth team management controls and mirror static server policies. */
teams?: boolean | OrganizationTeamsOptions;
};
export type OrganizationTeamsOptions = {
/** Enable team management controls. @default true */
enabled?: boolean;
/** Maximum teams an organization can contain. */
maximumTeams?: number;
/** Maximum members a team can contain. */
maximumMembersPerTeam?: number;
/** Allow deletion of an organization's final team. @default false */
allowRemovingAllTeams?: boolean;
};
export type OrganizationAdditionalFields = {
/** Fields rendered during organization creation and profile editing. */
organization?: AdditionalFields;
/** Read-only member details returned by Better Auth member queries. */
member?: AdditionalFields;
/** Fields rendered when an invitation is created. */
invitation?: AdditionalFields;
/** Fields rendered when a team is created or edited. */
team?: AdditionalFields;
/** Fields rendered when a dynamic organization role is created or edited. */
role?: AdditionalFields;
};
export type OrganizationPermissionResource = {
/** Resource label shown above its actions. Defaults to the resource key. */
label?: string;
/** Map of Better Auth action keys to display labels. */
actions: Record<string, string>;
};
export type OrganizationPermissionRegistry = Record<string, OrganizationPermissionResource>;
export declare const organizationPlugin: ((options?: OrganizationPluginOptions | undefined) => {
creatorRole: string;
slug: string | null | undefined;
hideSlug: boolean | undefined;
slugPrefix: string;
checkSlug: boolean;
localization: {
accept: string;
acceptInvitationTitle: string;
acceptInvitationDescription: string;
accepted: string;
actions: string;
admin: string;
all: string;
canceled: string;
cancelInvitation: string;
changeLogo: string;
changeMemberRole: string;
changeMemberRoleDescription: string;
clear: string;
createOrganization: string;
deleteLogo: string;
deleteOrganization: string;
deleteOrganizationDescription: string;
invitations: string;
invitationResent: string;
invitationUnavailable: string;
invitationUnavailableDescription: string;
invitedAt: string;
inviteMember: string;
inviteMemberSuccess: string;
inviteMemberDescription: string;
leftOrganization: string;
leaveOrganization: string;
leaveOrganizationDescription: string;
logo: string;
logoChangedSuccess: string;
logoDeletedSuccess: string;
manage: string;
member: string;
memberRemoved: string;
memberRoleUpdated: string;
members: string;
people: string;
name: string;
namePlaceholder: string;
noInvitations: string;
noOrganizations: string;
organization: string;
organizationDeleted: string;
organizationInvitationsEmptyDescription: string;
organizations: string;
organizationsDescription: string;
organizationProfile: string;
organizationUpdatedSuccess: string;
owner: string;
pending: string;
nextPage: string;
firstPage: string;
lastPage: string;
pageOf: string;
rowsPerPage: string;
columns: string;
selectedCount: string;
selectRow: string;
selectAllRows: string;
cancelSelectedInvitations: string;
cancelSelectedInvitationsDescription: string;
invitationsCanceled: string;
removeSelectedMembers: string;
removeSelectedMembersDescription: string;
membersRemoved: string;
deleteSelectedRoles: string;
deleteSelectedRolesDescription: string;
rolesDeleted: string;
personalAccount: string;
previousPage: string;
rejected: string;
paginationRange: string;
return: string;
rejectInvitation: string;
removeMember: string;
removeMemberWarning: string;
resendInvitation: string;
role: string;
search: string;
selectAtLeastOneRole: string;
selectRoles: string;
slug: string;
slugPlaceholder: string;
status: string;
uploadLogo: string;
userInvitationsEmptyDescription: string;
verifyEmailToViewInvitations: string;
verifyEmailToViewInvitationsDescription: string;
teams: string;
team: string;
teamsDescription: string;
selectTeam: string;
allTeams: string;
selectMember: string;
createTeam: string;
renameTeam: string;
deleteTeam: string;
deleteTeamDescription: string;
noTeams: string;
noTeamsDescription: string;
teamMembers: string;
addTeamMember: string;
removeTeamMember: string;
teamCreated: string;
teamUpdated: string;
teamDeleted: string;
teamLimitReached: string;
teamMemberLimitReached: string;
lastTeamRemovalDisabled: string;
activeTeamRemovalDisabled: string;
onlyOwnerActionDisabled: string;
limitReached: string;
organizationLimitReached: string;
membershipLimitReached: string;
invitationLimitReached: string;
roles: string;
rolesDescription: string;
createRole: string;
editRole: string;
deleteRole: string;
deleteRoleDescription: string;
roleName: string;
permissions: string;
permissionsLimitedDescription: string;
noRoles: string;
noRolesDescription: string;
roleCreated: string;
roleUpdated: string;
roleDeleted: string;
roleInUse: string;
roleNamePlaceholder: string;
};
logo: {
delete?: (url: string) => Promise<void>;
enabled: boolean;
extension: "png" | "jpg" | "webp" | "inherit";
resize: (file: File, size?: number, extension?: "png" | "jpg" | "webp" | "inherit") => Promise<File>;
size: number;
upload?: (file: File) => Promise<string>;
};
roles: {
[x: string]: string;
};
_localizationResolver: (plugin: AuthPluginBase, context: AuthPluginLocalizationContext) => {
roles: {
[x: string]: string;
};
id: string;
localization?: Record<string, unknown>;
_localizationOverrides?: Record<string, unknown>;
_localizationResolver?: import('../..').AuthPluginLocalizationResolver;
viewPaths?: import('../..').AuthPluginViewPaths;
additionalFields?: AdditionalFields;
};
additionalFields: AdditionalFields;
modelFields: {
organization: AdditionalFields;
member: AdditionalFields;
invitation: AdditionalFields;
team: AdditionalFields;
role: AdditionalFields;
};
dynamicAccessControl: {
enabled: boolean;
permissions: OrganizationPermissionRegistry;
} | undefined;
organizationLimit: number | undefined;
membershipLimit: number | undefined;
invitationLimit: number | undefined;
allowMultipleRoles: boolean;
allowOrganizationCreation: boolean;
teams: boolean;
teamPolicy: {
maximumTeams: number | undefined;
maximumMembersPerTeam: number | undefined;
allowRemovingAllTeams: boolean;
};
viewPaths: {
settings: {
organizations: string;
};
auth: {
acceptInvitation: string;
};
organization: {
settings: string;
people: string;
teams: string;
roles: string;
};
};
} & {
id: "organization";
}) & {
id: "organization";
};