Skip to content

Commit 67b7da8

Browse files
committed
feat(csv-parse): improve record_delimiter validation
1 parent 67053ab commit 67b7da8

File tree

10 files changed

+479
-167
lines changed

10 files changed

+479
-167
lines changed

packages/csv-parse/dist/cjs/index.cjs

+31-3
Original file line numberDiff line numberDiff line change
@@ -5386,12 +5386,40 @@ class Parser extends Transform {
53865386
throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);
53875387
}
53885388
// Normalize option `record_delimiter`
5389-
if(!options.record_delimiter){
5389+
if(options.record_delimiter === undefined){
53905390
options.record_delimiter = [];
5391-
}else if(!Array.isArray(options.record_delimiter)){
5391+
}else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter) ){
5392+
if(options.record_delimiter.length === 0){
5393+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5394+
'Invalid option `record_delimiter`:',
5395+
'value must be a non empty string or buffer,',
5396+
`got ${JSON.stringify(options.record_delimiter)}`
5397+
], options);
5398+
}
53925399
options.record_delimiter = [options.record_delimiter];
5400+
}else if(!Array.isArray(options.record_delimiter)){
5401+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5402+
'Invalid option `record_delimiter`:',
5403+
'value must be a string, a buffer or array of string|buffer,',
5404+
`got ${JSON.stringify(options.record_delimiter)}`
5405+
], options);
53935406
}
5394-
options.record_delimiter = options.record_delimiter.map(function(rd){
5407+
options.record_delimiter = options.record_delimiter.map(function(rd, i){
5408+
if(typeof rd !== 'string' && ! isBuffer(rd) ){
5409+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5410+
'Invalid option `record_delimiter`:',
5411+
'value must be a string, a buffer or array of string|buffer',
5412+
`at index ${i},`,
5413+
`got ${JSON.stringify(rd)}`
5414+
], options);
5415+
}else if(rd.length === 0){
5416+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5417+
'Invalid option `record_delimiter`:',
5418+
'value must be a non empty string or buffer',
5419+
`at index ${i},`,
5420+
`got ${JSON.stringify(rd)}`
5421+
], options);
5422+
}
53955423
if(typeof rd === 'string'){
53965424
rd = Buffer.from(rd, options.encoding);
53975425
}

packages/csv-parse/dist/cjs/sync.cjs

+31-3
Original file line numberDiff line numberDiff line change
@@ -5386,12 +5386,40 @@ class Parser extends Transform {
53865386
throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);
53875387
}
53885388
// Normalize option `record_delimiter`
5389-
if(!options.record_delimiter){
5389+
if(options.record_delimiter === undefined){
53905390
options.record_delimiter = [];
5391-
}else if(!Array.isArray(options.record_delimiter)){
5391+
}else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter)){
5392+
if(options.record_delimiter.length === 0){
5393+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5394+
'Invalid option `record_delimiter`:',
5395+
'value must be a non empty string or buffer,',
5396+
`got ${JSON.stringify(options.record_delimiter)}`
5397+
], options);
5398+
}
53925399
options.record_delimiter = [options.record_delimiter];
5400+
}else if(!Array.isArray(options.record_delimiter)){
5401+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5402+
'Invalid option `record_delimiter`:',
5403+
'value must be a string, a buffer or array of string|buffer,',
5404+
`got ${JSON.stringify(options.record_delimiter)}`
5405+
], options);
53935406
}
5394-
options.record_delimiter = options.record_delimiter.map(function(rd){
5407+
options.record_delimiter = options.record_delimiter.map(function(rd, i){
5408+
if(typeof rd !== 'string' && ! isBuffer(rd)){
5409+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5410+
'Invalid option `record_delimiter`:',
5411+
'value must be a string, a buffer or array of string|buffer',
5412+
`at index ${i},`,
5413+
`got ${JSON.stringify(rd)}`
5414+
], options);
5415+
}else if(rd.length === 0){
5416+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5417+
'Invalid option `record_delimiter`:',
5418+
'value must be a non empty string or buffer',
5419+
`at index ${i},`,
5420+
`got ${JSON.stringify(rd)}`
5421+
], options);
5422+
}
53955423
if(typeof rd === 'string'){
53965424
rd = Buffer.from(rd, options.encoding);
53975425
}

packages/csv-parse/dist/esm/index.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -5382,12 +5382,40 @@ class Parser extends Transform {
53825382
throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);
53835383
}
53845384
// Normalize option `record_delimiter`
5385-
if(!options.record_delimiter){
5385+
if(options.record_delimiter === undefined){
53865386
options.record_delimiter = [];
5387-
}else if(!Array.isArray(options.record_delimiter)){
5387+
}else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter) ){
5388+
if(options.record_delimiter.length === 0){
5389+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5390+
'Invalid option `record_delimiter`:',
5391+
'value must be a non empty string or buffer,',
5392+
`got ${JSON.stringify(options.record_delimiter)}`
5393+
], options);
5394+
}
53885395
options.record_delimiter = [options.record_delimiter];
5396+
}else if(!Array.isArray(options.record_delimiter)){
5397+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5398+
'Invalid option `record_delimiter`:',
5399+
'value must be a string, a buffer or array of string|buffer,',
5400+
`got ${JSON.stringify(options.record_delimiter)}`
5401+
], options);
53895402
}
5390-
options.record_delimiter = options.record_delimiter.map(function(rd){
5403+
options.record_delimiter = options.record_delimiter.map(function(rd, i){
5404+
if(typeof rd !== 'string' && ! isBuffer(rd) ){
5405+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5406+
'Invalid option `record_delimiter`:',
5407+
'value must be a string, a buffer or array of string|buffer',
5408+
`at index ${i},`,
5409+
`got ${JSON.stringify(rd)}`
5410+
], options);
5411+
}else if(rd.length === 0){
5412+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5413+
'Invalid option `record_delimiter`:',
5414+
'value must be a non empty string or buffer',
5415+
`at index ${i},`,
5416+
`got ${JSON.stringify(rd)}`
5417+
], options);
5418+
}
53915419
if(typeof rd === 'string'){
53925420
rd = Buffer.from(rd, options.encoding);
53935421
}

packages/csv-parse/dist/esm/sync.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -5382,12 +5382,40 @@ class Parser extends Transform {
53825382
throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);
53835383
}
53845384
// Normalize option `record_delimiter`
5385-
if(!options.record_delimiter){
5385+
if(options.record_delimiter === undefined){
53865386
options.record_delimiter = [];
5387-
}else if(!Array.isArray(options.record_delimiter)){
5387+
}else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter)){
5388+
if(options.record_delimiter.length === 0){
5389+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5390+
'Invalid option `record_delimiter`:',
5391+
'value must be a non empty string or buffer,',
5392+
`got ${JSON.stringify(options.record_delimiter)}`
5393+
], options);
5394+
}
53885395
options.record_delimiter = [options.record_delimiter];
5396+
}else if(!Array.isArray(options.record_delimiter)){
5397+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5398+
'Invalid option `record_delimiter`:',
5399+
'value must be a string, a buffer or array of string|buffer,',
5400+
`got ${JSON.stringify(options.record_delimiter)}`
5401+
], options);
53895402
}
5390-
options.record_delimiter = options.record_delimiter.map(function(rd){
5403+
options.record_delimiter = options.record_delimiter.map(function(rd, i){
5404+
if(typeof rd !== 'string' && ! isBuffer(rd)){
5405+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5406+
'Invalid option `record_delimiter`:',
5407+
'value must be a string, a buffer or array of string|buffer',
5408+
`at index ${i},`,
5409+
`got ${JSON.stringify(rd)}`
5410+
], options);
5411+
}else if(rd.length === 0){
5412+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5413+
'Invalid option `record_delimiter`:',
5414+
'value must be a non empty string or buffer',
5415+
`at index ${i},`,
5416+
`got ${JSON.stringify(rd)}`
5417+
], options);
5418+
}
53915419
if(typeof rd === 'string'){
53925420
rd = Buffer.from(rd, options.encoding);
53935421
}

packages/csv-parse/dist/iife/index.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -5385,12 +5385,40 @@ var csv_parse = (function (exports) {
53855385
throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);
53865386
}
53875387
// Normalize option `record_delimiter`
5388-
if(!options.record_delimiter){
5388+
if(options.record_delimiter === undefined){
53895389
options.record_delimiter = [];
5390-
}else if(!Array.isArray(options.record_delimiter)){
5390+
}else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter) ){
5391+
if(options.record_delimiter.length === 0){
5392+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5393+
'Invalid option `record_delimiter`:',
5394+
'value must be a non empty string or buffer,',
5395+
`got ${JSON.stringify(options.record_delimiter)}`
5396+
], options);
5397+
}
53915398
options.record_delimiter = [options.record_delimiter];
5399+
}else if(!Array.isArray(options.record_delimiter)){
5400+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5401+
'Invalid option `record_delimiter`:',
5402+
'value must be a string, a buffer or array of string|buffer,',
5403+
`got ${JSON.stringify(options.record_delimiter)}`
5404+
], options);
53925405
}
5393-
options.record_delimiter = options.record_delimiter.map(function(rd){
5406+
options.record_delimiter = options.record_delimiter.map(function(rd, i){
5407+
if(typeof rd !== 'string' && ! isBuffer(rd) ){
5408+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5409+
'Invalid option `record_delimiter`:',
5410+
'value must be a string, a buffer or array of string|buffer',
5411+
`at index ${i},`,
5412+
`got ${JSON.stringify(rd)}`
5413+
], options);
5414+
}else if(rd.length === 0){
5415+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5416+
'Invalid option `record_delimiter`:',
5417+
'value must be a non empty string or buffer',
5418+
`at index ${i},`,
5419+
`got ${JSON.stringify(rd)}`
5420+
], options);
5421+
}
53945422
if(typeof rd === 'string'){
53955423
rd = Buffer.from(rd, options.encoding);
53965424
}

packages/csv-parse/dist/iife/sync.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -5385,12 +5385,40 @@ var csv_parse_sync = (function (exports) {
53855385
throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);
53865386
}
53875387
// Normalize option `record_delimiter`
5388-
if(!options.record_delimiter){
5388+
if(options.record_delimiter === undefined){
53895389
options.record_delimiter = [];
5390-
}else if(!Array.isArray(options.record_delimiter)){
5390+
}else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter)){
5391+
if(options.record_delimiter.length === 0){
5392+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5393+
'Invalid option `record_delimiter`:',
5394+
'value must be a non empty string or buffer,',
5395+
`got ${JSON.stringify(options.record_delimiter)}`
5396+
], options);
5397+
}
53915398
options.record_delimiter = [options.record_delimiter];
5399+
}else if(!Array.isArray(options.record_delimiter)){
5400+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5401+
'Invalid option `record_delimiter`:',
5402+
'value must be a string, a buffer or array of string|buffer,',
5403+
`got ${JSON.stringify(options.record_delimiter)}`
5404+
], options);
53925405
}
5393-
options.record_delimiter = options.record_delimiter.map(function(rd){
5406+
options.record_delimiter = options.record_delimiter.map(function(rd, i){
5407+
if(typeof rd !== 'string' && ! isBuffer(rd)){
5408+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5409+
'Invalid option `record_delimiter`:',
5410+
'value must be a string, a buffer or array of string|buffer',
5411+
`at index ${i},`,
5412+
`got ${JSON.stringify(rd)}`
5413+
], options);
5414+
}else if(rd.length === 0){
5415+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5416+
'Invalid option `record_delimiter`:',
5417+
'value must be a non empty string or buffer',
5418+
`at index ${i},`,
5419+
`got ${JSON.stringify(rd)}`
5420+
], options);
5421+
}
53945422
if(typeof rd === 'string'){
53955423
rd = Buffer.from(rd, options.encoding);
53965424
}

packages/csv-parse/dist/umd/index.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -5388,12 +5388,40 @@
53885388
throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);
53895389
}
53905390
// Normalize option `record_delimiter`
5391-
if(!options.record_delimiter){
5391+
if(options.record_delimiter === undefined){
53925392
options.record_delimiter = [];
5393-
}else if(!Array.isArray(options.record_delimiter)){
5393+
}else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter) ){
5394+
if(options.record_delimiter.length === 0){
5395+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5396+
'Invalid option `record_delimiter`:',
5397+
'value must be a non empty string or buffer,',
5398+
`got ${JSON.stringify(options.record_delimiter)}`
5399+
], options);
5400+
}
53945401
options.record_delimiter = [options.record_delimiter];
5402+
}else if(!Array.isArray(options.record_delimiter)){
5403+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5404+
'Invalid option `record_delimiter`:',
5405+
'value must be a string, a buffer or array of string|buffer,',
5406+
`got ${JSON.stringify(options.record_delimiter)}`
5407+
], options);
53955408
}
5396-
options.record_delimiter = options.record_delimiter.map(function(rd){
5409+
options.record_delimiter = options.record_delimiter.map(function(rd, i){
5410+
if(typeof rd !== 'string' && ! isBuffer(rd) ){
5411+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5412+
'Invalid option `record_delimiter`:',
5413+
'value must be a string, a buffer or array of string|buffer',
5414+
`at index ${i},`,
5415+
`got ${JSON.stringify(rd)}`
5416+
], options);
5417+
}else if(rd.length === 0){
5418+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5419+
'Invalid option `record_delimiter`:',
5420+
'value must be a non empty string or buffer',
5421+
`at index ${i},`,
5422+
`got ${JSON.stringify(rd)}`
5423+
], options);
5424+
}
53975425
if(typeof rd === 'string'){
53985426
rd = Buffer.from(rd, options.encoding);
53995427
}

packages/csv-parse/dist/umd/sync.js

+31-3
Original file line numberDiff line numberDiff line change
@@ -5388,12 +5388,40 @@
53885388
throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);
53895389
}
53905390
// Normalize option `record_delimiter`
5391-
if(!options.record_delimiter){
5391+
if(options.record_delimiter === undefined){
53925392
options.record_delimiter = [];
5393-
}else if(!Array.isArray(options.record_delimiter)){
5393+
}else if(typeof options.record_delimiter === 'string' || isBuffer(options.record_delimiter)){
5394+
if(options.record_delimiter.length === 0){
5395+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5396+
'Invalid option `record_delimiter`:',
5397+
'value must be a non empty string or buffer,',
5398+
`got ${JSON.stringify(options.record_delimiter)}`
5399+
], options);
5400+
}
53945401
options.record_delimiter = [options.record_delimiter];
5402+
}else if(!Array.isArray(options.record_delimiter)){
5403+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5404+
'Invalid option `record_delimiter`:',
5405+
'value must be a string, a buffer or array of string|buffer,',
5406+
`got ${JSON.stringify(options.record_delimiter)}`
5407+
], options);
53955408
}
5396-
options.record_delimiter = options.record_delimiter.map(function(rd){
5409+
options.record_delimiter = options.record_delimiter.map(function(rd, i){
5410+
if(typeof rd !== 'string' && ! isBuffer(rd)){
5411+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5412+
'Invalid option `record_delimiter`:',
5413+
'value must be a string, a buffer or array of string|buffer',
5414+
`at index ${i},`,
5415+
`got ${JSON.stringify(rd)}`
5416+
], options);
5417+
}else if(rd.length === 0){
5418+
throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [
5419+
'Invalid option `record_delimiter`:',
5420+
'value must be a non empty string or buffer',
5421+
`at index ${i},`,
5422+
`got ${JSON.stringify(rd)}`
5423+
], options);
5424+
}
53975425
if(typeof rd === 'string'){
53985426
rd = Buffer.from(rd, options.encoding);
53995427
}

0 commit comments

Comments
 (0)