UNPKG

@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
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"; };