From 67b7da892db7f0f426b9f0fa12063e81eafe8a9b Mon Sep 17 00:00:00 2001 From: David Worms Date: Sat, 6 Nov 2021 20:04:16 +0100 Subject: [PATCH] feat(csv-parse): improve record_delimiter validation --- packages/csv-parse/dist/cjs/index.cjs | 34 +- packages/csv-parse/dist/cjs/sync.cjs | 34 +- packages/csv-parse/dist/esm/index.js | 34 +- packages/csv-parse/dist/esm/sync.js | 34 +- packages/csv-parse/dist/iife/index.js | 34 +- packages/csv-parse/dist/iife/sync.js | 34 +- packages/csv-parse/dist/umd/index.js | 34 +- packages/csv-parse/dist/umd/sync.js | 34 +- packages/csv-parse/lib/index.js | 34 +- .../test/option.record_delimiter.coffee | 340 ++++++++++-------- 10 files changed, 479 insertions(+), 167 deletions(-) diff --git a/packages/csv-parse/dist/cjs/index.cjs b/packages/csv-parse/dist/cjs/index.cjs index 3277ad56d..5f75f8302 100644 --- a/packages/csv-parse/dist/cjs/index.cjs +++ b/packages/csv-parse/dist/cjs/index.cjs @@ -5386,12 +5386,40 @@ class Parser extends Transform { throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`); } // Normalize option `record_delimiter` - if(!options.record_delimiter){ + if(options.record_delimiter === undefined){ options.record_delimiter = []; - }else if(!Array.isArray(options.record_delimiter)){ + }else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter) ){ + if(options.record_delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); + } options.record_delimiter = [options.record_delimiter]; + }else if(!Array.isArray(options.record_delimiter)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); } - options.record_delimiter = options.record_delimiter.map(function(rd){ + options.record_delimiter = options.record_delimiter.map(function(rd, i){ + if(typeof rd !== 'string' && ! isBuffer(rd) ){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + }else if(rd.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + } if(typeof rd === 'string'){ rd = Buffer.from(rd, options.encoding); } diff --git a/packages/csv-parse/dist/cjs/sync.cjs b/packages/csv-parse/dist/cjs/sync.cjs index 71fedeeb8..9d61d4317 100644 --- a/packages/csv-parse/dist/cjs/sync.cjs +++ b/packages/csv-parse/dist/cjs/sync.cjs @@ -5386,12 +5386,40 @@ class Parser extends Transform { throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`); } // Normalize option `record_delimiter` - if(!options.record_delimiter){ + if(options.record_delimiter === undefined){ options.record_delimiter = []; - }else if(!Array.isArray(options.record_delimiter)){ + }else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter)){ + if(options.record_delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); + } options.record_delimiter = [options.record_delimiter]; + }else if(!Array.isArray(options.record_delimiter)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); } - options.record_delimiter = options.record_delimiter.map(function(rd){ + options.record_delimiter = options.record_delimiter.map(function(rd, i){ + if(typeof rd !== 'string' && ! isBuffer(rd)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + }else if(rd.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + } if(typeof rd === 'string'){ rd = Buffer.from(rd, options.encoding); } diff --git a/packages/csv-parse/dist/esm/index.js b/packages/csv-parse/dist/esm/index.js index 1cf7ef665..b80cfe219 100644 --- a/packages/csv-parse/dist/esm/index.js +++ b/packages/csv-parse/dist/esm/index.js @@ -5382,12 +5382,40 @@ class Parser extends Transform { throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`); } // Normalize option `record_delimiter` - if(!options.record_delimiter){ + if(options.record_delimiter === undefined){ options.record_delimiter = []; - }else if(!Array.isArray(options.record_delimiter)){ + }else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter) ){ + if(options.record_delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); + } options.record_delimiter = [options.record_delimiter]; + }else if(!Array.isArray(options.record_delimiter)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); } - options.record_delimiter = options.record_delimiter.map(function(rd){ + options.record_delimiter = options.record_delimiter.map(function(rd, i){ + if(typeof rd !== 'string' && ! isBuffer(rd) ){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + }else if(rd.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + } if(typeof rd === 'string'){ rd = Buffer.from(rd, options.encoding); } diff --git a/packages/csv-parse/dist/esm/sync.js b/packages/csv-parse/dist/esm/sync.js index 46815a1ea..25221524c 100644 --- a/packages/csv-parse/dist/esm/sync.js +++ b/packages/csv-parse/dist/esm/sync.js @@ -5382,12 +5382,40 @@ class Parser extends Transform { throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`); } // Normalize option `record_delimiter` - if(!options.record_delimiter){ + if(options.record_delimiter === undefined){ options.record_delimiter = []; - }else if(!Array.isArray(options.record_delimiter)){ + }else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter)){ + if(options.record_delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); + } options.record_delimiter = [options.record_delimiter]; + }else if(!Array.isArray(options.record_delimiter)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); } - options.record_delimiter = options.record_delimiter.map(function(rd){ + options.record_delimiter = options.record_delimiter.map(function(rd, i){ + if(typeof rd !== 'string' && ! isBuffer(rd)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + }else if(rd.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + } if(typeof rd === 'string'){ rd = Buffer.from(rd, options.encoding); } diff --git a/packages/csv-parse/dist/iife/index.js b/packages/csv-parse/dist/iife/index.js index 2aed2b7f8..2edc15a16 100644 --- a/packages/csv-parse/dist/iife/index.js +++ b/packages/csv-parse/dist/iife/index.js @@ -5385,12 +5385,40 @@ var csv_parse = (function (exports) { throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`); } // Normalize option `record_delimiter` - if(!options.record_delimiter){ + if(options.record_delimiter === undefined){ options.record_delimiter = []; - }else if(!Array.isArray(options.record_delimiter)){ + }else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter) ){ + if(options.record_delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); + } options.record_delimiter = [options.record_delimiter]; + }else if(!Array.isArray(options.record_delimiter)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); } - options.record_delimiter = options.record_delimiter.map(function(rd){ + options.record_delimiter = options.record_delimiter.map(function(rd, i){ + if(typeof rd !== 'string' && ! isBuffer(rd) ){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + }else if(rd.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + } if(typeof rd === 'string'){ rd = Buffer.from(rd, options.encoding); } diff --git a/packages/csv-parse/dist/iife/sync.js b/packages/csv-parse/dist/iife/sync.js index 5dfbd0328..d0ec1cbf8 100644 --- a/packages/csv-parse/dist/iife/sync.js +++ b/packages/csv-parse/dist/iife/sync.js @@ -5385,12 +5385,40 @@ var csv_parse_sync = (function (exports) { throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`); } // Normalize option `record_delimiter` - if(!options.record_delimiter){ + if(options.record_delimiter === undefined){ options.record_delimiter = []; - }else if(!Array.isArray(options.record_delimiter)){ + }else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter)){ + if(options.record_delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); + } options.record_delimiter = [options.record_delimiter]; + }else if(!Array.isArray(options.record_delimiter)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); } - options.record_delimiter = options.record_delimiter.map(function(rd){ + options.record_delimiter = options.record_delimiter.map(function(rd, i){ + if(typeof rd !== 'string' && ! isBuffer(rd)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + }else if(rd.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + } if(typeof rd === 'string'){ rd = Buffer.from(rd, options.encoding); } diff --git a/packages/csv-parse/dist/umd/index.js b/packages/csv-parse/dist/umd/index.js index 29ef1b7fb..23e2be99d 100644 --- a/packages/csv-parse/dist/umd/index.js +++ b/packages/csv-parse/dist/umd/index.js @@ -5388,12 +5388,40 @@ throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`); } // Normalize option `record_delimiter` - if(!options.record_delimiter){ + if(options.record_delimiter === undefined){ options.record_delimiter = []; - }else if(!Array.isArray(options.record_delimiter)){ + }else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter) ){ + if(options.record_delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); + } options.record_delimiter = [options.record_delimiter]; + }else if(!Array.isArray(options.record_delimiter)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); } - options.record_delimiter = options.record_delimiter.map(function(rd){ + options.record_delimiter = options.record_delimiter.map(function(rd, i){ + if(typeof rd !== 'string' && ! isBuffer(rd) ){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + }else if(rd.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + } if(typeof rd === 'string'){ rd = Buffer.from(rd, options.encoding); } diff --git a/packages/csv-parse/dist/umd/sync.js b/packages/csv-parse/dist/umd/sync.js index 73045fb41..a04b5fa0a 100644 --- a/packages/csv-parse/dist/umd/sync.js +++ b/packages/csv-parse/dist/umd/sync.js @@ -5388,12 +5388,40 @@ throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`); } // Normalize option `record_delimiter` - if(!options.record_delimiter){ + if(options.record_delimiter === undefined){ options.record_delimiter = []; - }else if(!Array.isArray(options.record_delimiter)){ + }else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter)){ + if(options.record_delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); + } options.record_delimiter = [options.record_delimiter]; + }else if(!Array.isArray(options.record_delimiter)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); } - options.record_delimiter = options.record_delimiter.map(function(rd){ + options.record_delimiter = options.record_delimiter.map(function(rd, i){ + if(typeof rd !== 'string' && ! isBuffer(rd)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + }else if(rd.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + } if(typeof rd === 'string'){ rd = Buffer.from(rd, options.encoding); } diff --git a/packages/csv-parse/lib/index.js b/packages/csv-parse/lib/index.js index aba99a332..50a8ef0b5 100644 --- a/packages/csv-parse/lib/index.js +++ b/packages/csv-parse/lib/index.js @@ -372,12 +372,40 @@ class Parser extends Transform { throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`); } // Normalize option `record_delimiter` - if(!options.record_delimiter){ + if(options.record_delimiter === undefined){ options.record_delimiter = []; - }else if(!Array.isArray(options.record_delimiter)){ + }else if(typeof options.record_delimiter === 'string' || Buffer.isBuffer(options.record_delimiter)){ + if(options.record_delimiter.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); + } options.record_delimiter = [options.record_delimiter]; + }else if(!Array.isArray(options.record_delimiter)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer,', + `got ${JSON.stringify(options.record_delimiter)}` + ], options); } - options.record_delimiter = options.record_delimiter.map(function(rd){ + options.record_delimiter = options.record_delimiter.map(function(rd, i){ + if(typeof rd !== 'string' && ! Buffer.isBuffer(rd)){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a string, a buffer or array of string|buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + }else if(rd.length === 0){ + throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [ + 'Invalid option `record_delimiter`:', + 'value must be a non empty string or buffer', + `at index ${i},`, + `got ${JSON.stringify(rd)}` + ], options); + } if(typeof rd === 'string'){ rd = Buffer.from(rd, options.encoding); } diff --git a/packages/csv-parse/test/option.record_delimiter.coffee b/packages/csv-parse/test/option.record_delimiter.coffee index df07d5327..01b75370a 100644 --- a/packages/csv-parse/test/option.record_delimiter.coffee +++ b/packages/csv-parse/test/option.record_delimiter.coffee @@ -5,6 +5,89 @@ describe 'Option `record_delimiter`', -> describe 'validation', -> + it 'accepted types', -> + parse 'a,b,c', record_delimiter: undefined, (->) + parse 'a,b,c', record_delimiter: 'string', (->) + parse 'a,b,c', record_delimiter: ['string'], (->) + parse 'a,b,c', record_delimiter: Buffer.from('string'), (->) + parse 'a,b,c', record_delimiter: [Buffer.from('string')], (->) + + it 'non accepted types', -> + (-> + parse 'a,b,c', record_delimiter: '', (->) + ).should.throw + message: [ + 'Invalid option `record_delimiter`:' + 'value must be a non empty string or buffer,' + 'got ""' + ].join ' ' + code: 'CSV_INVALID_OPTION_RECORD_DELIMITER' + (-> + parse 'a,b,c', record_delimiter: Buffer.from(''), (->) + ).should.throw + message: [ + 'Invalid option `record_delimiter`:' + 'value must be a non empty string or buffer,' + 'got {"type":"Buffer","data":[]}' + ].join ' ' + code: 'CSV_INVALID_OPTION_RECORD_DELIMITER' + (-> + parse 'a,b,c', record_delimiter: null, (->) + ).should.throw + message: [ + 'Invalid option `record_delimiter`:' + 'value must be a string, a buffer or array of string|buffer,' + 'got null' + ].join ' ' + code: 'CSV_INVALID_OPTION_RECORD_DELIMITER' + (-> + parse 'a,b,c', record_delimiter: ['a', '', 'b'], (->) + ).should.throw + message: [ + 'Invalid option `record_delimiter`:' + 'value must be a non empty string or buffer' + 'at index 1,' + 'got ""' + ].join ' ' + code: 'CSV_INVALID_OPTION_RECORD_DELIMITER' + (-> + parse 'a,b,c', record_delimiter: ['a', null, 'b'], (->) + ).should.throw + message: [ + 'Invalid option `record_delimiter`:' + 'value must be a string, a buffer or array of string|buffer' + 'at index 1,' + 'got null' + ].join ' ' + code: 'CSV_INVALID_OPTION_RECORD_DELIMITER' + + describe 'usage', -> + + it 'as a string', (next) -> + parse """ + ABC,45::DEF,23 + """, record_delimiter: '::', (err, records) -> + return next err if err + records.should.eql [ + [ 'ABC','45' ] + [ 'DEF','23' ] + ] + next() + + it 'as an array', (next) -> + parse """ + ABC,45::DEF,23\n50,60 + """, record_delimiter: ['::','\n'], (err, records) -> + return next err if err + records.should.eql [ + [ 'ABC','45' ] + [ 'DEF','23' ] + [ '50', '60'] + ] + next() + + describe 'details', -> + it 'is compatible with buffer size', (next) -> parser = parse record_delimiter: ['::::::'], (err, records) -> records.should.eql [ @@ -16,153 +99,130 @@ describe 'Option `record_delimiter`', -> 1,2,3::::::b,c,d """ parser.end() - - it 'as a string', (next) -> - parse """ - ABC,45::DEF,23 - """, record_delimiter: '::', (err, records) -> - return next err if err - records.should.eql [ - [ 'ABC','45' ] - [ 'DEF','23' ] - ] - next() - - it 'as an array', (next) -> - parse """ - ABC,45::DEF,23\n50,60 - """, record_delimiter: ['::','\n'], (err, records) -> - return next err if err - records.should.eql [ - [ 'ABC','45' ] - [ 'DEF','23' ] - [ '50', '60'] - ] - next() - - it 'ensure that delimiter and record_delimiter doesnt match', (next) -> - parse """ - a;b - 11;22; - 33;33; - """, - delimiter: ';' - record_delimiter: [';\n', '\n'] - , (err, records) -> - records.should.eql [ - [ 'a', 'b' ] - [ '11', '22' ] - [ '33', '33' ] - ] unless err - next err + it 'ensure that delimiter and record_delimiter doesnt match', (next) -> + parse """ + a;b + 11;22; + 33;33; + + """, + delimiter: ';' + record_delimiter: [';\n', '\n'] + , (err, records) -> + records.should.eql [ + [ 'a', 'b' ] + [ '11', '22' ] + [ '33', '33' ] + ] unless err + next err - it 'handle new line preceded by a quote when record_delimiter is a string', (next) -> - parse """ - "ABC","45"::"DEF","23"::"GHI","94" - """, record_delimiter: '::', (err, records) -> - return next err if err - records.should.eql [ - [ 'ABC','45' ] - [ 'DEF','23' ] - [ 'GHI','94' ] - ] - next() + it 'handle new line preceded by a quote when record_delimiter is a string', (next) -> + parse """ + "ABC","45"::"DEF","23"::"GHI","94" + """, record_delimiter: '::', (err, records) -> + return next err if err + records.should.eql [ + [ 'ABC','45' ] + [ 'DEF','23' ] + [ 'GHI','94' ] + ] + next() - it 'handle new line preceded by a quote when record_delimiter is an array', (next) -> - parse """ - "ABC","45"::"DEF","23"::"GHI","94"\r\n"JKL","13" - """, record_delimiter: ['::', '\r\n'], (err, records) -> - return next err if err - records.should.eql [ - [ 'ABC','45' ] - [ 'DEF','23' ] - [ 'GHI','94' ] - [ 'JKL','13' ] - ] - next() + it 'handle new line preceded by a quote when record_delimiter is an array', (next) -> + parse """ + "ABC","45"::"DEF","23"::"GHI","94"\r\n"JKL","13" + """, record_delimiter: ['::', '\r\n'], (err, records) -> + return next err if err + records.should.eql [ + [ 'ABC','45' ] + [ 'DEF','23' ] + [ 'GHI','94' ] + [ 'JKL','13' ] + ] + next() - it 'handle chunks of multiple chars when record_delimiter is a string', (next) -> - records = [] - parser = parse record_delimiter: '::' - parser.on 'readable', -> - while d = parser.read() - records.push d - parser.on 'end', -> - records.should.eql [ - [ 'ABC','45' ] - [ 'DEF','23' ] - [ 'GHI','94' ] - [ 'JKL','02' ] - ] - next() - parser.write '"ABC","45"' - parser.write '::"DEF","23":' - parser.write ':"GHI","94"::' - parser.write '"JKL","02"' - parser.end() + it 'handle chunks of multiple chars when record_delimiter is a string', (next) -> + records = [] + parser = parse record_delimiter: '::' + parser.on 'readable', -> + while d = parser.read() + records.push d + parser.on 'end', -> + records.should.eql [ + [ 'ABC','45' ] + [ 'DEF','23' ] + [ 'GHI','94' ] + [ 'JKL','02' ] + ] + next() + parser.write '"ABC","45"' + parser.write '::"DEF","23":' + parser.write ':"GHI","94"::' + parser.write '"JKL","02"' + parser.end() - it 'handle chunks of multiple chars when record_delimiter is an array', (next) -> - records = [] - parser = parse record_delimiter: ['::', '\r'] - parser.on 'readable', -> - while d = parser.read() - records.push d - parser.on 'end', -> - records.should.eql [ - [ 'ABC','45' ] - [ 'DEF','23' ] - [ 'GHI','94' ] - [ 'JKL','02' ] - [ 'MNO','13' ] - ] - next() - parser.write '"ABC","45"' - parser.write '::"DEF","23":' - parser.write ':"GHI","94"::' - parser.write '"JKL","02"\r' - parser.write '"MNO","13"' - parser.end() + it 'handle chunks of multiple chars when record_delimiter is an array', (next) -> + records = [] + parser = parse record_delimiter: ['::', '\r'] + parser.on 'readable', -> + while d = parser.read() + records.push d + parser.on 'end', -> + records.should.eql [ + [ 'ABC','45' ] + [ 'DEF','23' ] + [ 'GHI','94' ] + [ 'JKL','02' ] + [ 'MNO','13' ] + ] + next() + parser.write '"ABC","45"' + parser.write '::"DEF","23":' + parser.write ':"GHI","94"::' + parser.write '"JKL","02"\r' + parser.write '"MNO","13"' + parser.end() - it 'handle chunks of multiple chars without quotes when record_delimiter is a string', (next) -> - records = [] - parser = parse record_delimiter: '::' - parser.on 'readable', -> - while d = parser.read() - records.push d - parser.on 'end', -> - records.should.eql [ - [ 'ABC','45' ] - [ 'DEF','23' ] - [ 'GHI','94' ] - [ 'JKL','02' ] - ] - next() - parser.write 'ABC,45' - parser.write '::DEF,23:' - parser.write ':GHI,94::' - parser.write 'JKL,02' - parser.end() + it 'handle chunks of multiple chars without quotes when record_delimiter is a string', (next) -> + records = [] + parser = parse record_delimiter: '::' + parser.on 'readable', -> + while d = parser.read() + records.push d + parser.on 'end', -> + records.should.eql [ + [ 'ABC','45' ] + [ 'DEF','23' ] + [ 'GHI','94' ] + [ 'JKL','02' ] + ] + next() + parser.write 'ABC,45' + parser.write '::DEF,23:' + parser.write ':GHI,94::' + parser.write 'JKL,02' + parser.end() - it 'handle chunks of multiple chars without quotes when record_delimiter is an array', (next) -> - records = [] - parser = parse record_delimiter: ['::','\n','\r\n'] - parser.on 'readable', -> - while d = parser.read() - records.push d - parser.on 'end', -> - records.should.eql [ - [ 'ABC','45' ] - [ 'DEF','23' ] - [ 'GHI','94' ] - [ 'JKL','02' ] - ] - next() - parser.write 'ABC,45\n' - parser.write 'DEF,23:' - parser.write ':GHI,94\r' - parser.write '\nJKL,02' - parser.end() + it 'handle chunks of multiple chars without quotes when record_delimiter is an array', (next) -> + records = [] + parser = parse record_delimiter: ['::','\n','\r\n'] + parser.on 'readable', -> + while d = parser.read() + records.push d + parser.on 'end', -> + records.should.eql [ + [ 'ABC','45' ] + [ 'DEF','23' ] + [ 'GHI','94' ] + [ 'JKL','02' ] + ] + next() + parser.write 'ABC,45\n' + parser.write 'DEF,23:' + parser.write ':GHI,94\r' + parser.write '\nJKL,02' + parser.end() describe 'auto', ->