```typescript
/**
 * Merges non-overlapping [start, end] pairs into the smallest list possible, 
 * preserving order by start time and ignoring open-ended intervals.
 *
 * @param intervals a list of [start, end] pairs
 * @returns the merged [start, end] pairs in ascending order
 */
export function mergeIntervals(intervals: number[][]): number[][] {
  const isInvalidPair = (pair: number[]) => pair[0] > pair[1];
  
  // Filter out any invalid interval that could cause an exception at runtime
  // or make the subsequent logic impossible to execute.
  intervals = intervals.filter(isInvalidPair);
  
  if (!intervals.length) return [];
  
  // Sort the intervals to start with the smallest possible integer. 
  // Then sort within each pair of adjacent [A, B] to prepare their pairing later on.
  intervals.sort((a, b) => a[0] + a[1] - (b[0] + b[1]));
  
  const result = [[...intervals[0]]];
  
  for (const currentInterval of intervals.slice(1)) {
    // If we already have the last interval that ends with the current one...
    if (result[result.length - 1][1] === currentInterval[0]) {
      // Simply merge them so they cover equal range.
      result[result.length - 1][1] = Math.max(result[result.length - 1][1], currentInterval[1]);
    } else {
      // Otherwise, it should always be true that we have a valid pair.
      result.push(currentInterval);
    }
  }
  
  return result;
}
```