@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.
- package/dist/dbf-worker.js +1 -1
- package/dist/es5/bundle.js +1 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/dbf-loader.js +6 -27
- package/dist/es5/dbf-loader.js.map +1 -1
- package/dist/es5/index.js +5 -5
- package/dist/es5/lib/parsers/parse-dbf.js +89 -179
- package/dist/es5/lib/parsers/parse-dbf.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shapefile.js +137 -314
- package/dist/es5/lib/parsers/parse-shapefile.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shp-geometry.js +49 -72
- package/dist/es5/lib/parsers/parse-shp-geometry.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shp-header.js +4 -4
- package/dist/es5/lib/parsers/parse-shp-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shp.js +45 -130
- package/dist/es5/lib/parsers/parse-shp.js.map +1 -1
- package/dist/es5/lib/parsers/parse-shx.js +11 -11
- package/dist/es5/lib/parsers/parse-shx.js.map +1 -1
- package/dist/es5/lib/streaming/binary-chunk-reader.js +82 -146
- package/dist/es5/lib/streaming/binary-chunk-reader.js.map +1 -1
- package/dist/es5/lib/streaming/binary-reader.js +19 -32
- package/dist/es5/lib/streaming/binary-reader.js.map +1 -1
- package/dist/es5/lib/streaming/zip-batch-iterators.js +33 -74
- package/dist/es5/lib/streaming/zip-batch-iterators.js.map +1 -1
- package/dist/es5/shapefile-loader.js +3 -3
- package/dist/es5/shapefile-loader.js.map +1 -1
- package/dist/es5/shp-loader.js +7 -28
- package/dist/es5/shp-loader.js.map +1 -1
- package/dist/esm/dbf-loader.js +1 -1
- package/dist/esm/shapefile-loader.js +1 -1
- package/dist/esm/shp-loader.js +1 -1
- package/dist/shp-worker.js +1 -1
- package/package.json +5 -5
package/dist/dbf-worker.js
CHANGED
package/dist/es5/bundle.js
CHANGED
package/dist/es5/bundle.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/es5/dbf-loader.js
CHANGED
|
@@ -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
|
-
|
|
13
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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","
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
18
|
-
|
|
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
|
-
|
|
33
|
-
|
|
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
|
-
(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
this.
|
|
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
|
-
|
|
61
|
-
}();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
62
45
|
function parseDBF(arrayBuffer) {
|
|
63
46
|
var _options$tables, _options$dbf;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
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
|
-
|
|
74
|
-
data
|
|
75
|
-
schema
|
|
76
|
-
|
|
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
|
-
|
|
64
|
+
const table = {
|
|
81
65
|
shape: 'object-row-table',
|
|
82
|
-
schema
|
|
83
|
-
data
|
|
66
|
+
schema,
|
|
67
|
+
data
|
|
84
68
|
};
|
|
85
69
|
return table;
|
|
86
70
|
}
|
|
87
71
|
case 'table':
|
|
88
72
|
return {
|
|
89
|
-
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(
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
function
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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
|
-
|
|
148
|
+
const recordView = binaryReader.getDataView(recordLength - 1);
|
|
232
149
|
if (!recordView) {
|
|
233
150
|
return state;
|
|
234
151
|
}
|
|
235
152
|
binaryReader.skip(1);
|
|
236
|
-
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
for (
|
|
270
|
-
|
|
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
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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
|
-
|
|
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(
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
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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"}
|