Skip to content

defineAccess

defineAccess<TRoles, TResources, TCustomResources, TUserSlug, TOrgSlug, TCustomActions, TPermissions>(props): VexAccessConfig<SubjectMap<TResources, TCustomResources, TUserSlug, TOrgSlug, TCustomActions>, TResources, TUserSlug, TOrgSlug, TCustomActions>

Defined in: packages/core/src/access/config.ts:73

Defines the RBAC configuration for a VexCMS project.

Builder in the defineCollection/defineGlobal family: infers the per-subject action/data/field registry (SubjectMap) from resources and customResources so hasPermission() calls against the returned config are fully typed; validates the matrix in dev; returns a frozen VexAccessConfig for defineConfig({ access }).

TRoles extends readonly string[]

Tuple of role name literals.

TResources extends readonly AccessResource[]

Tuple of collection/global configs contributing subjects.

TCustomResources extends Record<string, CustomResourceInput> = { }

Custom subject declarations ({ actions, data? }).

TUserSlug extends string = string

Slug literal of the user collection; drives the callback user type via the generated registry.

TOrgSlug extends string | undefined = undefined

Slug literal of the organization collection, when multi-tenant. Presence gates the organization callback key; undefined when single-tenant.

TCustomActions extends Partial<Record<TUserSlug | TResources[number]["slug"] | Extract<TOrgSlug, string>, CustomActionsInput>> = { }

TPermissions extends Record<TRoles[number], RolePermissions<SubjectMap<TResources, TCustomResources, TUserSlug, TOrgSlug, TCustomActions>, InferDocTypeFromSlug<TUserSlug>, TOrgSlug extends string ? InferDocTypeFromSlug<TOrgSlug> : never, TUserSlug, TOrgSlug>> = Record<TRoles[number], RolePermissions<SubjectMap<TResources, TCustomResources, TUserSlug, TOrgSlug, TCustomActions>, InferDocTypeFromSlug<TUserSlug>, TOrgSlug extends string ? InferDocTypeFromSlug<TOrgSlug> : never, TUserSlug, TOrgSlug>>

VexAccessConfigInput<TRoles, TResources, TCustomResources, TUserSlug, TOrgSlug, TCustomActions, TPermissions>

The access configuration.

VexAccessConfig<SubjectMap<TResources, TCustomResources, TUserSlug, TOrgSlug, TCustomActions>, TResources, TUserSlug, TOrgSlug, TCustomActions>

Frozen VexAccessConfig carrying the SubjectMap phantom for inference.

When userCollectionSlug or userRolesField is empty, when a customResources key collides with a resource slug, or when a customResources entry declares an empty actions array. A rule’s withIndex is validated against its resource’s declared indexes separately, by validateAccessConfig (access/validateAccessConfig.ts), called from defineConfig once the full resource set (including the merged user collection) is known.

export const access = defineAccess({
roles: ["admin", "editor"],
resources: [pages, users],
customResources: { apiKeys: { actions: ["create", "revoke"] } },
userCollectionSlug: "users",
userRolesField: "roles",
permissions: {
admin: { [WILDCARD_KEY]: true },
editor: { pages: { read: true, update: true }, apiKeys: false },
},
});