@loaders.gl/shapefile 3.3.0-alpha.1 → 3.3.0-alpha.11

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.
Files changed (72) hide show
  1. package/dist/dbf-worker.js +1 -1
  2. package/dist/dist.min.js +47 -11
  3. package/dist/es5/bundle.js +0 -1
  4. package/dist/es5/bundle.js.map +1 -1
  5. package/dist/es5/dbf-loader.js +5 -16
  6. package/dist/es5/dbf-loader.js.map +1 -1
  7. package/dist/es5/index.js +6 -9
  8. package/dist/es5/index.js.map +1 -1
  9. package/dist/es5/lib/parsers/parse-dbf.js +69 -154
  10. package/dist/es5/lib/parsers/parse-dbf.js.map +1 -1
  11. package/dist/es5/lib/parsers/parse-shapefile.js +34 -148
  12. package/dist/es5/lib/parsers/parse-shapefile.js.map +1 -1
  13. package/dist/es5/lib/parsers/parse-shp-geometry.js +4 -57
  14. package/dist/es5/lib/parsers/parse-shp-geometry.js.map +1 -1
  15. package/dist/es5/lib/parsers/parse-shp-header.js +0 -3
  16. package/dist/es5/lib/parsers/parse-shp-header.js.map +1 -1
  17. package/dist/es5/lib/parsers/parse-shp.js +39 -98
  18. package/dist/es5/lib/parsers/parse-shp.js.map +1 -1
  19. package/dist/es5/lib/parsers/parse-shx.js +0 -4
  20. package/dist/es5/lib/parsers/parse-shx.js.map +1 -1
  21. package/dist/es5/lib/parsers/types.js.map +1 -1
  22. package/dist/es5/lib/streaming/binary-chunk-reader.js +39 -55
  23. package/dist/es5/lib/streaming/binary-chunk-reader.js.map +1 -1
  24. package/dist/es5/lib/streaming/binary-reader.js +11 -12
  25. package/dist/es5/lib/streaming/binary-reader.js.map +1 -1
  26. package/dist/es5/lib/streaming/zip-batch-iterators.js +1 -24
  27. package/dist/es5/lib/streaming/zip-batch-iterators.js.map +1 -1
  28. package/dist/es5/shapefile-loader.js +1 -3
  29. package/dist/es5/shapefile-loader.js.map +1 -1
  30. package/dist/es5/shp-loader.js +6 -17
  31. package/dist/es5/shp-loader.js.map +1 -1
  32. package/dist/es5/workers/dbf-worker.js +0 -2
  33. package/dist/es5/workers/dbf-worker.js.map +1 -1
  34. package/dist/es5/workers/shp-worker.js +0 -2
  35. package/dist/es5/workers/shp-worker.js.map +1 -1
  36. package/dist/esm/bundle.js +1 -1
  37. package/dist/esm/bundle.js.map +1 -1
  38. package/dist/esm/dbf-loader.js +6 -2
  39. package/dist/esm/dbf-loader.js.map +1 -1
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/lib/parsers/parse-dbf.js +18 -58
  42. package/dist/esm/lib/parsers/parse-dbf.js.map +1 -1
  43. package/dist/esm/lib/parsers/parse-shapefile.js +12 -35
  44. package/dist/esm/lib/parsers/parse-shapefile.js.map +1 -1
  45. package/dist/esm/lib/parsers/parse-shp-geometry.js +3 -28
  46. package/dist/esm/lib/parsers/parse-shp-geometry.js.map +1 -1
  47. package/dist/esm/lib/parsers/parse-shp-header.js +1 -3
  48. package/dist/esm/lib/parsers/parse-shp-header.js.map +1 -1
  49. package/dist/esm/lib/parsers/parse-shp.js +2 -26
  50. package/dist/esm/lib/parsers/parse-shp.js.map +1 -1
  51. package/dist/esm/lib/parsers/parse-shx.js +1 -2
  52. package/dist/esm/lib/parsers/parse-shx.js.map +1 -1
  53. package/dist/esm/lib/parsers/types.js.map +1 -1
  54. package/dist/esm/lib/streaming/binary-chunk-reader.js +4 -19
  55. package/dist/esm/lib/streaming/binary-chunk-reader.js.map +1 -1
  56. package/dist/esm/lib/streaming/binary-reader.js +0 -5
  57. package/dist/esm/lib/streaming/binary-reader.js.map +1 -1
  58. package/dist/esm/lib/streaming/zip-batch-iterators.js +2 -5
  59. package/dist/esm/lib/streaming/zip-batch-iterators.js.map +1 -1
  60. package/dist/esm/shapefile-loader.js +3 -1
  61. package/dist/esm/shapefile-loader.js.map +1 -1
  62. package/dist/esm/shp-loader.js +6 -2
  63. package/dist/esm/shp-loader.js.map +1 -1
  64. package/dist/esm/workers/dbf-worker.js.map +1 -1
  65. package/dist/esm/workers/shp-worker.js.map +1 -1
  66. package/dist/lib/parsers/types.d.ts +7 -7
  67. package/dist/lib/parsers/types.d.ts.map +1 -1
  68. package/dist/lib/streaming/binary-chunk-reader.d.ts +1 -1
  69. package/dist/lib/streaming/binary-chunk-reader.d.ts.map +1 -1
  70. package/dist/shp-worker.js +1 -1
  71. package/package.json +5 -5
  72. package/src/lib/parsers/parse-dbf.ts +1 -1
@@ -1,41 +1,27 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.parseDBF = parseDBF;
9
8
  exports.parseDBFInBatches = parseDBFInBatches;
10
-
11
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
-
13
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
14
-
15
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
16
-
17
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
-
19
13
  var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/awaitAsyncGenerator"));
20
-
21
14
  var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapAsyncGenerator"));
22
-
23
- var _asyncIterator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncIterator"));
24
-
25
15
  var _schema = require("@loaders.gl/schema");
26
-
27
16
  var _binaryChunkReader = _interopRequireDefault(require("../streaming/binary-chunk-reader"));
28
-
29
17
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
30
-
31
18
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
32
-
33
19
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
34
-
20
+ function _asyncIterator(iterable) { var method, async, sync, retry = 2; for ("undefined" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) { if (async && null != (method = iterable[async])) return method.call(iterable); if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable)); async = "@@asyncIterator", sync = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
21
+ function AsyncFromSyncIterator(s) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var done = r.done; return Promise.resolve(r.value).then(function (value) { return { value: value, done: done }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) { this.s = s, this.n = s.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, return: function _return(value) { var ret = this.s.return; return void 0 === ret ? Promise.resolve({ value: value, done: !0 }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments)); }, throw: function _throw(value) { var thr = this.s.return; return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(s); }
35
22
  var LITTLE_ENDIAN = true;
36
23
  var DBF_HEADER_SIZE = 32;
37
24
  var STATE;
38
-
39
25
  (function (STATE) {
40
26
  STATE[STATE["START"] = 0] = "START";
41
27
  STATE[STATE["FIELD_DESCRIPTORS"] = 1] = "FIELD_DESCRIPTORS";
@@ -43,7 +29,6 @@ var STATE;
43
29
  STATE[STATE["END"] = 3] = "END";
44
30
  STATE[STATE["ERROR"] = 4] = "ERROR";
45
31
  })(STATE || (STATE = {}));
46
-
47
32
  var DBFParser = function () {
48
33
  function DBFParser(options) {
49
34
  (0, _classCallCheck2.default)(this, DBFParser);
@@ -58,16 +43,17 @@ var DBFParser = function () {
58
43
 
59
44
  (0, _createClass2.default)(DBFParser, [{
60
45
  key: "write",
61
- value: function write(arrayBuffer) {
46
+ value:
47
+ function write(arrayBuffer) {
62
48
  this.binaryReader.write(arrayBuffer);
63
49
  this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);
50
+
64
51
  }
65
52
  }, {
66
53
  key: "end",
67
54
  value: function end() {
68
55
  this.binaryReader.end();
69
56
  this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);
70
-
71
57
  if (this.state !== STATE.END) {
72
58
  this.state = STATE.ERROR;
73
59
  this.result.error = 'DBF incomplete file';
@@ -76,26 +62,21 @@ var DBFParser = function () {
76
62
  }]);
77
63
  return DBFParser;
78
64
  }();
79
-
80
65
  function parseDBF(arrayBuffer) {
81
66
  var _options$tables, _options$dbf;
82
-
83
67
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
84
-
85
68
  var _ref = options.dbf || {},
86
- _ref$encoding = _ref.encoding,
87
- encoding = _ref$encoding === void 0 ? 'latin1' : _ref$encoding;
88
-
69
+ _ref$encoding = _ref.encoding,
70
+ encoding = _ref$encoding === void 0 ? 'latin1' : _ref$encoding;
89
71
  var dbfParser = new DBFParser({
90
72
  encoding: encoding
91
73
  });
92
74
  dbfParser.write(arrayBuffer);
93
75
  dbfParser.end();
94
76
  var _dbfParser$result = dbfParser.result,
95
- data = _dbfParser$result.data,
96
- schema = _dbfParser$result.schema;
77
+ data = _dbfParser$result.data,
78
+ schema = _dbfParser$result.schema;
97
79
  var shape = (options === null || options === void 0 ? void 0 : (_options$tables = options.tables) === null || _options$tables === void 0 ? void 0 : _options$tables.format) || (options === null || options === void 0 ? void 0 : (_options$dbf = options.dbf) === null || _options$dbf === void 0 ? void 0 : _options$dbf.shape);
98
-
99
80
  switch (shape) {
100
81
  case 'object-row-table':
101
82
  {
@@ -106,40 +87,34 @@ function parseDBF(arrayBuffer) {
106
87
  };
107
88
  return table;
108
89
  }
109
-
110
90
  case 'table':
111
91
  return {
112
92
  schema: schema,
113
93
  rows: data
114
94
  };
115
-
116
95
  case 'rows':
117
96
  default:
118
97
  return data;
119
98
  }
120
99
  }
121
-
122
100
  function parseDBFInBatches(_x) {
123
101
  return _parseDBFInBatches.apply(this, arguments);
124
102
  }
125
-
126
103
  function _parseDBFInBatches() {
127
104
  _parseDBFInBatches = (0, _wrapAsyncGenerator2.default)(_regenerator.default.mark(function _callee(asyncIterator) {
128
105
  var options,
129
- _ref2,
130
- _ref2$encoding,
131
- encoding,
132
- parser,
133
- headerReturned,
134
- _iteratorNormalCompletion,
135
- _didIteratorError,
136
- _iteratorError,
137
- _iterator,
138
- _step,
139
- _value,
140
- arrayBuffer,
141
- _args = arguments;
142
-
106
+ _ref2,
107
+ _ref2$encoding,
108
+ encoding,
109
+ parser,
110
+ headerReturned,
111
+ _iteratorAbruptCompletion,
112
+ _didIteratorError,
113
+ _iteratorError,
114
+ _iterator,
115
+ _step,
116
+ arrayBuffer,
117
+ _args = arguments;
143
118
  return _regenerator.default.wrap(function _callee$(_context) {
144
119
  while (1) {
145
120
  switch (_context.prev = _context.next) {
@@ -150,117 +125,85 @@ function _parseDBFInBatches() {
150
125
  encoding: encoding
151
126
  });
152
127
  headerReturned = false;
153
- _iteratorNormalCompletion = true;
128
+ _iteratorAbruptCompletion = false;
154
129
  _didIteratorError = false;
155
130
  _context.prev = 6;
156
- _iterator = (0, _asyncIterator2.default)(asyncIterator);
157
-
131
+ _iterator = _asyncIterator(asyncIterator);
158
132
  case 8:
159
133
  _context.next = 10;
160
134
  return (0, _awaitAsyncGenerator2.default)(_iterator.next());
161
-
162
135
  case 10:
163
- _step = _context.sent;
164
- _iteratorNormalCompletion = _step.done;
165
- _context.next = 14;
166
- return (0, _awaitAsyncGenerator2.default)(_step.value);
167
-
168
- case 14:
169
- _value = _context.sent;
170
-
171
- if (_iteratorNormalCompletion) {
172
- _context.next = 29;
136
+ if (!(_iteratorAbruptCompletion = !(_step = _context.sent).done)) {
137
+ _context.next = 24;
173
138
  break;
174
139
  }
175
-
176
- arrayBuffer = _value;
140
+ arrayBuffer = _step.value;
177
141
  parser.write(arrayBuffer);
178
-
179
142
  if (!(!headerReturned && parser.result.dbfHeader)) {
180
- _context.next = 22;
143
+ _context.next = 17;
181
144
  break;
182
145
  }
183
-
184
146
  headerReturned = true;
185
- _context.next = 22;
147
+ _context.next = 17;
186
148
  return parser.result.dbfHeader;
187
-
188
- case 22:
149
+ case 17:
189
150
  if (!(parser.result.data.length > 0)) {
190
- _context.next = 26;
151
+ _context.next = 21;
191
152
  break;
192
153
  }
193
-
194
- _context.next = 25;
154
+ _context.next = 20;
195
155
  return parser.result.data;
196
-
197
- case 25:
156
+ case 20:
198
157
  parser.result.data = [];
199
-
200
- case 26:
201
- _iteratorNormalCompletion = true;
158
+ case 21:
159
+ _iteratorAbruptCompletion = false;
202
160
  _context.next = 8;
203
161
  break;
204
-
205
- case 29:
206
- _context.next = 35;
162
+ case 24:
163
+ _context.next = 30;
207
164
  break;
208
-
209
- case 31:
210
- _context.prev = 31;
165
+ case 26:
166
+ _context.prev = 26;
211
167
  _context.t0 = _context["catch"](6);
212
168
  _didIteratorError = true;
213
169
  _iteratorError = _context.t0;
214
-
215
- case 35:
216
- _context.prev = 35;
217
- _context.prev = 36;
218
-
219
- if (!(!_iteratorNormalCompletion && _iterator.return != null)) {
220
- _context.next = 40;
170
+ case 30:
171
+ _context.prev = 30;
172
+ _context.prev = 31;
173
+ if (!(_iteratorAbruptCompletion && _iterator.return != null)) {
174
+ _context.next = 35;
221
175
  break;
222
176
  }
223
-
224
- _context.next = 40;
177
+ _context.next = 35;
225
178
  return (0, _awaitAsyncGenerator2.default)(_iterator.return());
226
-
227
- case 40:
228
- _context.prev = 40;
229
-
179
+ case 35:
180
+ _context.prev = 35;
230
181
  if (!_didIteratorError) {
231
- _context.next = 43;
182
+ _context.next = 38;
232
183
  break;
233
184
  }
234
-
235
185
  throw _iteratorError;
236
-
237
- case 43:
238
- return _context.finish(40);
239
-
240
- case 44:
186
+ case 38:
241
187
  return _context.finish(35);
242
-
243
- case 45:
188
+ case 39:
189
+ return _context.finish(30);
190
+ case 40:
244
191
  parser.end();
245
-
246
192
  if (!(parser.result.data.length > 0)) {
247
- _context.next = 49;
193
+ _context.next = 44;
248
194
  break;
249
195
  }
250
-
251
- _context.next = 49;
196
+ _context.next = 44;
252
197
  return parser.result.data;
253
-
254
- case 49:
198
+ case 44:
255
199
  case "end":
256
200
  return _context.stop();
257
201
  }
258
202
  }
259
- }, _callee, null, [[6, 31, 35, 45], [36,, 40, 44]]);
203
+ }, _callee, null, [[6, 26, 30, 40], [31,, 35, 39]]);
260
204
  }));
261
205
  return _parseDBFInBatches.apply(this, arguments);
262
206
  }
263
-
264
207
  function parseState(state, result, binaryReader, textDecoder) {
265
208
  while (true) {
266
209
  try {
@@ -268,14 +211,11 @@ function parseState(state, result, binaryReader, textDecoder) {
268
211
  case STATE.ERROR:
269
212
  case STATE.END:
270
213
  return state;
271
-
272
214
  case STATE.START:
273
215
  var dataView = binaryReader.getDataView(DBF_HEADER_SIZE);
274
-
275
216
  if (!dataView) {
276
217
  return state;
277
218
  }
278
-
279
219
  result.dbfHeader = parseDBFHeader(dataView);
280
220
  result.progress = {
281
221
  bytesUsed: 0,
@@ -284,45 +224,39 @@ function parseState(state, result, binaryReader, textDecoder) {
284
224
  };
285
225
  state = STATE.FIELD_DESCRIPTORS;
286
226
  break;
287
-
288
227
  case STATE.FIELD_DESCRIPTORS:
289
- var fieldDescriptorView = binaryReader.getDataView(result.dbfHeader.headerLength - DBF_HEADER_SIZE);
290
-
228
+ var fieldDescriptorView = binaryReader.getDataView(
229
+ result.dbfHeader.headerLength - DBF_HEADER_SIZE);
291
230
  if (!fieldDescriptorView) {
292
231
  return state;
293
232
  }
294
-
295
233
  result.dbfFields = parseFieldDescriptors(fieldDescriptorView, textDecoder);
296
234
  result.schema = new _schema.Schema(result.dbfFields.map(function (dbfField) {
297
235
  return makeField(dbfField);
298
236
  }));
299
237
  state = STATE.FIELD_PROPERTIES;
238
+
300
239
  binaryReader.skip(1);
301
240
  break;
302
-
303
241
  case STATE.FIELD_PROPERTIES:
304
242
  var _ref3 = (result === null || result === void 0 ? void 0 : result.dbfHeader) || {},
305
- _ref3$recordLength = _ref3.recordLength,
306
- recordLength = _ref3$recordLength === void 0 ? 0 : _ref3$recordLength,
307
- _ref3$nRecords = _ref3.nRecords,
308
- nRecords = _ref3$nRecords === void 0 ? 0 : _ref3$nRecords;
309
-
243
+ _ref3$recordLength = _ref3.recordLength,
244
+ recordLength = _ref3$recordLength === void 0 ? 0 : _ref3$recordLength,
245
+ _ref3$nRecords = _ref3.nRecords,
246
+ nRecords = _ref3$nRecords === void 0 ? 0 : _ref3$nRecords;
310
247
  while (result.data.length < nRecords) {
311
248
  var recordView = binaryReader.getDataView(recordLength - 1);
312
-
313
249
  if (!recordView) {
314
250
  return state;
315
251
  }
316
-
317
252
  binaryReader.skip(1);
253
+
318
254
  var row = parseRow(recordView, result.dbfFields, textDecoder);
319
255
  result.data.push(row);
320
256
  result.progress.rows = result.data.length;
321
257
  }
322
-
323
258
  state = STATE.END;
324
259
  break;
325
-
326
260
  default:
327
261
  state = STATE.ERROR;
328
262
  result.error = "illegal parser state ".concat(state);
@@ -352,9 +286,9 @@ function parseFieldDescriptors(view, textDecoder) {
352
286
  var nFields = (view.byteLength - 1) / 32;
353
287
  var fields = [];
354
288
  var offset = 0;
355
-
356
289
  for (var i = 0; i < nFields; i++) {
357
- var name = textDecoder.decode(new Uint8Array(view.buffer, view.byteOffset + offset, 11)).replace(/\u0000/g, '');
290
+ var name = textDecoder.decode(new Uint8Array(view.buffer, view.byteOffset + offset, 11))
291
+ .replace(/\u0000/g, '');
358
292
  fields.push({
359
293
  name: name,
360
294
  dataType: String.fromCharCode(view.getUint8(offset + 11)),
@@ -363,17 +297,14 @@ function parseFieldDescriptors(view, textDecoder) {
363
297
  });
364
298
  offset += 32;
365
299
  }
366
-
367
300
  return fields;
368
301
  }
369
302
 
370
303
  function parseRow(view, fields, textDecoder) {
371
304
  var out = {};
372
305
  var offset = 0;
373
-
374
306
  var _iterator2 = _createForOfIteratorHelper(fields),
375
- _step2;
376
-
307
+ _step2;
377
308
  try {
378
309
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
379
310
  var field = _step2.value;
@@ -386,7 +317,6 @@ function parseRow(view, fields, textDecoder) {
386
317
  } finally {
387
318
  _iterator2.f();
388
319
  }
389
-
390
320
  return out;
391
321
  }
392
322
 
@@ -394,25 +324,18 @@ function parseField(text, dataType) {
394
324
  switch (dataType) {
395
325
  case 'B':
396
326
  return parseNumber(text);
397
-
398
327
  case 'C':
399
328
  return parseCharacter(text);
400
-
401
329
  case 'F':
402
330
  return parseNumber(text);
403
-
404
331
  case 'N':
405
332
  return parseNumber(text);
406
-
407
333
  case 'O':
408
334
  return parseNumber(text);
409
-
410
335
  case 'D':
411
336
  return parseDate(text);
412
-
413
337
  case 'L':
414
338
  return parseBoolean(text);
415
-
416
339
  default:
417
340
  throw new Error('Unsupported data type');
418
341
  }
@@ -437,32 +360,24 @@ function parseCharacter(text) {
437
360
 
438
361
  function makeField(_ref4) {
439
362
  var name = _ref4.name,
440
- dataType = _ref4.dataType,
441
- fieldLength = _ref4.fieldLength,
442
- decimal = _ref4.decimal;
443
-
363
+ dataType = _ref4.dataType,
364
+ fieldLength = _ref4.fieldLength,
365
+ decimal = _ref4.decimal;
444
366
  switch (dataType) {
445
367
  case 'B':
446
368
  return new _schema.Field(name, new _schema.Float64(), true);
447
-
448
369
  case 'C':
449
370
  return new _schema.Field(name, new _schema.Utf8(), true);
450
-
451
371
  case 'F':
452
372
  return new _schema.Field(name, new _schema.Float64(), true);
453
-
454
373
  case 'N':
455
374
  return new _schema.Field(name, new _schema.Float64(), true);
456
-
457
375
  case 'O':
458
376
  return new _schema.Field(name, new _schema.Float64(), true);
459
-
460
377
  case 'D':
461
378
  return new _schema.Field(name, new _schema.TimestampMillisecond(), true);
462
-
463
379
  case 'L':
464
380
  return new _schema.Field(name, new _schema.Bool(), true);
465
-
466
381
  default:
467
382
  throw new Error('Unsupported data type');
468
383
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/parsers/parse-dbf.ts"],"names":["LITTLE_ENDIAN","DBF_HEADER_SIZE","STATE","DBFParser","options","BinaryChunkReader","START","data","textDecoder","TextDecoder","encoding","arrayBuffer","binaryReader","write","state","parseState","result","end","END","ERROR","error","parseDBF","dbf","dbfParser","schema","shape","tables","format","table","rows","parseDBFInBatches","asyncIterator","parser","headerReturned","dbfHeader","length","dataView","getDataView","parseDBFHeader","progress","bytesUsed","rowsTotal","nRecords","FIELD_DESCRIPTORS","fieldDescriptorView","headerLength","dbfFields","parseFieldDescriptors","Schema","map","dbfField","makeField","FIELD_PROPERTIES","skip","recordLength","recordView","row","parseRow","push","message","headerView","year","getUint8","month","day","getUint32","getUint16","languageDriver","view","nFields","byteLength","fields","offset","i","name","decode","Uint8Array","buffer","byteOffset","replace","dataType","String","fromCharCode","fieldLength","decimal","out","field","text","parseField","parseNumber","parseCharacter","parseDate","parseBoolean","Error","str","Date","UTC","slice","parseInt","value","test","number","parseFloat","isNaN","trim","Field","Float64","Utf8","TimestampMillisecond","Bool"],"mappings":"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","sourcesContent":["import {\n Schema,\n Field,\n Bool,\n Utf8,\n Float64,\n TimestampMillisecond,\n ObjectRowTable\n} from '@loaders.gl/schema';\nimport BinaryChunkReader from '../streaming/binary-chunk-reader';\nimport {\n DBFLoaderOptions,\n DBFResult,\n DBFTableOutput,\n DBFHeader,\n DBFRowsOutput,\n DBFField\n} from './types';\n\nconst LITTLE_ENDIAN = true;\nconst DBF_HEADER_SIZE = 32;\n\nenum STATE {\n START = 0, // Expecting header\n FIELD_DESCRIPTORS = 1,\n FIELD_PROPERTIES = 2,\n END = 3,\n ERROR = 4\n}\n\nclass DBFParser {\n binaryReader = new BinaryChunkReader();\n textDecoder: TextDecoder;\n state = STATE.START;\n result: DBFResult = {\n data: []\n };\n\n constructor(options: {encoding: string}) {\n this.textDecoder = new TextDecoder(options.encoding);\n }\n\n /**\n * @param arrayBuffer\n */\n write(arrayBuffer: ArrayBuffer): void {\n this.binaryReader.write(arrayBuffer);\n this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);\n // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n\n // important events:\n // - schema available\n // - first rows available\n // - all rows available\n }\n\n end(): void {\n this.binaryReader.end();\n this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);\n // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n if (this.state !== STATE.END) {\n this.state = STATE.ERROR;\n this.result.error = 'DBF incomplete file';\n }\n }\n}\n\n/**\n * @param arrayBuffer\n * @param options\n * @returns DBFTable or rows\n */\nexport function parseDBF(\n arrayBuffer: ArrayBuffer,\n options: DBFLoaderOptions = {}\n): DBFRowsOutput | DBFTableOutput | ObjectRowTable {\n const {encoding = 'latin1'} = options.dbf || {};\n\n const dbfParser = new DBFParser({encoding});\n dbfParser.write(arrayBuffer);\n dbfParser.end();\n\n const {data, schema} = dbfParser.result;\n const shape = options?.tables?.format || options?.dbf?.shape;\n switch (shape) {\n case 'object-row-table': {\n const table: ObjectRowTable = {\n shape: 'object-row-table',\n schema,\n data\n };\n return table;\n }\n case 'table':\n return {schema, rows: data};\n case 'rows':\n default:\n return data;\n }\n}\n/**\n * @param asyncIterator\n * @param options\n */\nexport async function* parseDBFInBatches(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options: DBFLoaderOptions = {}\n): AsyncIterable<DBFHeader | DBFRowsOutput | DBFTableOutput> {\n const {encoding = 'latin1'} = options.dbf || {};\n\n const parser = new DBFParser({encoding});\n let headerReturned = false;\n for await (const arrayBuffer of asyncIterator) {\n parser.write(arrayBuffer);\n if (!headerReturned && parser.result.dbfHeader) {\n headerReturned = true;\n yield parser.result.dbfHeader;\n }\n\n if (parser.result.data.length > 0) {\n yield parser.result.data;\n parser.result.data = [];\n }\n }\n parser.end();\n if (parser.result.data.length > 0) {\n yield parser.result.data;\n }\n}\n/**\n * https://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm\n * @param state\n * @param result\n * @param binaryReader\n * @param textDecoder\n * @returns\n */\n/* eslint-disable complexity, max-depth */\nfunction parseState(\n state: STATE,\n result: DBFResult,\n binaryReader: BinaryChunkReader,\n textDecoder: TextDecoder\n): STATE {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n switch (state) {\n case STATE.ERROR:\n case STATE.END:\n return state;\n\n case STATE.START:\n // Parse initial file header\n // DBF Header\n const dataView = binaryReader.getDataView(DBF_HEADER_SIZE);\n if (!dataView) {\n return state;\n }\n result.dbfHeader = parseDBFHeader(dataView);\n result.progress = {\n bytesUsed: 0,\n rowsTotal: result.dbfHeader.nRecords,\n rows: 0\n };\n state = STATE.FIELD_DESCRIPTORS;\n break;\n\n case STATE.FIELD_DESCRIPTORS:\n // Parse DBF field descriptors (schema)\n const fieldDescriptorView = binaryReader.getDataView(\n // @ts-ignore\n result.dbfHeader.headerLength - DBF_HEADER_SIZE\n );\n if (!fieldDescriptorView) {\n return state;\n }\n\n result.dbfFields = parseFieldDescriptors(fieldDescriptorView, textDecoder);\n result.schema = new Schema(result.dbfFields.map((dbfField) => makeField(dbfField)));\n\n state = STATE.FIELD_PROPERTIES;\n\n // TODO(kyle) Not exactly sure why start offset needs to be headerLength + 1?\n // parsedbf uses ((fields.length + 1) << 5) + 2;\n binaryReader.skip(1);\n break;\n\n case STATE.FIELD_PROPERTIES:\n const {recordLength = 0, nRecords = 0} = result?.dbfHeader || {};\n while (result.data.length < nRecords) {\n const recordView = binaryReader.getDataView(recordLength - 1);\n if (!recordView) {\n return state;\n }\n // Note: Avoid actually reading the last byte, which may not be present\n binaryReader.skip(1);\n\n // @ts-ignore\n const row = parseRow(recordView, result.dbfFields, textDecoder);\n result.data.push(row);\n // @ts-ignore\n result.progress.rows = result.data.length;\n }\n state = STATE.END;\n break;\n\n default:\n state = STATE.ERROR;\n result.error = `illegal parser state ${state}`;\n return state;\n }\n } catch (error) {\n state = STATE.ERROR;\n result.error = `DBF parsing failed: ${(error as Error).message}`;\n return state;\n }\n }\n}\n\n/**\n * @param headerView\n */\nfunction parseDBFHeader(headerView: DataView): DBFHeader {\n return {\n // Last updated date\n year: headerView.getUint8(1) + 1900,\n month: headerView.getUint8(2),\n day: headerView.getUint8(3),\n // Number of records in data file\n nRecords: headerView.getUint32(4, LITTLE_ENDIAN),\n // Length of header in bytes\n headerLength: headerView.getUint16(8, LITTLE_ENDIAN),\n // Length of each record\n recordLength: headerView.getUint16(10, LITTLE_ENDIAN),\n // Not sure if this is usually set\n languageDriver: headerView.getUint8(29)\n };\n}\n\n/**\n * @param view\n */\nfunction parseFieldDescriptors(view: DataView, textDecoder: TextDecoder): DBFField[] {\n // NOTE: this might overestimate the number of fields if the \"Database\n // Container\" container exists and is included in the headerLength\n const nFields = (view.byteLength - 1) / 32;\n const fields: DBFField[] = [];\n let offset = 0;\n for (let i = 0; i < nFields; i++) {\n const name = textDecoder\n .decode(new Uint8Array(view.buffer, view.byteOffset + offset, 11))\n // eslint-disable-next-line no-control-regex\n .replace(/\\u0000/g, '');\n\n fields.push({\n name,\n dataType: String.fromCharCode(view.getUint8(offset + 11)),\n fieldLength: view.getUint8(offset + 16),\n decimal: view.getUint8(offset + 17)\n });\n offset += 32;\n }\n return fields;\n}\n\n/*\n * @param {BinaryChunkReader} binaryReader\nfunction parseRows(binaryReader, fields, nRecords, recordLength, textDecoder) {\n const rows = [];\n for (let i = 0; i < nRecords; i++) {\n const recordView = binaryReader.getDataView(recordLength - 1);\n binaryReader.skip(1);\n // @ts-ignore\n rows.push(parseRow(recordView, fields, textDecoder));\n }\n return rows;\n}\n */\n\n/**\n *\n * @param view\n * @param fields\n * @param textDecoder\n * @returns\n */\nfunction parseRow(\n view: DataView,\n fields: DBFField[],\n textDecoder: TextDecoder\n): {[key: string]: any} {\n const out = {};\n let offset = 0;\n for (const field of fields) {\n const text = textDecoder.decode(\n new Uint8Array(view.buffer, view.byteOffset + offset, field.fieldLength)\n );\n out[field.name] = parseField(text, field.dataType);\n offset += field.fieldLength;\n }\n\n return out;\n}\n\n/**\n * Should NaN be coerced to null?\n * @param text\n * @param dataType\n * @returns Field depends on a type of the data\n */\nfunction parseField(text: string, dataType: string): string | number | boolean | null {\n switch (dataType) {\n case 'B':\n return parseNumber(text);\n case 'C':\n return parseCharacter(text);\n case 'F':\n return parseNumber(text);\n case 'N':\n return parseNumber(text);\n case 'O':\n return parseNumber(text);\n case 'D':\n return parseDate(text);\n case 'L':\n return parseBoolean(text);\n default:\n throw new Error('Unsupported data type');\n }\n}\n\n/**\n * Parse YYYYMMDD to date in milliseconds\n * @param str YYYYMMDD\n * @returns new Date as a number\n */\nfunction parseDate(str: any): number {\n return Date.UTC(str.slice(0, 4), parseInt(str.slice(4, 6), 10) - 1, str.slice(6, 8));\n}\n\n/**\n * Read boolean value\n * any of Y, y, T, t coerce to true\n * any of N, n, F, f coerce to false\n * otherwise null\n * @param value\n * @returns boolean | null\n */\nfunction parseBoolean(value: string): boolean | null {\n return /^[nf]$/i.test(value) ? false : /^[yt]$/i.test(value) ? true : null;\n}\n\n/**\n * Return null instead of NaN\n * @param text\n * @returns number | null\n */\nfunction parseNumber(text: string): number | null {\n const number = parseFloat(text);\n return isNaN(number) ? null : number;\n}\n\n/**\n *\n * @param text\n * @returns string | null\n */\nfunction parseCharacter(text: string): string | null {\n return text.trim() || null;\n}\n\n/**\n * Create a standard Arrow-style `Field` from field descriptor.\n * TODO - use `fieldLength` and `decimal` to generate smaller types?\n * @param param0\n * @returns Field\n */\n// eslint-disable\nfunction makeField({name, dataType, fieldLength, decimal}: DBFField): Field {\n switch (dataType) {\n case 'B':\n return new Field(name, new Float64(), true);\n case 'C':\n return new Field(name, new Utf8(), true);\n case 'F':\n return new Field(name, new Float64(), true);\n case 'N':\n return new Field(name, new Float64(), true);\n case 'O':\n return new Field(name, new Float64(), true);\n case 'D':\n return new Field(name, new TimestampMillisecond(), true);\n case 'L':\n return new Field(name, new Bool(), true);\n default:\n throw new Error('Unsupported data type');\n }\n}\n"],"file":"parse-dbf.js"}
1
+ {"version":3,"file":"parse-dbf.js","names":["LITTLE_ENDIAN","DBF_HEADER_SIZE","STATE","DBFParser","options","BinaryChunkReader","START","data","textDecoder","TextDecoder","encoding","arrayBuffer","binaryReader","write","state","parseState","result","end","END","ERROR","error","parseDBF","dbf","dbfParser","schema","shape","tables","format","table","rows","parseDBFInBatches","asyncIterator","parser","headerReturned","dbfHeader","length","dataView","getDataView","parseDBFHeader","progress","bytesUsed","rowsTotal","nRecords","FIELD_DESCRIPTORS","fieldDescriptorView","headerLength","dbfFields","parseFieldDescriptors","Schema","map","dbfField","makeField","FIELD_PROPERTIES","skip","recordLength","recordView","row","parseRow","push","message","headerView","year","getUint8","month","day","getUint32","getUint16","languageDriver","view","nFields","byteLength","fields","offset","i","name","decode","Uint8Array","buffer","byteOffset","replace","dataType","String","fromCharCode","fieldLength","decimal","out","field","text","parseField","parseNumber","parseCharacter","parseDate","parseBoolean","Error","str","Date","UTC","slice","parseInt","value","test","number","parseFloat","isNaN","trim","Field","Float64","Utf8","TimestampMillisecond","Bool"],"sources":["../../../../src/lib/parsers/parse-dbf.ts"],"sourcesContent":["import {\n Schema,\n Field,\n Bool,\n Utf8,\n Float64,\n TimestampMillisecond,\n ObjectRowTable\n} from '@loaders.gl/schema';\nimport BinaryChunkReader from '../streaming/binary-chunk-reader';\nimport {\n DBFLoaderOptions,\n DBFResult,\n DBFTableOutput,\n DBFHeader,\n DBFRowsOutput,\n DBFField\n} from './types';\n\nconst LITTLE_ENDIAN = true;\nconst DBF_HEADER_SIZE = 32;\n\nenum STATE {\n START = 0, // Expecting header\n FIELD_DESCRIPTORS = 1,\n FIELD_PROPERTIES = 2,\n END = 3,\n ERROR = 4\n}\n\nclass DBFParser {\n binaryReader = new BinaryChunkReader();\n textDecoder: TextDecoder;\n state = STATE.START;\n result: DBFResult = {\n data: []\n };\n\n constructor(options: {encoding: string}) {\n this.textDecoder = new TextDecoder(options.encoding);\n }\n\n /**\n * @param arrayBuffer\n */\n write(arrayBuffer: ArrayBuffer): void {\n this.binaryReader.write(arrayBuffer);\n this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);\n // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n\n // important events:\n // - schema available\n // - first rows available\n // - all rows available\n }\n\n end(): void {\n this.binaryReader.end();\n this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);\n // this.result.progress.bytesUsed = this.binaryReader.bytesUsed();\n if (this.state !== STATE.END) {\n this.state = STATE.ERROR;\n this.result.error = 'DBF incomplete file';\n }\n }\n}\n\n/**\n * @param arrayBuffer\n * @param options\n * @returns DBFTable or rows\n */\nexport function parseDBF(\n arrayBuffer: ArrayBuffer,\n options: DBFLoaderOptions = {}\n): DBFRowsOutput | DBFTableOutput | ObjectRowTable {\n const {encoding = 'latin1'} = options.dbf || {};\n\n const dbfParser = new DBFParser({encoding});\n dbfParser.write(arrayBuffer);\n dbfParser.end();\n\n const {data, schema} = dbfParser.result;\n const shape = options?.tables?.format || options?.dbf?.shape;\n switch (shape) {\n case 'object-row-table': {\n const table: ObjectRowTable = {\n shape: 'object-row-table',\n schema,\n data\n };\n return table;\n }\n case 'table':\n return {schema, rows: data};\n case 'rows':\n default:\n return data;\n }\n}\n/**\n * @param asyncIterator\n * @param options\n */\nexport async function* parseDBFInBatches(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options: DBFLoaderOptions = {}\n): AsyncIterable<DBFHeader | DBFRowsOutput | DBFTableOutput> {\n const {encoding = 'latin1'} = options.dbf || {};\n\n const parser = new DBFParser({encoding});\n let headerReturned = false;\n for await (const arrayBuffer of asyncIterator) {\n parser.write(arrayBuffer);\n if (!headerReturned && parser.result.dbfHeader) {\n headerReturned = true;\n yield parser.result.dbfHeader;\n }\n\n if (parser.result.data.length > 0) {\n yield parser.result.data;\n parser.result.data = [];\n }\n }\n parser.end();\n if (parser.result.data.length > 0) {\n yield parser.result.data;\n }\n}\n/**\n * https://www.dbase.com/Knowledgebase/INT/db7_file_fmt.htm\n * @param state\n * @param result\n * @param binaryReader\n * @param textDecoder\n * @returns\n */\n/* eslint-disable complexity, max-depth */\nfunction parseState(\n state: STATE,\n result: DBFResult,\n binaryReader: BinaryChunkReader,\n textDecoder: TextDecoder\n): STATE {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n switch (state) {\n case STATE.ERROR:\n case STATE.END:\n return state;\n\n case STATE.START:\n // Parse initial file header\n // DBF Header\n const dataView = binaryReader.getDataView(DBF_HEADER_SIZE);\n if (!dataView) {\n return state;\n }\n result.dbfHeader = parseDBFHeader(dataView);\n result.progress = {\n bytesUsed: 0,\n rowsTotal: result.dbfHeader.nRecords,\n rows: 0\n };\n state = STATE.FIELD_DESCRIPTORS;\n break;\n\n case STATE.FIELD_DESCRIPTORS:\n // Parse DBF field descriptors (schema)\n const fieldDescriptorView = binaryReader.getDataView(\n // @ts-ignore\n result.dbfHeader.headerLength - DBF_HEADER_SIZE\n );\n if (!fieldDescriptorView) {\n return state;\n }\n\n result.dbfFields = parseFieldDescriptors(fieldDescriptorView, textDecoder);\n result.schema = new Schema(result.dbfFields.map((dbfField) => makeField(dbfField)));\n\n state = STATE.FIELD_PROPERTIES;\n\n // TODO(kyle) Not exactly sure why start offset needs to be headerLength + 1?\n // parsedbf uses ((fields.length + 1) << 5) + 2;\n binaryReader.skip(1);\n break;\n\n case STATE.FIELD_PROPERTIES:\n const {recordLength = 0, nRecords = 0} = result?.dbfHeader || {};\n while (result.data.length < nRecords) {\n const recordView = binaryReader.getDataView(recordLength - 1);\n if (!recordView) {\n return state;\n }\n // Note: Avoid actually reading the last byte, which may not be present\n binaryReader.skip(1);\n\n // @ts-ignore\n const row = parseRow(recordView, result.dbfFields, textDecoder);\n result.data.push(row);\n // @ts-ignore\n result.progress.rows = result.data.length;\n }\n state = STATE.END;\n break;\n\n default:\n state = STATE.ERROR;\n result.error = `illegal parser state ${state}`;\n return state;\n }\n } catch (error) {\n state = STATE.ERROR;\n result.error = `DBF parsing failed: ${(error as Error).message}`;\n return state;\n }\n }\n}\n\n/**\n * @param headerView\n */\nfunction parseDBFHeader(headerView: DataView): DBFHeader {\n return {\n // Last updated date\n year: headerView.getUint8(1) + 1900,\n month: headerView.getUint8(2),\n day: headerView.getUint8(3),\n // Number of records in data file\n nRecords: headerView.getUint32(4, LITTLE_ENDIAN),\n // Length of header in bytes\n headerLength: headerView.getUint16(8, LITTLE_ENDIAN),\n // Length of each record\n recordLength: headerView.getUint16(10, LITTLE_ENDIAN),\n // Not sure if this is usually set\n languageDriver: headerView.getUint8(29)\n };\n}\n\n/**\n * @param view\n */\nfunction parseFieldDescriptors(view: DataView, textDecoder: TextDecoder): DBFField[] {\n // NOTE: this might overestimate the number of fields if the \"Database\n // Container\" container exists and is included in the headerLength\n const nFields = (view.byteLength - 1) / 32;\n const fields: DBFField[] = [];\n let offset = 0;\n for (let i = 0; i < nFields; i++) {\n const name = textDecoder\n .decode(new Uint8Array(view.buffer, view.byteOffset + offset, 11))\n // eslint-disable-next-line no-control-regex\n .replace(/\\u0000/g, '');\n\n fields.push({\n name,\n dataType: String.fromCharCode(view.getUint8(offset + 11)),\n fieldLength: view.getUint8(offset + 16),\n decimal: view.getUint8(offset + 17)\n });\n offset += 32;\n }\n return fields;\n}\n\n/*\n * @param {BinaryChunkReader} binaryReader\nfunction parseRows(binaryReader, fields, nRecords, recordLength, textDecoder) {\n const rows = [];\n for (let i = 0; i < nRecords; i++) {\n const recordView = binaryReader.getDataView(recordLength - 1);\n binaryReader.skip(1);\n // @ts-ignore\n rows.push(parseRow(recordView, fields, textDecoder));\n }\n return rows;\n}\n */\n\n/**\n *\n * @param view\n * @param fields\n * @param textDecoder\n * @returns\n */\nfunction parseRow(\n view: DataView,\n fields: DBFField[],\n textDecoder: TextDecoder\n): {[key: string]: any} {\n const out: {[key: string]: string | number | boolean | null} = {};\n let offset = 0;\n for (const field of fields) {\n const text = textDecoder.decode(\n new Uint8Array(view.buffer, view.byteOffset + offset, field.fieldLength)\n );\n out[field.name] = parseField(text, field.dataType);\n offset += field.fieldLength;\n }\n\n return out;\n}\n\n/**\n * Should NaN be coerced to null?\n * @param text\n * @param dataType\n * @returns Field depends on a type of the data\n */\nfunction parseField(text: string, dataType: string): string | number | boolean | null {\n switch (dataType) {\n case 'B':\n return parseNumber(text);\n case 'C':\n return parseCharacter(text);\n case 'F':\n return parseNumber(text);\n case 'N':\n return parseNumber(text);\n case 'O':\n return parseNumber(text);\n case 'D':\n return parseDate(text);\n case 'L':\n return parseBoolean(text);\n default:\n throw new Error('Unsupported data type');\n }\n}\n\n/**\n * Parse YYYYMMDD to date in milliseconds\n * @param str YYYYMMDD\n * @returns new Date as a number\n */\nfunction parseDate(str: any): number {\n return Date.UTC(str.slice(0, 4), parseInt(str.slice(4, 6), 10) - 1, str.slice(6, 8));\n}\n\n/**\n * Read boolean value\n * any of Y, y, T, t coerce to true\n * any of N, n, F, f coerce to false\n * otherwise null\n * @param value\n * @returns boolean | null\n */\nfunction parseBoolean(value: string): boolean | null {\n return /^[nf]$/i.test(value) ? false : /^[yt]$/i.test(value) ? true : null;\n}\n\n/**\n * Return null instead of NaN\n * @param text\n * @returns number | null\n */\nfunction parseNumber(text: string): number | null {\n const number = parseFloat(text);\n return isNaN(number) ? null : number;\n}\n\n/**\n *\n * @param text\n * @returns string | null\n */\nfunction parseCharacter(text: string): string | null {\n return text.trim() || null;\n}\n\n/**\n * Create a standard Arrow-style `Field` from field descriptor.\n * TODO - use `fieldLength` and `decimal` to generate smaller types?\n * @param param0\n * @returns Field\n */\n// eslint-disable\nfunction makeField({name, dataType, fieldLength, decimal}: DBFField): Field {\n switch (dataType) {\n case 'B':\n return new Field(name, new Float64(), true);\n case 'C':\n return new Field(name, new Utf8(), true);\n case 'F':\n return new Field(name, new Float64(), true);\n case 'N':\n return new Field(name, new Float64(), true);\n case 'O':\n return new Field(name, new Float64(), true);\n case 'D':\n return new Field(name, new TimestampMillisecond(), true);\n case 'L':\n return new Field(name, new Bool(), true);\n default:\n throw new Error('Unsupported data type');\n }\n}\n"],"mappings":"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"}