diff --git a/packages/csv-stringify/dist/cjs/index.cjs b/packages/csv-stringify/dist/cjs/index.cjs index 59356991..d4769eef 100644 --- a/packages/csv-stringify/dist/cjs/index.cjs +++ b/packages/csv-stringify/dist/cjs/index.cjs @@ -475,8 +475,21 @@ const stringifier = function(options, state, info){ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv-stringify/dist/cjs/sync.cjs b/packages/csv-stringify/dist/cjs/sync.cjs index 1978e275..a0d83508 100644 --- a/packages/csv-stringify/dist/cjs/sync.cjs +++ b/packages/csv-stringify/dist/cjs/sync.cjs @@ -473,8 +473,21 @@ const stringifier = function(options, state, info){ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv-stringify/dist/esm/index.js b/packages/csv-stringify/dist/esm/index.js index fb0be81c..96ca7942 100644 --- a/packages/csv-stringify/dist/esm/index.js +++ b/packages/csv-stringify/dist/esm/index.js @@ -5533,8 +5533,21 @@ const stringifier = function(options, state, info){ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv-stringify/dist/esm/sync.js b/packages/csv-stringify/dist/esm/sync.js index 3954e705..a0f795c7 100644 --- a/packages/csv-stringify/dist/esm/sync.js +++ b/packages/csv-stringify/dist/esm/sync.js @@ -2443,8 +2443,21 @@ const stringifier = function(options, state, info){ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv-stringify/dist/iife/index.js b/packages/csv-stringify/dist/iife/index.js index daad9dcb..6dc014fb 100644 --- a/packages/csv-stringify/dist/iife/index.js +++ b/packages/csv-stringify/dist/iife/index.js @@ -5536,8 +5536,21 @@ var csv_stringify = (function (exports) { } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv-stringify/dist/iife/sync.js b/packages/csv-stringify/dist/iife/sync.js index a36da0d9..5d261a4d 100644 --- a/packages/csv-stringify/dist/iife/sync.js +++ b/packages/csv-stringify/dist/iife/sync.js @@ -2446,8 +2446,21 @@ var csv_stringify_sync = (function (exports) { } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv-stringify/dist/umd/index.js b/packages/csv-stringify/dist/umd/index.js index efed7e3b..c0693f95 100644 --- a/packages/csv-stringify/dist/umd/index.js +++ b/packages/csv-stringify/dist/umd/index.js @@ -5539,8 +5539,21 @@ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv-stringify/dist/umd/sync.js b/packages/csv-stringify/dist/umd/sync.js index c995979e..a617683a 100644 --- a/packages/csv-stringify/dist/umd/sync.js +++ b/packages/csv-stringify/dist/umd/sync.js @@ -2449,8 +2449,21 @@ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv-stringify/lib/api/index.js b/packages/csv-stringify/lib/api/index.js index fa9d5664..80c9f36b 100644 --- a/packages/csv-stringify/lib/api/index.js +++ b/packages/csv-stringify/lib/api/index.js @@ -158,8 +158,21 @@ const stringifier = function(options, state, info){ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv-stringify/test/option.escape_formulas.coffee b/packages/csv-stringify/test/option.escape_formulas.coffee index f7058f3b..fd606031 100644 --- a/packages/csv-stringify/test/option.escape_formulas.coffee +++ b/packages/csv-stringify/test/option.escape_formulas.coffee @@ -19,7 +19,7 @@ describe 'Option `escape_formulas`', -> code: 'CSV_OPTION_ESCAPE_FORMULAS_INVALID_TYPE' message: 'option `escape_formulas` must be a boolean, got "invalid"' - it 'escape =, +, -, @, \\t, \\r signs', (next) -> + it 'escape =, +, -, @, \\t, \\r and unicode equivalent signs', (next) -> stringify [ [ '=a',1] [ '+b',2] @@ -28,6 +28,11 @@ describe 'Option `escape_formulas`', -> [ '\te',5] [ '\rf',6] [ 'g',7] + [ '\uFF1Dh',8] + [ '\uFF0Bi',9] + [ '\uFF0Dj',10] + [ '\uFF20k',11] + [ '\uFF0Cl',12] # \uFF0C is 'full width comma' and should not be escaped ], escape_formulas: true, eof: false, (err, data) -> return next err if err data.should.eql """ @@ -38,6 +43,11 @@ describe 'Option `escape_formulas`', -> '\te,5 '\rf,6 g,7 + '\uFF1Dh,8 + '\uFF0Bi,9 + '\uFF0Dj,10 + '\uFF20k,11 + \uFF0Cl,12 """ next() diff --git a/packages/csv/dist/cjs/index.cjs b/packages/csv/dist/cjs/index.cjs index 8dbf7e0e..54b6d0f0 100644 --- a/packages/csv/dist/cjs/index.cjs +++ b/packages/csv/dist/cjs/index.cjs @@ -2271,8 +2271,21 @@ const stringifier = function(options, state, info){ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv/dist/cjs/sync.cjs b/packages/csv/dist/cjs/sync.cjs index ab358cf4..01772180 100644 --- a/packages/csv/dist/cjs/sync.cjs +++ b/packages/csv/dist/cjs/sync.cjs @@ -2048,8 +2048,21 @@ const stringifier = function(options, state, info){ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv/dist/esm/index.js b/packages/csv/dist/esm/index.js index 865ba570..e0d52851 100644 --- a/packages/csv/dist/esm/index.js +++ b/packages/csv/dist/esm/index.js @@ -7398,8 +7398,21 @@ const stringifier = function(options, state, info){ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv/dist/esm/sync.js b/packages/csv/dist/esm/sync.js index f36c4bf1..863d443a 100644 --- a/packages/csv/dist/esm/sync.js +++ b/packages/csv/dist/esm/sync.js @@ -7175,8 +7175,21 @@ const stringifier = function(options, state, info){ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv/dist/iife/index.js b/packages/csv/dist/iife/index.js index 8579af30..d4a39ff3 100644 --- a/packages/csv/dist/iife/index.js +++ b/packages/csv/dist/iife/index.js @@ -7401,8 +7401,21 @@ var csv = (function (exports) { } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv/dist/iife/sync.js b/packages/csv/dist/iife/sync.js index 5718c67f..e19d3fd6 100644 --- a/packages/csv/dist/iife/sync.js +++ b/packages/csv/dist/iife/sync.js @@ -7178,8 +7178,21 @@ var csv_sync = (function (exports) { } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv/dist/umd/index.js b/packages/csv/dist/umd/index.js index 841c7e67..856e10fb 100644 --- a/packages/csv/dist/umd/index.js +++ b/packages/csv/dist/umd/index.js @@ -7404,8 +7404,21 @@ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){ diff --git a/packages/csv/dist/umd/sync.js b/packages/csv/dist/umd/sync.js index 51b9584d..9a4ba5db 100644 --- a/packages/csv/dist/umd/sync.js +++ b/packages/csv/dist/umd/sync.js @@ -7181,8 +7181,21 @@ } }); quotedMatch = quotedMatch && quotedMatch.length > 0; - if (escape_formulas && ['=', '+', '-', '@', '\t', '\r'].includes(value[0])) { - value = `'${value}`; + if (escape_formulas) { + switch (value[0]) { + case '=': + case '+': + case '-': + case '@': + case '\t': + case '\r': + case '\uFF1D': // Unicode '=' + case '\uFF0B': // Unicode '+' + case '\uFF0D': // Unicode '-' + case '\uFF20': // Unicode '@' + value = `'${value}`; + break; + } } const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch; if(shouldQuote === true && containsEscape === true){