@loaders.gl/shapefile 3.4.14 → 3.4.15

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 (33) hide show
  1. package/dist/dbf-worker.js +1 -1
  2. package/dist/es5/bundle.js +1 -1
  3. package/dist/es5/bundle.js.map +1 -1
  4. package/dist/es5/dbf-loader.js +6 -27
  5. package/dist/es5/dbf-loader.js.map +1 -1
  6. package/dist/es5/index.js +5 -5
  7. package/dist/es5/lib/parsers/parse-dbf.js +89 -179
  8. package/dist/es5/lib/parsers/parse-dbf.js.map +1 -1
  9. package/dist/es5/lib/parsers/parse-shapefile.js +137 -314
  10. package/dist/es5/lib/parsers/parse-shapefile.js.map +1 -1
  11. package/dist/es5/lib/parsers/parse-shp-geometry.js +49 -72
  12. package/dist/es5/lib/parsers/parse-shp-geometry.js.map +1 -1
  13. package/dist/es5/lib/parsers/parse-shp-header.js +4 -4
  14. package/dist/es5/lib/parsers/parse-shp-header.js.map +1 -1
  15. package/dist/es5/lib/parsers/parse-shp.js +45 -130
  16. package/dist/es5/lib/parsers/parse-shp.js.map +1 -1
  17. package/dist/es5/lib/parsers/parse-shx.js +11 -11
  18. package/dist/es5/lib/parsers/parse-shx.js.map +1 -1
  19. package/dist/es5/lib/streaming/binary-chunk-reader.js +82 -146
  20. package/dist/es5/lib/streaming/binary-chunk-reader.js.map +1 -1
  21. package/dist/es5/lib/streaming/binary-reader.js +19 -32
  22. package/dist/es5/lib/streaming/binary-reader.js.map +1 -1
  23. package/dist/es5/lib/streaming/zip-batch-iterators.js +33 -74
  24. package/dist/es5/lib/streaming/zip-batch-iterators.js.map +1 -1
  25. package/dist/es5/shapefile-loader.js +3 -3
  26. package/dist/es5/shapefile-loader.js.map +1 -1
  27. package/dist/es5/shp-loader.js +7 -28
  28. package/dist/es5/shp-loader.js.map +1 -1
  29. package/dist/esm/dbf-loader.js +1 -1
  30. package/dist/esm/shapefile-loader.js +1 -1
  31. package/dist/esm/shp-loader.js +1 -1
  32. package/dist/shp-worker.js +1 -1
  33. package/package.json +5 -5
@@ -739,7 +739,7 @@
739
739
  }
740
740
 
741
741
  // src/dbf-loader.ts
742
- var VERSION = true ? "3.4.14" : "latest";
742
+ var VERSION = true ? "3.4.15" : "latest";
743
743
  var DBFWorkerLoader = {
744
744
  name: "DBF",
745
745
  id: "dbf",
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var moduleExports = require('./index');
3
+ const moduleExports = require('./index');
4
4
  globalThis.loaders = globalThis.loaders || {};
5
5
  module.exports = Object.assign(globalThis.loaders, moduleExports);
6
6
  //# sourceMappingURL=bundle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"sources":["../../src/bundle.ts"],"sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"mappings":";;AACA,IAAMA,aAAa,GAAGC,OAAO,CAAC,SAAS,CAAC;AACxCC,UAAU,CAACC,OAAO,GAAGD,UAAU,CAACC,OAAO,IAAI,CAAC,CAAC;AAC7CC,MAAM,CAACC,OAAO,GAAGC,MAAM,CAACC,MAAM,CAACL,UAAU,CAACC,OAAO,EAAEH,aAAa,CAAC"}
1
+ {"version":3,"file":"bundle.js","names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"sources":["../../src/bundle.ts"],"sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"mappings":";;AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAS,CAAC;AACxCC,UAAU,CAACC,OAAO,GAAGD,UAAU,CAACC,OAAO,IAAI,CAAC,CAAC;AAC7CC,MAAM,CAACC,OAAO,GAAGC,MAAM,CAACC,MAAM,CAACL,UAAU,CAACC,OAAO,EAAEH,aAAa,CAAC"}
@@ -1,18 +1,12 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.DBFWorkerLoader = exports.DBFLoader = void 0;
8
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
7
  var _parseDbf = require("./lib/parsers/parse-dbf");
12
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
13
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
14
- var VERSION = typeof "3.4.14" !== 'undefined' ? "3.4.14" : 'latest';
15
- var DBFWorkerLoader = {
8
+ const VERSION = typeof "3.4.15" !== 'undefined' ? "3.4.15" : 'latest';
9
+ const DBFWorkerLoader = {
16
10
  name: 'DBF',
17
11
  id: 'dbf',
18
12
  module: 'shapefile',
@@ -28,26 +22,11 @@ var DBFWorkerLoader = {
28
22
  }
29
23
  };
30
24
  exports.DBFWorkerLoader = DBFWorkerLoader;
31
- var DBFLoader = _objectSpread(_objectSpread({}, DBFWorkerLoader), {}, {
32
- parse: function () {
33
- var _parse = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(arrayBuffer, options) {
34
- return _regenerator.default.wrap(function _callee$(_context) {
35
- while (1) switch (_context.prev = _context.next) {
36
- case 0:
37
- return _context.abrupt("return", (0, _parseDbf.parseDBF)(arrayBuffer, options));
38
- case 1:
39
- case "end":
40
- return _context.stop();
41
- }
42
- }, _callee);
43
- }));
44
- function parse(_x, _x2) {
45
- return _parse.apply(this, arguments);
46
- }
47
- return parse;
48
- }(),
25
+ const DBFLoader = {
26
+ ...DBFWorkerLoader,
27
+ parse: async (arrayBuffer, options) => (0, _parseDbf.parseDBF)(arrayBuffer, options),
49
28
  parseSync: _parseDbf.parseDBF,
50
29
  parseInBatches: _parseDbf.parseDBFInBatches
51
- });
30
+ };
52
31
  exports.DBFLoader = DBFLoader;
53
32
  //# sourceMappingURL=dbf-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dbf-loader.js","names":["_parseDbf","require","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty2","default","getOwnPropertyDescriptors","defineProperties","defineProperty","VERSION","DBFWorkerLoader","name","id","module","version","worker","category","extensions","mimeTypes","options","dbf","encoding","exports","DBFLoader","parse","_parse","_asyncToGenerator2","_regenerator","mark","_callee","arrayBuffer","wrap","_callee$","_context","prev","next","abrupt","parseDBF","stop","_x","_x2","parseSync","parseInBatches","parseDBFInBatches"],"sources":["../../src/dbf-loader.ts"],"sourcesContent":["import type {Loader, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {parseDBF, parseDBFInBatches} from './lib/parsers/parse-dbf';\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\n/**\n * DBFLoader - DBF files are used to contain non-geometry columns in Shapefiles\n */\nexport const DBFWorkerLoader: Loader = {\n name: 'DBF',\n id: 'dbf',\n module: 'shapefile',\n version: VERSION,\n worker: true,\n category: 'table',\n extensions: ['dbf'],\n mimeTypes: ['application/x-dbf'],\n options: {\n dbf: {\n encoding: 'latin1'\n }\n }\n};\n\n/** DBF file loader */\nexport const DBFLoader: LoaderWithParser = {\n ...DBFWorkerLoader,\n parse: async (arrayBuffer, options) => parseDBF(arrayBuffer, options),\n parseSync: parseDBF,\n parseInBatches: parseDBFInBatches\n};\n"],"mappings":";;;;;;;;;;AACA,IAAAA,SAAA,GAAAC,OAAA;AAAoE,SAAAC,QAAAC,MAAA,EAAAC,cAAA,QAAAC,IAAA,GAAAC,MAAA,CAAAD,IAAA,CAAAF,MAAA,OAAAG,MAAA,CAAAC,qBAAA,QAAAC,OAAA,GAAAF,MAAA,CAAAC,qBAAA,CAAAJ,MAAA,GAAAC,cAAA,KAAAI,OAAA,GAAAA,OAAA,CAAAC,MAAA,WAAAC,GAAA,WAAAJ,MAAA,CAAAK,wBAAA,CAAAR,MAAA,EAAAO,GAAA,EAAAE,UAAA,OAAAP,IAAA,CAAAQ,IAAA,CAAAC,KAAA,CAAAT,IAAA,EAAAG,OAAA,YAAAH,IAAA;AAAA,SAAAU,cAAAC,MAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAC,SAAA,CAAAC,MAAA,EAAAF,CAAA,UAAAG,MAAA,WAAAF,SAAA,CAAAD,CAAA,IAAAC,SAAA,CAAAD,CAAA,QAAAA,CAAA,OAAAf,OAAA,CAAAI,MAAA,CAAAc,MAAA,OAAAC,OAAA,WAAAC,GAAA,QAAAC,gBAAA,CAAAC,OAAA,EAAAR,MAAA,EAAAM,GAAA,EAAAF,MAAA,CAAAE,GAAA,SAAAhB,MAAA,CAAAmB,yBAAA,GAAAnB,MAAA,CAAAoB,gBAAA,CAAAV,MAAA,EAAAV,MAAA,CAAAmB,yBAAA,CAAAL,MAAA,KAAAlB,OAAA,CAAAI,MAAA,CAAAc,MAAA,GAAAC,OAAA,WAAAC,GAAA,IAAAhB,MAAA,CAAAqB,cAAA,CAAAX,MAAA,EAAAM,GAAA,EAAAhB,MAAA,CAAAK,wBAAA,CAAAS,MAAA,EAAAE,GAAA,iBAAAN,MAAA;AAIpE,IAAMY,OAAO,GAAG,eAAkB,KAAK,WAAW,cAAiB,QAAQ;AAKpE,IAAMC,eAAuB,GAAG;EACrCC,IAAI,EAAE,KAAK;EACXC,EAAE,EAAE,KAAK;EACTC,MAAM,EAAE,WAAW;EACnBC,OAAO,EAAEL,OAAO;EAChBM,MAAM,EAAE,IAAI;EACZC,QAAQ,EAAE,OAAO;EACjBC,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBC,SAAS,EAAE,CAAC,mBAAmB,CAAC;EAChCC,OAAO,EAAE;IACPC,GAAG,EAAE;MACHC,QAAQ,EAAE;IACZ;EACF;AACF,CAAC;AAACC,OAAA,CAAAZ,eAAA,GAAAA,eAAA;AAGK,IAAMa,SAA2B,GAAA3B,aAAA,CAAAA,aAAA,KACnCc,eAAe;EAClBc,KAAK;IAAA,IAAAC,MAAA,OAAAC,kBAAA,CAAArB,OAAA,EAAAsB,YAAA,CAAAtB,OAAA,CAAAuB,IAAA,CAAE,SAAAC,QAAOC,WAAW,EAAEX,OAAO;MAAA,OAAAQ,YAAA,CAAAtB,OAAA,CAAA0B,IAAA,UAAAC,SAAAC,QAAA;QAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;UAAA;YAAA,OAAAF,QAAA,CAAAG,MAAA,WAAK,IAAAC,kBAAQ,EAACP,WAAW,EAAEX,OAAO,CAAC;UAAA;UAAA;YAAA,OAAAc,QAAA,CAAAK,IAAA;QAAA;MAAA,GAAAT,OAAA;IAAA;IAAA,SAAAL,MAAAe,EAAA,EAAAC,GAAA;MAAA,OAAAf,MAAA,CAAA9B,KAAA,OAAAI,SAAA;IAAA;IAAA,OAAAyB,KAAA;EAAA;EACrEiB,SAAS,EAAEJ,kBAAQ;EACnBK,cAAc,EAAEC;AAAiB,EAClC;AAACrB,OAAA,CAAAC,SAAA,GAAAA,SAAA"}
1
+ {"version":3,"file":"dbf-loader.js","names":["_parseDbf","require","VERSION","DBFWorkerLoader","name","id","module","version","worker","category","extensions","mimeTypes","options","dbf","encoding","exports","DBFLoader","parse","arrayBuffer","parseDBF","parseSync","parseInBatches","parseDBFInBatches"],"sources":["../../src/dbf-loader.ts"],"sourcesContent":["import type {Loader, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {parseDBF, parseDBFInBatches} from './lib/parsers/parse-dbf';\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\n/**\n * DBFLoader - DBF files are used to contain non-geometry columns in Shapefiles\n */\nexport const DBFWorkerLoader: Loader = {\n name: 'DBF',\n id: 'dbf',\n module: 'shapefile',\n version: VERSION,\n worker: true,\n category: 'table',\n extensions: ['dbf'],\n mimeTypes: ['application/x-dbf'],\n options: {\n dbf: {\n encoding: 'latin1'\n }\n }\n};\n\n/** DBF file loader */\nexport const DBFLoader: LoaderWithParser = {\n ...DBFWorkerLoader,\n parse: async (arrayBuffer, options) => parseDBF(arrayBuffer, options),\n parseSync: parseDBF,\n parseInBatches: parseDBFInBatches\n};\n"],"mappings":";;;;;;AACA,IAAAA,SAAA,GAAAC,OAAA;AAIA,MAAMC,OAAO,GAAG,eAAkB,KAAK,WAAW,cAAiB,QAAQ;AAKpE,MAAMC,eAAuB,GAAG;EACrCC,IAAI,EAAE,KAAK;EACXC,EAAE,EAAE,KAAK;EACTC,MAAM,EAAE,WAAW;EACnBC,OAAO,EAAEL,OAAO;EAChBM,MAAM,EAAE,IAAI;EACZC,QAAQ,EAAE,OAAO;EACjBC,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBC,SAAS,EAAE,CAAC,mBAAmB,CAAC;EAChCC,OAAO,EAAE;IACPC,GAAG,EAAE;MACHC,QAAQ,EAAE;IACZ;EACF;AACF,CAAC;AAACC,OAAA,CAAAZ,eAAA,GAAAA,eAAA;AAGK,MAAMa,SAA2B,GAAG;EACzC,GAAGb,eAAe;EAClBc,KAAK,EAAE,MAAAA,CAAOC,WAAW,EAAEN,OAAO,KAAK,IAAAO,kBAAQ,EAACD,WAAW,EAAEN,OAAO,CAAC;EACrEQ,SAAS,EAAED,kBAAQ;EACnBE,cAAc,EAAEC;AAClB,CAAC;AAACP,OAAA,CAAAC,SAAA,GAAAA,SAAA"}
package/dist/es5/index.js CHANGED
@@ -5,31 +5,31 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  Object.defineProperty(exports, "DBFLoader", {
7
7
  enumerable: true,
8
- get: function get() {
8
+ get: function () {
9
9
  return _dbfLoader.DBFLoader;
10
10
  }
11
11
  });
12
12
  Object.defineProperty(exports, "DBFWorkerLoader", {
13
13
  enumerable: true,
14
- get: function get() {
14
+ get: function () {
15
15
  return _dbfLoader.DBFWorkerLoader;
16
16
  }
17
17
  });
18
18
  Object.defineProperty(exports, "SHPLoader", {
19
19
  enumerable: true,
20
- get: function get() {
20
+ get: function () {
21
21
  return _shpLoader.SHPLoader;
22
22
  }
23
23
  });
24
24
  Object.defineProperty(exports, "SHPWorkerLoader", {
25
25
  enumerable: true,
26
- get: function get() {
26
+ get: function () {
27
27
  return _shpLoader.SHPWorkerLoader;
28
28
  }
29
29
  });
30
30
  Object.defineProperty(exports, "ShapefileLoader", {
31
31
  enumerable: true,
32
- get: function get() {
32
+ get: function () {
33
33
  return _shapefileLoader.ShapefileLoader;
34
34
  }
35
35
  });
@@ -6,21 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.parseDBF = parseDBF;
8
8
  exports.parseDBFInBatches = parseDBFInBatches;
9
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
- var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/awaitAsyncGenerator"));
14
- var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapAsyncGenerator"));
15
10
  var _schema = require("@loaders.gl/schema");
16
11
  var _binaryChunkReader = _interopRequireDefault(require("../streaming/binary-chunk-reader"));
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; } } }; }
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); }
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; }
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); }
22
- var LITTLE_ENDIAN = true;
23
- var DBF_HEADER_SIZE = 32;
12
+ const LITTLE_ENDIAN = true;
13
+ const DBF_HEADER_SIZE = 32;
24
14
  var STATE = function (STATE) {
25
15
  STATE[STATE["START"] = 0] = "START";
26
16
  STATE[STATE["FIELD_DESCRIPTORS"] = 1] = "FIELD_DESCRIPTORS";
@@ -29,9 +19,8 @@ var STATE = function (STATE) {
29
19
  STATE[STATE["ERROR"] = 4] = "ERROR";
30
20
  return STATE;
31
21
  }(STATE || {});
32
- var DBFParser = function () {
33
- function DBFParser(options) {
34
- (0, _classCallCheck2.default)(this, DBFParser);
22
+ class DBFParser {
23
+ constructor(options) {
35
24
  (0, _defineProperty2.default)(this, "binaryReader", new _binaryChunkReader.default());
36
25
  (0, _defineProperty2.default)(this, "textDecoder", void 0);
37
26
  (0, _defineProperty2.default)(this, "state", STATE.START);
@@ -40,53 +29,48 @@ var DBFParser = function () {
40
29
  });
41
30
  this.textDecoder = new TextDecoder(options.encoding);
42
31
  }
43
- (0, _createClass2.default)(DBFParser, [{
44
- key: "write",
45
- value: function write(arrayBuffer) {
46
- this.binaryReader.write(arrayBuffer);
47
- this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);
48
- }
49
- }, {
50
- key: "end",
51
- value: function end() {
52
- this.binaryReader.end();
53
- this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);
54
- if (this.state !== STATE.END) {
55
- this.state = STATE.ERROR;
56
- this.result.error = 'DBF incomplete file';
57
- }
32
+ write(arrayBuffer) {
33
+ this.binaryReader.write(arrayBuffer);
34
+ this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);
35
+ }
36
+ end() {
37
+ this.binaryReader.end();
38
+ this.state = parseState(this.state, this.result, this.binaryReader, this.textDecoder);
39
+ if (this.state !== STATE.END) {
40
+ this.state = STATE.ERROR;
41
+ this.result.error = 'DBF incomplete file';
58
42
  }
59
- }]);
60
- return DBFParser;
61
- }();
43
+ }
44
+ }
62
45
  function parseDBF(arrayBuffer) {
63
46
  var _options$tables, _options$dbf;
64
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
65
- var _ref = options.dbf || {},
66
- _ref$encoding = _ref.encoding,
67
- encoding = _ref$encoding === void 0 ? 'latin1' : _ref$encoding;
68
- var dbfParser = new DBFParser({
69
- encoding: encoding
47
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
48
+ const {
49
+ encoding = 'latin1'
50
+ } = options.dbf || {};
51
+ const dbfParser = new DBFParser({
52
+ encoding
70
53
  });
71
54
  dbfParser.write(arrayBuffer);
72
55
  dbfParser.end();
73
- var _dbfParser$result = dbfParser.result,
74
- data = _dbfParser$result.data,
75
- schema = _dbfParser$result.schema;
76
- 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);
56
+ const {
57
+ data,
58
+ schema
59
+ } = dbfParser.result;
60
+ const 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);
77
61
  switch (shape) {
78
62
  case 'object-row-table':
79
63
  {
80
- var table = {
64
+ const table = {
81
65
  shape: 'object-row-table',
82
- schema: schema,
83
- data: data
66
+ schema,
67
+ data
84
68
  };
85
69
  return table;
86
70
  }
87
71
  case 'table':
88
72
  return {
89
- schema: schema,
73
+ schema,
90
74
  rows: data
91
75
  };
92
76
  case 'rows':
@@ -94,100 +78,36 @@ function parseDBF(arrayBuffer) {
94
78
  return data;
95
79
  }
96
80
  }
97
- function parseDBFInBatches(_x) {
98
- return _parseDBFInBatches.apply(this, arguments);
99
- }
100
- function _parseDBFInBatches() {
101
- _parseDBFInBatches = (0, _wrapAsyncGenerator2.default)(function (asyncIterator) {
102
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
103
- return _regenerator.default.mark(function _callee() {
104
- var _ref2, _ref2$encoding, encoding, parser, headerReturned, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, arrayBuffer;
105
- return _regenerator.default.wrap(function _callee$(_context) {
106
- while (1) switch (_context.prev = _context.next) {
107
- case 0:
108
- _ref2 = options.dbf || {}, _ref2$encoding = _ref2.encoding, encoding = _ref2$encoding === void 0 ? 'latin1' : _ref2$encoding;
109
- parser = new DBFParser({
110
- encoding: encoding
111
- });
112
- headerReturned = false;
113
- _iteratorAbruptCompletion = false;
114
- _didIteratorError = false;
115
- _context.prev = 5;
116
- _iterator = _asyncIterator(asyncIterator);
117
- case 7:
118
- _context.next = 9;
119
- return (0, _awaitAsyncGenerator2.default)(_iterator.next());
120
- case 9:
121
- if (!(_iteratorAbruptCompletion = !(_step = _context.sent).done)) {
122
- _context.next = 23;
123
- break;
124
- }
125
- arrayBuffer = _step.value;
126
- parser.write(arrayBuffer);
127
- if (!(!headerReturned && parser.result.dbfHeader)) {
128
- _context.next = 16;
129
- break;
130
- }
131
- headerReturned = true;
132
- _context.next = 16;
133
- return parser.result.dbfHeader;
134
- case 16:
135
- if (!(parser.result.data.length > 0)) {
136
- _context.next = 20;
137
- break;
138
- }
139
- _context.next = 19;
140
- return parser.result.data;
141
- case 19:
142
- parser.result.data = [];
143
- case 20:
144
- _iteratorAbruptCompletion = false;
145
- _context.next = 7;
146
- break;
147
- case 23:
148
- _context.next = 29;
149
- break;
150
- case 25:
151
- _context.prev = 25;
152
- _context.t0 = _context["catch"](5);
153
- _didIteratorError = true;
154
- _iteratorError = _context.t0;
155
- case 29:
156
- _context.prev = 29;
157
- _context.prev = 30;
158
- if (!(_iteratorAbruptCompletion && _iterator.return != null)) {
159
- _context.next = 34;
160
- break;
161
- }
162
- _context.next = 34;
163
- return (0, _awaitAsyncGenerator2.default)(_iterator.return());
164
- case 34:
165
- _context.prev = 34;
166
- if (!_didIteratorError) {
167
- _context.next = 37;
168
- break;
169
- }
170
- throw _iteratorError;
171
- case 37:
172
- return _context.finish(34);
173
- case 38:
174
- return _context.finish(29);
175
- case 39:
176
- parser.end();
177
- if (!(parser.result.data.length > 0)) {
178
- _context.next = 43;
179
- break;
180
- }
181
- _context.next = 43;
182
- return parser.result.data;
183
- case 43:
184
- case "end":
185
- return _context.stop();
81
+ function parseDBFInBatches(asyncIterator) {
82
+ try {
83
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
84
+ return async function* () {
85
+ const {
86
+ encoding = 'latin1'
87
+ } = options.dbf || {};
88
+ const parser = new DBFParser({
89
+ encoding
90
+ });
91
+ let headerReturned = false;
92
+ for await (const arrayBuffer of asyncIterator) {
93
+ parser.write(arrayBuffer);
94
+ if (!headerReturned && parser.result.dbfHeader) {
95
+ headerReturned = true;
96
+ yield parser.result.dbfHeader;
186
97
  }
187
- }, _callee, null, [[5, 25, 29, 39], [30,, 34, 38]]);
188
- })();
189
- });
190
- return _parseDBFInBatches.apply(this, arguments);
98
+ if (parser.result.data.length > 0) {
99
+ yield parser.result.data;
100
+ parser.result.data = [];
101
+ }
102
+ }
103
+ parser.end();
104
+ if (parser.result.data.length > 0) {
105
+ yield parser.result.data;
106
+ }
107
+ }();
108
+ } catch (e) {
109
+ return Promise.reject(e);
110
+ }
191
111
  }
192
112
  function parseState(state, result, binaryReader, textDecoder) {
193
113
  while (true) {
@@ -197,7 +117,7 @@ function parseState(state, result, binaryReader, textDecoder) {
197
117
  case STATE.END:
198
118
  return state;
199
119
  case STATE.START:
200
- var dataView = binaryReader.getDataView(DBF_HEADER_SIZE);
120
+ const dataView = binaryReader.getDataView(DBF_HEADER_SIZE);
201
121
  if (!dataView) {
202
122
  return state;
203
123
  }
@@ -210,30 +130,27 @@ function parseState(state, result, binaryReader, textDecoder) {
210
130
  state = STATE.FIELD_DESCRIPTORS;
211
131
  break;
212
132
  case STATE.FIELD_DESCRIPTORS:
213
- var fieldDescriptorView = binaryReader.getDataView(result.dbfHeader.headerLength - DBF_HEADER_SIZE);
133
+ const fieldDescriptorView = binaryReader.getDataView(result.dbfHeader.headerLength - DBF_HEADER_SIZE);
214
134
  if (!fieldDescriptorView) {
215
135
  return state;
216
136
  }
217
137
  result.dbfFields = parseFieldDescriptors(fieldDescriptorView, textDecoder);
218
- result.schema = new _schema.Schema(result.dbfFields.map(function (dbfField) {
219
- return makeField(dbfField);
220
- }));
138
+ result.schema = new _schema.Schema(result.dbfFields.map(dbfField => makeField(dbfField)));
221
139
  state = STATE.FIELD_PROPERTIES;
222
140
  binaryReader.skip(1);
223
141
  break;
224
142
  case STATE.FIELD_PROPERTIES:
225
- var _ref3 = (result === null || result === void 0 ? void 0 : result.dbfHeader) || {},
226
- _ref3$recordLength = _ref3.recordLength,
227
- recordLength = _ref3$recordLength === void 0 ? 0 : _ref3$recordLength,
228
- _ref3$nRecords = _ref3.nRecords,
229
- nRecords = _ref3$nRecords === void 0 ? 0 : _ref3$nRecords;
143
+ const {
144
+ recordLength = 0,
145
+ nRecords = 0
146
+ } = (result === null || result === void 0 ? void 0 : result.dbfHeader) || {};
230
147
  while (result.data.length < nRecords) {
231
- var recordView = binaryReader.getDataView(recordLength - 1);
148
+ const recordView = binaryReader.getDataView(recordLength - 1);
232
149
  if (!recordView) {
233
150
  return state;
234
151
  }
235
152
  binaryReader.skip(1);
236
- var row = parseRow(recordView, result.dbfFields, textDecoder);
153
+ const row = parseRow(recordView, result.dbfFields, textDecoder);
237
154
  result.data.push(row);
238
155
  result.progress.rows = result.data.length;
239
156
  }
@@ -263,13 +180,13 @@ function parseDBFHeader(headerView) {
263
180
  };
264
181
  }
265
182
  function parseFieldDescriptors(view, textDecoder) {
266
- var nFields = (view.byteLength - 1) / 32;
267
- var fields = [];
268
- var offset = 0;
269
- for (var i = 0; i < nFields; i++) {
270
- var name = textDecoder.decode(new Uint8Array(view.buffer, view.byteOffset + offset, 11)).replace(/\u0000/g, '');
183
+ const nFields = (view.byteLength - 1) / 32;
184
+ const fields = [];
185
+ let offset = 0;
186
+ for (let i = 0; i < nFields; i++) {
187
+ const name = textDecoder.decode(new Uint8Array(view.buffer, view.byteOffset + offset, 11)).replace(/\u0000/g, '');
271
188
  fields.push({
272
- name: name,
189
+ name,
273
190
  dataType: String.fromCharCode(view.getUint8(offset + 11)),
274
191
  fieldLength: view.getUint8(offset + 16),
275
192
  decimal: view.getUint8(offset + 17)
@@ -279,21 +196,12 @@ function parseFieldDescriptors(view, textDecoder) {
279
196
  return fields;
280
197
  }
281
198
  function parseRow(view, fields, textDecoder) {
282
- var out = {};
283
- var offset = 0;
284
- var _iterator2 = _createForOfIteratorHelper(fields),
285
- _step2;
286
- try {
287
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
288
- var field = _step2.value;
289
- var text = textDecoder.decode(new Uint8Array(view.buffer, view.byteOffset + offset, field.fieldLength));
290
- out[field.name] = parseField(text, field.dataType);
291
- offset += field.fieldLength;
292
- }
293
- } catch (err) {
294
- _iterator2.e(err);
295
- } finally {
296
- _iterator2.f();
199
+ const out = {};
200
+ let offset = 0;
201
+ for (const field of fields) {
202
+ const text = textDecoder.decode(new Uint8Array(view.buffer, view.byteOffset + offset, field.fieldLength));
203
+ out[field.name] = parseField(text, field.dataType);
204
+ offset += field.fieldLength;
297
205
  }
298
206
  return out;
299
207
  }
@@ -324,17 +232,19 @@ function parseBoolean(value) {
324
232
  return /^[nf]$/i.test(value) ? false : /^[yt]$/i.test(value) ? true : null;
325
233
  }
326
234
  function parseNumber(text) {
327
- var number = parseFloat(text);
235
+ const number = parseFloat(text);
328
236
  return isNaN(number) ? null : number;
329
237
  }
330
238
  function parseCharacter(text) {
331
239
  return text.trim() || null;
332
240
  }
333
- function makeField(_ref4) {
334
- var name = _ref4.name,
335
- dataType = _ref4.dataType,
336
- fieldLength = _ref4.fieldLength,
337
- decimal = _ref4.decimal;
241
+ function makeField(_ref) {
242
+ let {
243
+ name,
244
+ dataType,
245
+ fieldLength,
246
+ decimal
247
+ } = _ref;
338
248
  switch (dataType) {
339
249
  case 'B':
340
250
  return new _schema.Field(name, new _schema.Float64(), true);
@@ -1 +1 @@
1
- {"version":3,"file":"parse-dbf.js","names":["_schema","require","_binaryChunkReader","_interopRequireDefault","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","Array","isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","from","test","arr","len","arr2","_asyncIterator","iterable","method","async","sync","retry","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","r","Promise","reject","resolve","then","apply","arguments","_return","ret","throw","_throw","thr","LITTLE_ENDIAN","DBF_HEADER_SIZE","STATE","DBFParser","options","_classCallCheck2","default","_defineProperty2","BinaryChunkReader","START","data","textDecoder","TextDecoder","encoding","_createClass2","key","write","arrayBuffer","binaryReader","state","parseState","result","end","END","ERROR","error","parseDBF","_options$tables","_options$dbf","undefined","_ref","dbf","_ref$encoding","dbfParser","_dbfParser$result","schema","shape","tables","format","table","rows","parseDBFInBatches","_x","_parseDBFInBatches","_wrapAsyncGenerator2","_regenerator","mark","_callee","_ref2","_ref2$encoding","parser","headerReturned","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","_iterator","_step","wrap","_callee$","_context","prev","_awaitAsyncGenerator2","sent","dbfHeader","t0","finish","stop","dataView","getDataView","parseDBFHeader","progress","bytesUsed","rowsTotal","nRecords","FIELD_DESCRIPTORS","fieldDescriptorView","headerLength","dbfFields","parseFieldDescriptors","Schema","map","dbfField","makeField","FIELD_PROPERTIES","skip","_ref3","_ref3$recordLength","recordLength","_ref3$nRecords","recordView","row","parseRow","push","concat","message","headerView","year","getUint8","month","day","getUint32","getUint16","languageDriver","view","nFields","byteLength","fields","offset","decode","Uint8Array","buffer","byteOffset","replace","dataType","String","fromCharCode","fieldLength","decimal","out","_iterator2","_step2","field","text","parseField","parseNumber","parseCharacter","parseDate","parseBoolean","Error","str","Date","UTC","parseInt","number","parseFloat","isNaN","trim","_ref4","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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"}
1
+ {"version":3,"file":"parse-dbf.js","names":["_schema","require","_binaryChunkReader","_interopRequireDefault","LITTLE_ENDIAN","DBF_HEADER_SIZE","STATE","DBFParser","constructor","options","_defineProperty2","default","BinaryChunkReader","START","data","textDecoder","TextDecoder","encoding","write","arrayBuffer","binaryReader","state","parseState","result","end","END","ERROR","error","parseDBF","_options$tables","_options$dbf","arguments","length","undefined","dbf","dbfParser","schema","shape","tables","format","table","rows","parseDBFInBatches","asyncIterator","parser","headerReturned","dbfHeader","e","Promise","reject","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","concat","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","_ref","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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"}