kepler.gl 3.1.0 → 3.1.1

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 (234) hide show
  1. package/README.md +27 -132
  2. package/dist/src/common-utils/src/data-type.d.ts +9 -1
  3. package/dist/src/components/src/common/data-table/header-cell.d.ts +1 -0
  4. package/dist/src/components/src/common/data-table/index.d.ts +1 -0
  5. package/dist/src/components/src/common/file-uploader/file-drop.d.ts +1 -32
  6. package/dist/src/components/src/common/item-selector/dropdown-list.d.ts +2 -2
  7. package/dist/src/components/src/common/item-selector/item-selector.d.ts +1 -1
  8. package/dist/src/components/src/common/item-selector/typeahead.d.ts +1 -1
  9. package/dist/src/components/src/geocoder/geocoder.d.ts +7 -0
  10. package/dist/src/components/src/geocoder-panel.d.ts +2 -2
  11. package/dist/src/components/src/hooks/use-fetch-vector-tile-metadata.d.ts +4 -3
  12. package/dist/src/constants/src/default-settings.d.ts +14 -1
  13. package/dist/src/deckgl-arrow-layers/src/constants.d.ts +0 -12
  14. package/dist/src/deckgl-arrow-layers/src/index.d.ts +0 -1
  15. package/dist/src/deckgl-arrow-layers/src/utils/utils.d.ts +12 -1
  16. package/dist/src/duckdb/src/components/preview-data-panel.d.ts +7 -2
  17. package/dist/src/duckdb/src/components/schema-panel.d.ts +12 -3
  18. package/dist/src/duckdb/src/processors/data-processor.d.ts +1 -0
  19. package/dist/src/duckdb/src/table/duckdb-table-utils.d.ts +106 -0
  20. package/dist/src/duckdb/src/table/duckdb-table.d.ts +5 -3
  21. package/dist/src/processors/src/data-processor.d.ts +15 -1
  22. package/dist/src/reducers/src/provider-state-updaters.d.ts +1 -0
  23. package/dist/src/reducers/src/vis-state-updaters.d.ts +1 -1
  24. package/dist/src/table/src/dataset-utils.d.ts +1 -1
  25. package/dist/src/table/src/tileset/vector-tile-utils.d.ts +17 -1
  26. package/dist/src/utils/src/application-config.d.ts +4 -3
  27. package/dist/src/utils/src/data-utils.d.ts +9 -3
  28. package/dist/src/utils/src/indexed-data-container.d.ts +2 -2
  29. package/dist/src/utils/src/map-style-utils/mapbox-utils.d.ts +1 -1
  30. package/dist/src/utils/src/map-utils.d.ts +1 -1
  31. package/dist/src/utils/src/plot.d.ts +2 -2
  32. package/package.json +5 -5
  33. package/src/actions/package.json +8 -8
  34. package/src/ai-assistant/dist/components/ai-assistant-component.js +2 -1
  35. package/src/ai-assistant/package.json +7 -7
  36. package/src/ai-assistant/src/components/ai-assistant-component.tsx +1 -0
  37. package/src/cloud-providers/package.json +2 -2
  38. package/src/common-utils/dist/data-type.d.ts +9 -1
  39. package/src/common-utils/dist/data-type.js +50 -1
  40. package/src/common-utils/package.json +3 -3
  41. package/src/common-utils/src/data-type.ts +49 -1
  42. package/src/components/dist/common/data-table/header-cell.d.ts +1 -0
  43. package/src/components/dist/common/data-table/header-cell.js +2 -2
  44. package/src/components/dist/common/data-table/index.d.ts +1 -0
  45. package/src/components/dist/common/data-table/index.js +5 -1
  46. package/src/components/dist/common/file-uploader/file-drop.d.ts +1 -32
  47. package/src/components/dist/common/file-uploader/file-drop.js +152 -167
  48. package/src/components/dist/common/item-selector/dropdown-list.d.ts +2 -2
  49. package/src/components/dist/common/item-selector/dropdown-list.js +2 -3
  50. package/src/components/dist/common/item-selector/item-selector.d.ts +1 -1
  51. package/src/components/dist/common/item-selector/typeahead.d.ts +1 -1
  52. package/src/components/dist/common/range-brush.js +3 -3
  53. package/src/components/dist/geocoder/geocoder.d.ts +7 -0
  54. package/src/components/dist/geocoder/geocoder.js +19 -11
  55. package/src/components/dist/geocoder-panel.d.ts +2 -2
  56. package/src/components/dist/geocoder-panel.js +64 -91
  57. package/src/components/dist/hooks/use-fetch-vector-tile-metadata.d.ts +4 -3
  58. package/src/components/dist/hooks/use-fetch-vector-tile-metadata.js +35 -26
  59. package/src/components/dist/hooks/use-legend-position.js +8 -4
  60. package/src/components/dist/map/map-legend-panel.js +2 -3
  61. package/src/components/dist/modal-container.js +8 -8
  62. package/src/components/dist/modals/tilesets-modals/tileset-vector-form.js +31 -12
  63. package/src/components/dist/side-panel/layer-panel/color-palette-preset.js +2 -2
  64. package/src/components/dist/side-panel/layer-panel/color-range-selector.js +10 -11
  65. package/src/components/dist/side-panel/layer-panel/color-selector.js +3 -3
  66. package/src/components/dist/side-panel/layer-panel/custom-palette.js +1 -2
  67. package/src/components/dist/side-panel/layer-panel/layer-configurator.js +6 -8
  68. package/src/components/dist/side-panel/layer-panel/vector-tile-layer-configurator.js +1 -2
  69. package/src/components/package.json +16 -16
  70. package/src/components/src/common/data-table/header-cell.tsx +2 -1
  71. package/src/components/src/common/data-table/index.tsx +4 -0
  72. package/src/components/src/common/file-uploader/file-drop.tsx +186 -161
  73. package/src/components/src/common/item-selector/dropdown-list.tsx +1 -6
  74. package/src/components/src/common/range-brush.tsx +2 -2
  75. package/src/components/src/geocoder/geocoder.tsx +16 -8
  76. package/src/components/src/geocoder-panel.tsx +95 -85
  77. package/src/components/src/hooks/use-fetch-vector-tile-metadata.ts +27 -25
  78. package/src/components/src/hooks/use-legend-position.ts +5 -2
  79. package/src/components/src/map/map-legend-panel.tsx +1 -2
  80. package/src/components/src/modal-container.tsx +7 -7
  81. package/src/components/src/modals/tilesets-modals/tileset-vector-form.tsx +12 -3
  82. package/src/components/src/side-panel/layer-panel/color-palette-preset.tsx +1 -1
  83. package/src/components/src/side-panel/layer-panel/color-range-selector.tsx +6 -11
  84. package/src/components/src/side-panel/layer-panel/color-selector.tsx +2 -2
  85. package/src/components/src/side-panel/layer-panel/custom-palette.tsx +0 -1
  86. package/src/components/src/side-panel/layer-panel/layer-configurator.tsx +23 -33
  87. package/src/components/src/side-panel/layer-panel/vector-tile-layer-configurator.tsx +0 -1
  88. package/src/constants/dist/default-settings.d.ts +14 -1
  89. package/src/constants/dist/default-settings.js +20 -5
  90. package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/91/4f/6c65f3a1eba584ffd2d892cabc25ab5804d4a9ef53694c98707372a83e56343a274bec04f15927a6fe7602615f0f23f73ccf599f524ef97ad6c77c8832ea +1 -0
  91. package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/a6/b2/5424aa4477192fb44cc90fd80892efdc96731f2ff0f48e8f28abf64243cc +2 -0
  92. package/src/constants/package.json +2 -2
  93. package/src/constants/src/default-settings.ts +16 -1
  94. package/src/constants/umd/keplergl.min.js +2 -2
  95. package/src/deckgl-arrow-layers/dist/constants.d.ts +0 -12
  96. package/src/deckgl-arrow-layers/dist/constants.js +4 -15
  97. package/src/deckgl-arrow-layers/dist/index.d.ts +0 -1
  98. package/src/deckgl-arrow-layers/dist/index.js +1 -8
  99. package/src/deckgl-arrow-layers/dist/layers/geo-arrow-scatterplot-layer.js +4 -4
  100. package/src/deckgl-arrow-layers/dist/layers/geo-arrow-text-layer.js +5 -5
  101. package/src/deckgl-arrow-layers/dist/utils/utils.d.ts +12 -1
  102. package/src/deckgl-arrow-layers/dist/utils/utils.js +7 -5
  103. package/src/deckgl-arrow-layers/package.json +2 -1
  104. package/src/deckgl-arrow-layers/src/constants.ts +0 -13
  105. package/src/deckgl-arrow-layers/src/index.ts +0 -2
  106. package/src/deckgl-arrow-layers/src/layers/geo-arrow-scatterplot-layer.ts +5 -3
  107. package/src/deckgl-arrow-layers/src/layers/geo-arrow-text-layer.ts +8 -4
  108. package/src/deckgl-arrow-layers/src/utils/utils.ts +7 -5
  109. package/src/deckgl-layers/dist/deckgl-extensions/filter-arrow-layer.d.ts +1 -1
  110. package/src/deckgl-layers/dist/deckgl-extensions/filter-shader-module.d.ts +1 -1
  111. package/src/deckgl-layers/dist/deckgl-extensions/filter-shader-module.js +3 -3
  112. package/src/deckgl-layers/package.json +5 -5
  113. package/src/deckgl-layers/src/deckgl-extensions/filter-shader-module.ts +4 -3
  114. package/src/duckdb/dist/components/monaco-editor.js +4 -5
  115. package/src/duckdb/dist/components/preview-data-panel.d.ts +7 -2
  116. package/src/duckdb/dist/components/preview-data-panel.js +7 -8
  117. package/src/duckdb/dist/components/schema-panel.d.ts +12 -3
  118. package/src/duckdb/dist/components/schema-panel.js +41 -24
  119. package/src/duckdb/dist/components/sql-panel.js +245 -56
  120. package/src/duckdb/dist/init.js +20 -14
  121. package/src/duckdb/dist/processors/data-processor.d.ts +1 -0
  122. package/src/duckdb/dist/processors/data-processor.js +4 -4
  123. package/src/duckdb/dist/table/duckdb-table-utils.d.ts +106 -0
  124. package/src/duckdb/dist/table/duckdb-table-utils.js +493 -2
  125. package/src/duckdb/dist/table/duckdb-table.d.ts +5 -3
  126. package/src/duckdb/dist/table/duckdb-table.js +153 -261
  127. package/src/duckdb/package.json +6 -6
  128. package/src/duckdb/src/components/monaco-editor.tsx +3 -3
  129. package/src/duckdb/src/components/preview-data-panel.tsx +15 -8
  130. package/src/duckdb/src/components/schema-panel.tsx +92 -21
  131. package/src/duckdb/src/components/sql-panel.tsx +160 -22
  132. package/src/duckdb/src/init.ts +4 -1
  133. package/src/duckdb/src/processors/data-processor.ts +2 -2
  134. package/src/duckdb/src/table/duckdb-table-utils.ts +407 -1
  135. package/src/duckdb/src/table/duckdb-table.ts +61 -92
  136. package/src/effects/package.json +5 -5
  137. package/src/layers/dist/arc-layer/arc-layer.d.ts +1 -1
  138. package/src/layers/dist/arc-layer/arc-layer.js +2 -3
  139. package/src/layers/dist/base-layer.d.ts +7 -6
  140. package/src/layers/dist/base-layer.js +36 -19
  141. package/src/layers/dist/geojson-layer/geojson-layer.js +4 -2
  142. package/src/layers/dist/geojson-layer/geojson-utils.js +10 -3
  143. package/src/layers/dist/heatmap-layer/heatmap-layer.d.ts +2 -0
  144. package/src/layers/dist/heatmap-layer/heatmap-layer.js +16 -9
  145. package/src/layers/dist/icon-layer/icon-layer.d.ts +6 -3
  146. package/src/layers/dist/icon-layer/icon-layer.js +19 -11
  147. package/src/layers/dist/index.d.ts +1 -1
  148. package/src/layers/dist/index.js +1 -1
  149. package/src/layers/dist/layer-text-label.d.ts +9 -0
  150. package/src/layers/dist/layer-text-label.js +51 -6
  151. package/src/layers/dist/layer-utils.d.ts +39 -30
  152. package/src/layers/dist/layer-utils.js +69 -9
  153. package/src/layers/dist/line-layer/line-layer.d.ts +1 -1
  154. package/src/layers/dist/line-layer/line-layer.js +2 -3
  155. package/src/layers/dist/point-layer/point-layer.d.ts +10 -7
  156. package/src/layers/dist/point-layer/point-layer.js +16 -8
  157. package/src/layers/dist/trip-layer/trip-layer.d.ts +2 -2
  158. package/src/layers/dist/trip-layer/trip-layer.js +4 -2
  159. package/src/layers/dist/vector-tile/abstract-tile-layer.d.ts +3 -7
  160. package/src/layers/dist/vector-tile/abstract-tile-layer.js +7 -6
  161. package/src/layers/dist/vector-tile/vector-tile-layer.d.ts +5 -7
  162. package/src/layers/dist/vector-tile/vector-tile-layer.js +23 -2
  163. package/src/layers/package.json +11 -10
  164. package/src/layers/src/arc-layer/arc-layer.ts +1 -1
  165. package/src/layers/src/base-layer.ts +50 -9
  166. package/src/layers/src/geojson-layer/geojson-layer.ts +3 -1
  167. package/src/layers/src/geojson-layer/geojson-utils.ts +4 -1
  168. package/src/layers/src/heatmap-layer/heatmap-layer.ts +17 -12
  169. package/src/layers/src/icon-layer/icon-layer.ts +7 -3
  170. package/src/layers/src/index.ts +1 -2
  171. package/src/layers/src/layer-text-label.ts +53 -4
  172. package/src/layers/src/layer-utils.ts +88 -9
  173. package/src/layers/src/line-layer/line-layer.ts +1 -1
  174. package/src/layers/src/point-layer/point-layer.ts +15 -11
  175. package/src/layers/src/trip-layer/trip-layer.ts +4 -2
  176. package/src/layers/src/vector-tile/abstract-tile-layer.ts +11 -5
  177. package/src/layers/src/vector-tile/vector-tile-layer.ts +33 -4
  178. package/src/localization/package.json +1 -1
  179. package/src/processors/dist/data-processor.d.ts +15 -1
  180. package/src/processors/dist/data-processor.js +104 -11
  181. package/src/processors/package.json +8 -7
  182. package/src/processors/src/data-processor.ts +116 -13
  183. package/src/reducers/dist/export-utils.js +2 -2
  184. package/src/reducers/dist/layer-utils.js +1 -1
  185. package/src/reducers/dist/provider-state-updaters.d.ts +1 -0
  186. package/src/reducers/dist/provider-state-updaters.js +5 -2
  187. package/src/reducers/dist/vis-state-updaters.d.ts +1 -1
  188. package/src/reducers/dist/vis-state-updaters.js +23 -12
  189. package/src/reducers/package.json +16 -16
  190. package/src/reducers/src/export-utils.ts +1 -1
  191. package/src/reducers/src/layer-utils.ts +2 -1
  192. package/src/reducers/src/provider-state-updaters.ts +4 -1
  193. package/src/reducers/src/vis-state-updaters.ts +45 -10
  194. package/src/schemas/dist/dataset-schema.js +35 -6
  195. package/src/schemas/package.json +7 -7
  196. package/src/schemas/src/dataset-schema.ts +36 -8
  197. package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/a3/a9/7f26bbc52905b0e21e9366a30ef0ba98f4ccf9aa8dd8326d90ba90191ba2e305323f505bf134c825356156c793bf9386ed2cef2aeb48eb327c26d106f69a +1 -0
  198. package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/7e/51/b8756555a0e2e696d944445ac23f7febf769006013fbc8419f39a701649d +2 -0
  199. package/src/styles/package.json +2 -2
  200. package/src/styles/umd/keplergl.min.js +2 -2
  201. package/src/table/dist/dataset-utils.js +23 -14
  202. package/src/table/dist/src/table/src/dataset-utils.d.ts +1 -1
  203. package/src/table/dist/src/table/src/tileset/vector-tile-utils.d.ts +17 -1
  204. package/src/table/dist/tileset/vector-tile-utils.js +122 -2
  205. package/src/table/package.json +5 -5
  206. package/src/table/src/dataset-utils.ts +16 -6
  207. package/src/table/src/tileset/vector-tile-utils.ts +131 -8
  208. package/src/tasks/package.json +2 -2
  209. package/src/types/actions.d.ts +1 -0
  210. package/src/types/layers.d.ts +1 -0
  211. package/src/types/package.json +1 -1
  212. package/src/types/types.d.ts +17 -0
  213. package/src/utils/dist/application-config.d.ts +4 -3
  214. package/src/utils/dist/application-config.js +3 -2
  215. package/src/utils/dist/data-scale-utils.js +4 -4
  216. package/src/utils/dist/data-utils.d.ts +9 -3
  217. package/src/utils/dist/data-utils.js +40 -7
  218. package/src/utils/dist/dataset-utils.js +23 -8
  219. package/src/utils/dist/indexed-data-container.d.ts +2 -2
  220. package/src/utils/dist/indexed-data-container.js +1 -1
  221. package/src/utils/dist/map-style-utils/mapbox-utils.d.ts +1 -1
  222. package/src/utils/dist/map-style-utils/mapbox-utils.js +3 -3
  223. package/src/utils/dist/plot.d.ts +2 -2
  224. package/src/utils/dist/plot.js +6 -6
  225. package/src/utils/map-utils.spec.js +1 -2
  226. package/src/utils/package.json +5 -4
  227. package/src/utils/src/application-config.ts +11 -8
  228. package/src/utils/src/data-scale-utils.ts +3 -3
  229. package/src/utils/src/data-utils.ts +36 -7
  230. package/src/utils/src/dataset-utils.ts +41 -9
  231. package/src/utils/src/indexed-data-container.ts +1 -1
  232. package/src/utils/src/map-style-utils/mapbox-utils.ts +2 -2
  233. package/src/utils/src/plot.ts +5 -5
  234. package/umd/keplergl.min.js +1279 -1295
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kepler.gl/reducers",
3
3
  "author": "Shan He <shan@uber.com>",
4
- "version": "3.1.0",
4
+ "version": "3.1.1",
5
5
  "description": "kepler.gl constants used by kepler.gl components, actions and reducers",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
@@ -31,21 +31,21 @@
31
31
  ],
32
32
  "dependencies": {
33
33
  "@dnd-kit/sortable": "^8.0.0",
34
- "@kepler.gl/actions": "3.1.0",
35
- "@kepler.gl/cloud-providers": "3.1.0",
36
- "@kepler.gl/common-utils": "3.1.0",
37
- "@kepler.gl/constants": "3.1.0",
38
- "@kepler.gl/deckgl-arrow-layers": "3.1.0",
39
- "@kepler.gl/deckgl-layers": "3.1.0",
40
- "@kepler.gl/effects": "3.1.0",
41
- "@kepler.gl/layers": "3.1.0",
42
- "@kepler.gl/localization": "3.1.0",
43
- "@kepler.gl/processors": "3.1.0",
44
- "@kepler.gl/schemas": "3.1.0",
45
- "@kepler.gl/table": "3.1.0",
46
- "@kepler.gl/tasks": "3.1.0",
47
- "@kepler.gl/types": "3.1.0",
48
- "@kepler.gl/utils": "3.1.0",
34
+ "@kepler.gl/actions": "3.1.1",
35
+ "@kepler.gl/cloud-providers": "3.1.1",
36
+ "@kepler.gl/common-utils": "3.1.1",
37
+ "@kepler.gl/constants": "3.1.1",
38
+ "@kepler.gl/deckgl-arrow-layers": "3.1.1",
39
+ "@kepler.gl/deckgl-layers": "3.1.1",
40
+ "@kepler.gl/effects": "3.1.1",
41
+ "@kepler.gl/layers": "3.1.1",
42
+ "@kepler.gl/localization": "3.1.1",
43
+ "@kepler.gl/processors": "3.1.1",
44
+ "@kepler.gl/schemas": "3.1.1",
45
+ "@kepler.gl/table": "3.1.1",
46
+ "@kepler.gl/tasks": "3.1.1",
47
+ "@kepler.gl/types": "3.1.1",
48
+ "@kepler.gl/utils": "3.1.1",
49
49
  "@loaders.gl/loader-utils": "^4.3.2",
50
50
  "@mapbox/geo-viewport": "^0.4.1",
51
51
  "@math.gl/web-mercator": "^3.6.2",
@@ -69,7 +69,7 @@ export function formatCsv(data: DataContainerInterface, fields: Field[]): string
69
69
 
70
70
  // parse geojson object as string
71
71
  for (const row of data.rows(true)) {
72
- formattedData.push(row.map((d, i) => parseFieldValue(d, fields[i].type)));
72
+ formattedData.push(row.map((d, i) => parseFieldValue(d, fields[i].type, fields[i])));
73
73
  }
74
74
 
75
75
  return csvFormatRows(formattedData);
@@ -20,6 +20,7 @@ import {
20
20
  } from '@kepler.gl/types';
21
21
  import {
22
22
  FindDefaultLayerPropsReturnValue,
23
+ FindDefaultLayerProps,
23
24
  Layer,
24
25
  LayerClassesType,
25
26
  OVERLAY_TYPE_CONST,
@@ -86,7 +87,7 @@ export function findDefaultLayer(dataset: KeplerTable, layerClasses: LayerClasse
86
87
  }))
87
88
  );
88
89
  },
89
- [] as (LayerClassesType[keyof LayerClassesType] & {type: string})[]
90
+ [] as (FindDefaultLayerProps & {type: string})[]
90
91
  );
91
92
 
92
93
  // go through all layerProps to create layer
@@ -49,6 +49,7 @@ export type ProviderState = {
49
49
  currentProvider: string | null;
50
50
  successInfo: any;
51
51
  mapSaved: null | string;
52
+ savedMapId: null | string;
52
53
  initialState?: any;
53
54
  visualizations: MapListItem[];
54
55
  };
@@ -60,6 +61,7 @@ export const INITIAL_PROVIDER_STATE: ProviderState = {
60
61
  currentProvider: null,
61
62
  successInfo: {},
62
63
  mapSaved: null,
64
+ savedMapId: null,
63
65
  visualizations: []
64
66
  };
65
67
 
@@ -154,7 +156,8 @@ export const exportFileSuccessUpdater = (
154
156
  successInfo: response,
155
157
  ...(!options.isPublic
156
158
  ? {
157
- mapSaved: provider.name
159
+ mapSaved: provider.name,
160
+ savedMapId: response?.info?.id ?? null
158
161
  }
159
162
  : {})
160
163
  };
@@ -22,6 +22,7 @@ import {
22
22
  } from '@kepler.gl/tasks';
23
23
  // Actions
24
24
  import {
25
+ addNotification,
25
26
  ActionTypes,
26
27
  CreateNewDatasetSuccessPayload,
27
28
  MapStateActions,
@@ -56,6 +57,7 @@ import {
56
57
  arrayInsert,
57
58
  computeSplitMapLayers,
58
59
  adjustValueToFilterDomain,
60
+ errorNotification,
59
61
  featureToFilterValue,
60
62
  filterDatasetCPU,
61
63
  generatePolygonFilter,
@@ -903,7 +905,18 @@ export function layerTypeChangeUpdater(
903
905
  // get a mint layer, with new id and type
904
906
  // because deck.gl uses id to match between new and old layer.
905
907
  // If type has changed but id is the same, it will break
906
- newLayer.assignConfigToLayer(oldLayer.config, oldLayer.visConfigSettings);
908
+
909
+ const defaultLayerProps =
910
+ typeof state.layerClasses[newType].findDefaultLayerProps === 'function'
911
+ ? state.layerClasses[newType].findDefaultLayerProps(state.datasets[newLayer.config.dataId])
912
+ : null;
913
+
914
+ newLayer.assignConfigToLayer(
915
+ oldLayer.config,
916
+ oldLayer.visConfigSettings,
917
+ state.datasets,
918
+ defaultLayerProps
919
+ );
907
920
  newLayer.updateLayerDomain(state.datasets);
908
921
  }
909
922
 
@@ -1390,7 +1403,7 @@ function _updateFilterProp(state, filter, prop, value, valueIndex, datasetIds?)
1390
1403
  */
1391
1404
  export const setFilterPlotUpdater = (
1392
1405
  state: VisState,
1393
- {idx, newProp, valueIndex = 0}: VisStateActions.SetFilterPlotUpdaterAction
1406
+ {idx, newProp}: VisStateActions.SetFilterPlotUpdaterAction
1394
1407
  ): VisState => {
1395
1408
  if (!state.filters[idx]) {
1396
1409
  Console.error(`filters[${idx}] is undefined`);
@@ -2337,15 +2350,37 @@ export const updateVisDataUpdater = (
2337
2350
 
2338
2351
  const datasets = toArray(action.datasets);
2339
2352
 
2340
- const allCreateDatasetsTasks = datasets.map(
2341
- ({info = {}, ...rest}) => createNewDataEntry({info, ...rest}, state.datasets) || {}
2342
- );
2343
- // call all Tasks
2344
- const datasetTasks = Task.allSettled(allCreateDatasetsTasks).map(results =>
2345
- createNewDatasetSuccess({results, addToMapOptions: options})
2346
- );
2353
+ const createDatasetTasks: Task[] = [];
2354
+ const notificationTasks: Task[] = [];
2347
2355
 
2348
- return withTask(updatedState, datasetTasks);
2356
+ datasets.forEach(({info = {}, ...rest}, datasetIndex) => {
2357
+ const task = createNewDataEntry({info, ...rest}, state.datasets);
2358
+ if (task) {
2359
+ createDatasetTasks.push(task);
2360
+ } else {
2361
+ notificationTasks.push(
2362
+ ACTION_TASK().map(() =>
2363
+ addNotification(
2364
+ errorNotification({
2365
+ message: `Failed to create a new dataset due to data verification errors`,
2366
+ id: `dataset-failed-${datasetIndex}`
2367
+ })
2368
+ )
2369
+ )
2370
+ );
2371
+ }
2372
+ });
2373
+
2374
+ const datasetsAllSettledTask = createDatasetTasks.length
2375
+ ? Task.allSettled(createDatasetTasks).map(results =>
2376
+ createNewDatasetSuccess({results, addToMapOptions: options})
2377
+ )
2378
+ : null;
2379
+
2380
+ return withTask(updatedState, [
2381
+ ...(datasetsAllSettledTask ? [datasetsAllSettledTask] : []),
2382
+ ...notificationTasks
2383
+ ]);
2349
2384
  };
2350
2385
 
2351
2386
  export const createNewDatasetSuccessUpdater = (
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
@@ -13,12 +14,14 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
13
14
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
15
  var _lodash = _interopRequireDefault(require("lodash.pick"));
15
16
  var _window = require("global/window");
16
- var _apacheArrow = require("apache-arrow");
17
+ var arrow = _interopRequireWildcard(require("apache-arrow"));
17
18
  var _constants = require("@kepler.gl/constants");
18
19
  var _versions = require("./versions");
19
20
  var _schema = _interopRequireDefault(require("./schema"));
20
21
  var _commonUtils = require("@kepler.gl/common-utils");
21
22
  var _utils = require("@kepler.gl/utils");
23
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
24
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
22
25
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
23
26
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24
27
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
@@ -81,8 +84,9 @@ var propertiesV1 = exports.propertiesV1 = _objectSpread(_objectSpread({}, proper
81
84
 
82
85
  /**
83
86
  * TODO Consider moving this cast to ArrowDataContainer?
84
- * Prepare a data container for export as part of json / html.
87
+ * Prepare a data container for export as part of json / html files.
85
88
  * 1) Arrow tables can store Timestamps as BigInts, so convert numbers to ISOStrings compatible with Kepler.gl's TIMESTAMP.
89
+ * 2) Geoarrow binary buffers converted to hex wkb
86
90
  * @param dataContainer A data container to flatten.
87
91
  * @returns Row based data.
88
92
  */
@@ -91,13 +95,17 @@ var getAllDataForSaving = function getAllDataForSaving(dataContainer) {
91
95
  if (dataContainer instanceof _utils.ArrowDataContainer) {
92
96
  var numColumns = dataContainer.numColumns();
93
97
  var _loop = function _loop(columnIndex) {
94
- var _column$type;
95
98
  var column = dataContainer.getColumn(columnIndex);
96
- var typeId = (_column$type = column.type) === null || _column$type === void 0 ? void 0 : _column$type.typeId;
97
- if (typeId === _apacheArrow.Type.Timestamp || typeId === _apacheArrow.Type.Date || typeId === _apacheArrow.Type.Time) {
99
+ var field = dataContainer.getField(columnIndex);
100
+ if (arrow.DataType.isTimestamp(column.type) || arrow.DataType.isDate(column.type) || arrow.DataType.isTime(column.type)) {
98
101
  allData.forEach(function (row) {
99
102
  row[columnIndex] = new Date(row[columnIndex]).toISOString();
100
103
  });
104
+ } else if ((field === null || field === void 0 ? void 0 : field.type) === _constants.ALL_FIELD_TYPES.geoarrow) {
105
+ var formatter = _utils.FIELD_DISPLAY_FORMAT[_constants.ALL_FIELD_TYPES.geoarrow];
106
+ allData.forEach(function (row) {
107
+ row[columnIndex] = formatter(row[columnIndex], field);
108
+ });
101
109
  }
102
110
  };
103
111
  for (var columnIndex = 0; columnIndex < numColumns; ++columnIndex) {
@@ -106,6 +114,26 @@ var getAllDataForSaving = function getAllDataForSaving(dataContainer) {
106
114
  }
107
115
  return allData;
108
116
  };
117
+
118
+ /**
119
+ * Transforms fields for saving as part of json / html files.
120
+ * @param fields The array of fields from a Kepler table.
121
+ * @returns The transformed fields array with GeoArrow types updated to GeoJSON.
122
+ */
123
+ var getFieldsForSaving = function getFieldsForSaving(fields) {
124
+ return fields.map(function (field) {
125
+ if (field.type === _constants.ALL_FIELD_TYPES.geoarrow) {
126
+ // geoarrow binary data is transformed to hex wkb in getAllDataForSaving, so update the field accordingly
127
+ return {
128
+ name: field.name,
129
+ type: _constants.ALL_FIELD_TYPES.geojson,
130
+ format: '',
131
+ analyzerType: 'GEOMETRY'
132
+ };
133
+ }
134
+ return field;
135
+ });
136
+ };
109
137
  var DatasetSchema = exports.DatasetSchema = /*#__PURE__*/function (_Schema2) {
110
138
  function DatasetSchema() {
111
139
  var _this2;
@@ -123,6 +151,7 @@ var DatasetSchema = exports.DatasetSchema = /*#__PURE__*/function (_Schema2) {
123
151
  value: function save(dataset) {
124
152
  var datasetFlattened = dataset.dataContainer ? _objectSpread(_objectSpread({}, dataset), {}, {
125
153
  allData: getAllDataForSaving(dataset.dataContainer),
154
+ fields: getFieldsForSaving(dataset.fields),
126
155
  // we use flattenData to save arrow tables,
127
156
  // but once flattened it's not an arrow file anymore.
128
157
  metadata: _objectSpread(_objectSpread({}, dataset.metadata), dataset.metadata.format === _constants.DATASET_FORMATS.arrow ? {
@@ -190,4 +219,4 @@ var datasetSchema = exports.datasetSchema = (0, _defineProperty2["default"])((0,
190
219
  properties: propertiesV1
191
220
  }));
192
221
  var _default = exports["default"] = datasetSchema;
193
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfd2luZG93IiwiX2FwYWNoZUFycm93IiwiX2NvbnN0YW50cyIsIl92ZXJzaW9ucyIsIl9zY2hlbWEiLCJfY29tbW9uVXRpbHMiLCJfdXRpbHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsImZpZWxkUHJvcGVydGllc1YwIiwiZXhwb3J0cyIsIm5hbWUiLCJ0eXBlIiwiZmllbGRQcm9wZXJ0aWVzVjEiLCJmb3JtYXQiLCJhbmFseXplclR5cGUiLCJtZXRhZGF0YSIsIkZpZWxkU2NoZW1hIiwiX1NjaGVtYSIsIl9jbGFzc0NhbGxDaGVjazIiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwic2F2ZSIsImZpZWxkcyIsIl90aGlzIiwibWFwIiwiZiIsInNhdmVQcm9wZXJ0aWVzT3JBcHBseVNjaGVtYSIsImxvYWQiLCJTY2hlbWEiLCJwcm9wZXJ0aWVzVjAiLCJpZCIsImxhYmVsIiwiY29sb3IiLCJhbGxEYXRhIiwidmVyc2lvbiIsIlZFUlNJT05TIiwidjAiLCJwcm9wZXJ0aWVzIiwicHJvcGVydGllc1YxIiwidjEiLCJkaXNhYmxlRGF0YU9wZXJhdGlvbiIsImdldEFsbERhdGFGb3JTYXZpbmciLCJkYXRhQ29udGFpbmVyIiwiZmxhdHRlbkRhdGEiLCJBcnJvd0RhdGFDb250YWluZXIiLCJudW1Db2x1bW5zIiwiX2xvb3AiLCJjb2x1bW5JbmRleCIsIl9jb2x1bW4kdHlwZSIsImNvbHVtbiIsImdldENvbHVtbiIsInR5cGVJZCIsIkFycm93VHlwZXMiLCJUaW1lc3RhbXAiLCJEYXRlIiwiVGltZSIsInJvdyIsInRvSVNPU3RyaW5nIiwiRGF0YXNldFNjaGVtYSIsIl9TY2hlbWEyIiwiX3RoaXMyIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjb25jYXQiLCJkYXRhc2V0IiwiZGF0YXNldEZsYXR0ZW5lZCIsIkRBVEFTRVRfRk9STUFUUyIsImFycm93IiwidXBkYXRlZEZpZWxkcyIsIm5lZWRDYWxjdWxhdGVNZXRhIiwiaGFzT3duUHJvcGVydHkiLCJmaWVsZE9yZGVyIiwic2FtcGxlRGF0YSIsImdldFNhbXBsZUZvclR5cGVBbmFseXplIiwicm93cyIsIm1ldGEiLCJnZXRGaWVsZHNGcm9tRGF0YSIsImkiLCJwaWNrIiwiZ2xvYmFsQ29uc29sZSIsIndhcm4iLCJkYXRhIiwiaW5mbyIsImRhdGFzZXRTY2hlbWEiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhc2V0LXNjaGVtYS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gucGljayc7XG5pbXBvcnQge2NvbnNvbGUgYXMgZ2xvYmFsQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge1R5cGUgYXMgQXJyb3dUeXBlc30gZnJvbSAnYXBhY2hlLWFycm93JztcblxuaW1wb3J0IHtEQVRBU0VUX0ZPUk1BVFN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7UHJvdG9EYXRhc2V0LCBSR0JDb2xvciwgSnNvbk9iamVjdH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0tlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7VkVSU0lPTlN9IGZyb20gJy4vdmVyc2lvbnMnO1xuaW1wb3J0IFNjaGVtYSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQge2dldEZpZWxkc0Zyb21EYXRhLCBnZXRTYW1wbGVGb3JUeXBlQW5hbHl6ZX0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtBcnJvd0RhdGFDb250YWluZXIsIERhdGFDb250YWluZXJJbnRlcmZhY2V9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBTYXZlZEZpZWxkID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZm9ybWF0Pzogc3RyaW5nO1xuICBhbmFseXplclR5cGU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBQYXJzZWRGaWVsZCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGZvcm1hdDogc3RyaW5nO1xuICBhbmFseXplclR5cGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNhdmVkRGF0YXNldFYxID0ge1xuICB2ZXJzaW9uOiAndjEnO1xuICBkYXRhOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNvbG9yOiBSR0JDb2xvcjtcbiAgICBhbGxEYXRhOiBhbnlbXVtdO1xuICAgIGZpZWxkczogU2F2ZWRGaWVsZFtdO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBKc29uT2JqZWN0O1xuICAgIGRpc2FibGVEYXRhT3BlcmF0aW9uPzogYm9vbGVhbjtcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFBhcnNlZERhdGFzZXQgPSB7XG4gIGRhdGE6IHtcbiAgICBmaWVsZHM6IFBhcnNlZEZpZWxkW107XG4gICAgcm93czogYW55W11bXTtcbiAgfTtcbiAgaW5mbzoge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIGNvbG9yPzogUkdCQ29sb3I7XG4gIH07XG59O1xuXG4vLyB2ZXJzaW9uIHYwXG5leHBvcnQgY29uc3QgZmllbGRQcm9wZXJ0aWVzVjAgPSB7XG4gIG5hbWU6IG51bGwsXG4gIHR5cGU6IG51bGxcbn07XG5cbmV4cG9ydCBjb25zdCBmaWVsZFByb3BlcnRpZXNWMSA9IHtcbiAgbmFtZTogbnVsbCxcbiAgdHlwZTogbnVsbCxcbiAgZm9ybWF0OiBudWxsLFxuICBhbmFseXplclR5cGU6IG51bGwsXG4gIG1ldGFkYXRhOiBudWxsXG59O1xuXG5leHBvcnQgY2xhc3MgRmllbGRTY2hlbWEgZXh0ZW5kcyBTY2hlbWEge1xuICBzYXZlKGZpZWxkcykge1xuICAgIHJldHVybiB7XG4gICAgICBbdGhpcy5rZXldOiBmaWVsZHMubWFwKGYgPT4gdGhpcy5zYXZlUHJvcGVydGllc09yQXBwbHlTY2hlbWEoZilbdGhpcy5rZXldKVxuICAgIH07XG4gIH1cbiAgbG9hZChmaWVsZHMpIHtcbiAgICByZXR1cm4ge1t0aGlzLmtleV06IGZpZWxkc307XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByb3BlcnRpZXNWMCA9IHtcbiAgaWQ6IG51bGwsXG4gIGxhYmVsOiBudWxsLFxuICBjb2xvcjogbnVsbCxcbiAgYWxsRGF0YTogbnVsbCxcbiAgZmllbGRzOiBuZXcgRmllbGRTY2hlbWEoe1xuICAgIGtleTogJ2ZpZWxkcycsXG4gICAgdmVyc2lvbjogVkVSU0lPTlMudjAsXG4gICAgcHJvcGVydGllczogZmllbGRQcm9wZXJ0aWVzVjBcbiAgfSlcbn07XG5cbmV4cG9ydCBjb25zdCBwcm9wZXJ0aWVzVjEgPSB7XG4gIC4uLnByb3BlcnRpZXNWMCxcbiAgZmllbGRzOiBuZXcgRmllbGRTY2hlbWEoe1xuICAgIGtleTogJ2ZpZWxkcycsXG4gICAgdmVyc2lvbjogVkVSU0lPTlMudjEsXG4gICAgcHJvcGVydGllczogZmllbGRQcm9wZXJ0aWVzVjFcbiAgfSksXG4gIHR5cGU6IG51bGwsXG4gIG1ldGFkYXRhOiBudWxsLFxuICBkaXNhYmxlRGF0YU9wZXJhdGlvbjogbnVsbFxufTtcblxuLyoqXG4gKiBUT0RPIENvbnNpZGVyIG1vdmluZyB0aGlzIGNhc3QgdG8gQXJyb3dEYXRhQ29udGFpbmVyP1xuICogUHJlcGFyZSBhIGRhdGEgY29udGFpbmVyIGZvciBleHBvcnQgYXMgcGFydCBvZiBqc29uIC8gaHRtbC5cbiAqIDEpIEFycm93IHRhYmxlcyBjYW4gc3RvcmUgVGltZXN0YW1wcyBhcyBCaWdJbnRzLCBzbyBjb252ZXJ0IG51bWJlcnMgdG8gSVNPU3RyaW5ncyBjb21wYXRpYmxlIHdpdGggS2VwbGVyLmdsJ3MgVElNRVNUQU1QLlxuICogQHBhcmFtIGRhdGFDb250YWluZXIgQSBkYXRhIGNvbnRhaW5lciB0byBmbGF0dGVuLlxuICogQHJldHVybnMgUm93IGJhc2VkIGRhdGEuXG4gKi9cbmNvbnN0IGdldEFsbERhdGFGb3JTYXZpbmcgPSAoZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSk6IGFueVtdW10gPT4ge1xuICBjb25zdCBhbGxEYXRhID0gZGF0YUNvbnRhaW5lci5mbGF0dGVuRGF0YSgpO1xuXG4gIGlmIChkYXRhQ29udGFpbmVyIGluc3RhbmNlb2YgQXJyb3dEYXRhQ29udGFpbmVyKSB7XG4gICAgY29uc3QgbnVtQ29sdW1ucyA9IGRhdGFDb250YWluZXIubnVtQ29sdW1ucygpO1xuXG4gICAgZm9yIChsZXQgY29sdW1uSW5kZXggPSAwOyBjb2x1bW5JbmRleCA8IG51bUNvbHVtbnM7ICsrY29sdW1uSW5kZXgpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGRhdGFDb250YWluZXIuZ2V0Q29sdW1uKGNvbHVtbkluZGV4KTtcbiAgICAgIGNvbnN0IHR5cGVJZCA9IGNvbHVtbi50eXBlPy50eXBlSWQ7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVJZCA9PT0gQXJyb3dUeXBlcy5UaW1lc3RhbXAgfHxcbiAgICAgICAgdHlwZUlkID09PSBBcnJvd1R5cGVzLkRhdGUgfHxcbiAgICAgICAgdHlwZUlkID09PSBBcnJvd1R5cGVzLlRpbWVcbiAgICAgICkge1xuICAgICAgICBhbGxEYXRhLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICByb3dbY29sdW1uSW5kZXhdID0gbmV3IERhdGUocm93W2NvbHVtbkluZGV4XSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFsbERhdGE7XG59O1xuXG5leHBvcnQgY2xhc3MgRGF0YXNldFNjaGVtYSBleHRlbmRzIFNjaGVtYSB7XG4gIGtleSA9ICdkYXRhc2V0JztcblxuICBzYXZlKGRhdGFzZXQ6IEtlcGxlclRhYmxlKTogU2F2ZWREYXRhc2V0VjFbJ2RhdGEnXSB7XG4gICAgY29uc3QgZGF0YXNldEZsYXR0ZW5lZCA9IGRhdGFzZXQuZGF0YUNvbnRhaW5lclxuICAgICAgPyB7XG4gICAgICAgICAgLi4uZGF0YXNldCxcbiAgICAgICAgICBhbGxEYXRhOiBnZXRBbGxEYXRhRm9yU2F2aW5nKGRhdGFzZXQuZGF0YUNvbnRhaW5lciksXG4gICAgICAgICAgLy8gd2UgdXNlIGZsYXR0ZW5EYXRhIHRvIHNhdmUgYXJyb3cgdGFibGVzLFxuICAgICAgICAgIC8vIGJ1dCBvbmNlIGZsYXR0ZW5lZCBpdCdzIG5vdCBhbiBhcnJvdyBmaWxlIGFueW1vcmUuXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIC4uLmRhdGFzZXQubWV0YWRhdGEsXG4gICAgICAgICAgICAuLi4oZGF0YXNldC5tZXRhZGF0YS5mb3JtYXQgPT09IERBVEFTRVRfRk9STUFUUy5hcnJvd1xuICAgICAgICAgICAgICA/IHtmb3JtYXQ6IERBVEFTRVRfRk9STUFUUy5yb3d9XG4gICAgICAgICAgICAgIDoge30pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA6IGRhdGFzZXQ7XG5cbiAgICByZXR1cm4gdGhpcy5zYXZlUHJvcGVydGllc09yQXBwbHlTY2hlbWEoZGF0YXNldEZsYXR0ZW5lZClbdGhpcy5rZXldO1xuICB9XG4gIGxvYWQoZGF0YXNldDogU2F2ZWREYXRhc2V0VjFbJ2RhdGEnXSk6IFByb3RvRGF0YXNldCB7XG4gICAgY29uc3Qge2ZpZWxkcywgYWxsRGF0YX0gPSBkYXRhc2V0O1xuICAgIGxldCB1cGRhdGVkRmllbGRzID0gZmllbGRzO1xuXG4gICAgLy8gcmVjYWxjdWxhdGUgZmllbGQgdHlwZVxuICAgIC8vIGJlY2F1c2Ugd2UgaGF2ZSB1cGRhdGVkIHR5cGUtYW5hbHl6ZXJcbiAgICAvLyB3ZSBuZWVkIHRvIGFkZCBmb3JtYXQgdG8gZWFjaCBmaWVsZFxuICAgIGNvbnN0IG5lZWRDYWxjdWxhdGVNZXRhID1cbiAgICAgIGZpZWxkc1swXSAmJlxuICAgICAgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGRzWzBdLCAnZm9ybWF0JykgfHxcbiAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHNbMF0sICdhbmFseXplclR5cGUnKSk7XG5cbiAgICBpZiAobmVlZENhbGN1bGF0ZU1ldGEpIHtcbiAgICAgIGNvbnN0IGZpZWxkT3JkZXIgPSBmaWVsZHMubWFwKGYgPT4gZi5uYW1lKTtcblxuICAgICAgY29uc3Qgc2FtcGxlRGF0YSA9IGdldFNhbXBsZUZvclR5cGVBbmFseXplKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZE9yZGVyLFxuICAgICAgICByb3dzOiBhbGxEYXRhXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1ldGEgPSBnZXRGaWVsZHNGcm9tRGF0YShzYW1wbGVEYXRhLCBmaWVsZE9yZGVyKTtcblxuICAgICAgdXBkYXRlZEZpZWxkcyA9IG1ldGEubWFwKChmLCBpKSA9PiAoe1xuICAgICAgICAuLi5waWNrKG1ldGFbaV0sIFsnbmFtZScsICd0eXBlJywgJ2Zvcm1hdCddKSxcbiAgICAgICAgYW5hbHl6ZXJUeXBlOiBtZXRhW2ldLmFuYWx5emVyVHlwZVxuICAgICAgfSkpO1xuXG4gICAgICB1cGRhdGVkRmllbGRzLmZvckVhY2goKGYsIGkpID0+IHtcbiAgICAgICAgaWYgKGZpZWxkc1tpXS50eXBlICE9PSBmLnR5cGUpIHtcbiAgICAgICAgICAvLyBpZiBuZXdseSBkZXRlY3RlZCBmaWVsZCB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHNhdmVkIHR5cGVcbiAgICAgICAgICAvLyB3ZSBsb2cgaXQgYnV0IHdvbid0IHVwZGF0ZSBpdCwgY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBicmVhayBwZW9wbGUncyBtYXBcbiAgICAgICAgICBnbG9iYWxDb25zb2xlLndhcm4oYGRldGVjdCAke2YubmFtZX0gdHlwZSBpcyBub3cgJHtmLnR5cGV9IGluc3RlYWQgb2YgJHtmaWVsZHNbaV0udHlwZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGZvcm1hdCBvZiBhbGwgZmllbGRzXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHtmaWVsZHM6IHVwZGF0ZWRGaWVsZHMsIHJvd3M6IGRhdGFzZXQuYWxsRGF0YX0sXG4gICAgICBpbmZvOiBwaWNrKGRhdGFzZXQsIFsnaWQnLCAnbGFiZWwnLCAnY29sb3InLCAndHlwZSddKSxcbiAgICAgIC4uLihkYXRhc2V0Lm1ldGFkYXRhID8ge21ldGFkYXRhOiBkYXRhc2V0Lm1ldGFkYXRhfSA6IHt9KSxcbiAgICAgIC4uLihkYXRhc2V0LmRpc2FibGVEYXRhT3BlcmF0aW9uID8ge2Rpc2FibGVEYXRhT3BlcmF0aW9uOiBkYXRhc2V0LmRpc2FibGVEYXRhT3BlcmF0aW9ufSA6IHt9KVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRhdGFzZXRTY2hlbWEgPSB7XG4gIFtWRVJTSU9OUy52MF06IG5ldyBEYXRhc2V0U2NoZW1hKHtcbiAgICBrZXk6ICdkYXRhc2V0JyxcbiAgICB2ZXJzaW9uOiBWRVJTSU9OUy52MCxcbiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzVjBcbiAgfSksXG4gIFtWRVJTSU9OUy52MV06IG5ldyBEYXRhc2V0U2NoZW1hKHtcbiAgICBrZXk6ICdkYXRhc2V0JyxcbiAgICB2ZXJzaW9uOiBWRVJTSU9OUy52MSxcbiAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzVjFcbiAgfSlcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRhdGFzZXRTY2hlbWE7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFHQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFQLE9BQUE7QUFBNEUsU0FBQVEsUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENB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
222
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfd2luZG93IiwiYXJyb3ciLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9jb25zdGFudHMiLCJfdmVyc2lvbnMiLCJfc2NoZW1hIiwiX2NvbW1vblV0aWxzIiwiX3V0aWxzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJmaWVsZFByb3BlcnRpZXNWMCIsImV4cG9ydHMiLCJuYW1lIiwidHlwZSIsImZpZWxkUHJvcGVydGllc1YxIiwiZm9ybWF0IiwiYW5hbHl6ZXJUeXBlIiwibWV0YWRhdGEiLCJGaWVsZFNjaGVtYSIsIl9TY2hlbWEiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsInNhdmUiLCJmaWVsZHMiLCJfdGhpcyIsIm1hcCIsImYiLCJzYXZlUHJvcGVydGllc09yQXBwbHlTY2hlbWEiLCJsb2FkIiwiU2NoZW1hIiwicHJvcGVydGllc1YwIiwiaWQiLCJsYWJlbCIsImNvbG9yIiwiYWxsRGF0YSIsInZlcnNpb24iLCJWRVJTSU9OUyIsInYwIiwicHJvcGVydGllcyIsInByb3BlcnRpZXNWMSIsInYxIiwiZGlzYWJsZURhdGFPcGVyYXRpb24iLCJnZXRBbGxEYXRhRm9yU2F2aW5nIiwiZGF0YUNvbnRhaW5lciIsImZsYXR0ZW5EYXRhIiwiQXJyb3dEYXRhQ29udGFpbmVyIiwibnVtQ29sdW1ucyIsIl9sb29wIiwiY29sdW1uSW5kZXgiLCJjb2x1bW4iLCJnZXRDb2x1bW4iLCJmaWVsZCIsImdldEZpZWxkIiwiRGF0YVR5cGUiLCJpc1RpbWVzdGFtcCIsImlzRGF0ZSIsImlzVGltZSIsInJvdyIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsIkFMTF9GSUVMRF9UWVBFUyIsImdlb2Fycm93IiwiZm9ybWF0dGVyIiwiRklFTERfRElTUExBWV9GT1JNQVQiLCJnZXRGaWVsZHNGb3JTYXZpbmciLCJnZW9qc29uIiwiRGF0YXNldFNjaGVtYSIsIl9TY2hlbWEyIiwiX3RoaXMyIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJjb25jYXQiLCJkYXRhc2V0IiwiZGF0YXNldEZsYXR0ZW5lZCIsIkRBVEFTRVRfRk9STUFUUyIsInVwZGF0ZWRGaWVsZHMiLCJuZWVkQ2FsY3VsYXRlTWV0YSIsImZpZWxkT3JkZXIiLCJzYW1wbGVEYXRhIiwiZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUiLCJyb3dzIiwibWV0YSIsImdldEZpZWxkc0Zyb21EYXRhIiwicGljayIsImdsb2JhbENvbnNvbGUiLCJ3YXJuIiwiZGF0YSIsImluZm8iLCJkYXRhc2V0U2NoZW1hIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi9zcmMvZGF0YXNldC1zY2hlbWEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHBpY2sgZnJvbSAnbG9kYXNoLnBpY2snO1xuaW1wb3J0IHtjb25zb2xlIGFzIGdsb2JhbENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcblxuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIERBVEFTRVRfRk9STUFUU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXQsIFJHQkNvbG9yLCBKc29uT2JqZWN0fSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7S2VwbGVyVGFibGV9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtWRVJTSU9OU30gZnJvbSAnLi92ZXJzaW9ucyc7XG5pbXBvcnQgU2NoZW1hIGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7Z2V0RmllbGRzRnJvbURhdGEsIGdldFNhbXBsZUZvclR5cGVBbmFseXplfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge0Fycm93RGF0YUNvbnRhaW5lciwgRGF0YUNvbnRhaW5lckludGVyZmFjZSwgRklFTERfRElTUExBWV9GT1JNQVR9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5leHBvcnQgdHlwZSBTYXZlZEZpZWxkID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZm9ybWF0Pzogc3RyaW5nO1xuICBhbmFseXplclR5cGU/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBQYXJzZWRGaWVsZCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGZvcm1hdDogc3RyaW5nO1xuICBhbmFseXplclR5cGU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNhdmVkRGF0YXNldFYxID0ge1xuICB2ZXJzaW9uOiAndjEnO1xuICBkYXRhOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNvbG9yOiBSR0JDb2xvcjtcbiAgICBhbGxEYXRhOiBhbnlbXVtdO1xuICAgIGZpZWxkczogU2F2ZWRGaWVsZFtdO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBKc29uT2JqZWN0O1xuICAgIGRpc2FibGVEYXRhT3BlcmF0aW9uPzogYm9vbGVhbjtcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFBhcnNlZERhdGFzZXQgPSB7XG4gIGRhdGE6IHtcbiAgICBmaWVsZHM6IFBhcnNlZEZpZWxkW107XG4gICAgcm93czogYW55W11bXTtcbiAgfTtcbiAgaW5mbzoge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIGNvbG9yPzogUkdCQ29sb3I7XG4gIH07XG59O1xuXG4vLyB2ZXJzaW9uIHYwXG5leHBvcnQgY29uc3QgZmllbGRQcm9wZXJ0aWVzVjAgPSB7XG4gIG5hbWU6IG51bGwsXG4gIHR5cGU6IG51bGxcbn07XG5cbmV4cG9ydCBjb25zdCBmaWVsZFByb3BlcnRpZXNWMSA9IHtcbiAgbmFtZTogbnVsbCxcbiAgdHlwZTogbnVsbCxcbiAgZm9ybWF0OiBudWxsLFxuICBhbmFseXplclR5cGU6IG51bGwsXG4gIG1ldGFkYXRhOiBudWxsXG59O1xuXG5leHBvcnQgY2xhc3MgRmllbGRTY2hlbWEgZXh0ZW5kcyBTY2hlbWEge1xuICBzYXZlKGZpZWxkcykge1xuICAgIHJldHVybiB7XG4gICAgICBbdGhpcy5rZXldOiBmaWVsZHMubWFwKGYgPT4gdGhpcy5zYXZlUHJvcGVydGllc09yQXBwbHlTY2hlbWEoZilbdGhpcy5rZXldKVxuICAgIH07XG4gIH1cbiAgbG9hZChmaWVsZHMpIHtcbiAgICByZXR1cm4ge1t0aGlzLmtleV06IGZpZWxkc307XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByb3BlcnRpZXNWMCA9IHtcbiAgaWQ6IG51bGwsXG4gIGxhYmVsOiBudWxsLFxuICBjb2xvcjogbnVsbCxcbiAgYWxsRGF0YTogbnVsbCxcbiAgZmllbGRzOiBuZXcgRmllbGRTY2hlbWEoe1xuICAgIGtleTogJ2ZpZWxkcycsXG4gICAgdmVyc2lvbjogVkVSU0lPTlMudjAsXG4gICAgcHJvcGVydGllczogZmllbGRQcm9wZXJ0aWVzVjBcbiAgfSlcbn07XG5cbmV4cG9ydCBjb25zdCBwcm9wZXJ0aWVzVjEgPSB7XG4gIC4uLnByb3BlcnRpZXNWMCxcbiAgZmllbGRzOiBuZXcgRmllbGRTY2hlbWEoe1xuICAgIGtleTogJ2ZpZWxkcycsXG4gICAgdmVyc2lvbjogVkVSU0lPTlMudjEsXG4gICAgcHJvcGVydGllczogZmllbGRQcm9wZXJ0aWVzVjFcbiAgfSksXG4gIHR5cGU6IG51bGwsXG4gIG1ldGFkYXRhOiBudWxsLFxuICBkaXNhYmxlRGF0YU9wZXJhdGlvbjogbnVsbFxufTtcblxuLyoqXG4gKiBUT0RPIENvbnNpZGVyIG1vdmluZyB0aGlzIGNhc3QgdG8gQXJyb3dEYXRhQ29udGFpbmVyP1xuICogUHJlcGFyZSBhIGRhdGEgY29udGFpbmVyIGZvciBleHBvcnQgYXMgcGFydCBvZiBqc29uIC8gaHRtbCBmaWxlcy5cbiAqIDEpIEFycm93IHRhYmxlcyBjYW4gc3RvcmUgVGltZXN0YW1wcyBhcyBCaWdJbnRzLCBzbyBjb252ZXJ0IG51bWJlcnMgdG8gSVNPU3RyaW5ncyBjb21wYXRpYmxlIHdpdGggS2VwbGVyLmdsJ3MgVElNRVNUQU1QLlxuICogMikgR2VvYXJyb3cgYmluYXJ5IGJ1ZmZlcnMgY29udmVydGVkIHRvIGhleCB3a2JcbiAqIEBwYXJhbSBkYXRhQ29udGFpbmVyIEEgZGF0YSBjb250YWluZXIgdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIFJvdyBiYXNlZCBkYXRhLlxuICovXG5jb25zdCBnZXRBbGxEYXRhRm9yU2F2aW5nID0gKGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2UpOiBhbnlbXVtdID0+IHtcbiAgY29uc3QgYWxsRGF0YSA9IGRhdGFDb250YWluZXIuZmxhdHRlbkRhdGEoKTtcblxuICBpZiAoZGF0YUNvbnRhaW5lciBpbnN0YW5jZW9mIEFycm93RGF0YUNvbnRhaW5lcikge1xuICAgIGNvbnN0IG51bUNvbHVtbnMgPSBkYXRhQ29udGFpbmVyLm51bUNvbHVtbnMoKTtcblxuICAgIGZvciAobGV0IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBudW1Db2x1bW5zOyArK2NvbHVtbkluZGV4KSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBkYXRhQ29udGFpbmVyLmdldENvbHVtbihjb2x1bW5JbmRleCk7XG4gICAgICBjb25zdCBmaWVsZCA9IGRhdGFDb250YWluZXIuZ2V0RmllbGQoY29sdW1uSW5kZXgpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGFycm93LkRhdGFUeXBlLmlzVGltZXN0YW1wKGNvbHVtbi50eXBlKSB8fFxuICAgICAgICBhcnJvdy5EYXRhVHlwZS5pc0RhdGUoY29sdW1uLnR5cGUpIHx8XG4gICAgICAgIGFycm93LkRhdGFUeXBlLmlzVGltZShjb2x1bW4udHlwZSlcbiAgICAgICkge1xuICAgICAgICBhbGxEYXRhLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICByb3dbY29sdW1uSW5kZXhdID0gbmV3IERhdGUocm93W2NvbHVtbkluZGV4XSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkPy50eXBlID09PSBBTExfRklFTERfVFlQRVMuZ2VvYXJyb3cpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gRklFTERfRElTUExBWV9GT1JNQVRbQUxMX0ZJRUxEX1RZUEVTLmdlb2Fycm93XTtcbiAgICAgICAgYWxsRGF0YS5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgcm93W2NvbHVtbkluZGV4XSA9IGZvcm1hdHRlcihyb3dbY29sdW1uSW5kZXhdLCBmaWVsZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbGxEYXRhO1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGZpZWxkcyBmb3Igc2F2aW5nIGFzIHBhcnQgb2YganNvbiAvIGh0bWwgZmlsZXMuXG4gKiBAcGFyYW0gZmllbGRzIFRoZSBhcnJheSBvZiBmaWVsZHMgZnJvbSBhIEtlcGxlciB0YWJsZS5cbiAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBmaWVsZHMgYXJyYXkgd2l0aCBHZW9BcnJvdyB0eXBlcyB1cGRhdGVkIHRvIEdlb0pTT04uXG4gKi9cbmNvbnN0IGdldEZpZWxkc0ZvclNhdmluZyA9IChmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSkgPT4ge1xuICByZXR1cm4gZmllbGRzLm1hcChmaWVsZCA9PiB7XG4gICAgaWYgKGZpZWxkLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy5nZW9hcnJvdykge1xuICAgICAgLy8gZ2VvYXJyb3cgYmluYXJ5IGRhdGEgaXMgdHJhbnNmb3JtZWQgdG8gaGV4IHdrYiBpbiBnZXRBbGxEYXRhRm9yU2F2aW5nLCBzbyB1cGRhdGUgdGhlIGZpZWxkIGFjY29yZGluZ2x5XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBmaWVsZC5uYW1lLFxuICAgICAgICB0eXBlOiBBTExfRklFTERfVFlQRVMuZ2VvanNvbixcbiAgICAgICAgZm9ybWF0OiAnJyxcbiAgICAgICAgYW5hbHl6ZXJUeXBlOiAnR0VPTUVUUlknXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZmllbGQ7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNsYXNzIERhdGFzZXRTY2hlbWEgZXh0ZW5kcyBTY2hlbWEge1xuICBrZXkgPSAnZGF0YXNldCc7XG5cbiAgc2F2ZShkYXRhc2V0OiBLZXBsZXJUYWJsZSk6IFNhdmVkRGF0YXNldFYxWydkYXRhJ10ge1xuICAgIGNvbnN0IGRhdGFzZXRGbGF0dGVuZWQgPSBkYXRhc2V0LmRhdGFDb250YWluZXJcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmRhdGFzZXQsXG4gICAgICAgICAgYWxsRGF0YTogZ2V0QWxsRGF0YUZvclNhdmluZyhkYXRhc2V0LmRhdGFDb250YWluZXIpLFxuICAgICAgICAgIGZpZWxkczogZ2V0RmllbGRzRm9yU2F2aW5nKGRhdGFzZXQuZmllbGRzKSxcbiAgICAgICAgICAvLyB3ZSB1c2UgZmxhdHRlbkRhdGEgdG8gc2F2ZSBhcnJvdyB0YWJsZXMsXG4gICAgICAgICAgLy8gYnV0IG9uY2UgZmxhdHRlbmVkIGl0J3Mgbm90IGFuIGFycm93IGZpbGUgYW55bW9yZS5cbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgLi4uZGF0YXNldC5tZXRhZGF0YSxcbiAgICAgICAgICAgIC4uLihkYXRhc2V0Lm1ldGFkYXRhLmZvcm1hdCA9PT0gREFUQVNFVF9GT1JNQVRTLmFycm93XG4gICAgICAgICAgICAgID8ge2Zvcm1hdDogREFUQVNFVF9GT1JNQVRTLnJvd31cbiAgICAgICAgICAgICAgOiB7fSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDogZGF0YXNldDtcblxuICAgIHJldHVybiB0aGlzLnNhdmVQcm9wZXJ0aWVzT3JBcHBseVNjaGVtYShkYXRhc2V0RmxhdHRlbmVkKVt0aGlzLmtleV07XG4gIH1cbiAgbG9hZChkYXRhc2V0OiBTYXZlZERhdGFzZXRWMVsnZGF0YSddKTogUHJvdG9EYXRhc2V0IHtcbiAgICBjb25zdCB7ZmllbGRzLCBhbGxEYXRhfSA9IGRhdGFzZXQ7XG4gICAgbGV0IHVwZGF0ZWRGaWVsZHMgPSBmaWVsZHM7XG5cbiAgICAvLyByZWNhbGN1bGF0ZSBmaWVsZCB0eXBlXG4gICAgLy8gYmVjYXVzZSB3ZSBoYXZlIHVwZGF0ZWQgdHlwZS1hbmFseXplclxuICAgIC8vIHdlIG5lZWQgdG8gYWRkIGZvcm1hdCB0byBlYWNoIGZpZWxkXG4gICAgY29uc3QgbmVlZENhbGN1bGF0ZU1ldGEgPVxuICAgICAgZmllbGRzWzBdICYmXG4gICAgICAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHNbMF0sICdmb3JtYXQnKSB8fFxuICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpZWxkc1swXSwgJ2FuYWx5emVyVHlwZScpKTtcblxuICAgIGlmIChuZWVkQ2FsY3VsYXRlTWV0YSkge1xuICAgICAgY29uc3QgZmllbGRPcmRlciA9IGZpZWxkcy5tYXAoZiA9PiBmLm5hbWUpO1xuXG4gICAgICBjb25zdCBzYW1wbGVEYXRhID0gZ2V0U2FtcGxlRm9yVHlwZUFuYWx5emUoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkT3JkZXIsXG4gICAgICAgIHJvd3M6IGFsbERhdGFcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbWV0YSA9IGdldEZpZWxkc0Zyb21EYXRhKHNhbXBsZURhdGEsIGZpZWxkT3JkZXIpO1xuXG4gICAgICB1cGRhdGVkRmllbGRzID0gbWV0YS5tYXAoKGYsIGkpID0+ICh7XG4gICAgICAgIC4uLnBpY2sobWV0YVtpXSwgWyduYW1lJywgJ3R5cGUnLCAnZm9ybWF0J10pLFxuICAgICAgICBhbmFseXplclR5cGU6IG1ldGFbaV0uYW5hbHl6ZXJUeXBlXG4gICAgICB9KSk7XG5cbiAgICAgIHVwZGF0ZWRGaWVsZHMuZm9yRWFjaCgoZiwgaSkgPT4ge1xuICAgICAgICBpZiAoZmllbGRzW2ldLnR5cGUgIT09IGYudHlwZSkge1xuICAgICAgICAgIC8vIGlmIG5ld2x5IGRldGVjdGVkIGZpZWxkIHR5cGUgaXMgZGlmZmVyZW50IGZyb20gc2F2ZWQgdHlwZVxuICAgICAgICAgIC8vIHdlIGxvZyBpdCBidXQgd29uJ3QgdXBkYXRlIGl0LCBjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGJyZWFrIHBlb3BsZSdzIG1hcFxuICAgICAgICAgIGdsb2JhbENvbnNvbGUud2FybihgZGV0ZWN0ICR7Zi5uYW1lfSB0eXBlIGlzIG5vdyAke2YudHlwZX0gaW5zdGVhZCBvZiAke2ZpZWxkc1tpXS50eXBlfWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBnZXQgZm9ybWF0IG9mIGFsbCBmaWVsZHNcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YToge2ZpZWxkczogdXBkYXRlZEZpZWxkcywgcm93czogZGF0YXNldC5hbGxEYXRhfSxcbiAgICAgIGluZm86IHBpY2soZGF0YXNldCwgWydpZCcsICdsYWJlbCcsICdjb2xvcicsICd0eXBlJ10pLFxuICAgICAgLi4uKGRhdGFzZXQubWV0YWRhdGEgPyB7bWV0YWRhdGE6IGRhdGFzZXQubWV0YWRhdGF9IDoge30pLFxuICAgICAgLi4uKGRhdGFzZXQuZGlzYWJsZURhdGFPcGVyYXRpb24gPyB7ZGlzYWJsZURhdGFPcGVyYXRpb246IGRhdGFzZXQuZGlzYWJsZURhdGFPcGVyYXRpb259IDoge30pXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGF0YXNldFNjaGVtYSA9IHtcbiAgW1ZFUlNJT05TLnYwXTogbmV3IERhdGFzZXRTY2hlbWEoe1xuICAgIGtleTogJ2RhdGFzZXQnLFxuICAgIHZlcnNpb246IFZFUlNJT05TLnYwLFxuICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXNWMFxuICB9KSxcbiAgW1ZFUlNJT05TLnYxXTogbmV3IERhdGFzZXRTY2hlbWEoe1xuICAgIGtleTogJ2RhdGFzZXQnLFxuICAgIHZlcnNpb246IFZFUlNJT05TLnYxLFxuICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXNWMVxuICB9KVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZGF0YXNldFNjaGVtYTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFDLHVCQUFBLENBQUFILE9BQUE7QUFFQSxJQUFBSSxVQUFBLEdBQUFKLE9BQUE7QUFHQSxJQUFBSyxTQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxP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O1VBQzlCLElBQUkyQyxNQUFNLENBQUMzQyxDQUFDLENBQUMsQ0FBQzhCLElBQUksS0FBS2dCLENBQUMsQ0FBQ2hCLElBQUksRUFBRTtZQUM3QjtZQUNBO1lBQ0E0RSxlQUFhLENBQUNDLElBQUksV0FBQWQsTUFBQSxDQUFXL0MsQ0FBQyxDQUFDakIsSUFBSSxtQkFBQWdFLE1BQUEsQ0FBZ0IvQyxDQUFDLENBQUNoQixJQUFJLGtCQUFBK0QsTUFBQSxDQUFlbEQsTUFBTSxDQUFDM0MsQ0FBQyxDQUFDLENBQUM4QixJQUFJLENBQUUsQ0FBQztVQUMzRjtRQUNGLENBQUMsQ0FBQztNQUNKOztNQUVBO01BQ0EsT0FBQXBCLGFBQUEsQ0FBQUEsYUFBQTtRQUNFa0csSUFBSSxFQUFFO1VBQUNqRSxNQUFNLEVBQUVzRCxhQUFhO1VBQUVLLElBQUksRUFBRVIsT0FBTyxDQUFDeEM7UUFBTyxDQUFDO1FBQ3BEdUQsSUFBSSxFQUFFLElBQUFKLGtCQUFJLEVBQUNYLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztNQUFDLEdBQ2pEQSxPQUFPLENBQUM1RCxRQUFRLEdBQUc7UUFBQ0EsUUFBUSxFQUFFNEQsT0FBTyxDQUFDNUQ7TUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3BENEQsT0FBTyxDQUFDakMsb0JBQW9CLEdBQUc7UUFBQ0Esb0JBQW9CLEVBQUVpQyxPQUFPLENBQUNqQztNQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWhHO0VBQUM7QUFBQSxFQWhFZ0NaLGtCQUFNO0FBbUVsQyxJQUFNNkQsYUFBYSxHQUFBbEYsT0FBQSxDQUFBa0YsYUFBQSxPQUFBaEcsZ0JBQUEsaUJBQUFBLGdCQUFBLGlCQUN2QjBDLGtCQUFRLENBQUNDLEVBQUUsRUFBRyxJQUFJNkIsYUFBYSxDQUFDO0VBQy9COUMsR0FBRyxFQUFFLFNBQVM7RUFDZGUsT0FBTyxFQUFFQyxrQkFBUSxDQUFDQyxFQUFFO0VBQ3BCQyxVQUFVLEVBQUVSO0FBQ2QsQ0FBQyxDQUFDLEdBQ0RNLGtCQUFRLENBQUNJLEVBQUUsRUFBRyxJQUFJMEIsYUFBYSxDQUFDO0VBQy9COUMsR0FBRyxFQUFFLFNBQVM7RUFDZGUsT0FBTyxFQUFFQyxrQkFBUSxDQUFDSSxFQUFFO0VBQ3BCRixVQUFVLEVBQUVDO0FBQ2QsQ0FBQyxDQUFDLENBQ0g7QUFBQyxJQUFBb0QsUUFBQSxHQUFBbkYsT0FBQSxjQUVha0YsYUFBYSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kepler.gl/schemas",
3
3
  "author": "Shan He <shan@uber.com>",
4
- "version": "3.1.0",
4
+ "version": "3.1.1",
5
5
  "description": "kepler.gl schemas used by kepler.gl components, actions and reducers",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
@@ -30,12 +30,12 @@
30
30
  "umd"
31
31
  ],
32
32
  "dependencies": {
33
- "@kepler.gl/common-utils": "3.1.0",
34
- "@kepler.gl/constants": "3.1.0",
35
- "@kepler.gl/layers": "3.1.0",
36
- "@kepler.gl/table": "3.1.0",
37
- "@kepler.gl/types": "3.1.0",
38
- "@kepler.gl/utils": "3.1.0",
33
+ "@kepler.gl/common-utils": "3.1.1",
34
+ "@kepler.gl/constants": "3.1.1",
35
+ "@kepler.gl/layers": "3.1.1",
36
+ "@kepler.gl/table": "3.1.1",
37
+ "@kepler.gl/types": "3.1.1",
38
+ "@kepler.gl/utils": "3.1.1",
39
39
  "@loaders.gl/loader-utils": "^4.3.2",
40
40
  "@types/keymirror": "^0.1.1",
41
41
  "@types/lodash.clonedeep": "^4.5.7",
@@ -3,15 +3,15 @@
3
3
 
4
4
  import pick from 'lodash.pick';
5
5
  import {console as globalConsole} from 'global/window';
6
- import {Type as ArrowTypes} from 'apache-arrow';
6
+ import * as arrow from 'apache-arrow';
7
7
 
8
- import {DATASET_FORMATS} from '@kepler.gl/constants';
8
+ import {ALL_FIELD_TYPES, DATASET_FORMATS} from '@kepler.gl/constants';
9
9
  import {ProtoDataset, RGBColor, JsonObject} from '@kepler.gl/types';
10
10
  import {KeplerTable} from '@kepler.gl/table';
11
11
  import {VERSIONS} from './versions';
12
12
  import Schema from './schema';
13
13
  import {getFieldsFromData, getSampleForTypeAnalyze} from '@kepler.gl/common-utils';
14
- import {ArrowDataContainer, DataContainerInterface} from '@kepler.gl/utils';
14
+ import {ArrowDataContainer, DataContainerInterface, FIELD_DISPLAY_FORMAT} from '@kepler.gl/utils';
15
15
 
16
16
  export type SavedField = {
17
17
  name: string;
@@ -104,8 +104,9 @@ export const propertiesV1 = {
104
104
 
105
105
  /**
106
106
  * TODO Consider moving this cast to ArrowDataContainer?
107
- * Prepare a data container for export as part of json / html.
107
+ * Prepare a data container for export as part of json / html files.
108
108
  * 1) Arrow tables can store Timestamps as BigInts, so convert numbers to ISOStrings compatible with Kepler.gl's TIMESTAMP.
109
+ * 2) Geoarrow binary buffers converted to hex wkb
109
110
  * @param dataContainer A data container to flatten.
110
111
  * @returns Row based data.
111
112
  */
@@ -117,15 +118,21 @@ const getAllDataForSaving = (dataContainer: DataContainerInterface): any[][] =>
117
118
 
118
119
  for (let columnIndex = 0; columnIndex < numColumns; ++columnIndex) {
119
120
  const column = dataContainer.getColumn(columnIndex);
120
- const typeId = column.type?.typeId;
121
+ const field = dataContainer.getField(columnIndex);
122
+
121
123
  if (
122
- typeId === ArrowTypes.Timestamp ||
123
- typeId === ArrowTypes.Date ||
124
- typeId === ArrowTypes.Time
124
+ arrow.DataType.isTimestamp(column.type) ||
125
+ arrow.DataType.isDate(column.type) ||
126
+ arrow.DataType.isTime(column.type)
125
127
  ) {
126
128
  allData.forEach(row => {
127
129
  row[columnIndex] = new Date(row[columnIndex]).toISOString();
128
130
  });
131
+ } else if (field?.type === ALL_FIELD_TYPES.geoarrow) {
132
+ const formatter = FIELD_DISPLAY_FORMAT[ALL_FIELD_TYPES.geoarrow];
133
+ allData.forEach(row => {
134
+ row[columnIndex] = formatter(row[columnIndex], field);
135
+ });
129
136
  }
130
137
  }
131
138
  }
@@ -133,6 +140,26 @@ const getAllDataForSaving = (dataContainer: DataContainerInterface): any[][] =>
133
140
  return allData;
134
141
  };
135
142
 
143
+ /**
144
+ * Transforms fields for saving as part of json / html files.
145
+ * @param fields The array of fields from a Kepler table.
146
+ * @returns The transformed fields array with GeoArrow types updated to GeoJSON.
147
+ */
148
+ const getFieldsForSaving = (fields: KeplerTable['fields']) => {
149
+ return fields.map(field => {
150
+ if (field.type === ALL_FIELD_TYPES.geoarrow) {
151
+ // geoarrow binary data is transformed to hex wkb in getAllDataForSaving, so update the field accordingly
152
+ return {
153
+ name: field.name,
154
+ type: ALL_FIELD_TYPES.geojson,
155
+ format: '',
156
+ analyzerType: 'GEOMETRY'
157
+ };
158
+ }
159
+ return field;
160
+ });
161
+ };
162
+
136
163
  export class DatasetSchema extends Schema {
137
164
  key = 'dataset';
138
165
 
@@ -141,6 +168,7 @@ export class DatasetSchema extends Schema {
141
168
  ? {
142
169
  ...dataset,
143
170
  allData: getAllDataForSaving(dataset.dataContainer),
171
+ fields: getFieldsForSaving(dataset.fields),
144
172
  // we use flattenData to save arrow tables,
145
173
  // but once flattened it's not an arrow file anymore.
146
174
  metadata: {