diff --git a/csv/_io.ts b/csv/_io.ts index 2a6742edfa26..43fcf2202d48 100644 --- a/csv/_io.ts +++ b/csv/_io.ts @@ -79,8 +79,7 @@ export async function parseRecord( const separatorLen = opt.separator.length; let recordBuffer = ""; const fieldIndexes = [] as number[]; - parseField: - for (;;) { + parseField: while (true) { if (opt.trimLeadingSpace) { line = line.trimStart(); } @@ -118,7 +117,7 @@ export async function parseRecord( } else { // Quoted string field line = line.substring(quoteLen); - for (;;) { + while (true) { const i = line.indexOf(quote); if (i >= 0) { // Hit next quote. diff --git a/csv/csv_stringify_stream.ts b/csv/csv_stringify_stream.ts index c327ee8af8d5..9ce76a0fc300 100644 --- a/csv/csv_stringify_stream.ts +++ b/csv/csv_stringify_stream.ts @@ -74,33 +74,22 @@ export class CsvStringifyStream * @param options Options for the stream. */ constructor(options?: TOptions) { - const { - separator, - columns = [], - } = options ?? {}; + const { separator, columns = [] } = options ?? {}; super( { start(controller) { if (columns && columns.length > 0) { - try { - controller.enqueue( - stringify([columns], { separator, headers: false }), - ); - } catch (error) { - controller.error(error); - } - } - }, - transform(chunk, controller) { - try { controller.enqueue( - stringify([chunk], { separator, headers: false, columns }), + stringify([columns], { separator, headers: false }), ); - } catch (error) { - controller.error(error); } }, + transform(chunk, controller) { + controller.enqueue( + stringify([chunk], { separator, headers: false, columns }), + ); + }, }, ); } diff --git a/csv/parse.ts b/csv/parse.ts index ca29437fea7f..c30517f70f45 100644 --- a/csv/parse.ts +++ b/csv/parse.ts @@ -103,8 +103,7 @@ class Parser { const separatorLen = this.#options.separator.length; let recordBuffer = ""; const fieldIndexes = [] as number[]; - parseField: - for (;;) { + parseField: while (true) { if (this.#options.trimLeadingSpace) { line = line.trimStart(); } @@ -142,7 +141,7 @@ class Parser { } else { // Quoted string field line = line.substring(quoteLen); - for (;;) { + while (true) { const i = line.indexOf(quote); if (i >= 0) { // Hit next quote. @@ -250,7 +249,7 @@ class Parser { throw new Error(ERR_INVALID_DELIM); } - for (;;) { + while (true) { const r = this.#parseRecord(lineIndex); if (r === null) break; lineResult = r; @@ -329,35 +328,35 @@ export function parse(input: string): string[][]; * * @typeParam T The options' type for parsing. * @param input The input to parse. - * @param opt The options for parsing. - * @returns If you don't provide `opt.skipFirstRow` and `opt.columns`, it returns `string[][]`. - * If you provide `opt.skipFirstRow` or `opt.columns`, it returns `Record[]`. + * @param options The options for parsing. + * @returns If you don't provide `options.skipFirstRow` and `options.columns`, it returns `string[][]`. + * If you provide `options.skipFirstRow` or `options.columns`, it returns `Record[]`. */ export function parse( input: string, - opt: T, + options: T, ): ParseResult; export function parse( input: string, - opt: T = { skipFirstRow: false } as T, + options: T = { skipFirstRow: false } as T, ): ParseResult { - const parser = new Parser(opt); + const parser = new Parser(options); const r = parser.parse(input); - if (opt.skipFirstRow || opt.columns) { + if (options.skipFirstRow || options.columns) { let headers: readonly string[] = []; - if (opt.skipFirstRow) { + if (options.skipFirstRow) { const head = r.shift(); if (head === undefined) throw new TypeError("Headers must be defined"); headers = head; } - if (opt.columns) { - headers = opt.columns; + if (options.columns) { + headers = options.columns; } - const firstLineIndex = opt.skipFirstRow ? 1 : 0; + const firstLineIndex = options.skipFirstRow ? 1 : 0; return r.map((row, i) => { return convertRowToObject(row, headers, firstLineIndex + i); }) as ParseResult; diff --git a/csv/stringify.ts b/csv/stringify.ts index 705533f3d23b..a3ec99fb312f 100644 --- a/csv/stringify.ts +++ b/csv/stringify.ts @@ -104,9 +104,11 @@ export type StringifyOptions = { */ separator?: string; /** - * a list of instructions for how to target and transform the data for each + * A list of instructions for how to target and transform the data for each * column of output. This is also where you can provide an explicit header * name for the column. + * + * @default {[]} */ columns?: Column[]; /** @@ -295,13 +297,16 @@ function getValuesFromItem( * * @param data The source data to stringify. It's an array of items which are * plain objects or arrays. + * @param options Options for the stringification. * @returns A CSV string. */ export function stringify( data: DataItem[], - { headers = true, separator: sep = ",", columns = [], bom = false }: - StringifyOptions = {}, + options?: StringifyOptions, ): string { + const { headers = true, separator: sep = ",", columns = [], bom = false } = + options ?? {}; + if (sep.includes(QUOTE) || sep.includes(CRLF)) { const message = [ "Separator cannot include the following strings:",