```typescript
/**
 * Merge overlapping intervals into non-overlapping ones while preserving 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.
 */
export function mergeIntervals(intervals: number[][]): number[][] {
    // Check for invalid input
    if (!intervals.every(interval => interval.length === 2 && interval[0] <= interval[1])) {
        throw new Error('Invalid intervals');
    }

    // Sort the intervals by their start value
    const sortedIntervals = [...intervals].sort((a, b) => a[0] - b[0]);

    const mergedIntervals: number[][] = [sortedIntervals[0]];

    for (const currentInterval of sortedIntervals.slice(1)) {
        // Get the last merged interval
        const lastMergedInterval = mergedIntervals[mergedIntervals.length - 1];

        // Check if the current interval overlaps with the last merged one
        if (currentInterval[0] <= lastMergedInterval[1]) {
            // Merge them by updating the end of the last merged interval
            mergedIntervals[mergedIntervals.length - 1] = [lastMergedInterval[0], Math.max(lastMergedInterval[1], currentInterval[1])];
        } else {
            // Add the current interval to the list of merged intervals
            mergedIntervals.push(currentInterval);
        }
    }

    return mergedIntervals;
}
```