```ts
export function fillOrder(
  sources: [number, number][],
  needed: number,
): { cost: number; taken: number[]; leftover: number[] } {
  if (!Number.isInteger(needed) || needed <= 0) {
    throw new Error('Needed must be a positive integer');
  }

  for (const source of sources) {
    if (
      !Array.isArray(source) ||
      source.length !== 2 ||
      typeof source[0] !== 'number' ||
      typeof source[1] !== 'number' ||
      source[0] <= 0 ||
      source[1] <= 0
    ) {
      throw new Error('Each source must be a pair of positive integers');
    }
  }

  const totalStock = sources.reduce((acc, source) => acc + source[1], 0);
  if (totalStock < needed) {
    throw new Error('Not enough stock to fulfill the order');
  }

  const order = sources.map((_, index) => index);
  order.sort((a, b) => sources[a][0] - sources[b][0]);
  const taken = sources.map(() => 0);
  let cost = 0;
  let remaining = needed;

  for (const index of order) {
    if (remaining <= 0) {
      break;
    }
    const unitCost = sources[index][0];
    const stock = sources[index][1];
    taken[index] = Math.min(stock, remaining);
    cost += taken[index] * unitCost;
    remaining -= taken[index];
  }

  const leftover = sources.map((source, index) => source[1] - taken[index]);
  return { cost, taken, leftover };
}
```