Vectrum
Sign In
18 lines · 1.2 KB · TypeScript
// What organization members may do (see lib/orgs.ts), shared with the pages that change it.

/** From least to most. */
export const ORG_ROLES = ["read", "write", "admin", "owner"] as const;
export type OrgRole = (typeof ORG_ROLES)[number];

export const ROLE_INFO: Record<OrgRole, { title: string; description: string }> = {
  read: { title: "Read", description: "Sees all of the organization’s repositories, private ones too, and can open issues and comment." },
  write: { title: "Write", description: "Also pushes to every repository and manages issues and pull requests." },
  admin: { title: "Admin", description: "Also creates repositories, changes their settings and deletes them." },
  owner: { title: "Owner", description: "Full control: also manages the organization, its members and invitations." },
};

export const isOrgRole = (value: unknown): value is OrgRole => ORG_ROLES.includes(value as OrgRole);
export const roleAtLeast = (role: OrgRole | null, need: OrgRole) => !!role && ORG_ROLES.indexOf(role) >= ORG_ROLES.indexOf(need);

/** What a role gives its member in each of the organization's repositories. */
export const repoAccessOfRole = (role: OrgRole) => (role === "owner" || role === "admin" ? "admin" : role);