```typescript
/**
 * Parse a semantic version string.
 */
export function parseSemver(version: string): {
  major: number;
  minor: number;
  patch: number;
  prerelease: string | null;
  build: string | null;
} {
  const parts = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.+))?((?:\+|\/)?(.+))?$/);
  
  if (!parts) {
    throw new Error(`Invalid semver format: ${version}`);
  }

  const [major, minor, patch] = parts.slice(1).map(Number);
  const prerelease = parts[4];
  const build = parts[5];

  return {
    major,
    minor,
    patch,
    prerelease,
    build,
  };
}
```