@loaders.gl/csv 3.0.9 → 3.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,26 +7,14 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports._typecheckCSVLoader = exports.CSVLoader = void 0;
9
9
 
10
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
-
12
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
13
-
14
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
-
18
10
  var _schema = require("@loaders.gl/schema");
19
11
 
20
12
  var _papaparse = _interopRequireDefault(require("./libs/papaparse"));
21
13
 
22
14
  var _asyncIteratorStreamer = _interopRequireDefault(require("./lib/async-iterator-streamer"));
23
15
 
24
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
25
-
26
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
27
-
28
- var VERSION = typeof "3.0.9" !== 'undefined' ? "3.0.9" : 'latest';
29
- var DEFAULT_CSV_LOADER_OPTIONS = {
16
+ const VERSION = typeof "3.0.13" !== 'undefined' ? "3.0.13" : 'latest';
17
+ const DEFAULT_CSV_LOADER_OPTIONS = {
30
18
  csv: {
31
19
  shape: 'object-row-table',
32
20
  optimizeMemoryUsage: false,
@@ -40,7 +28,7 @@ var DEFAULT_CSV_LOADER_OPTIONS = {
40
28
  delimitersToGuess: [',', '\t', '|', ';']
41
29
  }
42
30
  };
43
- var CSVLoader = {
31
+ const CSVLoader = {
44
32
  id: 'csv',
45
33
  module: 'csv',
46
34
  name: 'CSV',
@@ -48,128 +36,90 @@ var CSVLoader = {
48
36
  extensions: ['csv'],
49
37
  mimeTypes: ['text/csv'],
50
38
  category: 'table',
51
- parse: function () {
52
- var _parse = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(arrayBuffer, options) {
53
- return _regenerator.default.wrap(function _callee$(_context) {
54
- while (1) {
55
- switch (_context.prev = _context.next) {
56
- case 0:
57
- return _context.abrupt("return", parseCSV(new TextDecoder().decode(arrayBuffer), options));
58
-
59
- case 1:
60
- case "end":
61
- return _context.stop();
62
- }
63
- }
64
- }, _callee);
65
- }));
66
-
67
- function parse(_x, _x2) {
68
- return _parse.apply(this, arguments);
69
- }
70
-
71
- return parse;
72
- }(),
73
- parseText: function parseText(text, options) {
74
- return parseCSV(text, options);
75
- },
39
+ parse: async (arrayBuffer, options) => parseCSV(new TextDecoder().decode(arrayBuffer), options),
40
+ parseText: (text, options) => parseCSV(text, options),
76
41
  parseInBatches: parseCSVInBatches,
77
42
  options: DEFAULT_CSV_LOADER_OPTIONS
78
43
  };
79
44
  exports.CSVLoader = CSVLoader;
80
45
 
81
- function parseCSV(_x3, _x4) {
82
- return _parseCSV.apply(this, arguments);
83
- }
46
+ async function parseCSV(csvText, options) {
47
+ const csvOptions = { ...DEFAULT_CSV_LOADER_OPTIONS.csv,
48
+ ...(options === null || options === void 0 ? void 0 : options.csv)
49
+ };
50
+ const firstRow = readFirstRow(csvText);
51
+ const header = csvOptions.header === 'auto' ? isHeaderRow(firstRow) : Boolean(csvOptions.header);
52
+ const parseWithHeader = header;
53
+ const papaparseConfig = { ...csvOptions,
54
+ header: parseWithHeader,
55
+ download: false,
56
+ transformHeader: parseWithHeader ? duplicateColumnTransformer() : undefined,
57
+ error: e => {
58
+ throw new Error(e);
59
+ }
60
+ };
84
61
 
85
- function _parseCSV() {
86
- _parseCSV = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2(csvText, options) {
87
- var csvOptions, firstRow, header, parseWithHeader, papaparseConfig, result, rows, headerRow;
88
- return _regenerator.default.wrap(function _callee2$(_context2) {
89
- while (1) {
90
- switch (_context2.prev = _context2.next) {
91
- case 0:
92
- csvOptions = _objectSpread(_objectSpread({}, DEFAULT_CSV_LOADER_OPTIONS.csv), options === null || options === void 0 ? void 0 : options.csv);
93
- firstRow = readFirstRow(csvText);
94
- header = csvOptions.header === 'auto' ? isHeaderRow(firstRow) : Boolean(csvOptions.header);
95
- parseWithHeader = header;
96
- papaparseConfig = _objectSpread(_objectSpread({}, csvOptions), {}, {
97
- header: parseWithHeader,
98
- download: false,
99
- transformHeader: parseWithHeader ? duplicateColumnTransformer() : undefined,
100
- error: function error(e) {
101
- throw new Error(e);
102
- }
103
- });
104
- result = _papaparse.default.parse(csvText, papaparseConfig);
105
- rows = result.data;
106
- headerRow = result.meta.fields || generateHeader(csvOptions.columnPrefix, firstRow.length);
107
- _context2.t0 = csvOptions.shape;
108
- _context2.next = _context2.t0 === 'object-row-table' ? 11 : _context2.t0 === 'array-row-table' ? 13 : 15;
109
- break;
110
-
111
- case 11:
112
- rows = rows.map(function (row) {
113
- return Array.isArray(row) ? (0, _schema.convertToObjectRow)(row, headerRow) : row;
114
- });
115
- return _context2.abrupt("break", 15);
116
-
117
- case 13:
118
- rows = rows.map(function (row) {
119
- return Array.isArray(row) ? row : (0, _schema.convertToArrayRow)(row, headerRow);
120
- });
121
- return _context2.abrupt("break", 15);
122
-
123
- case 15:
124
- return _context2.abrupt("return", rows);
125
-
126
- case 16:
127
- case "end":
128
- return _context2.stop();
129
- }
130
- }
131
- }, _callee2);
132
- }));
133
- return _parseCSV.apply(this, arguments);
62
+ const result = _papaparse.default.parse(csvText, papaparseConfig);
63
+
64
+ let {
65
+ data: rows
66
+ } = result;
67
+ const headerRow = result.meta.fields || generateHeader(csvOptions.columnPrefix, firstRow.length);
68
+
69
+ switch (csvOptions.shape) {
70
+ case 'object-row-table':
71
+ rows = rows.map(row => Array.isArray(row) ? (0, _schema.convertToObjectRow)(row, headerRow) : row);
72
+ break;
73
+
74
+ case 'array-row-table':
75
+ rows = rows.map(row => Array.isArray(row) ? row : (0, _schema.convertToArrayRow)(row, headerRow));
76
+ break;
77
+
78
+ default:
79
+ }
80
+
81
+ return rows;
134
82
  }
135
83
 
136
84
  function parseCSVInBatches(asyncIterator, options) {
137
85
  var _options;
138
86
 
139
- options = _objectSpread({}, options);
87
+ options = { ...options
88
+ };
140
89
 
141
90
  if (options.batchSize === 'auto') {
142
91
  options.batchSize = 4000;
143
92
  }
144
93
 
145
- var csvOptions = _objectSpread(_objectSpread({}, DEFAULT_CSV_LOADER_OPTIONS.csv), (_options = options) === null || _options === void 0 ? void 0 : _options.csv);
146
-
147
- var asyncQueue = new _schema.AsyncQueue();
148
- var isFirstRow = true;
149
- var headerRow = null;
150
- var tableBatchBuilder = null;
151
- var schema = null;
152
-
153
- var config = _objectSpread(_objectSpread({}, csvOptions), {}, {
94
+ const csvOptions = { ...DEFAULT_CSV_LOADER_OPTIONS.csv,
95
+ ...((_options = options) === null || _options === void 0 ? void 0 : _options.csv)
96
+ };
97
+ const asyncQueue = new _schema.AsyncQueue();
98
+ let isFirstRow = true;
99
+ let headerRow = null;
100
+ let tableBatchBuilder = null;
101
+ let schema = null;
102
+ const config = { ...csvOptions,
154
103
  header: false,
155
104
  download: false,
156
105
  chunkSize: 1024 * 1024 * 5,
157
106
  skipEmptyLines: false,
158
- step: function step(results) {
159
- var row = results.data;
107
+
108
+ step(results) {
109
+ let row = results.data;
160
110
 
161
111
  if (csvOptions.skipEmptyLines) {
162
- var collapsedRow = row.flat().join('').trim();
112
+ const collapsedRow = row.flat().join('').trim();
163
113
 
164
114
  if (collapsedRow === '') {
165
115
  return;
166
116
  }
167
117
  }
168
118
 
169
- var bytesUsed = results.meta.cursor;
119
+ const bytesUsed = results.meta.cursor;
170
120
 
171
121
  if (isFirstRow && !headerRow) {
172
- var header = csvOptions.header === 'auto' ? isHeaderRow(row) : Boolean(csvOptions.header);
122
+ const header = csvOptions.header === 'auto' ? isHeaderRow(row) : Boolean(csvOptions.header);
173
123
 
174
124
  if (header) {
175
125
  headerRow = row.map(duplicateColumnTransformer());
@@ -191,14 +141,15 @@ function parseCSVInBatches(asyncIterator, options) {
191
141
  row = JSON.parse(JSON.stringify(row));
192
142
  }
193
143
 
194
- tableBatchBuilder = tableBatchBuilder || new _schema.TableBatchBuilder(schema, _objectSpread({
195
- shape: csvOptions.shape || 'array-row-table'
196
- }, options));
144
+ tableBatchBuilder = tableBatchBuilder || new _schema.TableBatchBuilder(schema, {
145
+ shape: csvOptions.shape || 'array-row-table',
146
+ ...options
147
+ });
197
148
 
198
149
  try {
199
150
  tableBatchBuilder.addRow(row);
200
- var batch = tableBatchBuilder && tableBatchBuilder.getFullBatch({
201
- bytesUsed: bytesUsed
151
+ const batch = tableBatchBuilder && tableBatchBuilder.getFullBatch({
152
+ bytesUsed
202
153
  });
203
154
 
204
155
  if (batch) {
@@ -208,11 +159,12 @@ function parseCSVInBatches(asyncIterator, options) {
208
159
  asyncQueue.enqueue(error);
209
160
  }
210
161
  },
211
- complete: function complete(results) {
162
+
163
+ complete(results) {
212
164
  try {
213
- var bytesUsed = results.meta.cursor;
214
- var batch = tableBatchBuilder && tableBatchBuilder.getFinalBatch({
215
- bytesUsed: bytesUsed
165
+ const bytesUsed = results.meta.cursor;
166
+ const batch = tableBatchBuilder && tableBatchBuilder.getFinalBatch({
167
+ bytesUsed
216
168
  });
217
169
 
218
170
  if (batch) {
@@ -224,7 +176,8 @@ function parseCSVInBatches(asyncIterator, options) {
224
176
 
225
177
  asyncQueue.close();
226
178
  }
227
- });
179
+
180
+ };
228
181
 
229
182
  _papaparse.default.parse(asyncIterator, config, _asyncIteratorStreamer.default);
230
183
 
@@ -232,13 +185,11 @@ function parseCSVInBatches(asyncIterator, options) {
232
185
  }
233
186
 
234
187
  function isHeaderRow(row) {
235
- return row && row.every(function (value) {
236
- return typeof value === 'string';
237
- });
188
+ return row && row.every(value => typeof value === 'string');
238
189
  }
239
190
 
240
191
  function readFirstRow(csvText) {
241
- var result = _papaparse.default.parse(csvText, {
192
+ const result = _papaparse.default.parse(csvText, {
242
193
  download: false,
243
194
  dynamicTyping: true,
244
195
  preview: 1
@@ -248,10 +199,10 @@ function readFirstRow(csvText) {
248
199
  }
249
200
 
250
201
  function duplicateColumnTransformer() {
251
- var observedColumns = new Set();
252
- return function (col) {
253
- var colName = col;
254
- var counter = 1;
202
+ const observedColumns = new Set();
203
+ return col => {
204
+ let colName = col;
205
+ let counter = 1;
255
206
 
256
207
  while (observedColumns.has(colName)) {
257
208
  colName = "".concat(col, ".").concat(counter);
@@ -263,11 +214,10 @@ function duplicateColumnTransformer() {
263
214
  };
264
215
  }
265
216
 
266
- function generateHeader(columnPrefix) {
267
- var count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
268
- var headers = [];
217
+ function generateHeader(columnPrefix, count = 0) {
218
+ const headers = [];
269
219
 
270
- for (var i = 0; i < count; i++) {
220
+ for (let i = 0; i < count; i++) {
271
221
  headers.push("".concat(columnPrefix).concat(i + 1));
272
222
  }
273
223
 
@@ -275,13 +225,13 @@ function generateHeader(columnPrefix) {
275
225
  }
276
226
 
277
227
  function deduceSchema(row, headerRow) {
278
- var schema = headerRow ? {} : [];
228
+ const schema = headerRow ? {} : [];
279
229
 
280
- for (var i = 0; i < row.length; i++) {
281
- var columnName = headerRow && headerRow[i] || i;
282
- var value = row[i];
230
+ for (let i = 0; i < row.length; i++) {
231
+ const columnName = headerRow && headerRow[i] || i;
232
+ const value = row[i];
283
233
 
284
- switch ((0, _typeof2.default)(value)) {
234
+ switch (typeof value) {
285
235
  case 'number':
286
236
  case 'boolean':
287
237
  schema[columnName] = {
@@ -304,6 +254,6 @@ function deduceSchema(row, headerRow) {
304
254
  return schema;
305
255
  }
306
256
 
307
- var _typecheckCSVLoader = CSVLoader;
257
+ const _typecheckCSVLoader = CSVLoader;
308
258
  exports._typecheckCSVLoader = _typecheckCSVLoader;
309
259
  //# sourceMappingURL=csv-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/csv-loader.ts"],"names":["VERSION","DEFAULT_CSV_LOADER_OPTIONS","csv","shape","optimizeMemoryUsage","header","columnPrefix","quoteChar","escapeChar","dynamicTyping","comments","skipEmptyLines","delimitersToGuess","CSVLoader","id","module","name","version","extensions","mimeTypes","category","parse","arrayBuffer","options","parseCSV","TextDecoder","decode","parseText","text","parseInBatches","parseCSVInBatches","csvText","csvOptions","firstRow","readFirstRow","isHeaderRow","Boolean","parseWithHeader","papaparseConfig","download","transformHeader","duplicateColumnTransformer","undefined","error","e","Error","result","Papa","rows","data","headerRow","meta","fields","generateHeader","length","map","row","Array","isArray","asyncIterator","batchSize","asyncQueue","AsyncQueue","isFirstRow","tableBatchBuilder","schema","config","chunkSize","step","results","collapsedRow","flat","join","trim","bytesUsed","cursor","deduceSchema","JSON","stringify","TableBatchBuilder","addRow","batch","getFullBatch","enqueue","complete","getFinalBatch","close","AsyncIteratorStreamer","every","value","preview","observedColumns","Set","col","colName","counter","has","add","count","headers","i","push","columnName","String","index","type","Float32Array","_typecheckCSVLoader"],"mappings":"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","sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {Batch} from '@loaders.gl/schema';\ntype Schema = any;\n\nimport {\n AsyncQueue,\n TableBatchBuilder,\n convertToArrayRow,\n convertToObjectRow\n} from '@loaders.gl/schema';\nimport Papa from './libs/papaparse';\nimport AsyncIteratorStreamer from './lib/async-iterator-streamer';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type CSVLoaderOptions = LoaderOptions & {\n csv?: {\n // loaders.gl options\n shape?: 'array-row-table' | 'object-row-table' | 'columnar-table';\n /** optimizes memory usage but increases parsing time. */\n optimizeMemoryUsage?: boolean;\n columnPrefix?: string;\n header?: 'auto';\n\n // CSV options (papaparse)\n // delimiter: auto\n // newline: auto\n quoteChar?: string;\n escapeChar?: string;\n // Convert numbers and boolean values in rows from strings\n dynamicTyping?: boolean;\n comments?: boolean;\n skipEmptyLines?: boolean | 'greedy';\n // transform: null?\n delimitersToGuess?: string[];\n // fastMode: auto\n };\n};\n\nconst DEFAULT_CSV_LOADER_OPTIONS = {\n csv: {\n shape: 'object-row-table',\n optimizeMemoryUsage: false,\n // CSV options\n header: 'auto',\n columnPrefix: 'column',\n // delimiter: auto\n // newline: auto\n quoteChar: '\"',\n escapeChar: '\"',\n dynamicTyping: true,\n comments: false,\n skipEmptyLines: true,\n // transform: null?\n delimitersToGuess: [',', '\\t', '|', ';']\n // fastMode: auto\n }\n};\n\nexport const CSVLoader = {\n id: 'csv',\n module: 'csv',\n name: 'CSV',\n version: VERSION,\n extensions: ['csv'],\n mimeTypes: ['text/csv'],\n category: 'table',\n parse: async (arrayBuffer: ArrayBuffer, options?: CSVLoaderOptions) =>\n parseCSV(new TextDecoder().decode(arrayBuffer), options),\n parseText: (text: string, options?: CSVLoaderOptions) => parseCSV(text, options),\n parseInBatches: parseCSVInBatches,\n // @ts-ignore\n // testText: null,\n options: DEFAULT_CSV_LOADER_OPTIONS as CSVLoaderOptions\n};\n\nasync function parseCSV(csvText: string, options?: CSVLoaderOptions) {\n // Apps can call the parse method directly, we so apply default options here\n const csvOptions = {...DEFAULT_CSV_LOADER_OPTIONS.csv, ...options?.csv};\n\n const firstRow = readFirstRow(csvText);\n const header: boolean =\n csvOptions.header === 'auto' ? isHeaderRow(firstRow) : Boolean(csvOptions.header);\n\n const parseWithHeader = header;\n\n const papaparseConfig = {\n // dynamicTyping: true,\n ...csvOptions,\n header: parseWithHeader,\n download: false, // We handle loading, no need for papaparse to do it for us\n transformHeader: parseWithHeader ? duplicateColumnTransformer() : undefined,\n error: (e) => {\n throw new Error(e);\n }\n };\n\n const result = Papa.parse(csvText, papaparseConfig);\n let {data: rows} = result;\n\n const headerRow = result.meta.fields || generateHeader(csvOptions.columnPrefix, firstRow.length);\n\n switch (csvOptions.shape) {\n case 'object-row-table':\n rows = rows.map((row) => (Array.isArray(row) ? convertToObjectRow(row, headerRow) : row));\n break;\n case 'array-row-table':\n rows = rows.map((row) => (Array.isArray(row) ? row : convertToArrayRow(row, headerRow)));\n break;\n default:\n }\n\n /*\n if (!header && shape === 'object-row-table') {\n // If the dataset has no header, transform the array result into an object shape with an\n // autogenerated header\n return result.data.map((row) =>\n row.reduce((acc, value, i) => {\n acc[headerRow[i]] = value;\n return acc;\n }, {})\n );\n }\n */\n return rows;\n}\n\n// TODO - support batch size 0 = no batching/single batch?\nfunction parseCSVInBatches(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options?: CSVLoaderOptions\n): AsyncIterable<Batch> {\n // Papaparse does not support standard batch size handling\n // TODO - investigate papaparse chunks mode\n options = {...options};\n if (options.batchSize === 'auto') {\n options.batchSize = 4000;\n }\n\n // Apps can call the parse method directly, we so apply default options here\n const csvOptions = {...DEFAULT_CSV_LOADER_OPTIONS.csv, ...options?.csv};\n\n const asyncQueue = new AsyncQueue<Batch>();\n\n let isFirstRow: boolean = true;\n let headerRow: string[] | null = null;\n let tableBatchBuilder: TableBatchBuilder | null = null;\n let schema: Schema | null = null;\n\n const config = {\n // dynamicTyping: true, // Convert numbers and boolean values in rows from strings,\n ...csvOptions,\n header: false, // Unfortunately, header detection is not automatic and does not infer shapes\n download: false, // We handle loading, no need for papaparse to do it for us\n // chunkSize is set to 5MB explicitly (same as Papaparse default) due to a bug where the\n // streaming parser gets stuck if skipEmptyLines and a step callback are both supplied.\n // See https://github.com/mholt/PapaParse/issues/465\n chunkSize: 1024 * 1024 * 5,\n // skipEmptyLines is set to a boolean value if supplied. Greedy is set to true\n // skipEmptyLines is handled manually given two bugs where the streaming parser gets stuck if\n // both of the skipEmptyLines and step callback options are provided:\n // - true doesn't work unless chunkSize is set: https://github.com/mholt/PapaParse/issues/465\n // - greedy doesn't work: https://github.com/mholt/PapaParse/issues/825\n skipEmptyLines: false,\n\n // step is called on every row\n // eslint-disable-next-line complexity\n step(results) {\n let row = results.data;\n\n if (csvOptions.skipEmptyLines) {\n // Manually reject lines that are empty\n const collapsedRow = row.flat().join('').trim();\n if (collapsedRow === '') {\n return;\n }\n }\n const bytesUsed = results.meta.cursor;\n\n // Check if we need to save a header row\n if (isFirstRow && !headerRow) {\n // Auto detects or can be forced with csvOptions.header\n const header = csvOptions.header === 'auto' ? isHeaderRow(row) : Boolean(csvOptions.header);\n if (header) {\n headerRow = row.map(duplicateColumnTransformer());\n return;\n }\n }\n\n // If first data row, we can deduce the schema\n if (isFirstRow) {\n isFirstRow = false;\n if (!headerRow) {\n headerRow = generateHeader(csvOptions.columnPrefix, row.length);\n }\n schema = deduceSchema(row, headerRow);\n }\n\n if (csvOptions.optimizeMemoryUsage) {\n // A workaround to allocate new strings and don't retain pointers to original strings.\n // https://bugs.chromium.org/p/v8/issues/detail?id=2869\n row = JSON.parse(JSON.stringify(row));\n }\n\n // Add the row\n tableBatchBuilder =\n tableBatchBuilder ||\n new TableBatchBuilder(schema, {\n // @ts-expect-error\n shape: csvOptions.shape || 'array-row-table',\n ...options\n });\n\n try {\n tableBatchBuilder.addRow(row);\n // If a batch has been completed, emit it\n const batch = tableBatchBuilder && tableBatchBuilder.getFullBatch({bytesUsed});\n if (batch) {\n asyncQueue.enqueue(batch);\n }\n } catch (error) {\n asyncQueue.enqueue(error as Error);\n }\n },\n\n // complete is called when all rows have been read\n complete(results) {\n try {\n const bytesUsed = results.meta.cursor;\n // Ensure any final (partial) batch gets emitted\n const batch = tableBatchBuilder && tableBatchBuilder.getFinalBatch({bytesUsed});\n if (batch) {\n asyncQueue.enqueue(batch);\n }\n } catch (error) {\n asyncQueue.enqueue(error as Error);\n }\n\n asyncQueue.close();\n }\n };\n\n Papa.parse(asyncIterator, config, AsyncIteratorStreamer);\n\n // TODO - Does it matter if we return asyncIterable or asyncIterator\n // return asyncQueue[Symbol.asyncIterator]();\n return asyncQueue;\n}\n\n/**\n * Checks if a certain row is a header row\n * @param row the row to check\n * @returns true if the row looks like a header\n */\nfunction isHeaderRow(row: string[]): boolean {\n return row && row.every((value) => typeof value === 'string');\n}\n\n/**\n * Reads, parses, and returns the first row of a CSV text\n * @param csvText the csv text to parse\n * @returns the first row\n */\nfunction readFirstRow(csvText: string): any[] {\n const result = Papa.parse(csvText, {\n download: false,\n dynamicTyping: true,\n preview: 1\n });\n return result.data[0];\n}\n\n/**\n * Creates a transformer that renames duplicate columns. This is needed as Papaparse doesn't handle\n * duplicate header columns and would use the latest occurrence by default.\n * See the header option in https://www.papaparse.com/docs#config\n * @returns a transform function that returns sanitized names for duplicate fields\n */\nfunction duplicateColumnTransformer() {\n const observedColumns = new Set();\n return (col) => {\n let colName = col;\n let counter = 1;\n while (observedColumns.has(colName)) {\n colName = `${col}.${counter}`;\n counter++;\n }\n observedColumns.add(colName);\n return colName;\n };\n}\n\n/**\n * Generates the header of a CSV given a prefix and a column count\n * @param columnPrefix the columnPrefix to use\n * @param count the count of column names to generate\n * @returns an array of column names\n */\nfunction generateHeader(columnPrefix: string, count: number = 0): string[] {\n const headers: string[] = [];\n for (let i = 0; i < count; i++) {\n headers.push(`${columnPrefix}${i + 1}`);\n }\n return headers;\n}\n\nfunction deduceSchema(row, headerRow) {\n const schema = headerRow ? {} : [];\n for (let i = 0; i < row.length; i++) {\n const columnName = (headerRow && headerRow[i]) || i;\n const value = row[i];\n switch (typeof value) {\n case 'number':\n case 'boolean':\n // TODO - booleans could be handled differently...\n schema[columnName] = {name: String(columnName), index: i, type: Float32Array};\n break;\n case 'string':\n default:\n schema[columnName] = {name: String(columnName), index: i, type: Array};\n // We currently only handle numeric rows\n // TODO we could offer a function to map strings to numbers?\n }\n }\n return schema;\n}\n\nexport const _typecheckCSVLoader: LoaderWithParser = CSVLoader;\n"],"file":"csv-loader.js"}
1
+ {"version":3,"sources":["../../src/csv-loader.ts"],"names":["VERSION","DEFAULT_CSV_LOADER_OPTIONS","csv","shape","optimizeMemoryUsage","header","columnPrefix","quoteChar","escapeChar","dynamicTyping","comments","skipEmptyLines","delimitersToGuess","CSVLoader","id","module","name","version","extensions","mimeTypes","category","parse","arrayBuffer","options","parseCSV","TextDecoder","decode","parseText","text","parseInBatches","parseCSVInBatches","csvText","csvOptions","firstRow","readFirstRow","isHeaderRow","Boolean","parseWithHeader","papaparseConfig","download","transformHeader","duplicateColumnTransformer","undefined","error","e","Error","result","Papa","data","rows","headerRow","meta","fields","generateHeader","length","map","row","Array","isArray","asyncIterator","batchSize","asyncQueue","AsyncQueue","isFirstRow","tableBatchBuilder","schema","config","chunkSize","step","results","collapsedRow","flat","join","trim","bytesUsed","cursor","deduceSchema","JSON","stringify","TableBatchBuilder","addRow","batch","getFullBatch","enqueue","complete","getFinalBatch","close","AsyncIteratorStreamer","every","value","preview","observedColumns","Set","col","colName","counter","has","add","count","headers","i","push","columnName","String","index","type","Float32Array","_typecheckCSVLoader"],"mappings":"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","sourcesContent":["import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {Batch} from '@loaders.gl/schema';\ntype Schema = any;\n\nimport {\n AsyncQueue,\n TableBatchBuilder,\n convertToArrayRow,\n convertToObjectRow\n} from '@loaders.gl/schema';\nimport Papa from './libs/papaparse';\nimport AsyncIteratorStreamer from './lib/async-iterator-streamer';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type CSVLoaderOptions = LoaderOptions & {\n csv?: {\n // loaders.gl options\n shape?: 'array-row-table' | 'object-row-table' | 'columnar-table';\n /** optimizes memory usage but increases parsing time. */\n optimizeMemoryUsage?: boolean;\n columnPrefix?: string;\n header?: 'auto';\n\n // CSV options (papaparse)\n // delimiter: auto\n // newline: auto\n quoteChar?: string;\n escapeChar?: string;\n // Convert numbers and boolean values in rows from strings\n dynamicTyping?: boolean;\n comments?: boolean;\n skipEmptyLines?: boolean | 'greedy';\n // transform: null?\n delimitersToGuess?: string[];\n // fastMode: auto\n };\n};\n\nconst DEFAULT_CSV_LOADER_OPTIONS = {\n csv: {\n shape: 'object-row-table',\n optimizeMemoryUsage: false,\n // CSV options\n header: 'auto',\n columnPrefix: 'column',\n // delimiter: auto\n // newline: auto\n quoteChar: '\"',\n escapeChar: '\"',\n dynamicTyping: true,\n comments: false,\n skipEmptyLines: true,\n // transform: null?\n delimitersToGuess: [',', '\\t', '|', ';']\n // fastMode: auto\n }\n};\n\nexport const CSVLoader = {\n id: 'csv',\n module: 'csv',\n name: 'CSV',\n version: VERSION,\n extensions: ['csv'],\n mimeTypes: ['text/csv'],\n category: 'table',\n parse: async (arrayBuffer: ArrayBuffer, options?: CSVLoaderOptions) =>\n parseCSV(new TextDecoder().decode(arrayBuffer), options),\n parseText: (text: string, options?: CSVLoaderOptions) => parseCSV(text, options),\n parseInBatches: parseCSVInBatches,\n // @ts-ignore\n // testText: null,\n options: DEFAULT_CSV_LOADER_OPTIONS as CSVLoaderOptions\n};\n\nasync function parseCSV(csvText: string, options?: CSVLoaderOptions) {\n // Apps can call the parse method directly, we so apply default options here\n const csvOptions = {...DEFAULT_CSV_LOADER_OPTIONS.csv, ...options?.csv};\n\n const firstRow = readFirstRow(csvText);\n const header: boolean =\n csvOptions.header === 'auto' ? isHeaderRow(firstRow) : Boolean(csvOptions.header);\n\n const parseWithHeader = header;\n\n const papaparseConfig = {\n // dynamicTyping: true,\n ...csvOptions,\n header: parseWithHeader,\n download: false, // We handle loading, no need for papaparse to do it for us\n transformHeader: parseWithHeader ? duplicateColumnTransformer() : undefined,\n error: (e) => {\n throw new Error(e);\n }\n };\n\n const result = Papa.parse(csvText, papaparseConfig);\n let {data: rows} = result;\n\n const headerRow = result.meta.fields || generateHeader(csvOptions.columnPrefix, firstRow.length);\n\n switch (csvOptions.shape) {\n case 'object-row-table':\n rows = rows.map((row) => (Array.isArray(row) ? convertToObjectRow(row, headerRow) : row));\n break;\n case 'array-row-table':\n rows = rows.map((row) => (Array.isArray(row) ? row : convertToArrayRow(row, headerRow)));\n break;\n default:\n }\n\n /*\n if (!header && shape === 'object-row-table') {\n // If the dataset has no header, transform the array result into an object shape with an\n // autogenerated header\n return result.data.map((row) =>\n row.reduce((acc, value, i) => {\n acc[headerRow[i]] = value;\n return acc;\n }, {})\n );\n }\n */\n return rows;\n}\n\n// TODO - support batch size 0 = no batching/single batch?\nfunction parseCSVInBatches(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options?: CSVLoaderOptions\n): AsyncIterable<Batch> {\n // Papaparse does not support standard batch size handling\n // TODO - investigate papaparse chunks mode\n options = {...options};\n if (options.batchSize === 'auto') {\n options.batchSize = 4000;\n }\n\n // Apps can call the parse method directly, we so apply default options here\n const csvOptions = {...DEFAULT_CSV_LOADER_OPTIONS.csv, ...options?.csv};\n\n const asyncQueue = new AsyncQueue<Batch>();\n\n let isFirstRow: boolean = true;\n let headerRow: string[] | null = null;\n let tableBatchBuilder: TableBatchBuilder | null = null;\n let schema: Schema | null = null;\n\n const config = {\n // dynamicTyping: true, // Convert numbers and boolean values in rows from strings,\n ...csvOptions,\n header: false, // Unfortunately, header detection is not automatic and does not infer shapes\n download: false, // We handle loading, no need for papaparse to do it for us\n // chunkSize is set to 5MB explicitly (same as Papaparse default) due to a bug where the\n // streaming parser gets stuck if skipEmptyLines and a step callback are both supplied.\n // See https://github.com/mholt/PapaParse/issues/465\n chunkSize: 1024 * 1024 * 5,\n // skipEmptyLines is set to a boolean value if supplied. Greedy is set to true\n // skipEmptyLines is handled manually given two bugs where the streaming parser gets stuck if\n // both of the skipEmptyLines and step callback options are provided:\n // - true doesn't work unless chunkSize is set: https://github.com/mholt/PapaParse/issues/465\n // - greedy doesn't work: https://github.com/mholt/PapaParse/issues/825\n skipEmptyLines: false,\n\n // step is called on every row\n // eslint-disable-next-line complexity\n step(results) {\n let row = results.data;\n\n if (csvOptions.skipEmptyLines) {\n // Manually reject lines that are empty\n const collapsedRow = row.flat().join('').trim();\n if (collapsedRow === '') {\n return;\n }\n }\n const bytesUsed = results.meta.cursor;\n\n // Check if we need to save a header row\n if (isFirstRow && !headerRow) {\n // Auto detects or can be forced with csvOptions.header\n const header = csvOptions.header === 'auto' ? isHeaderRow(row) : Boolean(csvOptions.header);\n if (header) {\n headerRow = row.map(duplicateColumnTransformer());\n return;\n }\n }\n\n // If first data row, we can deduce the schema\n if (isFirstRow) {\n isFirstRow = false;\n if (!headerRow) {\n headerRow = generateHeader(csvOptions.columnPrefix, row.length);\n }\n schema = deduceSchema(row, headerRow);\n }\n\n if (csvOptions.optimizeMemoryUsage) {\n // A workaround to allocate new strings and don't retain pointers to original strings.\n // https://bugs.chromium.org/p/v8/issues/detail?id=2869\n row = JSON.parse(JSON.stringify(row));\n }\n\n // Add the row\n tableBatchBuilder =\n tableBatchBuilder ||\n new TableBatchBuilder(schema, {\n // @ts-expect-error\n shape: csvOptions.shape || 'array-row-table',\n ...options\n });\n\n try {\n tableBatchBuilder.addRow(row);\n // If a batch has been completed, emit it\n const batch = tableBatchBuilder && tableBatchBuilder.getFullBatch({bytesUsed});\n if (batch) {\n asyncQueue.enqueue(batch);\n }\n } catch (error) {\n asyncQueue.enqueue(error as Error);\n }\n },\n\n // complete is called when all rows have been read\n complete(results) {\n try {\n const bytesUsed = results.meta.cursor;\n // Ensure any final (partial) batch gets emitted\n const batch = tableBatchBuilder && tableBatchBuilder.getFinalBatch({bytesUsed});\n if (batch) {\n asyncQueue.enqueue(batch);\n }\n } catch (error) {\n asyncQueue.enqueue(error as Error);\n }\n\n asyncQueue.close();\n }\n };\n\n Papa.parse(asyncIterator, config, AsyncIteratorStreamer);\n\n // TODO - Does it matter if we return asyncIterable or asyncIterator\n // return asyncQueue[Symbol.asyncIterator]();\n return asyncQueue;\n}\n\n/**\n * Checks if a certain row is a header row\n * @param row the row to check\n * @returns true if the row looks like a header\n */\nfunction isHeaderRow(row: string[]): boolean {\n return row && row.every((value) => typeof value === 'string');\n}\n\n/**\n * Reads, parses, and returns the first row of a CSV text\n * @param csvText the csv text to parse\n * @returns the first row\n */\nfunction readFirstRow(csvText: string): any[] {\n const result = Papa.parse(csvText, {\n download: false,\n dynamicTyping: true,\n preview: 1\n });\n return result.data[0];\n}\n\n/**\n * Creates a transformer that renames duplicate columns. This is needed as Papaparse doesn't handle\n * duplicate header columns and would use the latest occurrence by default.\n * See the header option in https://www.papaparse.com/docs#config\n * @returns a transform function that returns sanitized names for duplicate fields\n */\nfunction duplicateColumnTransformer() {\n const observedColumns = new Set();\n return (col) => {\n let colName = col;\n let counter = 1;\n while (observedColumns.has(colName)) {\n colName = `${col}.${counter}`;\n counter++;\n }\n observedColumns.add(colName);\n return colName;\n };\n}\n\n/**\n * Generates the header of a CSV given a prefix and a column count\n * @param columnPrefix the columnPrefix to use\n * @param count the count of column names to generate\n * @returns an array of column names\n */\nfunction generateHeader(columnPrefix: string, count: number = 0): string[] {\n const headers: string[] = [];\n for (let i = 0; i < count; i++) {\n headers.push(`${columnPrefix}${i + 1}`);\n }\n return headers;\n}\n\nfunction deduceSchema(row, headerRow) {\n const schema = headerRow ? {} : [];\n for (let i = 0; i < row.length; i++) {\n const columnName = (headerRow && headerRow[i]) || i;\n const value = row[i];\n switch (typeof value) {\n case 'number':\n case 'boolean':\n // TODO - booleans could be handled differently...\n schema[columnName] = {name: String(columnName), index: i, type: Float32Array};\n break;\n case 'string':\n default:\n schema[columnName] = {name: String(columnName), index: i, type: Array};\n // We currently only handle numeric rows\n // TODO we could offer a function to map strings to numbers?\n }\n }\n return schema;\n}\n\nexport const _typecheckCSVLoader: LoaderWithParser = CSVLoader;\n"],"file":"csv-loader.js"}
package/dist/es5/index.js CHANGED
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  Object.defineProperty(exports, "CSVLoader", {
7
7
  enumerable: true,
8
- get: function get() {
8
+ get: function () {
9
9
  return _csvLoader.CSVLoader;
10
10
  }
11
11
  });
@@ -7,124 +7,31 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = AsyncIteratorStreamer;
9
9
 
10
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
-
12
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
-
14
- var _asyncIterator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncIterator"));
15
-
16
10
  var _papaparse = _interopRequireDefault(require("../libs/papaparse"));
17
11
 
18
- var ChunkStreamer = _papaparse.default.ChunkStreamer;
12
+ const {
13
+ ChunkStreamer
14
+ } = _papaparse.default;
19
15
 
20
16
  function AsyncIteratorStreamer(config) {
21
17
  config = config || {};
22
18
  ChunkStreamer.call(this, config);
23
19
  this.textDecoder = new TextDecoder(this._config.encoding);
24
20
 
25
- this.stream = function () {
26
- var _ref = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(asyncIterator) {
27
- var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, chunk;
28
-
29
- return _regenerator.default.wrap(function _callee$(_context) {
30
- while (1) {
31
- switch (_context.prev = _context.next) {
32
- case 0:
33
- this._input = asyncIterator;
34
- _context.prev = 1;
35
- _iteratorNormalCompletion = true;
36
- _didIteratorError = false;
37
- _context.prev = 4;
38
- _iterator = (0, _asyncIterator2.default)(asyncIterator);
39
-
40
- case 6:
41
- _context.next = 8;
42
- return _iterator.next();
43
-
44
- case 8:
45
- _step = _context.sent;
46
- _iteratorNormalCompletion = _step.done;
47
- _context.next = 12;
48
- return _step.value;
49
-
50
- case 12:
51
- _value = _context.sent;
52
-
53
- if (_iteratorNormalCompletion) {
54
- _context.next = 19;
55
- break;
56
- }
57
-
58
- chunk = _value;
59
- this.parseChunk(this.getStringChunk(chunk));
60
-
61
- case 16:
62
- _iteratorNormalCompletion = true;
63
- _context.next = 6;
64
- break;
65
-
66
- case 19:
67
- _context.next = 25;
68
- break;
69
-
70
- case 21:
71
- _context.prev = 21;
72
- _context.t0 = _context["catch"](4);
73
- _didIteratorError = true;
74
- _iteratorError = _context.t0;
21
+ this.stream = async function (asyncIterator) {
22
+ this._input = asyncIterator;
75
23
 
76
- case 25:
77
- _context.prev = 25;
78
- _context.prev = 26;
24
+ try {
25
+ for await (const chunk of asyncIterator) {
26
+ this.parseChunk(this.getStringChunk(chunk));
27
+ }
79
28
 
80
- if (!(!_iteratorNormalCompletion && _iterator.return != null)) {
81
- _context.next = 30;
82
- break;
83
- }
84
-
85
- _context.next = 30;
86
- return _iterator.return();
87
-
88
- case 30:
89
- _context.prev = 30;
90
-
91
- if (!_didIteratorError) {
92
- _context.next = 33;
93
- break;
94
- }
95
-
96
- throw _iteratorError;
97
-
98
- case 33:
99
- return _context.finish(30);
100
-
101
- case 34:
102
- return _context.finish(25);
103
-
104
- case 35:
105
- this._finished = true;
106
- this.parseChunk('');
107
- _context.next = 42;
108
- break;
109
-
110
- case 39:
111
- _context.prev = 39;
112
- _context.t1 = _context["catch"](1);
113
-
114
- this._sendError(_context.t1);
115
-
116
- case 42:
117
- case "end":
118
- return _context.stop();
119
- }
120
- }
121
- }, _callee, this, [[1, 39], [4, 21, 25, 35], [26,, 30, 34]]);
122
- }));
123
-
124
- return function (_x) {
125
- return _ref.apply(this, arguments);
126
- };
127
- }();
29
+ this._finished = true;
30
+ this.parseChunk('');
31
+ } catch (error) {
32
+ this._sendError(error);
33
+ }
34
+ };
128
35
 
129
36
  this._nextChunk = function nextChunk() {};
130
37
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/async-iterator-streamer.ts"],"names":["ChunkStreamer","Papa","AsyncIteratorStreamer","config","call","textDecoder","TextDecoder","_config","encoding","stream","asyncIterator","_input","chunk","parseChunk","getStringChunk","_finished","_sendError","_nextChunk","nextChunk","decode","prototype","Object","create","constructor"],"mappings":";;;;;;;;;;;;;;;AAQA;;AACA,IAAOA,aAAP,GAAwBC,kBAAxB,CAAOD,aAAP;;AAEe,SAASE,qBAAT,CAA+BC,MAA/B,EAAuC;AACpDA,EAAAA,MAAM,GAAGA,MAAM,IAAI,EAAnB;AAEAH,EAAAA,aAAa,CAACI,IAAd,CAAmB,IAAnB,EAAyBD,MAAzB;AAEA,OAAKE,WAAL,GAAmB,IAAIC,WAAJ,CAAgB,KAAKC,OAAL,CAAaC,QAA7B,CAAnB;;AAaA,OAAKC,MAAL;AAAA,yEAAc,iBAAgBC,aAAhB;AAAA;;AAAA;AAAA;AAAA;AAAA;AACZ,mBAAKC,MAAL,GAAcD,aAAd;AADY;AAAA;AAAA;AAAA;AAAA,uDAMgBA,aANhB;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAMOE,cAAAA,KANP;AAOR,mBAAKC,UAAL,CAAgB,KAAKC,cAAL,CAAoBF,KAApB,CAAhB;;AAPQ;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAsBV,mBAAKG,SAAL,GAAiB,IAAjB;AACA,mBAAKF,UAAL,CAAgB,EAAhB;AAvBU;AAAA;;AAAA;AAAA;AAAA;;AA0BV,mBAAKG,UAAL;;AA1BU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAAd;;AAAA;AAAA;AAAA;AAAA;;AA8BA,OAAKC,UAAL,GAAkB,SAASC,SAAT,GAAqB,CAEtC,CAFD;;AAKA,OAAKJ,cAAL,GAAsB,UAAUF,KAAV,EAAiB;AACrC,WAAO,OAAOA,KAAP,KAAiB,QAAjB,GAA4BA,KAA5B,GAAoC,KAAKP,WAAL,CAAiBc,MAAjB,CAAwBP,KAAxB,EAA+B;AAACH,MAAAA,MAAM,EAAE;AAAT,KAA/B,CAA3C;AACD,GAFD;AAGD;;AAEDP,qBAAqB,CAACkB,SAAtB,GAAkCC,MAAM,CAACC,MAAP,CAActB,aAAa,CAACoB,SAA5B,CAAlC;AACAlB,qBAAqB,CAACkB,SAAtB,CAAgCG,WAAhC,GAA8CrB,qBAA9C","sourcesContent":["// A custom papaparse `Streamer` for async iterators\n// Ideally this can be contributed back to papaparse\n// Or papaparse can expose Streamer API so we can extend without forking.\n\n// @ts-nocheck\n/* eslint-disable no-invalid-this */\n\n// Note: papaparse is not an ES6 module\nimport Papa from '../libs/papaparse';\nconst {ChunkStreamer} = Papa;\n\nexport default function AsyncIteratorStreamer(config) {\n config = config || {};\n\n ChunkStreamer.call(this, config);\n\n this.textDecoder = new TextDecoder(this._config.encoding);\n\n // Implement ChunkStreamer base class methods\n\n // this.pause = function() {\n // ChunkStreamer.prototype.pause.apply(this, arguments);\n // };\n\n // this.resume = function() {\n // ChunkStreamer.prototype.resume.apply(this, arguments);\n // this._input.resume();\n // };\n\n this.stream = async function (asyncIterator) {\n this._input = asyncIterator;\n\n try {\n // ES2018 version\n // TODO - check for pause and abort flags?\n for await (const chunk of asyncIterator) {\n this.parseChunk(this.getStringChunk(chunk));\n }\n\n // ES5 VERSION\n // while (true) {\n // asyncIterator.next().then(function(value) {\n // if (value.done) {\n // // finalize iterator?\n // }\n // }\n // const = await ;\n // if (done) return total;\n // total += value.length;\n // }\n\n this._finished = true;\n this.parseChunk('');\n } catch (error) {\n // Inform ChunkStreamer base class of error\n this._sendError(error);\n }\n };\n\n this._nextChunk = function nextChunk() {\n // Left empty, as async iterator automatically pulls next chunk\n };\n\n // HELPER METHODS\n this.getStringChunk = function (chunk) {\n return typeof chunk === 'string' ? chunk : this.textDecoder.decode(chunk, {stream: true});\n };\n}\n\nAsyncIteratorStreamer.prototype = Object.create(ChunkStreamer.prototype);\nAsyncIteratorStreamer.prototype.constructor = AsyncIteratorStreamer;\n"],"file":"async-iterator-streamer.js"}
1
+ {"version":3,"sources":["../../../src/lib/async-iterator-streamer.ts"],"names":["ChunkStreamer","Papa","AsyncIteratorStreamer","config","call","textDecoder","TextDecoder","_config","encoding","stream","asyncIterator","_input","chunk","parseChunk","getStringChunk","_finished","error","_sendError","_nextChunk","nextChunk","decode","prototype","Object","create","constructor"],"mappings":";;;;;;;;;AAQA;;AACA,MAAM;AAACA,EAAAA;AAAD,IAAkBC,kBAAxB;;AAEe,SAASC,qBAAT,CAA+BC,MAA/B,EAAuC;AACpDA,EAAAA,MAAM,GAAGA,MAAM,IAAI,EAAnB;AAEAH,EAAAA,aAAa,CAACI,IAAd,CAAmB,IAAnB,EAAyBD,MAAzB;AAEA,OAAKE,WAAL,GAAmB,IAAIC,WAAJ,CAAgB,KAAKC,OAAL,CAAaC,QAA7B,CAAnB;;AAaA,OAAKC,MAAL,GAAc,gBAAgBC,aAAhB,EAA+B;AAC3C,SAAKC,MAAL,GAAcD,aAAd;;AAEA,QAAI;AAGF,iBAAW,MAAME,KAAjB,IAA0BF,aAA1B,EAAyC;AACvC,aAAKG,UAAL,CAAgB,KAAKC,cAAL,CAAoBF,KAApB,CAAhB;AACD;;AAcD,WAAKG,SAAL,GAAiB,IAAjB;AACA,WAAKF,UAAL,CAAgB,EAAhB;AACD,KArBD,CAqBE,OAAOG,KAAP,EAAc;AAEd,WAAKC,UAAL,CAAgBD,KAAhB;AACD;AACF,GA5BD;;AA8BA,OAAKE,UAAL,GAAkB,SAASC,SAAT,GAAqB,CAEtC,CAFD;;AAKA,OAAKL,cAAL,GAAsB,UAAUF,KAAV,EAAiB;AACrC,WAAO,OAAOA,KAAP,KAAiB,QAAjB,GAA4BA,KAA5B,GAAoC,KAAKP,WAAL,CAAiBe,MAAjB,CAAwBR,KAAxB,EAA+B;AAACH,MAAAA,MAAM,EAAE;AAAT,KAA/B,CAA3C;AACD,GAFD;AAGD;;AAEDP,qBAAqB,CAACmB,SAAtB,GAAkCC,MAAM,CAACC,MAAP,CAAcvB,aAAa,CAACqB,SAA5B,CAAlC;AACAnB,qBAAqB,CAACmB,SAAtB,CAAgCG,WAAhC,GAA8CtB,qBAA9C","sourcesContent":["// A custom papaparse `Streamer` for async iterators\n// Ideally this can be contributed back to papaparse\n// Or papaparse can expose Streamer API so we can extend without forking.\n\n// @ts-nocheck\n/* eslint-disable no-invalid-this */\n\n// Note: papaparse is not an ES6 module\nimport Papa from '../libs/papaparse';\nconst {ChunkStreamer} = Papa;\n\nexport default function AsyncIteratorStreamer(config) {\n config = config || {};\n\n ChunkStreamer.call(this, config);\n\n this.textDecoder = new TextDecoder(this._config.encoding);\n\n // Implement ChunkStreamer base class methods\n\n // this.pause = function() {\n // ChunkStreamer.prototype.pause.apply(this, arguments);\n // };\n\n // this.resume = function() {\n // ChunkStreamer.prototype.resume.apply(this, arguments);\n // this._input.resume();\n // };\n\n this.stream = async function (asyncIterator) {\n this._input = asyncIterator;\n\n try {\n // ES2018 version\n // TODO - check for pause and abort flags?\n for await (const chunk of asyncIterator) {\n this.parseChunk(this.getStringChunk(chunk));\n }\n\n // ES5 VERSION\n // while (true) {\n // asyncIterator.next().then(function(value) {\n // if (value.done) {\n // // finalize iterator?\n // }\n // }\n // const = await ;\n // if (done) return total;\n // total += value.length;\n // }\n\n this._finished = true;\n this.parseChunk('');\n } catch (error) {\n // Inform ChunkStreamer base class of error\n this._sendError(error);\n }\n };\n\n this._nextChunk = function nextChunk() {\n // Left empty, as async iterator automatically pulls next chunk\n };\n\n // HELPER METHODS\n this.getStringChunk = function (chunk) {\n return typeof chunk === 'string' ? chunk : this.textDecoder.decode(chunk, {stream: true});\n };\n}\n\nAsyncIteratorStreamer.prototype = Object.create(ChunkStreamer.prototype);\nAsyncIteratorStreamer.prototype.constructor = AsyncIteratorStreamer;\n"],"file":"async-iterator-streamer.js"}