@loaders.gl/json 4.0.0-alpha.4 → 4.0.0-alpha.6

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 (188) hide show
  1. package/dist/bundle.d.ts +2 -0
  2. package/dist/bundle.d.ts.map +1 -0
  3. package/dist/bundle.js +2 -2
  4. package/dist/dist.min.js +3094 -0
  5. package/dist/es5/bundle.js +6 -0
  6. package/dist/es5/bundle.js.map +1 -0
  7. package/dist/es5/geojson-loader.js +157 -0
  8. package/dist/es5/geojson-loader.js.map +1 -0
  9. package/dist/es5/geojson-writer.js +27 -0
  10. package/dist/es5/geojson-writer.js.map +1 -0
  11. package/dist/es5/index.js +69 -0
  12. package/dist/es5/index.js.map +1 -0
  13. package/dist/es5/json-loader.js +67 -0
  14. package/dist/es5/json-loader.js.map +1 -0
  15. package/dist/es5/json-writer.js +42 -0
  16. package/dist/es5/json-writer.js.map +1 -0
  17. package/dist/es5/lib/clarinet/clarinet.js +446 -0
  18. package/dist/es5/lib/clarinet/clarinet.js.map +1 -0
  19. package/dist/es5/lib/encoders/encode-utils.js +42 -0
  20. package/dist/es5/lib/encoders/encode-utils.js.map +1 -0
  21. package/dist/es5/lib/encoders/geojson-encoder.js +178 -0
  22. package/dist/es5/lib/encoders/geojson-encoder.js.map +1 -0
  23. package/dist/es5/lib/encoders/json-encoder.js +30 -0
  24. package/dist/es5/lib/encoders/json-encoder.js.map +1 -0
  25. package/dist/es5/lib/encoders/utf8-encoder.js +54 -0
  26. package/dist/es5/lib/encoders/utf8-encoder.js.map +1 -0
  27. package/dist/es5/lib/json-parser/json-parser.js +140 -0
  28. package/dist/es5/lib/json-parser/json-parser.js.map +1 -0
  29. package/dist/es5/lib/json-parser/streaming-json-parser.js +123 -0
  30. package/dist/es5/lib/json-parser/streaming-json-parser.js.map +1 -0
  31. package/dist/es5/lib/jsonpath/jsonpath.js +119 -0
  32. package/dist/es5/lib/jsonpath/jsonpath.js.map +1 -0
  33. package/dist/es5/lib/parsers/parse-json-in-batches.js +206 -0
  34. package/dist/es5/lib/parsers/parse-json-in-batches.js.map +1 -0
  35. package/dist/es5/lib/parsers/parse-json.js +38 -0
  36. package/dist/es5/lib/parsers/parse-json.js.map +1 -0
  37. package/dist/es5/lib/parsers/parse-ndjson-in-batches.js +114 -0
  38. package/dist/es5/lib/parsers/parse-ndjson-in-batches.js.map +1 -0
  39. package/dist/es5/lib/parsers/parse-ndjson.js +19 -0
  40. package/dist/es5/lib/parsers/parse-ndjson.js.map +1 -0
  41. package/dist/es5/ndgeoson-loader.js +54 -0
  42. package/dist/es5/ndgeoson-loader.js.map +1 -0
  43. package/dist/es5/ndjson-loader.js +44 -0
  44. package/dist/es5/ndjson-loader.js.map +1 -0
  45. package/dist/es5/workers/geojson-worker.js +6 -0
  46. package/dist/es5/workers/geojson-worker.js.map +1 -0
  47. package/dist/esm/bundle.js +4 -0
  48. package/dist/esm/bundle.js.map +1 -0
  49. package/dist/esm/geojson-loader.js +79 -0
  50. package/dist/esm/geojson-loader.js.map +1 -0
  51. package/dist/esm/geojson-writer.js +18 -0
  52. package/dist/esm/geojson-writer.js.map +1 -0
  53. package/dist/esm/index.js +9 -0
  54. package/dist/esm/index.js.map +1 -0
  55. package/dist/esm/json-loader.js +48 -0
  56. package/dist/esm/json-loader.js.map +1 -0
  57. package/dist/esm/json-writer.js +14 -0
  58. package/dist/esm/json-writer.js.map +1 -0
  59. package/dist/esm/lib/clarinet/LICENSE +28 -0
  60. package/dist/esm/lib/clarinet/clarinet.js +415 -0
  61. package/dist/esm/lib/clarinet/clarinet.js.map +1 -0
  62. package/dist/esm/lib/encoders/encode-utils.js +31 -0
  63. package/dist/esm/lib/encoders/encode-utils.js.map +1 -0
  64. package/dist/esm/lib/encoders/geojson-encoder.js +98 -0
  65. package/dist/esm/lib/encoders/geojson-encoder.js.map +1 -0
  66. package/dist/esm/lib/encoders/json-encoder.js +12 -0
  67. package/dist/esm/lib/encoders/json-encoder.js.map +1 -0
  68. package/dist/esm/lib/encoders/utf8-encoder.js +32 -0
  69. package/dist/esm/lib/encoders/utf8-encoder.js.map +1 -0
  70. package/dist/{lib/parser → esm/lib/json-parser}/json-parser.js +4 -22
  71. package/dist/esm/lib/json-parser/json-parser.js.map +1 -0
  72. package/dist/{lib/parser → esm/lib/json-parser}/streaming-json-parser.js +2 -23
  73. package/dist/esm/lib/json-parser/streaming-json-parser.js.map +1 -0
  74. package/dist/esm/lib/jsonpath/jsonpath.js +67 -0
  75. package/dist/esm/lib/jsonpath/jsonpath.js.map +1 -0
  76. package/dist/{lib → esm/lib/parsers}/parse-json-in-batches.js +19 -15
  77. package/dist/esm/lib/parsers/parse-json-in-batches.js.map +1 -0
  78. package/dist/{lib → esm/lib/parsers}/parse-json.js +4 -9
  79. package/dist/esm/lib/parsers/parse-json.js.map +1 -0
  80. package/dist/{lib → esm/lib/parsers}/parse-ndjson-in-batches.js +3 -6
  81. package/dist/esm/lib/parsers/parse-ndjson-in-batches.js.map +1 -0
  82. package/dist/esm/lib/parsers/parse-ndjson.js +13 -0
  83. package/dist/esm/lib/parsers/parse-ndjson.js.map +1 -0
  84. package/dist/esm/ndgeoson-loader.js +27 -0
  85. package/dist/esm/ndgeoson-loader.js.map +1 -0
  86. package/dist/esm/ndjson-loader.js +18 -0
  87. package/dist/esm/ndjson-loader.js.map +1 -0
  88. package/dist/esm/workers/geojson-worker.js +4 -0
  89. package/dist/esm/workers/geojson-worker.js.map +1 -0
  90. package/dist/geojson-loader.d.ts +16 -0
  91. package/dist/geojson-loader.d.ts.map +1 -0
  92. package/dist/geojson-loader.js +65 -69
  93. package/dist/geojson-worker.js +1016 -232
  94. package/dist/geojson-writer.d.ts +6 -0
  95. package/dist/geojson-writer.d.ts.map +1 -0
  96. package/dist/geojson-writer.js +22 -0
  97. package/dist/index.d.ts +13 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +24 -6
  100. package/dist/json-loader.d.ts +17 -0
  101. package/dist/json-loader.d.ts.map +1 -0
  102. package/dist/json-loader.js +33 -38
  103. package/dist/json-writer.d.ts +6 -0
  104. package/dist/json-writer.d.ts.map +1 -0
  105. package/dist/json-writer.js +18 -0
  106. package/dist/lib/clarinet/clarinet.d.ts +74 -0
  107. package/dist/lib/clarinet/clarinet.d.ts.map +1 -0
  108. package/dist/lib/clarinet/clarinet.js +510 -493
  109. package/dist/lib/encoders/encode-utils.d.ts +19 -0
  110. package/dist/lib/encoders/encode-utils.d.ts.map +1 -0
  111. package/dist/lib/encoders/encode-utils.js +47 -0
  112. package/dist/lib/encoders/geojson-encoder.d.ts +14 -0
  113. package/dist/lib/encoders/geojson-encoder.d.ts.map +1 -0
  114. package/dist/lib/encoders/geojson-encoder.js +104 -0
  115. package/dist/lib/encoders/json-encoder.d.ts +16 -0
  116. package/dist/lib/encoders/json-encoder.d.ts.map +1 -0
  117. package/dist/lib/encoders/json-encoder.js +22 -0
  118. package/dist/lib/encoders/utf8-encoder.d.ts +12 -0
  119. package/dist/lib/encoders/utf8-encoder.d.ts.map +1 -0
  120. package/dist/lib/encoders/utf8-encoder.js +32 -0
  121. package/dist/lib/json-parser/json-parser.d.ts +22 -0
  122. package/dist/lib/json-parser/json-parser.d.ts.map +1 -0
  123. package/dist/lib/json-parser/json-parser.js +98 -0
  124. package/dist/lib/json-parser/streaming-json-parser.d.ts +37 -0
  125. package/dist/lib/json-parser/streaming-json-parser.d.ts.map +1 -0
  126. package/dist/lib/json-parser/streaming-json-parser.js +100 -0
  127. package/dist/lib/jsonpath/jsonpath.d.ts +32 -0
  128. package/dist/lib/jsonpath/jsonpath.d.ts.map +1 -0
  129. package/dist/lib/jsonpath/jsonpath.js +81 -78
  130. package/dist/lib/parsers/parse-json-in-batches.d.ts +5 -0
  131. package/dist/lib/parsers/parse-json-in-batches.d.ts.map +1 -0
  132. package/dist/lib/parsers/parse-json-in-batches.js +100 -0
  133. package/dist/lib/parsers/parse-json.d.ts +4 -0
  134. package/dist/lib/parsers/parse-json.d.ts.map +1 -0
  135. package/dist/lib/parsers/parse-json.js +32 -0
  136. package/dist/lib/parsers/parse-ndjson-in-batches.d.ts +4 -0
  137. package/dist/lib/parsers/parse-ndjson-in-batches.d.ts.map +1 -0
  138. package/dist/lib/parsers/parse-ndjson-in-batches.js +36 -0
  139. package/dist/lib/parsers/parse-ndjson.d.ts +3 -0
  140. package/dist/lib/parsers/parse-ndjson.d.ts.map +1 -0
  141. package/dist/lib/parsers/parse-ndjson.js +17 -0
  142. package/dist/ndgeoson-loader.d.ts +34 -0
  143. package/dist/ndgeoson-loader.d.ts.map +1 -0
  144. package/dist/ndgeoson-loader.js +37 -0
  145. package/dist/ndjson-loader.d.ts +4 -0
  146. package/dist/ndjson-loader.d.ts.map +1 -0
  147. package/dist/ndjson-loader.js +26 -31
  148. package/dist/workers/geojson-worker.d.ts +2 -0
  149. package/dist/workers/geojson-worker.d.ts.map +1 -0
  150. package/dist/workers/geojson-worker.js +5 -4
  151. package/package.json +10 -10
  152. package/src/geojson-loader.ts +10 -6
  153. package/src/geojson-writer.ts +27 -0
  154. package/src/index.ts +10 -0
  155. package/src/json-loader.ts +15 -24
  156. package/src/json-writer.ts +24 -0
  157. package/src/lib/encoders/encode-utils.ts +54 -0
  158. package/src/lib/encoders/geojson-encoder.ts +139 -0
  159. package/src/lib/encoders/json-encoder.ts +30 -0
  160. package/src/lib/encoders/utf8-encoder.ts +35 -0
  161. package/src/lib/{parse-json-in-batches.ts → parsers/parse-json-in-batches.ts} +30 -8
  162. package/src/lib/{parse-json.ts → parsers/parse-json.ts} +7 -3
  163. package/src/lib/{parse-ndjson-in-batches.ts → parsers/parse-ndjson-in-batches.ts} +1 -1
  164. package/src/lib/parsers/parse-ndjson.ts +15 -0
  165. package/src/ndgeoson-loader.ts +48 -0
  166. package/src/ndjson-loader.ts +20 -27
  167. package/dist/bundle.js.map +0 -1
  168. package/dist/geojson-loader.js.map +0 -1
  169. package/dist/index.js.map +0 -1
  170. package/dist/json-loader.js.map +0 -1
  171. package/dist/jsonl-loader.js +0 -2
  172. package/dist/jsonl-loader.js.map +0 -1
  173. package/dist/lib/clarinet/clarinet.js.map +0 -1
  174. package/dist/lib/jsonpath/jsonpath.js.map +0 -1
  175. package/dist/lib/parse-json-in-batches.js.map +0 -1
  176. package/dist/lib/parse-json.js.map +0 -1
  177. package/dist/lib/parse-ndjson-in-batches.js.map +0 -1
  178. package/dist/lib/parse-ndjson.js +0 -11
  179. package/dist/lib/parse-ndjson.js.map +0 -1
  180. package/dist/lib/parser/json-parser.js.map +0 -1
  181. package/dist/lib/parser/streaming-json-parser.js.map +0 -1
  182. package/dist/ndjson-loader.js.map +0 -1
  183. package/dist/workers/geojson-worker.js.map +0 -1
  184. package/src/jsonl-loader.ts +0 -53
  185. package/src/lib/parse-ndjson.ts +0 -10
  186. /package/dist/{lib → es5/lib}/clarinet/LICENSE +0 -0
  187. /package/src/lib/{parser → json-parser}/json-parser.ts +0 -0
  188. /package/src/lib/{parser → json-parser}/streaming-json-parser.ts +0 -0
@@ -0,0 +1,27 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright Foursquare, Inc 20222
3
+
4
+ import type {Writer} from '@loaders.gl/loader-utils';
5
+ import type {Table, TableBatch} from '@loaders.gl/schema';
6
+ import type {GeoJSONWriterOptions} from './lib/encoders/geojson-encoder';
7
+ import {encodeTableAsGeojsonInBatches} from './lib/encoders/geojson-encoder';
8
+
9
+ export type {GeoJSONWriterOptions};
10
+
11
+ export const GeoJSONWriter: Writer<Table, TableBatch, GeoJSONWriterOptions> = {
12
+ id: 'geojson',
13
+ version: 'latest',
14
+ module: 'geojson',
15
+ name: 'GeoJSON',
16
+ extensions: ['geojson'],
17
+ mimeTypes: ['application/geo+json'],
18
+ options: {
19
+ geojson: {
20
+ featureArray: false,
21
+ geometryColumn: null
22
+ }
23
+ },
24
+ text: true,
25
+ encodeInBatches: (tableIterator: AsyncIterable<TableBatch>, options) =>
26
+ encodeTableAsGeojsonInBatches(tableIterator, options)
27
+ };
package/src/index.ts CHANGED
@@ -1,7 +1,12 @@
1
+ // loaders.gl, MIT license
2
+
1
3
  export type {JSONLoaderOptions} from './json-loader';
2
4
  export {JSONLoader} from './json-loader';
3
5
  export {NDJSONLoader} from './ndjson-loader';
4
6
 
7
+ export type {JSONWriterOptions} from './json-writer';
8
+ export {JSONWriter} from './json-writer';
9
+
5
10
  // EXPERIMENTAL EXPORTS - WARNING: MAY BE REMOVED WIHTOUT NOTICE IN FUTURE RELEASES
6
11
  export type {GeoJSONLoaderOptions as _GeoJSONLoaderOptions} from './geojson-loader';
7
12
  export {
@@ -9,5 +14,10 @@ export {
9
14
  GeoJSONWorkerLoader as _GeoJSONWorkerLoader
10
15
  } from './geojson-loader';
11
16
 
17
+ export type {GeoJSONWriterOptions as _GeoJSONWriterOptions} from './geojson-writer';
18
+ export {GeoJSONWriter as _GeoJSONWriter} from './geojson-writer';
19
+
12
20
  export {default as _JSONPath} from './lib/jsonpath/jsonpath';
13
21
  export {default as _ClarinetParser} from './lib/clarinet/clarinet';
22
+
23
+ export {rebuildJsonObject as _rebuildJsonObject} from './lib/parsers/parse-json-in-batches';
@@ -1,25 +1,29 @@
1
- import type {Batch} from '@loaders.gl/schema';
1
+ // loaders.gl, MIT license
2
+
3
+ import type {Table, TableBatch} from '@loaders.gl/schema';
2
4
  import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
3
- import parseJSONSync from './lib/parse-json';
4
- import parseJSONInBatches from './lib/parse-json-in-batches';
5
+ import {parseJSONSync} from './lib/parsers/parse-json';
6
+ import {parseJSONInBatches} from './lib/parsers/parse-json-in-batches';
5
7
 
6
8
  // __VERSION__ is injected by babel-plugin-version-inline
7
9
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
8
10
  const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
9
11
 
12
+ type ParseJSONOptions = {
13
+ shape?: 'row-table';
14
+ table?: boolean;
15
+ jsonpaths?: string[];
16
+ };
17
+
10
18
  /**
11
19
  * @param table -
12
20
  * @param jsonpaths -
13
21
  */
14
22
  export type JSONLoaderOptions = LoaderOptions & {
15
- json?: {
16
- shape?: 'row-table';
17
- table?: false;
18
- jsonpaths?: string[];
19
- };
23
+ json?: ParseJSONOptions;
20
24
  };
21
25
 
22
- const DEFAULT_JSON_LOADER_OPTIONS = {
26
+ const DEFAULT_JSON_LOADER_OPTIONS: {json: Required<ParseJSONOptions>} = {
23
27
  json: {
24
28
  shape: 'row-table',
25
29
  table: false,
@@ -28,26 +32,13 @@ const DEFAULT_JSON_LOADER_OPTIONS = {
28
32
  }
29
33
  };
30
34
 
31
- export const JSONLoader: LoaderWithParser = {
35
+ export const JSONLoader: LoaderWithParser<Table, TableBatch, JSONLoaderOptions> = {
32
36
  name: 'JSON',
33
37
  id: 'json',
34
38
  module: 'json',
35
39
  version: VERSION,
36
40
  extensions: ['json', 'geojson'],
37
41
  mimeTypes: ['application/json'],
38
- // TODO - support various line based JSON formats
39
- /*
40
- extensions: {
41
- json: null,
42
- jsonl: {stream: true},
43
- ndjson: {stream: true}
44
- },
45
- mimeTypes: {
46
- 'application/json': null,
47
- 'application/json-seq': {stream: true},
48
- 'application/x-ndjson': {stream: true}
49
- },
50
- */
51
42
  category: 'table',
52
43
  text: true,
53
44
  parse,
@@ -68,7 +59,7 @@ function parseTextSync(text: string, options?: JSONLoaderOptions) {
68
59
  function parseInBatches(
69
60
  asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,
70
61
  options?: JSONLoaderOptions
71
- ): AsyncIterable<Batch> {
62
+ ): AsyncIterable<TableBatch> {
72
63
  const jsonOptions = {...options, json: {...DEFAULT_JSON_LOADER_OPTIONS.json, ...options?.json}};
73
64
  return parseJSONInBatches(asyncIterator, jsonOptions as JSONLoaderOptions);
74
65
  }
@@ -0,0 +1,24 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright 2022 Foursquare Labs, Inc.
3
+
4
+ /* global TextEncoder */
5
+ import type {Writer} from '@loaders.gl/loader-utils';
6
+ import type {Table, TableBatch} from '@loaders.gl/schema';
7
+ import type {JSONWriterOptions} from './lib/encoders/json-encoder';
8
+ import {encodeTableAsJSON} from './lib/encoders/json-encoder';
9
+
10
+ export type {JSONWriterOptions};
11
+
12
+ export const JSONWriter: Writer<Table, TableBatch, JSONWriterOptions> = {
13
+ id: 'json',
14
+ version: 'latest',
15
+ module: 'json',
16
+ name: 'JSON',
17
+ extensions: ['json'],
18
+ mimeTypes: ['application/json'],
19
+ options: {},
20
+ text: true,
21
+ encode: async (table: Table, options: JSONWriterOptions) =>
22
+ new TextEncoder().encode(encodeTableAsJSON(table, options)).buffer,
23
+ encodeText: (table: Table, options: JSONWriterOptions) => encodeTableAsJSON(table, options)
24
+ };
@@ -0,0 +1,54 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright 2022 Foursquare Labs, Inc.
3
+
4
+ import {Table, getTableLength, getTableNumCols, getTableRowAsArray} from '@loaders.gl/schema';
5
+
6
+ type Row = {[key: string]: unknown};
7
+
8
+ /**
9
+ * Attempts to identify which column contains geometry
10
+ * Currently just returns name (key) of first object-valued column
11
+ * @todo look for hints in schema metadata
12
+ * @todo look for WKB
13
+ */
14
+ export function detectGeometryColumnIndex(table: Table): number {
15
+ // TODO - look for hints in schema metadata
16
+
17
+ // look for a column named geometry
18
+ const geometryIndex = table.schema?.fields.findIndex((field) => field.name === 'geometry') ?? -1;
19
+ if (geometryIndex > -1) {
20
+ return geometryIndex;
21
+ }
22
+
23
+ // look at the data
24
+ // TODO - this drags in the indices
25
+ if (getTableLength(table) > 0) {
26
+ const row = getTableRowAsArray(table, 0);
27
+ for (let columnIndex = 0; columnIndex < getTableNumCols(table); columnIndex++) {
28
+ const value = row?.[columnIndex];
29
+ if (value && typeof value === 'object') {
30
+ return columnIndex;
31
+ }
32
+ }
33
+ }
34
+
35
+ throw new Error('Failed to detect geometry column');
36
+ }
37
+
38
+ /**
39
+ * Return a row as a property (key/value) object, excluding selected columns
40
+ */
41
+ export function getRowPropertyObject(
42
+ table: Table,
43
+ row: Row,
44
+ excludeColumnIndices: number[] = []
45
+ ): {[columnName: string]: unknown} {
46
+ const properties = {};
47
+ for (let columnIndex = 0; columnIndex < getTableNumCols(table); ++columnIndex) {
48
+ const columnName = table.schema?.fields[columnIndex].name;
49
+ if (columnName && !excludeColumnIndices.includes(columnIndex)) {
50
+ properties[columnName] = row[columnName];
51
+ }
52
+ }
53
+ return properties;
54
+ }
@@ -0,0 +1,139 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright 2022 Foursquare Labs, Inc.
3
+
4
+ import {Feature, getTableLength} from '@loaders.gl/schema';
5
+ import {Table, TableBatch, getTableRowAsObject} from '@loaders.gl/schema';
6
+ import {detectGeometryColumnIndex, getRowPropertyObject} from './encode-utils';
7
+ import {Utf8ArrayBufferEncoder} from './utf8-encoder';
8
+
9
+ type Row = {[key: string]: unknown};
10
+
11
+ export type GeoJSONWriterOptions = {
12
+ geojson?: {
13
+ featureArray?: boolean;
14
+ geometryColumn?: number | null;
15
+ };
16
+ chunkSize?: number;
17
+ };
18
+
19
+ /**
20
+ * Encode a table as GeoJSON
21
+ */
22
+ // eslint-disable-next-line max-statements
23
+ export async function* encodeTableAsGeojsonInBatches(
24
+ batchIterator: AsyncIterable<TableBatch>, // | Iterable<TableBatch>,
25
+ inputOpts: GeoJSONWriterOptions = {}
26
+ ): AsyncIterable<ArrayBuffer> {
27
+ const options: Required<GeoJSONWriterOptions> = {geojson: {}, chunkSize: 10000, ...inputOpts};
28
+
29
+ const utf8Encoder = new Utf8ArrayBufferEncoder(options.chunkSize);
30
+
31
+ if (!options.geojson.featureArray) {
32
+ utf8Encoder.push('{\n', '"type": "FeatureCollection",\n', '"features":\n');
33
+ }
34
+ utf8Encoder.push('['); // Note no newline
35
+
36
+ let geometryColumn = options.geojson.geometryColumn;
37
+
38
+ let isFirstLine = true;
39
+
40
+ for await (const batch of batchIterator) {
41
+ const {table, start, end = getTableLength(batch.table) - start} = batch;
42
+
43
+ // Deduce geometry column if not already done
44
+ if (!geometryColumn) {
45
+ geometryColumn = geometryColumn || detectGeometryColumnIndex(table);
46
+ }
47
+
48
+ for (let rowIndex = start; rowIndex < end; ++rowIndex) {
49
+ // Add a comma except on final feature
50
+ if (!isFirstLine) {
51
+ utf8Encoder.push(',');
52
+ }
53
+ utf8Encoder.push('\n');
54
+ isFirstLine = false;
55
+
56
+ encodeRow(table, rowIndex, geometryColumn, utf8Encoder);
57
+
58
+ // eslint-disable-next-line max-depth
59
+ if (utf8Encoder.isFull()) {
60
+ yield utf8Encoder.getArrayBufferBatch();
61
+ }
62
+ }
63
+ const arrayBufferBatch = utf8Encoder.getArrayBufferBatch();
64
+ if (arrayBufferBatch.byteLength > 0) {
65
+ yield arrayBufferBatch;
66
+ }
67
+ }
68
+
69
+ utf8Encoder.push('\n');
70
+
71
+ // Add completing rows and emit final batch
72
+ utf8Encoder.push(']\n');
73
+ if (!options.geojson.featureArray) {
74
+ utf8Encoder.push('}');
75
+ }
76
+
77
+ // Note: Since we pushed a few final lines, the last batch will always exist, no need to check first
78
+ yield utf8Encoder.getArrayBufferBatch();
79
+ }
80
+
81
+ // Helpers
82
+
83
+ /**
84
+ * Encode a row. Currently this ignores properties in the geometry column.
85
+ */
86
+ function encodeRow(
87
+ table: Table,
88
+ rowIndex: number,
89
+ geometryColumnIndex: number,
90
+ utf8Encoder: Utf8ArrayBufferEncoder
91
+ ): void {
92
+ const row = getTableRowAsObject(table, rowIndex);
93
+ if (!row) return;
94
+ const featureWithProperties = getFeatureFromRow(table, row, geometryColumnIndex);
95
+ const featureString = JSON.stringify(featureWithProperties);
96
+ utf8Encoder.push(featureString);
97
+ }
98
+
99
+ /**
100
+ * Encode a row as a Feature. Currently this ignores properties objects in the geometry column.
101
+ */
102
+ function getFeatureFromRow(table: Table, row: Row, geometryColumnIndex: number): Feature {
103
+ // Extract non-feature/geometry properties
104
+ const properties = getRowPropertyObject(table, row, [geometryColumnIndex]);
105
+
106
+ // Extract geometry feature
107
+ const columnName = table.schema?.fields[geometryColumnIndex].name;
108
+ let featureOrGeometry =
109
+ columnName && (row[columnName] as {[key: string]: unknown} | string | null | undefined);
110
+
111
+ // GeoJSON support null geometries
112
+ if (!featureOrGeometry) {
113
+ // @ts-ignore Feature type does not support null geometries
114
+ return {type: 'Feature', geometry: null, properties};
115
+ }
116
+
117
+ // Support string geometries?
118
+ // TODO: This assumes GeoJSON strings, which may not be the correct format
119
+ // (could be WKT, encoded WKB...)
120
+ if (typeof featureOrGeometry === 'string') {
121
+ try {
122
+ featureOrGeometry = JSON.parse(featureOrGeometry);
123
+ } catch (err) {
124
+ throw new Error('Invalid string geometry');
125
+ }
126
+ }
127
+
128
+ if (typeof featureOrGeometry !== 'object' || typeof featureOrGeometry?.type !== 'string') {
129
+ throw new Error('invalid geometry column value');
130
+ }
131
+
132
+ if (featureOrGeometry?.type === 'Feature') {
133
+ // @ts-ignore Feature type does not support null geometries
134
+ return {...featureOrGeometry, properties};
135
+ }
136
+
137
+ // @ts-ignore Feature type does not support null geometries
138
+ return {type: 'Feature', geometry: featureOrGeometry, properties};
139
+ }
@@ -0,0 +1,30 @@
1
+ // loaders.gl, MIT license
2
+ // Copyright 2022 Foursquare Labs, Inc.
3
+
4
+ import {Table, makeRowIterator} from '@loaders.gl/schema';
5
+
6
+ type RowArray = unknown[];
7
+ type RowObject = {[key: string]: unknown};
8
+ type TableJSON = RowArray[] | RowObject[];
9
+
10
+ export type JSONWriterOptions = {
11
+ shape?: 'object-row-table' | 'array-row-table';
12
+ wrapper?: (table: TableJSON) => unknown;
13
+ };
14
+
15
+ /**
16
+ * Encode a table as a JSON string
17
+ */
18
+ export function encodeTableAsJSON(table: Table, options: JSONWriterOptions = {}): string {
19
+ const shape = options.shape || 'object-row-table';
20
+
21
+ const strings: string[] = [];
22
+ const rowIterator = makeRowIterator(table, shape);
23
+ for (const row of rowIterator) {
24
+ // Round elements etc
25
+ // processRow(wrappedRow, table.schema);
26
+ // const wrappedRow = options.wrapper ? options.wrapper(row) : row;
27
+ strings.push(JSON.stringify(row));
28
+ }
29
+ return `[${strings.join(',')}]`;
30
+ }
@@ -0,0 +1,35 @@
1
+ // loaders.gl, MIT License
2
+
3
+ /* global TextEncoder */
4
+ export class Utf8ArrayBufferEncoder {
5
+ private readonly chunkSize: number;
6
+ private strings: string[] = [];
7
+ private totalLength = 0;
8
+ private textEncoder: TextEncoder = new TextEncoder();
9
+
10
+ constructor(chunkSize: number) {
11
+ this.chunkSize = chunkSize;
12
+ }
13
+
14
+ push(...strings: string[]): void {
15
+ for (const string of strings) {
16
+ this.strings.push(string);
17
+ this.totalLength += string.length;
18
+ }
19
+ }
20
+
21
+ isFull(): boolean {
22
+ return this.totalLength >= this.chunkSize;
23
+ }
24
+
25
+ getArrayBufferBatch(): ArrayBufferLike {
26
+ return this.textEncoder.encode(this.getStringBatch()).buffer;
27
+ }
28
+
29
+ getStringBatch(): string {
30
+ const stringChunk = this.strings.join('');
31
+ this.strings = [];
32
+ this.totalLength = 0;
33
+ return stringChunk;
34
+ }
35
+ }
@@ -1,15 +1,16 @@
1
- import type {Batch} from '@loaders.gl/schema';
2
- import type {JSONLoaderOptions} from '../json-loader';
1
+ import type {TableBatch} from '@loaders.gl/schema';
2
+ import type {JSONLoaderOptions} from '../../json-loader';
3
3
  import {TableBatchBuilder} from '@loaders.gl/schema';
4
- import {makeTextDecoderIterator} from '@loaders.gl/loader-utils';
5
- import StreamingJSONParser from './parser/streaming-json-parser';
4
+ import {assert, makeTextDecoderIterator} from '@loaders.gl/loader-utils';
5
+ import StreamingJSONParser from '../json-parser/streaming-json-parser';
6
+ import JSONPath from '../jsonpath/jsonpath';
6
7
 
7
8
  // TODO - support batch size 0 = no batching/single batch?
8
9
  // eslint-disable-next-line max-statements, complexity
9
- export default async function* parseJSONInBatches(
10
+ export async function* parseJSONInBatches(
10
11
  binaryAsyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,
11
12
  options: JSONLoaderOptions
12
- ): AsyncIterable<Batch> {
13
+ ): AsyncIterable<TableBatch> {
13
14
  const asyncIterator = makeTextDecoderIterator(binaryAsyncIterator);
14
15
 
15
16
  const {metadata} = options;
@@ -35,7 +36,7 @@ export default async function* parseJSONInBatches(
35
36
 
36
37
  if (rows.length > 0 && isFirstChunk) {
37
38
  if (metadata) {
38
- const initialBatch: Batch = {
39
+ const initialBatch: TableBatch = {
39
40
  // Common fields
40
41
  shape,
41
42
  batchType: 'partial-result',
@@ -77,7 +78,7 @@ export default async function* parseJSONInBatches(
77
78
  }
78
79
 
79
80
  if (metadata) {
80
- const finalBatch: Batch = {
81
+ const finalBatch: TableBatch = {
81
82
  shape,
82
83
  batchType: 'final-result',
83
84
  container: parser.getPartialResult(),
@@ -89,3 +90,24 @@ export default async function* parseJSONInBatches(
89
90
  yield finalBatch;
90
91
  }
91
92
  }
93
+
94
+ export function rebuildJsonObject(batch, data) {
95
+ // Last batch will have this special type and will provide all the root object of the parsed file
96
+ assert(batch.batchType === 'final-result');
97
+
98
+ // The streamed JSON data is a top level array (jsonpath = '$'), just return the array of row objects
99
+ if (batch.jsonpath === '$') {
100
+ return data;
101
+ }
102
+
103
+ // (jsonpath !== '$') The streamed data is not a top level array, so stitch it back in to the top-level object
104
+ if (batch.jsonpath && batch.jsonpath.length > 1) {
105
+ const topLevelObject = batch.container;
106
+ const streamingPath = new JSONPath(batch.jsonpath);
107
+ streamingPath.setFieldAtPath(topLevelObject, data);
108
+ return topLevelObject;
109
+ }
110
+
111
+ // No jsonpath, in this case nothing was streamed.
112
+ return batch.container;
113
+ }
@@ -1,10 +1,14 @@
1
- import type {JSONLoaderOptions} from '../json-loader';
1
+ // loaders.gl, MIT license
2
+ import type {RowTable} from '@loaders.gl/schema';
3
+ import {makeTableFromData} from '@loaders.gl/schema';
4
+ import type {JSONLoaderOptions} from '../../json-loader';
2
5
 
3
- export default function parseJSONSync(jsonText: string, options: JSONLoaderOptions) {
6
+ export function parseJSONSync(jsonText: string, options: JSONLoaderOptions): RowTable {
4
7
  try {
5
8
  const json = JSON.parse(jsonText);
6
9
  if (options.json?.table) {
7
- return getFirstArray(json) || json;
10
+ const data = getFirstArray(json) || json;
11
+ return makeTableFromData(data);
8
12
  }
9
13
  return json;
10
14
  } catch (error) {
@@ -7,7 +7,7 @@ import {
7
7
  makeTextDecoderIterator
8
8
  } from '@loaders.gl/loader-utils';
9
9
 
10
- export default async function* parseNDJSONInBatches(
10
+ export async function* parseNDJSONInBatches(
11
11
  binaryAsyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,
12
12
  options?: LoaderOptions
13
13
  ): AsyncIterable<Batch> {
@@ -0,0 +1,15 @@
1
+ import type {ArrayRowTable, ObjectRowTable} from '@loaders.gl/schema';
2
+ import {makeTableFromData} from '@loaders.gl/schema';
3
+
4
+ export function parseNDJSONSync(ndjsonText: string): ArrayRowTable | ObjectRowTable {
5
+ const lines = ndjsonText.trim().split('\n');
6
+ const parsedLines = lines.map((line, counter) => {
7
+ try {
8
+ return JSON.parse(line);
9
+ } catch (error) {
10
+ throw new Error(`NDJSONLoader: failed to parse JSON on line ${counter + 1}`);
11
+ }
12
+ });
13
+
14
+ return makeTableFromData(parsedLines);
15
+ }
@@ -0,0 +1,48 @@
1
+ import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
2
+ import {parseNDJSONSync} from './lib/parsers/parse-ndjson';
3
+ import {parseNDJSONInBatches} from './lib/parsers/parse-ndjson-in-batches';
4
+
5
+ // __VERSION__ is injected by babel-plugin-version-inline
6
+ // @ts-ignore TS2304: Cannot find name '__VERSION__'.
7
+ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
8
+
9
+ export type NDGeoJSONLoaderOptions = LoaderOptions & {
10
+ geojson?: {
11
+ shape?: 'object-row-table';
12
+ };
13
+ gis?: {
14
+ format: 'geojson';
15
+ };
16
+ };
17
+
18
+ const DEFAULT_NDGEOJSON_LOADER_OPTIONS = {
19
+ geojson: {
20
+ shape: 'object-row-table'
21
+ },
22
+ gis: {
23
+ format: 'geojson'
24
+ }
25
+ };
26
+
27
+ export const NDJSONLoader = {
28
+ name: 'NDJSON',
29
+ id: 'ndjson',
30
+ module: 'json',
31
+ version: VERSION,
32
+ extensions: ['ndjson', 'ndgeojson'],
33
+ mimeTypes: [
34
+ 'application/geo+x-ndjson',
35
+ 'application/geo+x-ldjson',
36
+ 'application/jsonlines', // https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-inference.html#cm-batch
37
+ 'application/geo+json-seq',
38
+ 'application/x-ndjson'
39
+ ],
40
+ category: 'table',
41
+ text: true,
42
+ parse: async (arrayBuffer: ArrayBuffer) => parseNDJSONSync(new TextDecoder().decode(arrayBuffer)),
43
+ parseTextSync: parseNDJSONSync,
44
+ parseInBatches: parseNDJSONInBatches,
45
+ options: DEFAULT_NDGEOJSON_LOADER_OPTIONS
46
+ };
47
+
48
+ export const _typecheckNDJSONLoader: LoaderWithParser = NDJSONLoader;
@@ -1,40 +1,33 @@
1
- import type {Batch} from '@loaders.gl/schema';
2
- import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
3
- import parseNDJSONSync from './lib/parse-ndjson';
4
- import parseNDJSONInBatches from './lib/parse-ndjson-in-batches';
1
+ // loaders.gl, MIT license
2
+
3
+ import {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
4
+ import {ObjectRowTable, ArrayRowTable, TableBatch} from '@loaders.gl/schema';
5
+ import {parseNDJSONSync} from './lib/parsers/parse-ndjson';
6
+ import {parseNDJSONInBatches} from './lib/parsers/parse-ndjson-in-batches';
5
7
 
6
8
  // __VERSION__ is injected by babel-plugin-version-inline
7
9
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
8
10
  const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
9
11
 
10
- export const NDJSONLoader = {
12
+ export const NDJSONLoader: LoaderWithParser<
13
+ ObjectRowTable | ArrayRowTable,
14
+ TableBatch,
15
+ LoaderOptions
16
+ > = {
11
17
  name: 'NDJSON',
12
18
  id: 'ndjson',
13
19
  module: 'json',
14
20
  version: VERSION,
15
- extensions: ['ndjson'],
16
- mimeTypes: ['application/x-ndjson'],
21
+ extensions: ['ndjson', 'jsonl'],
22
+ mimeTypes: [
23
+ 'application/x-ndjson',
24
+ 'application/jsonlines', // https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-inference.html#cm-batch
25
+ 'application/json-seq'
26
+ ],
17
27
  category: 'table',
18
28
  text: true,
19
- parse,
20
- parseTextSync,
21
- parseInBatches,
29
+ parse: async (arrayBuffer: ArrayBuffer) => parseNDJSONSync(new TextDecoder().decode(arrayBuffer)),
30
+ parseTextSync: parseNDJSONSync,
31
+ parseInBatches: parseNDJSONInBatches,
22
32
  options: {}
23
33
  };
24
-
25
- async function parse(arrayBuffer: ArrayBuffer) {
26
- return parseTextSync(new TextDecoder().decode(arrayBuffer));
27
- }
28
-
29
- function parseTextSync(text: string) {
30
- return parseNDJSONSync(text);
31
- }
32
-
33
- function parseInBatches(
34
- asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,
35
- options?: LoaderOptions
36
- ): AsyncIterable<Batch> {
37
- return parseNDJSONInBatches(asyncIterator, options);
38
- }
39
-
40
- export const _typecheckNDJSONLoader: LoaderWithParser = NDJSONLoader;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/bundle.ts"],"names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"mappings":"AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAD,CAA7B;;AACAC,UAAU,CAACC,OAAX,GAAqBD,UAAU,CAACC,OAAX,IAAsB,EAA3C;AACAC,MAAM,CAACC,OAAP,GAAiBC,MAAM,CAACC,MAAP,CAAcL,UAAU,CAACC,OAAzB,EAAkCH,aAAlC,CAAjB","sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"file":"bundle.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/geojson-loader.ts"],"names":["geojsonToBinary","parseJSONSync","parseJSONInBatches","VERSION","DEFAULT_GEOJSON_LOADER_OPTIONS","geojson","shape","json","jsonpaths","gis","format","GeoJSONWorkerLoader","name","id","module","version","worker","extensions","mimeTypes","category","text","options","GeoJSONLoader","parse","parseTextSync","parseInBatches","arrayBuffer","TextDecoder","decode","asyncIterator","geojsonIterator","makeBinaryGeometryIterator","batch","data"],"mappings":"AAEA,SAAQA,eAAR,QAA8B,iBAA9B;AACA,OAAOC,aAAP,MAA0B,kBAA1B;AACA,OAAOC,kBAAP,MAA+B,6BAA/B;AAIA,MAAMC,OAAO,GAAG,2BAAuB,WAAvB,qBAAmD,QAAnE;AAWA,MAAMC,8BAA8B,GAAG;AACrCC,EAAAA,OAAO,EAAE;AACPC,IAAAA,KAAK,EAAE;AADA,GAD4B;AAIrCC,EAAAA,IAAI,EAAE;AACJC,IAAAA,SAAS,EAAE,CAAC,GAAD,EAAM,YAAN;AADP,GAJ+B;AAOrCC,EAAAA,GAAG,EAAE;AACHC,IAAAA,MAAM,EAAE;AADL;AAPgC,CAAvC;AAeA,OAAO,MAAMC,mBAA2B,GAAG;AACzCC,EAAAA,IAAI,EAAE,SADmC;AAEzCC,EAAAA,EAAE,EAAE,SAFqC;AAGzCC,EAAAA,MAAM,EAAE,SAHiC;AAIzCC,EAAAA,OAAO,EAAEZ,OAJgC;AAKzCa,EAAAA,MAAM,EAAE,IALiC;AAMzCC,EAAAA,UAAU,EAAE,CAAC,SAAD,CAN6B;AAOzCC,EAAAA,SAAS,EAAE,CAAC,sBAAD,CAP8B;AAQzCC,EAAAA,QAAQ,EAAE,UAR+B;AASzCC,EAAAA,IAAI,EAAE,IATmC;AAUzCC,EAAAA,OAAO,EAAEjB;AAVgC,CAApC;AAaP,OAAO,MAAMkB,aAA+B,GAAG,EAC7C,GAAGX,mBAD0C;AAE7CY,EAAAA,KAF6C;AAG7CC,EAAAA,aAH6C;AAI7CC,EAAAA;AAJ6C,CAAxC;;AAOP,eAAeF,KAAf,CAAqBG,WAArB,EAAkCL,OAAlC,EAA2C;AACzC,SAAOG,aAAa,CAAC,IAAIG,WAAJ,GAAkBC,MAAlB,CAAyBF,WAAzB,CAAD,EAAwCL,OAAxC,CAApB;AACD;;AAED,SAASG,aAAT,CAAuBJ,IAAvB,EAA6BC,OAA7B,EAAsC;AAEpCA,EAAAA,OAAO,GAAG,EAAC,GAAGjB,8BAAJ;AAAoC,OAAGiB;AAAvC,GAAV;AACAA,EAAAA,OAAO,CAACd,IAAR,GAAe,EAAC,GAAGH,8BAA8B,CAACC,OAAnC;AAA4C,OAAGgB,OAAO,CAAChB;AAAvD,GAAf;AACAgB,EAAAA,OAAO,CAACZ,GAAR,GAAcY,OAAO,CAACZ,GAAR,IAAe,EAA7B;AACA,QAAMF,IAAI,GAAGN,aAAa,CAACmB,IAAD,EAAOC,OAAP,CAA1B;;AACA,UAAQA,OAAO,CAACZ,GAAR,CAAYC,MAApB;AACE,SAAK,QAAL;AACE,aAAOV,eAAe,CAACO,IAAD,CAAtB;;AACF;AACE,aAAOA,IAAP;AAJJ;AAMD;;AAED,SAASkB,cAAT,CAAwBI,aAAxB,EAAuCR,OAAvC,EAAoE;AAElEA,EAAAA,OAAO,GAAG,EAAC,GAAGjB,8BAAJ;AAAoC,OAAGiB;AAAvC,GAAV;AACAA,EAAAA,OAAO,CAACd,IAAR,GAAe,EAAC,GAAGH,8BAA8B,CAACC,OAAnC;AAA4C,OAAGgB,OAAO,CAAChB;AAAvD,GAAf;AAEA,QAAMyB,eAAe,GAAG5B,kBAAkB,CAAC2B,aAAD,EAAgBR,OAAhB,CAA1C;;AAEA,UAAQA,OAAO,CAACZ,GAAR,CAAYC,MAApB;AACE,SAAK,QAAL;AACE,aAAOqB,0BAA0B,CAACD,eAAD,CAAjC;;AACF;AACE,aAAOA,eAAP;AAJJ;AAMD;;AAED,gBAAgBC,0BAAhB,CAA2CD,eAA3C,EAA4D;AAC1D,aAAW,MAAME,KAAjB,IAA0BF,eAA1B,EAA2C;AACzCE,IAAAA,KAAK,CAACC,IAAN,GAAajC,eAAe,CAACgC,KAAK,CAACC,IAAP,CAA5B;AACA,UAAMD,KAAN;AACD;AACF","sourcesContent":["import type {Loader, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {JSONLoaderOptions} from './json-loader';\nimport {geojsonToBinary} from '@loaders.gl/gis';\nimport parseJSONSync from './lib/parse-json';\nimport parseJSONInBatches from './lib/parse-json-in-batches';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type GeoJSONLoaderOptions = JSONLoaderOptions & {\n geojson?: {\n shape?: 'object-row-table';\n };\n gis?: {\n format: 'geojson';\n };\n};\n\nconst DEFAULT_GEOJSON_LOADER_OPTIONS = {\n geojson: {\n shape: 'object-row-table'\n },\n json: {\n jsonpaths: ['$', '$.features']\n },\n gis: {\n format: 'geojson'\n }\n};\n\n/**\n * GeoJSON loader\n */\nexport const GeoJSONWorkerLoader: Loader = {\n name: 'GeoJSON',\n id: 'geojson',\n module: 'geojson',\n version: VERSION,\n worker: true,\n extensions: ['geojson'],\n mimeTypes: ['application/geo+json'],\n category: 'geometry',\n text: true,\n options: DEFAULT_GEOJSON_LOADER_OPTIONS\n};\n\nexport const GeoJSONLoader: LoaderWithParser = {\n ...GeoJSONWorkerLoader,\n parse,\n parseTextSync,\n parseInBatches\n};\n\nasync function parse(arrayBuffer, options) {\n return parseTextSync(new TextDecoder().decode(arrayBuffer), options);\n}\n\nfunction parseTextSync(text, options) {\n // Apps can call the parse method directly, we so apply default options here\n options = {...DEFAULT_GEOJSON_LOADER_OPTIONS, ...options};\n options.json = {...DEFAULT_GEOJSON_LOADER_OPTIONS.geojson, ...options.geojson};\n options.gis = options.gis || {};\n const json = parseJSONSync(text, options);\n switch (options.gis.format) {\n case 'binary':\n return geojsonToBinary(json);\n default:\n return json;\n }\n}\n\nfunction parseInBatches(asyncIterator, options): AsyncIterable<any> {\n // Apps can call the parse method directly, we so apply default options here\n options = {...DEFAULT_GEOJSON_LOADER_OPTIONS, ...options};\n options.json = {...DEFAULT_GEOJSON_LOADER_OPTIONS.geojson, ...options.geojson};\n\n const geojsonIterator = parseJSONInBatches(asyncIterator, options);\n\n switch (options.gis.format) {\n case 'binary':\n return makeBinaryGeometryIterator(geojsonIterator);\n default:\n return geojsonIterator;\n }\n}\n\nasync function* makeBinaryGeometryIterator(geojsonIterator) {\n for await (const batch of geojsonIterator) {\n batch.data = geojsonToBinary(batch.data);\n yield batch;\n }\n}\n"],"file":"geojson-loader.js"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["JSONLoader","NDJSONLoader","GeoJSONLoader","_GeoJSONLoader","GeoJSONWorkerLoader","_GeoJSONWorkerLoader","default","_JSONPath","_ClarinetParser"],"mappings":"AACA,SAAQA,UAAR,QAAyB,eAAzB;AACA,SAAQC,YAAR,QAA2B,iBAA3B;AAIA,SACEC,aAAa,IAAIC,cADnB,EAEEC,mBAAmB,IAAIC,oBAFzB,QAGO,kBAHP;AAKA,SAAQC,OAAO,IAAIC,SAAnB,QAAmC,yBAAnC;AACA,SAAQD,OAAO,IAAIE,eAAnB,QAAyC,yBAAzC","sourcesContent":["export type {JSONLoaderOptions} from './json-loader';\nexport {JSONLoader} from './json-loader';\nexport {NDJSONLoader} from './ndjson-loader';\n\n// EXPERIMENTAL EXPORTS - WARNING: MAY BE REMOVED WIHTOUT NOTICE IN FUTURE RELEASES\nexport type {GeoJSONLoaderOptions as _GeoJSONLoaderOptions} from './geojson-loader';\nexport {\n GeoJSONLoader as _GeoJSONLoader,\n GeoJSONWorkerLoader as _GeoJSONWorkerLoader\n} from './geojson-loader';\n\nexport {default as _JSONPath} from './lib/jsonpath/jsonpath';\nexport {default as _ClarinetParser} from './lib/clarinet/clarinet';\n"],"file":"index.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/json-loader.ts"],"names":["parseJSONSync","parseJSONInBatches","VERSION","DEFAULT_JSON_LOADER_OPTIONS","json","shape","table","jsonpaths","JSONLoader","name","id","module","version","extensions","mimeTypes","category","text","parse","parseTextSync","parseInBatches","options","arrayBuffer","TextDecoder","decode","jsonOptions","asyncIterator"],"mappings":"AAEA,OAAOA,aAAP,MAA0B,kBAA1B;AACA,OAAOC,kBAAP,MAA+B,6BAA/B;AAIA,MAAMC,OAAO,GAAG,2BAAuB,WAAvB,qBAAmD,QAAnE;AAcA,MAAMC,2BAA2B,GAAG;AAClCC,EAAAA,IAAI,EAAE;AACJC,IAAAA,KAAK,EAAE,WADH;AAEJC,IAAAA,KAAK,EAAE,KAFH;AAGJC,IAAAA,SAAS,EAAE;AAHP;AAD4B,CAApC;AASA,OAAO,MAAMC,UAA4B,GAAG;AAC1CC,EAAAA,IAAI,EAAE,MADoC;AAE1CC,EAAAA,EAAE,EAAE,MAFsC;AAG1CC,EAAAA,MAAM,EAAE,MAHkC;AAI1CC,EAAAA,OAAO,EAAEV,OAJiC;AAK1CW,EAAAA,UAAU,EAAE,CAAC,MAAD,EAAS,SAAT,CAL8B;AAM1CC,EAAAA,SAAS,EAAE,CAAC,kBAAD,CAN+B;AAoB1CC,EAAAA,QAAQ,EAAE,OApBgC;AAqB1CC,EAAAA,IAAI,EAAE,IArBoC;AAsB1CC,EAAAA,KAtB0C;AAuB1CC,EAAAA,aAvB0C;AAwB1CC,EAAAA,cAxB0C;AAyB1CC,EAAAA,OAAO,EAAEjB;AAzBiC,CAArC;;AA4BP,eAAec,KAAf,CAAqBI,WAArB,EAA+CD,OAA/C,EAA4E;AAC1E,SAAOF,aAAa,CAAC,IAAII,WAAJ,GAAkBC,MAAlB,CAAyBF,WAAzB,CAAD,EAAwCD,OAAxC,CAApB;AACD;;AAED,SAASF,aAAT,CAAuBF,IAAvB,EAAqCI,OAArC,EAAkE;AAChE,QAAMI,WAAW,GAAG,EAAC,GAAGJ,OAAJ;AAAahB,IAAAA,IAAI,EAAE,EAAC,GAAGD,2BAA2B,CAACC,IAAhC;AAAsC,UAAGgB,OAAH,aAAGA,OAAH,uBAAGA,OAAO,CAAEhB,IAAZ;AAAtC;AAAnB,GAApB;AACA,SAAOJ,aAAa,CAACgB,IAAD,EAAOQ,WAAP,CAApB;AACD;;AAED,SAASL,cAAT,CACEM,aADF,EAEEL,OAFF,EAGwB;AACtB,QAAMI,WAAW,GAAG,EAAC,GAAGJ,OAAJ;AAAahB,IAAAA,IAAI,EAAE,EAAC,GAAGD,2BAA2B,CAACC,IAAhC;AAAsC,UAAGgB,OAAH,aAAGA,OAAH,uBAAGA,OAAO,CAAEhB,IAAZ;AAAtC;AAAnB,GAApB;AACA,SAAOH,kBAAkB,CAACwB,aAAD,EAAgBD,WAAhB,CAAzB;AACD","sourcesContent":["import type {Batch} from '@loaders.gl/schema';\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport parseJSONSync from './lib/parse-json';\nimport parseJSONInBatches from './lib/parse-json-in-batches';\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 * @param table -\n * @param jsonpaths -\n */\nexport type JSONLoaderOptions = LoaderOptions & {\n json?: {\n shape?: 'row-table';\n table?: false;\n jsonpaths?: string[];\n };\n};\n\nconst DEFAULT_JSON_LOADER_OPTIONS = {\n json: {\n shape: 'row-table',\n table: false,\n jsonpaths: []\n // batchSize: 'auto'\n }\n};\n\nexport const JSONLoader: LoaderWithParser = {\n name: 'JSON',\n id: 'json',\n module: 'json',\n version: VERSION,\n extensions: ['json', 'geojson'],\n mimeTypes: ['application/json'],\n // TODO - support various line based JSON formats\n /*\n extensions: {\n json: null,\n jsonl: {stream: true},\n ndjson: {stream: true}\n },\n mimeTypes: {\n 'application/json': null,\n 'application/json-seq': {stream: true},\n 'application/x-ndjson': {stream: true}\n },\n */\n category: 'table',\n text: true,\n parse,\n parseTextSync,\n parseInBatches,\n options: DEFAULT_JSON_LOADER_OPTIONS\n};\n\nasync function parse(arrayBuffer: ArrayBuffer, options?: JSONLoaderOptions) {\n return parseTextSync(new TextDecoder().decode(arrayBuffer), options);\n}\n\nfunction parseTextSync(text: string, options?: JSONLoaderOptions) {\n const jsonOptions = {...options, json: {...DEFAULT_JSON_LOADER_OPTIONS.json, ...options?.json}};\n return parseJSONSync(text, jsonOptions as JSONLoaderOptions);\n}\n\nfunction parseInBatches(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options?: JSONLoaderOptions\n): AsyncIterable<Batch> {\n const jsonOptions = {...options, json: {...DEFAULT_JSON_LOADER_OPTIONS.json, ...options?.json}};\n return parseJSONInBatches(asyncIterator, jsonOptions as JSONLoaderOptions);\n}\n"],"file":"json-loader.js"}