```ts
/** An installation order for packages under prerequisite pairs. */
export function installOrder(
  packages: string[],
  requires: string[][],
): string[] {
  if (packages.length === 0) return [];

  const needs: Record<string, number> = {};
  const enables: Record<string, string[]> = {};
  const packageSet = new Set(packages);

  for (const name of packages) {
    needs[name] = 0;
    enables[name] = [];
  }

  for (const [pkg, needed] of requires) {
    if (!packageSet.has(pkg)) {
      throw new Error(`Package ${pkg} is not in the list.`);
    }
    if (!packageSet.has(needed)) {
      throw new Error(`Package ${needed} is not in the list.`);
    }

    needs[pkg] += 1;
    enables[needed].push(pkg);
  }

  const ready = packages.filter((name) => needs[name] === 0);

  const order: string[] = [];
  while (ready.length > 0) {
    const next = ready.pop() as string;
    order.push(next);
    for (const follower of enables[next]) {
      needs[follower] -= 1;
      if (needs[follower] === 0) {
        ready.push(follower);
      }
    }
  }

  return order;
}
```