```ts
/**
 * Merge overlapping intervals in ascending order.
 *
 * @param intervals - A list of [start, end] pairs.
 * @returns The smallest list of non-overlapping pairs covering the same points,
 *          sorted ascending by start. Intervals that merely touch (end === next start) do merge.
 */
export function mergeIntervals(intervals: number[][]): number[][] {
  if (!intervals || intervals.length === 0) return [];

  const merged = [...intervals];
  const result: number[][] = [];

  while (merged.length > 0) {
    const current = merged.shift()!;

    // Check for invalid start value
    if (current[0] > current[1]) throw new Error('Invalid interval');

    let next = merged.find((interval) => interval[0] <= current[1]);
    if (!next) next = { [current[0]]: Infinity, ...current };

    // Merge overlapping intervals
    const mergedValue = {
      start: Math.min(current[0], next?.start ?? Infinity),
      end: Math.max(current[1], next?.end ?? -Infinity),
    };
    result.push(mergedValue);

    // Remove the merged interval from the list of unmerged intervals
    merged.splice(merged.indexOf(next), 1);
  }

  return result;
}
```