Comparing version 4.1.1 to 4.1.2
{ | ||
"name": "papaparse", | ||
"version": "4.1.1", | ||
"version": "4.1.2", | ||
"description": "Fast and powerful CSV parser for the browser that supports web workers and streaming large files. Converts CSV to JSON and JSON to CSV.", | ||
@@ -44,11 +44,18 @@ "keywords": [ | ||
"devDependencies": { | ||
"chai": "^3.0.0", | ||
"connect": "^3.3.3", | ||
"grunt": "^0.4.5", | ||
"grunt-contrib-uglify": "^0.6.0", | ||
"mocha": "^2.2.5", | ||
"mocha-phantomjs": "^3.5.4", | ||
"open": "0.0.5", | ||
"phantomjs": "1.9.1 - 1.9.7-15", | ||
"serve-static": "^1.7.1" | ||
}, | ||
"scripts": { | ||
"test": "node tests/test.js" | ||
"test-browser": "node tests/test.js", | ||
"test-phantomjs": "node tests/test.js --phantomjs", | ||
"test-node": "mocha tests/node-tests.js tests/test-cases.js", | ||
"test": "npm run test-node && npm run test-phantomjs" | ||
} | ||
} |
102
papaparse.js
/*! | ||
Papa Parse | ||
v4.1.1 | ||
v4.1.2 | ||
https://github.com/mholt/PapaParse | ||
@@ -10,3 +10,5 @@ */ | ||
var IS_WORKER = (!global.document && !!global.postMessage), LOADED_SYNC = false, AUTO_SCRIPT_PATH; | ||
var IS_WORKER = !global.document && !!global.postMessage, | ||
IS_PAPA_WORKER = IS_WORKER && /(\?|&)papaworker(=|&|$)/.test(global.location.search), | ||
LOADED_SYNC = false, AUTO_SCRIPT_PATH; | ||
var workers = {}, workerIdCounter = 0; | ||
@@ -23,3 +25,3 @@ | ||
Papa.BAD_DELIMITERS = ["\r", "\n", "\"", Papa.BYTE_ORDER_MARK]; | ||
Papa.WORKERS_SUPPORTED = !!global.Worker; | ||
Papa.WORKERS_SUPPORTED = !IS_WORKER && !!global.Worker; | ||
Papa.SCRIPT_PATH = null; // Must be set by your code if you use workers and this lib is loaded asynchronously | ||
@@ -30,3 +32,3 @@ | ||
Papa.RemoteChunkSize = 1024 * 1024 * 5; // 5 MB | ||
Papa.DefaultDelimiter = ","; // Used if not specified and detection fails | ||
Papa.DefaultDelimiter = ","; // Used if not specified and detection fails | ||
@@ -48,3 +50,3 @@ // Exposed for testing and development only | ||
// Wireup with RequireJS | ||
global.define(function() { return Papa; }); | ||
define(function() { return Papa; }); | ||
} | ||
@@ -152,3 +154,3 @@ else | ||
if (IS_WORKER) | ||
if (IS_PAPA_WORKER) | ||
{ | ||
@@ -231,6 +233,12 @@ global.onmessage = workerThreadReceivedMessage; | ||
// Default configuration | ||
var _quotes = false; // whether to surround every datum with quotes | ||
var _delimiter = ","; // delimiting character | ||
var _newline = "\r\n"; // newline character(s) | ||
/** whether to surround every datum with quotes */ | ||
var _quotes = false; | ||
/** delimiting character */ | ||
var _delimiter = ","; | ||
/** newline character(s) */ | ||
var _newline = "\r\n"; | ||
unpackConfig(); | ||
@@ -292,3 +300,3 @@ | ||
// Turns an object's keys into an array | ||
/** Turns an object's keys into an array */ | ||
function objectKeys(obj) | ||
@@ -304,3 +312,3 @@ { | ||
// The double for loop that iterates the data and writes out a CSV string including header row | ||
/** The double for loop that iterates the data and writes out a CSV string including header row */ | ||
function serialize(fields, data) | ||
@@ -351,3 +359,3 @@ { | ||
// Encloses a value around quotes if needed (makes a value safe for CSV insertion) | ||
/** Encloses a value around quotes if needed (makes a value safe for CSV insertion) */ | ||
function safe(str, col) | ||
@@ -379,3 +387,3 @@ { | ||
// ChunkStreamer is the base prototype for various streamer implementations. | ||
/** ChunkStreamer is the base prototype for various streamer implementations. */ | ||
function ChunkStreamer(config) | ||
@@ -392,2 +400,3 @@ { | ||
this._nextChunk = null; | ||
this.isFirstChunk = true; | ||
this._completeResults = { | ||
@@ -402,2 +411,11 @@ data: [], | ||
{ | ||
// First chunk pre-processing | ||
if (this.isFirstChunk && isFunction(this._config.beforeFirstChunk)) | ||
{ | ||
var modifiedChunk = this._config.beforeFirstChunk(chunk); | ||
if (modifiedChunk !== undefined) | ||
chunk = modifiedChunk; | ||
} | ||
this.isFirstChunk = false; | ||
// Rejoin the line we likely just split in two by chunking the file | ||
@@ -425,3 +443,3 @@ var aggregate = this._partialLine + chunk; | ||
if (IS_WORKER) | ||
if (IS_PAPA_WORKER) | ||
{ | ||
@@ -462,3 +480,3 @@ global.postMessage({ | ||
this._config.error(error); | ||
else if (IS_WORKER && this._config.error) | ||
else if (IS_PAPA_WORKER && this._config.error) | ||
{ | ||
@@ -477,3 +495,5 @@ global.postMessage({ | ||
var configCopy = copy(config); | ||
configCopy.chunkSize = parseInt(configCopy.chunkSize); // VERY important so we don't concatenate strings! | ||
configCopy.chunkSize = parseInt(configCopy.chunkSize); // parseInt VERY important so we don't concatenate strings! | ||
if (!config.step && !config.chunk) | ||
configCopy.chunkSize = null; // disable Range header if not streaming; bad values break IIS - see issue #196 | ||
this._handle = new ParserHandle(configCopy); | ||
@@ -727,5 +747,7 @@ this._handle.streamer = this; | ||
// Parses input. Most users won't need, and shouldn't mess with, the baseIndex | ||
// and ignoreLastRow parameters. They are used by streamers (wrapper functions) | ||
// when an input comes in multiple chunks, like from a file. | ||
/** | ||
* Parses input. Most users won't need, and shouldn't mess with, the baseIndex | ||
* and ignoreLastRow parameters. They are used by streamers (wrapper functions) | ||
* when an input comes in multiple chunks, like from a file. | ||
*/ | ||
this.parse = function(input, baseIndex, ignoreLastRow) | ||
@@ -912,3 +934,4 @@ { | ||
avgFieldCount /= preview.data.length; | ||
if (preview.data.length > 0) | ||
avgFieldCount /= preview.data.length; | ||
@@ -971,3 +994,3 @@ if ((typeof bestDelta === 'undefined' || delta < bestDelta) | ||
// The core parser implements speedy and correct CSV parsing | ||
/** The core parser implements speedy and correct CSV parsing */ | ||
function Parser(config) | ||
@@ -1194,4 +1217,6 @@ { | ||
// Appends the remaining input from cursor to the end into | ||
// row, saves the row, calls step, and returns the results. | ||
/** | ||
* Appends the remaining input from cursor to the end into | ||
* row, saves the row, calls step, and returns the results. | ||
*/ | ||
function finish(value) | ||
@@ -1201,3 +1226,3 @@ { | ||
return returnable(); | ||
if (!value) | ||
if (typeof value === 'undefined') | ||
value = input.substr(cursor); | ||
@@ -1212,6 +1237,8 @@ row.push(value); | ||
// Appends the current row to the results. It sets the cursor | ||
// to newCursor and finds the nextNewline. The caller should | ||
// take care to execute user's step function and check for | ||
// preview and end parsing if necessary. | ||
/** | ||
* Appends the current row to the results. It sets the cursor | ||
* to newCursor and finds the nextNewline. The caller should | ||
* take care to execute user's step function and check for | ||
* preview and end parsing if necessary. | ||
*/ | ||
function saveRow(newCursor) | ||
@@ -1225,3 +1252,3 @@ { | ||
// Returns an object with the results, errors, and meta. | ||
/** Returns an object with the results, errors, and meta. */ | ||
function returnable(stopped) | ||
@@ -1242,3 +1269,3 @@ { | ||
// Executes the user's step function and resets data & errors. | ||
/** Executes the user's step function and resets data & errors. */ | ||
function doStep() | ||
@@ -1251,3 +1278,3 @@ { | ||
// Sets the abort flag | ||
/** Sets the abort flag */ | ||
this.abort = function() | ||
@@ -1258,3 +1285,3 @@ { | ||
// Gets the cursor position | ||
/** Gets the cursor position */ | ||
this.getCharIndex = function() | ||
@@ -1284,3 +1311,6 @@ { | ||
); | ||
var w = new global.Worker(Papa.SCRIPT_PATH || AUTO_SCRIPT_PATH); | ||
var workerUrl = Papa.SCRIPT_PATH || AUTO_SCRIPT_PATH; | ||
// Append "papaworker" to the search string to tell papaparse that this is our worker. | ||
workerUrl += (workerUrl.indexOf('?') !== -1 ? '&' : '?') + 'papaworker'; | ||
var w = new global.Worker(workerUrl); | ||
w.onmessage = mainThreadReceivedMessage; | ||
@@ -1292,3 +1322,3 @@ w.id = workerIdCounter++; | ||
// Callback when main thread receives a message | ||
/** Callback when main thread receives a message */ | ||
function mainThreadReceivedMessage(e) | ||
@@ -1352,3 +1382,3 @@ { | ||
// Callback when worker thread receives a message | ||
/** Callback when worker thread receives a message */ | ||
function workerThreadReceivedMessage(e) | ||
@@ -1381,3 +1411,3 @@ { | ||
// Makes a deep copy of an array or object (mostly) | ||
/** Makes a deep copy of an array or object (mostly) */ | ||
function copy(obj) | ||
@@ -1384,0 +1414,0 @@ { |
/*! | ||
Papa Parse | ||
v4.1.1 | ||
v4.1.2 | ||
https://github.com/mholt/PapaParse | ||
*/ | ||
!function(e){"use strict";function t(t,r){if(r=r||{},r.worker&&w.WORKERS_SUPPORTED){var n=h();return n.userStep=r.step,n.userChunk=r.chunk,n.userComplete=r.complete,n.userError=r.error,r.step=m(r.step),r.chunk=m(r.chunk),r.complete=m(r.complete),r.error=m(r.error),delete r.worker,void n.postMessage({input:t,config:r,workerId:n.id})}var o=null;return"string"==typeof t?o=r.download?new i(r):new a(r):(e.File&&t instanceof File||t instanceof Object)&&(o=new s(r)),o.stream(t)}function r(e,t){function r(){"object"==typeof t&&("string"==typeof t.delimiter&&1==t.delimiter.length&&-1==w.BAD_DELIMITERS.indexOf(t.delimiter)&&(u=t.delimiter),("boolean"==typeof t.quotes||t.quotes instanceof Array)&&(o=t.quotes),"string"==typeof t.newline&&(f=t.newline))}function n(e){if("object"!=typeof e)return[];var t=[];for(var r in e)t.push(r);return t}function i(e,t){var r="";"string"==typeof e&&(e=JSON.parse(e)),"string"==typeof t&&(t=JSON.parse(t));var n=e instanceof Array&&e.length>0,i=!(t[0]instanceof Array);if(n){for(var a=0;a<e.length;a++)a>0&&(r+=u),r+=s(e[a],a);t.length>0&&(r+=f)}for(var o=0;o<t.length;o++){for(var h=n?e.length:t[o].length,d=0;h>d;d++){d>0&&(r+=u);var c=n&&i?e[d]:d;r+=s(t[o][c],d)}o<t.length-1&&(r+=f)}return r}function s(e,t){if("undefined"==typeof e||null===e)return"";e=e.toString().replace(/"/g,'""');var r="boolean"==typeof o&&o||o instanceof Array&&o[t]||a(e,w.BAD_DELIMITERS)||e.indexOf(u)>-1||" "==e.charAt(0)||" "==e.charAt(e.length-1);return r?'"'+e+'"':e}function a(e,t){for(var r=0;r<t.length;r++)if(e.indexOf(t[r])>-1)return!0;return!1}var o=!1,u=",",f="\r\n";if(r(),"string"==typeof e&&(e=JSON.parse(e)),e instanceof Array){if(!e.length||e[0]instanceof Array)return i(null,e);if("object"==typeof e[0])return i(n(e[0]),e)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),e.data instanceof Array&&(e.fields||(e.fields=e.data[0]instanceof Array?e.fields:n(e.data[0])),e.data[0]instanceof Array||"object"==typeof e.data[0]||(e.data=[e.data])),i(e.fields||[],e.data||[]);throw"exception: Unable to serialize unrecognized input"}function n(t){function r(e){var t=_(e);t.chunkSize=parseInt(t.chunkSize),this._handle=new o(t),this._handle.streamer=this,this._config=t}this._handle=null,this._paused=!1,this._finished=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this._completeResults={data:[],errors:[],meta:{}},r.call(this,t),this.parseChunk=function(t){var r=this._partialLine+t;this._partialLine="";var n=this._handle.parse(r,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var i=n.meta.cursor;this._finished||(this._partialLine=r.substring(i-this._baseIndex),this._baseIndex=i),n&&n.data&&(this._rowCount+=n.data.length);var s=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(k)e.postMessage({results:n,workerId:w.WORKER_ID,finished:s});else if(m(this._config.chunk)){if(this._config.chunk(n,this._handle),this._paused)return;n=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(n.data),this._completeResults.errors=this._completeResults.errors.concat(n.errors),this._completeResults.meta=n.meta),!s||!m(this._config.complete)||n&&n.meta.aborted||this._config.complete(this._completeResults),s||n&&n.meta.paused||this._nextChunk(),n}},this._sendError=function(t){m(this._config.error)?this._config.error(t):k&&this._config.error&&e.postMessage({workerId:w.WORKER_ID,error:t,finished:!1})}}function i(e){function t(e){var t=e.getResponseHeader("Content-Range");return parseInt(t.substr(t.lastIndexOf("/")+1))}e=e||{},e.chunkSize||(e.chunkSize=w.RemoteChunkSize),n.call(this,e);var r;this._nextChunk=k?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)return void this._chunkLoaded();if(r=new XMLHttpRequest,k||(r.onload=g(this._chunkLoaded,this),r.onerror=g(this._chunkError,this)),r.open("GET",this._input,!k),this._config.chunkSize){var e=this._start+this._config.chunkSize-1;r.setRequestHeader("Range","bytes="+this._start+"-"+e),r.setRequestHeader("If-None-Match","webkit-no-cache")}try{r.send()}catch(t){this._chunkError(t.message)}k&&0==r.status?this._chunkError():this._start+=this._config.chunkSize},this._chunkLoaded=function(){if(4==r.readyState){if(r.status<200||r.status>=400)return void this._chunkError();this._finished=!this._config.chunkSize||this._start>t(r),this.parseChunk(r.responseText)}},this._chunkError=function(e){var t=r.statusText||e;this._sendError(t)}}function s(e){e=e||{},e.chunkSize||(e.chunkSize=w.LocalChunkSize),n.call(this,e);var t,r,i="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,i?(t=new FileReader,t.onload=g(this._chunkLoaded,this),t.onerror=g(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var e=this._input;if(this._config.chunkSize){var n=Math.min(this._start+this._config.chunkSize,this._input.size);e=r.call(e,this._start,n)}var s=t.readAsText(e,this._config.encoding);i||this._chunkLoaded({target:{result:s}})},this._chunkLoaded=function(e){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function a(e){e=e||{},n.call(this,e);var t,r;this.stream=function(e){return t=e,r=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e=this._config.chunkSize,t=e?r.substr(0,e):r;return r=e?r.substr(e):"",this._finished=!r,this.parseChunk(t)}}}function o(e){function t(){if(b&&c&&(f("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+w.DefaultDelimiter+"'"),c=!1),e.skipEmptyLines)for(var t=0;t<b.data.length;t++)1==b.data[t].length&&""==b.data[t][0]&&b.data.splice(t--,1);return r()&&n(),i()}function r(){return e.header&&0==y.length}function n(){if(b){for(var e=0;r()&&e<b.data.length;e++)for(var t=0;t<b.data[e].length;t++)y.push(b.data[e][t]);b.data.splice(0,1)}}function i(){if(!b||!e.header&&!e.dynamicTyping)return b;for(var t=0;t<b.data.length;t++){for(var r={},n=0;n<b.data[t].length;n++){if(e.dynamicTyping){var i=b.data[t][n];b.data[t][n]="true"==i||"TRUE"==i?!0:"false"==i||"FALSE"==i?!1:o(i)}e.header&&(n>=y.length?(r.__parsed_extra||(r.__parsed_extra=[]),r.__parsed_extra.push(b.data[t][n])):r[y[n]]=b.data[t][n])}e.header&&(b.data[t]=r,n>y.length?f("FieldMismatch","TooManyFields","Too many fields: expected "+y.length+" fields but parsed "+n,t):n<y.length&&f("FieldMismatch","TooFewFields","Too few fields: expected "+y.length+" fields but parsed "+n,t))}return e.header&&b.meta&&(b.meta.fields=y),b}function s(t){for(var r,n,i,s=[","," ","|",";",w.RECORD_SEP,w.UNIT_SEP],a=0;a<s.length;a++){var o=s[a],f=0,h=0;i=void 0;for(var d=new u({delimiter:o,preview:10}).parse(t),c=0;c<d.data.length;c++){var l=d.data[c].length;h+=l,"undefined"!=typeof i?l>1&&(f+=Math.abs(l-i),i=l):i=l}h/=d.data.length,("undefined"==typeof n||n>f)&&h>1.99&&(n=f,r=o)}return e.delimiter=r,{successful:!!r,bestDelimiter:r}}function a(e){e=e.substr(0,1048576);var t=e.split("\r");if(1==t.length)return"\n";for(var r=0,n=0;n<t.length;n++)"\n"==t[n][0]&&r++;return r>=t.length/2?"\r\n":"\r"}function o(e){var t=l.test(e);return t?parseFloat(e):e}function f(e,t,r,n){b.errors.push({type:e,code:t,message:r,row:n})}var h,d,c,l=/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i,p=this,g=0,v=!1,k=!1,y=[],b={data:[],errors:[],meta:{}};if(m(e.step)){var R=e.step;e.step=function(n){if(b=n,r())t();else{if(t(),0==b.data.length)return;g+=n.data.length,e.preview&&g>e.preview?d.abort():R(b,p)}}}this.parse=function(r,n,i){if(e.newline||(e.newline=a(r)),c=!1,!e.delimiter){var o=s(r);o.successful?e.delimiter=o.bestDelimiter:(c=!0,e.delimiter=w.DefaultDelimiter),b.meta.delimiter=e.delimiter}var f=_(e);return e.preview&&e.header&&f.preview++,h=r,d=new u(f),b=d.parse(h,n,i),t(),v?{meta:{paused:!0}}:b||{meta:{paused:!1}}},this.paused=function(){return v},this.pause=function(){v=!0,d.abort(),h=h.substr(d.getCharIndex())},this.resume=function(){v=!1,p.streamer.parseChunk(h)},this.aborted=function(){return k},this.abort=function(){k=!0,d.abort(),b.meta.aborted=!0,m(e.complete)&&e.complete(b),h=""}}function u(e){e=e||{};var t=e.delimiter,r=e.newline,n=e.comments,i=e.step,s=e.preview,a=e.fastMode;if(("string"!=typeof t||w.BAD_DELIMITERS.indexOf(t)>-1)&&(t=","),n===t)throw"Comment character same as delimiter";n===!0?n="#":("string"!=typeof n||w.BAD_DELIMITERS.indexOf(n)>-1)&&(n=!1),"\n"!=r&&"\r"!=r&&"\r\n"!=r&&(r="\n");var o=0,u=!1;this.parse=function(e,f,h){function d(e){b.push(e),S=o}function c(t){return h?p():(t||(t=e.substr(o)),w.push(t),o=g,d(w),y&&_(),p())}function l(t){o=t,d(w),w=[],O=e.indexOf(r,o)}function p(e){return{data:b,errors:R,meta:{delimiter:t,linebreak:r,aborted:u,truncated:!!e,cursor:S+(f||0)}}}function _(){i(p()),b=[],R=[]}if("string"!=typeof e)throw"Input must be a string";var g=e.length,m=t.length,v=r.length,k=n.length,y="function"==typeof i;o=0;var b=[],R=[],w=[],S=0;if(!e)return p();if(a||a!==!1&&-1===e.indexOf('"')){for(var E=e.split(r),C=0;C<E.length;C++){var w=E[C];if(o+=w.length,C!==E.length-1)o+=r.length;else if(h)return p();if(!n||w.substr(0,k)!=n){if(y){if(b=[],d(w.split(t)),_(),u)return p()}else d(w.split(t));if(s&&C>=s)return b=b.slice(0,s),p(!0)}}return p()}for(var x=e.indexOf(t,o),O=e.indexOf(r,o);;)if('"'!=e[o])if(n&&0===w.length&&e.substr(o,k)===n){if(-1==O)return p();o=O+v,O=e.indexOf(r,o),x=e.indexOf(t,o)}else if(-1!==x&&(O>x||-1===O))w.push(e.substring(o,x)),o=x+m,x=e.indexOf(t,o);else{if(-1===O)break;if(w.push(e.substring(o,O)),l(O+v),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0)}else{var I=o;for(o++;;){var I=e.indexOf('"',I+1);if(-1===I)return h||R.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:b.length,index:o}),c();if(I===g-1){var D=e.substring(o,I).replace(/""/g,'"');return c(D)}if('"'!=e[I+1]){if(e[I+1]==t){w.push(e.substring(o,I).replace(/""/g,'"')),o=I+1+m,x=e.indexOf(t,o),O=e.indexOf(r,o);break}if(e.substr(I+1,v)===r){if(w.push(e.substring(o,I).replace(/""/g,'"')),l(I+1+v),x=e.indexOf(t,o),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0);break}}else I++}}return c()},this.abort=function(){u=!0},this.getCharIndex=function(){return o}}function f(){var e=document.getElementsByTagName("script");return e.length?e[e.length-1].src:""}function h(){if(!w.WORKERS_SUPPORTED)return!1;if(!y&&null===w.SCRIPT_PATH)throw new Error("Script path cannot be determined automatically when Papa Parse is loaded asynchronously. You need to set Papa.SCRIPT_PATH manually.");var t=new e.Worker(w.SCRIPT_PATH||v);return t.onmessage=d,t.id=R++,b[t.id]=t,t}function d(e){var t=e.data,r=b[t.workerId],n=!1;if(t.error)r.userError(t.error,t.file);else if(t.results&&t.results.data){var i=function(){n=!0,c(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},s={abort:i,pause:l,resume:l};if(m(r.userStep)){for(var a=0;a<t.results.data.length&&(r.userStep({data:[t.results.data[a]],errors:t.results.errors,meta:t.results.meta},s),!n);a++);delete t.results}else m(r.userChunk)&&(r.userChunk(t.results,s,t.file),delete t.results)}t.finished&&!n&&c(t.workerId,t.results)}function c(e,t){var r=b[e];m(r.userComplete)&&r.userComplete(t),r.terminate(),delete b[e]}function l(){throw"Not implemented."}function p(t){var r=t.data;if("undefined"==typeof w.WORKER_ID&&r&&(w.WORKER_ID=r.workerId),"string"==typeof r.input)e.postMessage({workerId:w.WORKER_ID,results:w.parse(r.input,r.config),finished:!0});else if(e.File&&r.input instanceof File||r.input instanceof Object){var n=w.parse(r.input,r.config);n&&e.postMessage({workerId:w.WORKER_ID,results:n,finished:!0})}}function _(e){if("object"!=typeof e)return e;var t=e instanceof Array?[]:{};for(var r in e)t[r]=_(e[r]);return t}function g(e,t){return function(){e.apply(t,arguments)}}function m(e){return"function"==typeof e}var v,k=!e.document&&!!e.postMessage,y=!1,b={},R=0,w={};if(w.parse=t,w.unparse=r,w.RECORD_SEP=String.fromCharCode(30),w.UNIT_SEP=String.fromCharCode(31),w.BYTE_ORDER_MARK="",w.BAD_DELIMITERS=["\r","\n",'"',w.BYTE_ORDER_MARK],w.WORKERS_SUPPORTED=!!e.Worker,w.SCRIPT_PATH=null,w.LocalChunkSize=10485760,w.RemoteChunkSize=5242880,w.DefaultDelimiter=",",w.Parser=u,w.ParserHandle=o,w.NetworkStreamer=i,w.FileStreamer=s,w.StringStreamer=a,"undefined"!=typeof module&&module.exports?module.exports=w:m(e.define)&&e.define.amd?e.define(function(){return w}):e.Papa=w,e.jQuery){var S=e.jQuery;S.fn.parse=function(t){function r(){if(0==a.length)return void(m(t.complete)&&t.complete());var e=a[0];if(m(t.before)){var r=t.before(e.file,e.inputElem);if("object"==typeof r){if("abort"==r.action)return void n("AbortError",e.file,e.inputElem,r.reason);if("skip"==r.action)return void i();"object"==typeof r.config&&(e.instanceConfig=S.extend(e.instanceConfig,r.config))}else if("skip"==r)return void i()}var s=e.instanceConfig.complete;e.instanceConfig.complete=function(t){m(s)&&s(t,e.file,e.inputElem),i()},w.parse(e.file,e.instanceConfig)}function n(e,r,n,i){m(t.error)&&t.error({name:e},r,n,i)}function i(){a.splice(0,1),r()}var s=t.config||{},a=[];return this.each(function(){var t="INPUT"==S(this).prop("tagName").toUpperCase()&&"file"==S(this).attr("type").toLowerCase()&&e.FileReader;if(!t||!this.files||0==this.files.length)return!0;for(var r=0;r<this.files.length;r++)a.push({file:this.files[r],inputElem:this,instanceConfig:S.extend({},s)})}),r(),this}}k?e.onmessage=p:w.WORKERS_SUPPORTED&&(v=f(),document.body?document.addEventListener("DOMContentLoaded",function(){y=!0},!0):y=!0),i.prototype=Object.create(n.prototype),i.prototype.constructor=i,s.prototype=Object.create(n.prototype),s.prototype.constructor=s,a.prototype=Object.create(a.prototype),a.prototype.constructor=a}("undefined"!=typeof window?window:this); | ||
!function(e){"use strict";function t(t,r){if(r=r||{},r.worker&&S.WORKERS_SUPPORTED){var n=f();return n.userStep=r.step,n.userChunk=r.chunk,n.userComplete=r.complete,n.userError=r.error,r.step=m(r.step),r.chunk=m(r.chunk),r.complete=m(r.complete),r.error=m(r.error),delete r.worker,void n.postMessage({input:t,config:r,workerId:n.id})}var o=null;return"string"==typeof t?o=r.download?new i(r):new a(r):(e.File&&t instanceof File||t instanceof Object)&&(o=new s(r)),o.stream(t)}function r(e,t){function r(){"object"==typeof t&&("string"==typeof t.delimiter&&1==t.delimiter.length&&-1==S.BAD_DELIMITERS.indexOf(t.delimiter)&&(u=t.delimiter),("boolean"==typeof t.quotes||t.quotes instanceof Array)&&(o=t.quotes),"string"==typeof t.newline&&(h=t.newline))}function n(e){if("object"!=typeof e)return[];var t=[];for(var r in e)t.push(r);return t}function i(e,t){var r="";"string"==typeof e&&(e=JSON.parse(e)),"string"==typeof t&&(t=JSON.parse(t));var n=e instanceof Array&&e.length>0,i=!(t[0]instanceof Array);if(n){for(var a=0;a<e.length;a++)a>0&&(r+=u),r+=s(e[a],a);t.length>0&&(r+=h)}for(var o=0;o<t.length;o++){for(var f=n?e.length:t[o].length,c=0;f>c;c++){c>0&&(r+=u);var d=n&&i?e[c]:c;r+=s(t[o][d],c)}o<t.length-1&&(r+=h)}return r}function s(e,t){if("undefined"==typeof e||null===e)return"";e=e.toString().replace(/"/g,'""');var r="boolean"==typeof o&&o||o instanceof Array&&o[t]||a(e,S.BAD_DELIMITERS)||e.indexOf(u)>-1||" "==e.charAt(0)||" "==e.charAt(e.length-1);return r?'"'+e+'"':e}function a(e,t){for(var r=0;r<t.length;r++)if(e.indexOf(t[r])>-1)return!0;return!1}var o=!1,u=",",h="\r\n";if(r(),"string"==typeof e&&(e=JSON.parse(e)),e instanceof Array){if(!e.length||e[0]instanceof Array)return i(null,e);if("object"==typeof e[0])return i(n(e[0]),e)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),e.data instanceof Array&&(e.fields||(e.fields=e.data[0]instanceof Array?e.fields:n(e.data[0])),e.data[0]instanceof Array||"object"==typeof e.data[0]||(e.data=[e.data])),i(e.fields||[],e.data||[]);throw"exception: Unable to serialize unrecognized input"}function n(t){function r(e){var t=_(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null),this._handle=new o(t),this._handle.streamer=this,this._config=t}this._handle=null,this._paused=!1,this._finished=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},r.call(this,t),this.parseChunk=function(t){if(this.isFirstChunk&&m(this._config.beforeFirstChunk)){var r=this._config.beforeFirstChunk(t);void 0!==r&&(t=r)}this.isFirstChunk=!1;var n=this._partialLine+t;this._partialLine="";var i=this._handle.parse(n,this._baseIndex,!this._finished);if(!this._handle.paused()&&!this._handle.aborted()){var s=i.meta.cursor;this._finished||(this._partialLine=n.substring(s-this._baseIndex),this._baseIndex=s),i&&i.data&&(this._rowCount+=i.data.length);var a=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(y)e.postMessage({results:i,workerId:S.WORKER_ID,finished:a});else if(m(this._config.chunk)){if(this._config.chunk(i,this._handle),this._paused)return;i=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(i.data),this._completeResults.errors=this._completeResults.errors.concat(i.errors),this._completeResults.meta=i.meta),!a||!m(this._config.complete)||i&&i.meta.aborted||this._config.complete(this._completeResults),a||i&&i.meta.paused||this._nextChunk(),i}},this._sendError=function(t){m(this._config.error)?this._config.error(t):y&&this._config.error&&e.postMessage({workerId:S.WORKER_ID,error:t,finished:!1})}}function i(e){function t(e){var t=e.getResponseHeader("Content-Range");return parseInt(t.substr(t.lastIndexOf("/")+1))}e=e||{},e.chunkSize||(e.chunkSize=S.RemoteChunkSize),n.call(this,e);var r;this._nextChunk=k?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)return void this._chunkLoaded();if(r=new XMLHttpRequest,k||(r.onload=g(this._chunkLoaded,this),r.onerror=g(this._chunkError,this)),r.open("GET",this._input,!k),this._config.chunkSize){var e=this._start+this._config.chunkSize-1;r.setRequestHeader("Range","bytes="+this._start+"-"+e),r.setRequestHeader("If-None-Match","webkit-no-cache")}try{r.send()}catch(t){this._chunkError(t.message)}k&&0==r.status?this._chunkError():this._start+=this._config.chunkSize},this._chunkLoaded=function(){if(4==r.readyState){if(r.status<200||r.status>=400)return void this._chunkError();this._finished=!this._config.chunkSize||this._start>t(r),this.parseChunk(r.responseText)}},this._chunkError=function(e){var t=r.statusText||e;this._sendError(t)}}function s(e){e=e||{},e.chunkSize||(e.chunkSize=S.LocalChunkSize),n.call(this,e);var t,r,i="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,i?(t=new FileReader,t.onload=g(this._chunkLoaded,this),t.onerror=g(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var e=this._input;if(this._config.chunkSize){var n=Math.min(this._start+this._config.chunkSize,this._input.size);e=r.call(e,this._start,n)}var s=t.readAsText(e,this._config.encoding);i||this._chunkLoaded({target:{result:s}})},this._chunkLoaded=function(e){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function a(e){e=e||{},n.call(this,e);var t,r;this.stream=function(e){return t=e,r=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e=this._config.chunkSize,t=e?r.substr(0,e):r;return r=e?r.substr(e):"",this._finished=!r,this.parseChunk(t)}}}function o(e){function t(){if(b&&d&&(h("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+S.DefaultDelimiter+"'"),d=!1),e.skipEmptyLines)for(var t=0;t<b.data.length;t++)1==b.data[t].length&&""==b.data[t][0]&&b.data.splice(t--,1);return r()&&n(),i()}function r(){return e.header&&0==y.length}function n(){if(b){for(var e=0;r()&&e<b.data.length;e++)for(var t=0;t<b.data[e].length;t++)y.push(b.data[e][t]);b.data.splice(0,1)}}function i(){if(!b||!e.header&&!e.dynamicTyping)return b;for(var t=0;t<b.data.length;t++){for(var r={},n=0;n<b.data[t].length;n++){if(e.dynamicTyping){var i=b.data[t][n];b.data[t][n]="true"==i||"TRUE"==i?!0:"false"==i||"FALSE"==i?!1:o(i)}e.header&&(n>=y.length?(r.__parsed_extra||(r.__parsed_extra=[]),r.__parsed_extra.push(b.data[t][n])):r[y[n]]=b.data[t][n])}e.header&&(b.data[t]=r,n>y.length?h("FieldMismatch","TooManyFields","Too many fields: expected "+y.length+" fields but parsed "+n,t):n<y.length&&h("FieldMismatch","TooFewFields","Too few fields: expected "+y.length+" fields but parsed "+n,t))}return e.header&&b.meta&&(b.meta.fields=y),b}function s(t){for(var r,n,i,s=[","," ","|",";",S.RECORD_SEP,S.UNIT_SEP],a=0;a<s.length;a++){var o=s[a],h=0,f=0;i=void 0;for(var c=new u({delimiter:o,preview:10}).parse(t),d=0;d<c.data.length;d++){var l=c.data[d].length;f+=l,"undefined"!=typeof i?l>1&&(h+=Math.abs(l-i),i=l):i=l}c.data.length>0&&(f/=c.data.length),("undefined"==typeof n||n>h)&&f>1.99&&(n=h,r=o)}return e.delimiter=r,{successful:!!r,bestDelimiter:r}}function a(e){e=e.substr(0,1048576);var t=e.split("\r");if(1==t.length)return"\n";for(var r=0,n=0;n<t.length;n++)"\n"==t[n][0]&&r++;return r>=t.length/2?"\r\n":"\r"}function o(e){var t=l.test(e);return t?parseFloat(e):e}function h(e,t,r,n){b.errors.push({type:e,code:t,message:r,row:n})}var f,c,d,l=/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i,p=this,g=0,v=!1,k=!1,y=[],b={data:[],errors:[],meta:{}};if(m(e.step)){var R=e.step;e.step=function(n){if(b=n,r())t();else{if(t(),0==b.data.length)return;g+=n.data.length,e.preview&&g>e.preview?c.abort():R(b,p)}}}this.parse=function(r,n,i){if(e.newline||(e.newline=a(r)),d=!1,!e.delimiter){var o=s(r);o.successful?e.delimiter=o.bestDelimiter:(d=!0,e.delimiter=S.DefaultDelimiter),b.meta.delimiter=e.delimiter}var h=_(e);return e.preview&&e.header&&h.preview++,f=r,c=new u(h),b=c.parse(f,n,i),t(),v?{meta:{paused:!0}}:b||{meta:{paused:!1}}},this.paused=function(){return v},this.pause=function(){v=!0,c.abort(),f=f.substr(c.getCharIndex())},this.resume=function(){v=!1,p.streamer.parseChunk(f)},this.aborted=function(){return k},this.abort=function(){k=!0,c.abort(),b.meta.aborted=!0,m(e.complete)&&e.complete(b),f=""}}function u(e){e=e||{};var t=e.delimiter,r=e.newline,n=e.comments,i=e.step,s=e.preview,a=e.fastMode;if(("string"!=typeof t||S.BAD_DELIMITERS.indexOf(t)>-1)&&(t=","),n===t)throw"Comment character same as delimiter";n===!0?n="#":("string"!=typeof n||S.BAD_DELIMITERS.indexOf(n)>-1)&&(n=!1),"\n"!=r&&"\r"!=r&&"\r\n"!=r&&(r="\n");var o=0,u=!1;this.parse=function(e,h,f){function c(e){b.push(e),S=o}function d(t){return f?p():("undefined"==typeof t&&(t=e.substr(o)),w.push(t),o=g,c(w),y&&_(),p())}function l(t){o=t,c(w),w=[],O=e.indexOf(r,o)}function p(e){return{data:b,errors:R,meta:{delimiter:t,linebreak:r,aborted:u,truncated:!!e,cursor:S+(h||0)}}}function _(){i(p()),b=[],R=[]}if("string"!=typeof e)throw"Input must be a string";var g=e.length,m=t.length,v=r.length,k=n.length,y="function"==typeof i;o=0;var b=[],R=[],w=[],S=0;if(!e)return p();if(a||a!==!1&&-1===e.indexOf('"')){for(var C=e.split(r),E=0;E<C.length;E++){var w=C[E];if(o+=w.length,E!==C.length-1)o+=r.length;else if(f)return p();if(!n||w.substr(0,k)!=n){if(y){if(b=[],c(w.split(t)),_(),u)return p()}else c(w.split(t));if(s&&E>=s)return b=b.slice(0,s),p(!0)}}return p()}for(var x=e.indexOf(t,o),O=e.indexOf(r,o);;)if('"'!=e[o])if(n&&0===w.length&&e.substr(o,k)===n){if(-1==O)return p();o=O+v,O=e.indexOf(r,o),x=e.indexOf(t,o)}else if(-1!==x&&(O>x||-1===O))w.push(e.substring(o,x)),o=x+m,x=e.indexOf(t,o);else{if(-1===O)break;if(w.push(e.substring(o,O)),l(O+v),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0)}else{var I=o;for(o++;;){var I=e.indexOf('"',I+1);if(-1===I)return f||R.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:b.length,index:o}),d();if(I===g-1){var D=e.substring(o,I).replace(/""/g,'"');return d(D)}if('"'!=e[I+1]){if(e[I+1]==t){w.push(e.substring(o,I).replace(/""/g,'"')),o=I+1+m,x=e.indexOf(t,o),O=e.indexOf(r,o);break}if(e.substr(I+1,v)===r){if(w.push(e.substring(o,I).replace(/""/g,'"')),l(I+1+v),x=e.indexOf(t,o),y&&(_(),u))return p();if(s&&b.length>=s)return p(!0);break}}else I++}}return d()},this.abort=function(){u=!0},this.getCharIndex=function(){return o}}function h(){var e=document.getElementsByTagName("script");return e.length?e[e.length-1].src:""}function f(){if(!S.WORKERS_SUPPORTED)return!1;if(!b&&null===S.SCRIPT_PATH)throw new Error("Script path cannot be determined automatically when Papa Parse is loaded asynchronously. You need to set Papa.SCRIPT_PATH manually.");var t=S.SCRIPT_PATH||v;t+=(-1!==t.indexOf("?")?"&":"?")+"papaworker";var r=new e.Worker(t);return r.onmessage=c,r.id=w++,R[r.id]=r,r}function c(e){var t=e.data,r=R[t.workerId],n=!1;if(t.error)r.userError(t.error,t.file);else if(t.results&&t.results.data){var i=function(){n=!0,d(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},s={abort:i,pause:l,resume:l};if(m(r.userStep)){for(var a=0;a<t.results.data.length&&(r.userStep({data:[t.results.data[a]],errors:t.results.errors,meta:t.results.meta},s),!n);a++);delete t.results}else m(r.userChunk)&&(r.userChunk(t.results,s,t.file),delete t.results)}t.finished&&!n&&d(t.workerId,t.results)}function d(e,t){var r=R[e];m(r.userComplete)&&r.userComplete(t),r.terminate(),delete R[e]}function l(){throw"Not implemented."}function p(t){var r=t.data;if("undefined"==typeof S.WORKER_ID&&r&&(S.WORKER_ID=r.workerId),"string"==typeof r.input)e.postMessage({workerId:S.WORKER_ID,results:S.parse(r.input,r.config),finished:!0});else if(e.File&&r.input instanceof File||r.input instanceof Object){var n=S.parse(r.input,r.config);n&&e.postMessage({workerId:S.WORKER_ID,results:n,finished:!0})}}function _(e){if("object"!=typeof e)return e;var t=e instanceof Array?[]:{};for(var r in e)t[r]=_(e[r]);return t}function g(e,t){return function(){e.apply(t,arguments)}}function m(e){return"function"==typeof e}var v,k=!e.document&&!!e.postMessage,y=k&&/(\?|&)papaworker(=|&|$)/.test(e.location.search),b=!1,R={},w=0,S={};if(S.parse=t,S.unparse=r,S.RECORD_SEP=String.fromCharCode(30),S.UNIT_SEP=String.fromCharCode(31),S.BYTE_ORDER_MARK="",S.BAD_DELIMITERS=["\r","\n",'"',S.BYTE_ORDER_MARK],S.WORKERS_SUPPORTED=!k&&!!e.Worker,S.SCRIPT_PATH=null,S.LocalChunkSize=10485760,S.RemoteChunkSize=5242880,S.DefaultDelimiter=",",S.Parser=u,S.ParserHandle=o,S.NetworkStreamer=i,S.FileStreamer=s,S.StringStreamer=a,"undefined"!=typeof module&&module.exports?module.exports=S:m(e.define)&&e.define.amd?define(function(){return S}):e.Papa=S,e.jQuery){var C=e.jQuery;C.fn.parse=function(t){function r(){if(0==a.length)return void(m(t.complete)&&t.complete());var e=a[0];if(m(t.before)){var r=t.before(e.file,e.inputElem);if("object"==typeof r){if("abort"==r.action)return void n("AbortError",e.file,e.inputElem,r.reason);if("skip"==r.action)return void i();"object"==typeof r.config&&(e.instanceConfig=C.extend(e.instanceConfig,r.config))}else if("skip"==r)return void i()}var s=e.instanceConfig.complete;e.instanceConfig.complete=function(t){m(s)&&s(t,e.file,e.inputElem),i()},S.parse(e.file,e.instanceConfig)}function n(e,r,n,i){m(t.error)&&t.error({name:e},r,n,i)}function i(){a.splice(0,1),r()}var s=t.config||{},a=[];return this.each(function(){var t="INPUT"==C(this).prop("tagName").toUpperCase()&&"file"==C(this).attr("type").toLowerCase()&&e.FileReader;if(!t||!this.files||0==this.files.length)return!0;for(var r=0;r<this.files.length;r++)a.push({file:this.files[r],inputElem:this,instanceConfig:C.extend({},s)})}),r(),this}}y?e.onmessage=p:S.WORKERS_SUPPORTED&&(v=h(),document.body?document.addEventListener("DOMContentLoaded",function(){b=!0},!0):b=!0),i.prototype=Object.create(n.prototype),i.prototype.constructor=i,s.prototype=Object.create(n.prototype),s.prototype.constructor=s,a.prototype=Object.create(a.prototype),a.prototype.constructor=a}("undefined"!=typeof window?window:this); |
@@ -107,3 +107,4 @@ var stepped = 0, chunks = 0, rows = 0; | ||
skipEmptyLines: $('#skipEmptyLines').prop('checked'), | ||
chunk: $('#chunk').prop('checked') ? chunkFn : undefined | ||
chunk: $('#chunk').prop('checked') ? chunkFn : undefined, | ||
beforeFirstChunk: undefined, | ||
}; | ||
@@ -151,2 +152,5 @@ | ||
if (printStepChecked) | ||
console.log("Chunk data:", results.data.length, results); | ||
if (pauseChecked) | ||
@@ -158,5 +162,2 @@ { | ||
} | ||
if (printStepChecked) | ||
console.log("Chunk data:", results.data.length, results); | ||
} | ||
@@ -163,0 +164,0 @@ |
@@ -40,14 +40,17 @@ (function() { | ||
var synchronouslyParsedCsvShouldBeCorrectlyParsed = function() { | ||
assertLongSampleParsedCorrectly(Papa.parse(longSampleRawCsv)); | ||
}(); | ||
describe('PapaParse', function() { | ||
it('synchronously parsed CSV should be correctly parsed', function() { | ||
assertLongSampleParsedCorrectly(Papa.parse(longSampleRawCsv)); | ||
}); | ||
var asynchronouslyParsedCsvShouldBeCorrectlyParsed = function() { | ||
Papa.parse(longSampleRawCsv, { | ||
complete: function(parsedCsv) { | ||
assertLongSampleParsedCorrectly(parsedCsv); | ||
}, | ||
it('asynchronously parsed CSV should be correctly parsed', function(done) { | ||
Papa.parse(longSampleRawCsv, { | ||
complete: function(parsedCsv) { | ||
assertLongSampleParsedCorrectly(parsedCsv); | ||
done(); | ||
}, | ||
}); | ||
}); | ||
}(); | ||
}); | ||
})(); | ||
})(); |
@@ -0,1 +1,8 @@ | ||
if (typeof module !== 'undefined' && module.exports) { | ||
var chai = require('chai'); | ||
var Papa = require('../papaparse.js'); | ||
} | ||
var assert = chai.assert; | ||
var RECORD_SEP = String.fromCharCode(30); | ||
@@ -9,2 +16,8 @@ var UNIT_SEP = String.fromCharCode(31); | ||
var XHR_ENABLED = false; | ||
try { | ||
new XMLHttpRequest(); | ||
XHR_ENABLED = true; | ||
} catch (e) {} // safari, ie | ||
// Tests for the core parser using new Papa.Parser().parse() (CSV to JSON) | ||
@@ -210,2 +223,10 @@ var CORE_PARSER_TESTS = [ | ||
}, | ||
{ | ||
description: "Empty quoted field at EOF is empty", | ||
input: 'a,b,""\na,b,""', | ||
expected: { | ||
data: [['a', 'b', ''], ['a', 'b', '']], | ||
errors: [] | ||
} | ||
}, | ||
{ | ||
@@ -433,3 +454,18 @@ description: "Multiple consecutive empty fields", | ||
describe('Core Parser Tests', function() { | ||
function generateTest(test) { | ||
(test.disabled ? it.skip : it)(test.description, function() { | ||
var actual = new Papa.Parser(test.config).parse(test.input); | ||
assert.deepEqual(JSON.stringify(actual.errors), JSON.stringify(test.expected.errors)); | ||
assert.deepEqual(actual.data, test.expected.data); | ||
}); | ||
} | ||
for (var i = 0; i < CORE_PARSER_TESTS.length; i++) { | ||
generateTest(CORE_PARSER_TESTS[i]); | ||
} | ||
}); | ||
// Tests for Papa.parse() function -- high-level wrapped parser (CSV to JSON) | ||
@@ -824,8 +860,18 @@ var PARSE_TESTS = [ | ||
describe('Parse Tests', function() { | ||
function generateTest(test) { | ||
(test.disabled ? it.skip : it)(test.description, function() { | ||
var actual = Papa.parse(test.input, test.config); | ||
assert.deepEqual(JSON.stringify(actual.errors), JSON.stringify(test.expected.errors)); | ||
assert.deepEqual(actual.data, test.expected.data); | ||
}); | ||
} | ||
for (var i = 0; i < PARSE_TESTS.length; i++) { | ||
generateTest(PARSE_TESTS[i]); | ||
} | ||
}); | ||
// Tests for Papa.parse() that involve asynchronous operation | ||
@@ -850,2 +896,3 @@ var PARSE_ASYNC_TESTS = [ | ||
}, | ||
disabled: !XHR_ENABLED, | ||
expected: { | ||
@@ -863,2 +910,3 @@ data: [['A','B','C'],['X','Y','Z']], | ||
}, | ||
disabled: !XHR_ENABLED, | ||
expected: { | ||
@@ -894,6 +942,25 @@ data: [['A','B','C'],['X','Y','Z']], | ||
describe('Parse Async Tests', function() { | ||
function generateTest(test) { | ||
(test.disabled ? it.skip : it)(test.description, function(done) { | ||
var config = test.config; | ||
config.complete = function(actual) { | ||
assert.deepEqual(JSON.stringify(actual.errors), JSON.stringify(test.expected.errors)); | ||
assert.deepEqual(actual.data, test.expected.data); | ||
done(); | ||
}; | ||
config.error = function(err) { | ||
throw err; | ||
}; | ||
Papa.parse(test.input, config); | ||
}); | ||
} | ||
for (var i = 0; i < PARSE_ASYNC_TESTS.length; i++) { | ||
generateTest(PARSE_ASYNC_TESTS[i]); | ||
} | ||
}); | ||
@@ -1048,4 +1115,27 @@ | ||
describe('Unparse Tests', function() { | ||
function generateTest(test) { | ||
(test.disabled ? it.skip : it)(test.description, function() { | ||
var actual; | ||
try { | ||
actual = Papa.unparse(test.input, test.config); | ||
} catch (e) { | ||
if (e instanceof Error) { | ||
throw e; | ||
} | ||
actual = e; | ||
} | ||
assert.strictEqual(actual, test.expected); | ||
}); | ||
} | ||
for (var i = 0; i < UNPARSE_TESTS.length; i++) { | ||
generateTest(UNPARSE_TESTS[i]); | ||
} | ||
}); | ||
var CUSTOM_TESTS = [ | ||
@@ -1055,2 +1145,3 @@ { | ||
expected: [['A', 'b', 'c'], ['d', 'E', 'f'], ['G', 'h', 'i']], | ||
disabled: !FILES_ENABLED, | ||
run: function(callback) { | ||
@@ -1109,2 +1200,3 @@ Papa.parse(new File(['A,b,c\nd,E,f\nG,h,i'], 'sample.csv'), { | ||
expected: [129, 287, 452, 595, 727, 865, 1031, 1209], | ||
disabled: !XHR_ENABLED, | ||
run: function(callback) { | ||
@@ -1126,2 +1218,3 @@ var updates = []; | ||
expected: [129, 287, 452, 595, 727, 865, 1031, 1209], | ||
disabled: !XHR_ENABLED, | ||
run: function(callback) { | ||
@@ -1144,2 +1237,3 @@ var updates = []; | ||
expected: [452, 452, 452, 865, 865, 865, 1209, 1209], | ||
disabled: !XHR_ENABLED, | ||
run: function(callback) { | ||
@@ -1163,2 +1257,3 @@ var updates = []; | ||
expected: [3, 3, 2], | ||
disabled: !XHR_ENABLED, | ||
run: function(callback) { | ||
@@ -1181,2 +1276,3 @@ var updates = []; | ||
expected: [452, 865, 1209], | ||
disabled: !XHR_ENABLED, | ||
run: function(callback) { | ||
@@ -1322,2 +1418,3 @@ var updates = []; | ||
expected: 1, | ||
disabled: !XHR_ENABLED, | ||
run: function(callback) { | ||
@@ -1327,2 +1424,3 @@ var updates = 0; | ||
worker: true, | ||
download: true, | ||
chunkSize: 500, | ||
@@ -1338,3 +1436,91 @@ step: function(response, handle) { | ||
} | ||
}, | ||
{ | ||
description: "beforeFirstChunk manipulates only first chunk", | ||
expected: 7, | ||
disabled: !XHR_ENABLED, | ||
run: function(callback) { | ||
var updates = 0; | ||
Papa.parse("/tests/long-sample.csv", { | ||
download: true, | ||
chunkSize: 500, | ||
beforeFirstChunk: function(chunk) { | ||
return chunk.replace(/.*?\n/, ''); | ||
}, | ||
step: function(response) { | ||
updates++; | ||
}, | ||
complete: function() { | ||
callback(updates); | ||
} | ||
}); | ||
} | ||
}, | ||
{ | ||
description: "First chunk not modified if beforeFirstChunk returns nothing", | ||
expected: 8, | ||
disabled: !XHR_ENABLED, | ||
run: function(callback) { | ||
var updates = 0; | ||
Papa.parse("/tests/long-sample.csv", { | ||
download: true, | ||
chunkSize: 500, | ||
beforeFirstChunk: function(chunk) { | ||
}, | ||
step: function(response) { | ||
updates++; | ||
}, | ||
complete: function() { | ||
callback(updates); | ||
} | ||
}); | ||
} | ||
}, | ||
{ | ||
description: "Should not assume we own the worker unless papaworker is in the search string", | ||
disabled: typeof Worker === 'undefined', | ||
expected: [false, true, true, true, true], | ||
run: function(callback) { | ||
var searchStrings = [ | ||
'', | ||
'?papaworker', | ||
'?x=1&papaworker', | ||
'?x=1&papaworker&y=1', | ||
'?x=1&papaworker=1' | ||
]; | ||
var results = searchStrings.map(function () { return false; }); | ||
var workers = []; | ||
// Give it .5s to do something | ||
setTimeout(function () { | ||
workers.forEach(function (w) { w.terminate(); }); | ||
callback(results); | ||
}, 500); | ||
searchStrings.forEach(function (searchString, idx) { | ||
var w = new Worker('../papaparse.js' + searchString); | ||
workers.push(w); | ||
w.addEventListener('message', function () { | ||
results[idx] = true; | ||
}); | ||
w.postMessage({input: 'a,b,c\n1,2,3'}); | ||
}); | ||
} | ||
} | ||
]; | ||
describe('Custom Tests', function() { | ||
function generateTest(test) { | ||
(test.disabled ? it.skip : it)(test.description, function(done) { | ||
test.run(function (actual) { | ||
assert.deepEqual(JSON.stringify(actual), JSON.stringify(test.expected)); | ||
done(); | ||
}); | ||
}); | ||
} | ||
for (var i = 0; i < CUSTOM_TESTS.length; i++) { | ||
generateTest(CUSTOM_TESTS[i]); | ||
} | ||
}); |
@@ -1,3 +0,1 @@ | ||
require('./node-tests.js'); | ||
var connect = require('connect'); | ||
@@ -7,6 +5,16 @@ var serveStatic = require('serve-static'); | ||
var path = require('path'); | ||
var child_process = require('child_process'); | ||
connect().use(serveStatic(path.join(__dirname, '/..'))).listen(8071, function() { | ||
open('http://localhost:8071/tests/tests.html'); | ||
console.log('Serving tests...'); | ||
var server = connect().use(serveStatic(path.join(__dirname, '/..'))).listen(8071, function() { | ||
if (process.argv.indexOf('--phantomjs') !== -1) { | ||
child_process.spawn('node_modules/.bin/mocha-phantomjs', ['http://localhost:8071/tests/tests.html'], { | ||
stdio: 'inherit' | ||
}).on('exit', function () { | ||
server.close(); | ||
}); | ||
} else { | ||
open('http://localhost:8071/tests/tests.html'); | ||
console.log('Serving tests...'); | ||
} | ||
}); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
113304
9
18
3738
1