```ts
/**
 * Splits a line of CSV into its fields on commas. A field wrapped in double quotes may contain commas,
 * and a doubled quote inside such a field means one literal quote character; the surrounding quotes are not part of the value.
 * Fields that are not quoted are taken literally, including any surrounding spaces. An empty line is one empty field.
 */
export function parseCsvLine(line: string): string[] {
  const result: string[] = [];
  let currentField = '';
  let inQuote = false;

  for (const char of line) {
    if (char === '"') {
      inQuote = !inQuote;
    } else if (!inQuote && char === ',') {
      if (currentField !== '') {
        result.push(currentField);
        currentField = '';
      }
    } else {
      currentField += char;
    }
  }

  if (currentField !== '' && !result.includes('')) {
    throw new Error('Quoted field is never closed');
  }

  return result;
}
```