Packbase SDK

Pack

TypeScript shapes for packs, members, roles, lists, and updates.

Pack

Pack describes a Packbase community that the API returns. Optional fields end in ?. These fields can be absent because of the endpoint or authentication state. Some fields can also be null. null means that Packbase does not have a stored value.

interface Pack {
  id: string
  display_name: string
  about?: { bio?: string | null; flair?: string }
  images?: { avatar?: string | null; header?: string | null }
  owner_id?: string | null
  membership?: {
    id: number
    user_id: string
    permissions: number
  }
  statistics?: {
    members: number
    heartbeat?: number
  }
  created_at: string
}

The list endpoint wraps its array in PackList so it can return visibility information beside the packs. It also omits the per-pack heartbeat field:

interface PackList {
  packs: Pack[]
  hidden: number
  total_count?: number
}

pb.packs.list({ search }) is all-at-once; the SDK does not expose a continuation flag without a usable continuation parameter.

PackMember

extends Profile means that a PackMember has the standard profile fields and membership-specific fields:

interface PackMember extends Profile {
  membership_id: number
  joined_at: string
  permissions: number
  online?: boolean
  last_online?: string
  roles?: PackRoleSummary[]
}

Roles and permissions

Permissions are bit flags. One number contains multiple Boolean permissions. Use the exported PackPermissionBits values. Combine them with the bitwise OR operator (|). Do not use hard-coded totals.

interface PackRole {
  id: string
  tenant_id: string
  name: string
  permissions: number
  created_at: string
  updated_at: string
}
const PackPermissionBits = {
  Owner: 1,
  Administrator: 2,
  BanMembers: 4,
  KickMembers: 8,
  ManageRoles: 16,
  DeleteHowls: 128,
  CreateHowls: 256,
  ManagePack: 512,
  PinHowls: 1024,
} as const

Custom roles cannot carry the Owner bit.

For example, PackPermissionBits.BanMembers | PackPermissionBits.KickMembers creates the permission number for a role that can do both.

Create and edit input

interface PackCreateInput {
  display_name: string
  description: string
}

interface PackEditInput {
  display_name?: string
  about?: { bio?: string; flair?: string }
  images?: { header?: string; avatar?: string }
}

The edit endpoint returns PackUpdateResult. This type matches the database update result, not a formatted Pack. To get the standard response structure after an edit, fetch the pack again.

Import

import type {
  Pack,
  PackList,
  PackMember,
  PackRole,
  PackRoleInput,
  PackRoleSummary,
  PackCreateInput,
  PackEditInput,
  PackUpdateResult,
  PackSetting,
} from '@packbase/sdk-ts'

On this page