admin-kit

API reference#

Every export, by sub-path. The sub-path is not cosmetic: it names the environment the module belongs to, which is what stops a server-only module from drifting into a client bundle unnoticed.

Sub-pathContentsEnvironment
@cortejojicoy/admin-kitConfig helpers, types, pure logicAnywhere, including plain Node
…/clientAdminProvider, contexts, hooksClient
…/dataCRUD hooks, data provider, resource typesClient
…/accessEngine, <Can>, guardsClient
…/uiPanels, primitives, generated screensClient
…/serverSession, access gates, cookiesServer
…/middlewarecreateAdminMiddlewareEdge
…/styles.cssThe stylesheet

Both ESM and CJS are published, with types for each.

@cortejojicoy/admin-kit#

Free of React and DOM code on purpose — the CLI imports your config through it, and edge middleware loads it too.

Config#

ExportSignature
defineAdminConfig(config: AdminConfig) => AdminConfig
defineAdminServerConfig(config: AdminServerConfig) => AdminServerConfig
resolveConfig(config: AdminConfig) => ResolvedAdminConfig
serializeConfig(config: AdminConfig) => AdminConfig — strips maps, auth.custom, plugins, secrets
findUnserializable(value: unknown, path?: string) => string[]

Constants: DEFAULT_LOGIN_PATH, DEFAULT_AFTER_LOGIN, DEFAULT_AFTER_LOGOUT, DEFAULT_APP_HOME, DEFAULT_ADMIN_BASE.

ExportSignature
buildNavConfig sections plus plugin sections, merged by id
modulesToSectionsModule descriptors → nav sections
filterNav(nav, engine) => NavSection[]
buildModulesCatalog entries + descriptors → modules
tileModules / dockModulesPlacement-filtered views
catalogFromDescriptorsA catalog from descriptors alone, for a static install
copyFor(copy: FlavoredCopy, flavor?) => string \| undefined
createPluginRegistry / createModuleRegistryRegistry helpers

Access#

ExportSignature
createAccessEngine(snapshot: AccessSnapshot, config?: AccessConfig) => AccessEngine
expandRoles(roles, { roles, hierarchy }) => { roles, grants }
matchesPattern(pattern: string, code: string) => boolean
ACCESS_LEVELSreadonly ['none', 'view', 'full']
atLeast(level, required) => boolean
rankOf / strongest / isAccessLevelLevel arithmetic
toAccessLevelCoerce any backend shape into a level
toPermissionsMapNormalize a whole permissions payload
EMPTY_SNAPSHOTA snapshot that grants nothing and claims nothing

AccessEngine: isAdmin, roles, levelFor, can, canAny, canAll, levelForModule, entitled, moduleVisible.

Data and HTTP#

ExportSignature
createRestDataProvider({ resources, baseUrl }) => DataProvider
buildListQueryList params → query string, per QueryNaming
fillPathFill :param segments in a path template
createHttpClientA small fetch wrapper
HttpErrorThrown by the client; carries status
joinUrl / appendQueryURL helpers
DataStoreThe cache
cacheKey / resourcePrefixCache key helpers

Theme and utils#

DEFAULT_TOKENS, DARK_TOKENS, tokensToStyle, tokensFromPrimary, cn.

Types#

AdminConfig, AdminServerConfig, ResolvedAdminConfig, AuthConfig, AppConfig, LayoutConfig, ThemeConfig, LoginPageConfig, LoginPageProps, RouterFlavor, PanelsConfig, AppPanelConfig, AdminPanelConfig, AuthUser, AuthSession, AuthState, AuthStatus, AuthActions, AuthContextValue, AuthProvider, JWTAuthConfig, JWTEndpoints, TokenStorage, OAuthConfig, OAuthProviderConfig, NavItem, NavSection, AdminPlugin, ModuleDescriptor, ModulePlacement, FlavoredCopy, AccessConfig, AccessSnapshot, AccessLevel, PermissionsMap, ModuleCatalogEntry, OnUnavailable, PermissionsAxisConfig, EntitlementsAxisConfig, CatalogAxisConfig, AccessEngine, ModuleAccessShape, DataProvider, ResourceDescriptor, ResourceEndpoints, ResourceMappers, EndpointDescriptor, FieldDescriptor, ListParams, ListResult, NormalizedError, QueryNaming, CrudOperation, HttpMethod, HttpClient, HttpClientOptions, HttpRequest.

AdminModule is a deprecated alias of AdminPlugin, kept until 1.0.

…/client#

Everything here is a client module; the published bundle carries the "use client" directive.

Provider#

<AdminProvider
  config={adminConfig}
  initialSession={session}
  snapshot={snapshot}
  icons={icons}
  plugins={[billing]}
  dataProvider={provider}
  router={appRouterAdapter}
  components={{ LoginPage }}
>

snapshotFromUser() derives a snapshot from a user object, for apps whose /me payload already carries roles and permissions.

Contexts and hooks#

ExportPurpose
useAdminConfig / useOptionalAdminConfigThe resolved config
AdminConfigProviderConfig alone, without the rest
RouterProvider, useRouterBridge, useCurrentPath, isActivePathRouting bridge
AuthContextProvider, AuthContext, useAuth, useOptionalAuthAuth state and actions
createJWTProvider, createOAuthProvider, createCustomProviderProvider factories
AccessProvider, useAccess, usePermissions, useCan, useModuleVisible, Can, IfAdminAccess bindings
PluginProvider, usePlugins, useModules, WidgetSlotPlugins and widgets
IconProvider, Icon, useIcon, useIconRegistry, BUILTIN_ICONSIcons
ThemeProvider, ThemeContext, useThemeTheme
DataProviderContext, DataStoreProvider, useDataProvider, useDataStoreData plumbing
useAppRouter, useAppPathname, useAppSearchParams, AppLink, appRouterAdapterApp Router
usePagesRouter, usePagesPathname, usePagesSearchParams, PagesLink, pagesRouterAdapterPages Router

Types: AdminProviderProps, RouterBridge, IconComponent, IconRegistry, ThemeMode, ThemeContextValue.

…/data#

ExportSignature
useList(resource, options?) => UseListResult<T>
useOne(resource, id) => UseOneResult<T>
useCreate / useUpdate / useDelete(resource) => MutationResult
useAction(resource, action) => MutationResult
useResource(name) => ResourceDescriptor \| undefined
defineResourceIdentity helper, for the inference
createRestDataProvider, buildListQuery, fillPath, defaultListMapperREST provider
DataStore, cacheKey, resourcePrefix, stableStringifyCache
createHttpClient, HttpErrorHTTP

UseListResult: rows, total, loading, validating, error, allowed, page, perPage, pageCount, setPage, refetch.

See Resources & CRUD.

…/access#

AccessProvider, useAccess, usePermissions, useCan, useModuleVisible, Can, IfAdmin, RequireAuth, RequirePermission, AppRouterGuard, PagesRouterGuard, plus the engine and level helpers re-exported from the core entry.

Types: AccessProviderProps, CanProps.

These hide controls and redirect browsers. They do not protect endpoints — see Access control.

…/ui#

Panels#

AdminShell, Sidebar, Brand, SidebarNav, SidebarItem, AppShell, AppLauncher, LauncherTile, LauncherGreeting, Dock, QuickAccessBar, QuickAccessDock, UserMenu.

Auth#

LoginPage, nextDestination, RequireAuth, RequirePermission.

Generated screens#

ComponentProps
ResourceTableresource, title, fields, hrefFor, actions, rowActions, searchable, className
ResourceFormresource, id, fields, title, onSaved, onCancel, className
ResourceShowresource, id, fields, title, actions, className

Helpers: listColumns, formatCell, titleize, formFields.

Primitives#

Button, Card, Badge, Field, Input, Textarea, Select, SearchInput, ErrorMessage, EmptyState, Skeleton, PageHeader.

Hooks#

useDisclosure, useMediaQuery, useLocalStorage, useSlideTransition, useDismiss.

…/server#

No "use client" directive, and it deliberately pulls in server-side primitives. Never import it from a client component.

ExportSignature
getServerSession(config, req, options?) => Promise<AuthSession \| null>
rolesFromSession(config, session) => string[]
verifyJWT(token, secret, options?) => Promise<VerifyResult>
serializeCookie(name, value, opts?) => string
parseCookies(header) => Record<string, string>
readCookieFromRequest(req, name) => string \| null
sessionCookieHttpOnly, Secure, SameSite=Lax by default
clearSessionCookieThe same, with Max-Age=0
resolveAccess(config, options) => Promise<AccessSnapshot>
resolveCatalogCatalog axis alone
checkModule=> { ok: true } \| { ok: false, error }
requireModuleThrows AccessDeniedError
requireEntitlementTenant axis only
requireAdminFails closed
assertPermission(config, code, { level?, roles?, snapshot? })
resolveModulesModules visible to this snapshot
AccessDeniedErrorreason, code, redirectTo

Also re-exported for server use: resolveConfig, serializeConfig, buildModules, tileModules, dockModules, buildNav, filterNav, createAccessEngine.

Types: ServerSessionOptions, RequestLike, JWTPayload, VerifyResult, VerifyOptions, CookieOptions, ResolveAccessOptions, GuardOptions.

…/middleware#

createAdminMiddleware(config: AdminConfig, options?: AdminMiddlewareOptions)
OptionDefaultMeaning
secretHMAC secret; prefer this over config.auth.jwt.secret
algorithms['HS256']Accepted algorithms
verifyReplace verification entirely, e.g. RS256 via jose
publicRoutesMerged with config.auth.publicRoutes
serverConfigPass the whole server config instead
returnParam'next'Query param carrying the post-login destination

It is a UX redirect, not the authorization boundary. See Access control.

…/styles.css#

import '@cortejojicoy/admin-kit/styles.css'

One stylesheet, driven by CSS custom properties. See Theming.

Edit this page on GitHub