@redus/georedus-ui 0.7.0 → 0.8.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @orioro/template-react
2
2
 
3
+ ## 0.8.1
4
+
5
+ ### Patch Changes
6
+
7
+ - fix municipio maxzoom
8
+
9
+ ## 0.8.0
10
+
11
+ ### Minor Changes
12
+
13
+ - integrate vtx protocol into censo data
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies
18
+ - @orioro/vector-tile-util@0.2.0
19
+
3
20
  ## 0.7.0
4
21
 
5
22
  ### Minor Changes
@@ -1,4 +1,4 @@
1
- export function importViewSpecsFromCsv(dialogs: any): Promise<typeof CANCELLED | Record<string, any>[]>;
1
+ export function importViewSpecsFromCsv(dialogs: any): Promise<Record<string, any>[] | typeof CANCELLED>;
2
2
  export namespace COLLECTION_SCHEMAS {
3
3
  export { ibge_malha_br_setor_censitario_2010 };
4
4
  export { ibge_malha_br_setor_censitario_2022 };
package/dist/index.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export * from './GeoReDUS';
2
+ export * from './vtxProtocol';
package/dist/main.js CHANGED
@@ -29,6 +29,8 @@ import { saveAs } from 'file-saver';
29
29
  import initGdalJs from 'gdal3.js';
30
30
  import queryString from 'query-string';
31
31
  import { wrap } from 'comlink';
32
+ import { dataMergeProtocol } from '@orioro/vector-tile-util';
33
+ import maplibregl from 'maplibre-gl';
32
34
  import { get as get$1 } from '@orioro/get';
33
35
  import { validate } from '@orioro/validate';
34
36
  import { buffer } from '@turf/turf';
@@ -1304,6 +1306,7 @@ function LeftPanel(_ref) {
1304
1306
  , {
1305
1307
  style: {
1306
1308
  position: 'absolute',
1309
+ zIndex: 1000,
1307
1310
  top: {
1308
1311
  xs: "".concat(1.2 * HEADER_HEIGHT, "px"),
1309
1312
  md: "".concat(HEADER_HEIGHT * (2 / 3), "px")
@@ -4261,6 +4264,21 @@ var worker = typeof Worker !== 'undefined' && new Worker(new URL('./GeoReDUSWork
4261
4264
  });
4262
4265
  var GeoReDUSWorker = worker ? wrap(worker) : null;
4263
4266
 
4267
+ var vtx = dataMergeProtocol();
4268
+ var memoFetchData = vtx.memoFetchData;
4269
+ var VTX_PROTOCOL = 'vtx';
4270
+ function vtxUrl(_a) {
4271
+ var tiles = _a.tiles,
4272
+ data = _a.data;
4273
+ return "".concat(VTX_PROTOCOL, "://").concat(JSON.stringify({
4274
+ t: tiles,
4275
+ d: data
4276
+ }));
4277
+ }
4278
+ function vtxSetup() {
4279
+ maplibregl.addProtocol('vtx', vtx.protocolHandler);
4280
+ }
4281
+
4264
4282
  // export const $workerGet: ExpressionSpec<[any, any?]> = {
4265
4283
  // parseArgs: ([arg1, arg2], { parseNodeInput }) =>
4266
4284
  // typeof arg2 === 'undefined'
@@ -4280,7 +4298,10 @@ var $naturalBreaks = function $naturalBreaks(_a) {
4280
4298
  }, isPlainObject(opt) ? pick(opt, ['scalesByK', 'k', 'minK', 'maxK', 'defaultColor']) : {}));
4281
4299
  return breaks;
4282
4300
  };
4283
- // export const $test = ()
4301
+ var $vtxUrl = function $vtxUrl(_a) {
4302
+ var options = _a[0];
4303
+ return vtxUrl(options);
4304
+ };
4284
4305
  var $urlSearch = function $urlSearch(_a) {
4285
4306
  var searchParams = _a[0];
4286
4307
  return Array.isArray(searchParams) ? queryString.stringify(searchParams[0], searchParams[1]) : queryString.stringify(
@@ -4303,7 +4324,8 @@ var $urlSearch = function $urlSearch(_a) {
4303
4324
  var CUSTOM_EXPR = /*#__PURE__*/Object.freeze({
4304
4325
  __proto__: null,
4305
4326
  $naturalBreaks: $naturalBreaks,
4306
- $urlSearch: $urlSearch
4327
+ $urlSearch: $urlSearch,
4328
+ $vtxUrl: $vtxUrl
4307
4329
  });
4308
4330
 
4309
4331
  var _a;
@@ -4326,7 +4348,18 @@ var _b = makeResolve({
4326
4348
  // @ts-ignore
4327
4349
  exps: __assign(__assign(__assign({}, ALL_EXPR), CUSTOM_EXPR), {
4328
4350
  $fetch: fetchExpr({
4329
- isFetchAllowed: isFetchAllowed
4351
+ isFetchAllowed: isFetchAllowed,
4352
+ //
4353
+ // memoFetchData already parses
4354
+ // response to json
4355
+ //
4356
+ // TODO: review integration techniques
4357
+ // for better API
4358
+ //
4359
+ fetchFn: vtx.memoFetchData,
4360
+ handleResponse: function handleResponse(data) {
4361
+ return data;
4362
+ }
4330
4363
  })
4331
4364
  })
4332
4365
  }).resolver),
@@ -4707,7 +4740,7 @@ function globalResources(context) {
4707
4740
  global_municipio: tableVectorSource(context, MUNICIPIO_MALHA_TABLE_ID, {
4708
4741
  absoluteId: MUNICIPIO_MALHA_TABLE_ID,
4709
4742
  minzoom: 4,
4710
- maxzoom: 20
4743
+ maxzoom: 12
4711
4744
  })
4712
4745
  },
4713
4746
  layers: _objectSpread2({
@@ -5345,6 +5378,15 @@ function cem_censo_2010_2022(viewSpec, allViewSpecs, context) {
5345
5378
  //
5346
5379
  var _vectorSourceFillColor = ['$flat', [['step', ['coalesce', ['get', ['$get', 'view.conf.data.variableId']], -1]], ['$get', 'view.metadata.colorScaleStops']]];
5347
5380
  var sourceLabel = "CENSO ".concat(year);
5381
+ var _resolveDataUrl = resolve.fn(function (context) {
5382
+ var _variableId = get$1(context, 'view.conf.data.variableId');
5383
+ var _variant = variantsByVariableId[_variableId];
5384
+ var url = "".concat(METADATA_API_ENDPOINT, "/").concat(_variant.source_table_id, "?").concat($urlSearch([{
5385
+ select: ['cd_setor', _variableId].join(','),
5386
+ cd_mun: "eq.".concat(context.app.municipioId)
5387
+ }]));
5388
+ return url;
5389
+ });
5348
5390
  return {
5349
5391
  // debug: true,
5350
5392
  id: viewId,
@@ -5438,18 +5480,9 @@ function cem_censo_2010_2022(viewSpec, allViewSpecs, context) {
5438
5480
  }
5439
5481
  },
5440
5482
  metadata: {
5441
- _dependencies: function _dependencies(_ref2) {
5442
- _ref2.viewConfState;
5443
- // console.log('run dependencies', omit(viewConfState.byId, [viewId]))
5444
-
5445
- // return omit(viewConfState.byId, [viewId])
5446
- return 'STABLE';
5447
-
5448
- // return omit(viewConfState.byId, [viewId])
5449
- },
5450
5483
  _value: ['$let', {
5451
5484
  customGeoJSON: ['$if', ['$empty', ['$get', 'view.conf.data.customSpatialAggregationUnit']], null, resolveAsync.fn(/*#__PURE__*/function () {
5452
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(context) {
5485
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(context) {
5453
5486
  var contents, BASE, POINTS, LINE_STRINGS, AREAS_FEATURES, AREAS_BASE, AREAS;
5454
5487
  return _regeneratorRuntime().wrap(function _callee$(_context) {
5455
5488
  while (1) switch (_context.prev = _context.next) {
@@ -5534,15 +5567,11 @@ function cem_censo_2010_2022(viewSpec, allViewSpecs, context) {
5534
5567
  }, _callee, null, [[0, 25]]);
5535
5568
  }));
5536
5569
  return function (_x) {
5537
- return _ref3.apply(this, arguments);
5570
+ return _ref2.apply(this, arguments);
5538
5571
  };
5539
5572
  }())]
5540
5573
  }, ['$let', {
5541
- variableValues: ['$if', ['$empty', ['$get', 'customGeoJSON.AREAS']], ['$get', ['$template', '[].${0}', ['$get', 'view.conf.data.variableId']], ['$fetch', ['$template', "".concat(METADATA_API_ENDPOINT) + '/${source_table_id}?select=' + '${variableId}' + '&cd_mun=eq.' + '${municipioId}', {
5542
- variableId: ['$get', 'view.conf.data.variableId'],
5543
- municipioId: ['$context', 'municipioId'],
5544
- source_table_id: ['$get', ['$template', '${0}.source_table_id', ['$get', 'view.conf.data.variableId']], variantsByVariableId]
5545
- }]]], ['$fetch', {
5574
+ variableValues: ['$if', ['$empty', ['$get', 'customGeoJSON.AREAS']], ['$get', ['$template', '[].${0}', ['$get', 'view.conf.data.variableId']], ['$fetch', _resolveDataUrl]], ['$fetch', {
5546
5575
  href: METADATA_API_ENDPOINT,
5547
5576
  pathname: 'rpc/aggregate_by_geojson'
5548
5577
  }, {
@@ -5562,20 +5591,6 @@ function cem_censo_2010_2022(viewSpec, allViewSpecs, context) {
5562
5591
  measureUnits: measureUnits,
5563
5592
  variableValues: ['$get', 'variableValues'],
5564
5593
  customGeoJSON: ['$get', 'customGeoJSON'],
5565
- customGeoJSON2: resolveAsync.fn(/*#__PURE__*/function () {
5566
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(context) {
5567
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5568
- while (1) switch (_context2.prev = _context2.next) {
5569
- case 0:
5570
- case "end":
5571
- return _context2.stop();
5572
- }
5573
- }, _callee2);
5574
- }));
5575
- return function (_x2) {
5576
- return _ref4.apply(this, arguments);
5577
- };
5578
- }()),
5579
5594
  colorScaleStops: ['$naturalBreaks', ['$get', 'variableValues'], _objectSpread2(_objectSpread2({}, _color_scheme), {}, {
5580
5595
  minK: 5
5581
5596
  })]
@@ -5612,7 +5627,6 @@ function cem_censo_2010_2022(viewSpec, allViewSpecs, context) {
5612
5627
  // The area of customGeoJson
5613
5628
  //
5614
5629
  customGeoJSON_Areas: ['$if', [['$empty', ['$get', 'view.metadata.customGeoJSON.AREAS']]], null, resolve.fn(function (context) {
5615
- // ['$get', 'view.metadata.customGeoJSON'],
5616
5630
  var _context$view$metadat = context.view.metadata,
5617
5631
  customGeoJSON = _context$view$metadat.customGeoJSON,
5618
5632
  variableValues = _context$view$metadat.variableValues;
@@ -5639,44 +5653,43 @@ function cem_censo_2010_2022(viewSpec, allViewSpecs, context) {
5639
5653
  type: 'vector',
5640
5654
  attribution: sourceLabel,
5641
5655
  minzoom: 8,
5642
- maxzoom: 20,
5656
+ //
5657
+ // Prevent system from fetching data beyond necessary detail
5658
+ //
5659
+ maxzoom: BUILDINGS_MIN_ZOOM,
5643
5660
  promoteId: 'cd_setor',
5644
- tiles: [['$join', ["".concat(VECTOR_TILE_SERVER_ENDPOINT, "/dvt/{z}/{x}/{y}?"), ['$urlSearch', {
5645
- view: ['$get', ['$template', '${0}.collection_id', ['$get', 'view.conf.data.variableId']], variantsByVariableId],
5646
- select: ['cd_setor'],
5647
- join_view: ['$get', ['$template', '${0}.source_table_id', ['$get', 'view.conf.data.variableId']], variantsByVariableId],
5648
- join_source_column: 'cd_setor',
5649
- join_target_column: 'cd_setor',
5650
- join_select: [['$get', 'view.conf.data.variableId']],
5651
- where: {
5652
- cd_mun: [['$get', 'municipioId']]
5653
- }
5654
- }]]]]
5661
+ tiles: [resolve.fn(function (context) {
5662
+ var _variableId = get$1(context, 'view.conf.data.variableId');
5663
+ var _variant = variantsByVariableId[_variableId];
5664
+ return ['$vtxUrl', {
5665
+ tiles: "".concat(VECTOR_TILE_SERVER_ENDPOINT, "/dvt/{z}/{x}/{y}?").concat($urlSearch([{
5666
+ view: _variant.collection_id,
5667
+ select: ['cd_setor'],
5668
+ where: {
5669
+ cd_mun: [context.app.municipioId]
5670
+ }
5671
+ }])),
5672
+ data: [['cd_setor', _resolveDataUrl]]
5673
+ }];
5674
+ })]
5655
5675
  }), "".concat(VECTOR_SOURCE_ID, "_buildings"), {
5656
5676
  type: 'vector',
5657
5677
  attribution: sourceLabel,
5658
- minzoom: 6,
5659
- maxzoom: 20,
5660
- tiles: [['$join', ["".concat(VECTOR_TILE_SERVER_ENDPOINT, "/dvt/{z}/{x}/{y}?"), ['$urlSearch', {
5661
- view: 'overture_br_buildings',
5662
- // view: [
5663
- // '$get',
5664
- // [
5665
- // '$template',
5666
- // '${0}.collection_id',
5667
- // ['$get', 'view.conf.data.variableId'],
5668
- // ],
5669
- // variantsByVariableId,
5670
- // ],
5671
- select: ['height', 'subtype'],
5672
- join_view: ['$get', ['$template', '${0}.source_table_id', ['$get', 'view.conf.data.variableId']], variantsByVariableId],
5673
- join_source_column: "setor_".concat(year, "_id"),
5674
- join_target_column: 'cd_setor',
5675
- join_select: [['$get', 'view.conf.data.variableId']],
5676
- where: {
5677
- municipio_id: [['$get', 'municipioId']]
5678
- }
5679
- }]]]]
5678
+ minzoom: BUILDINGS_MIN_ZOOM,
5679
+ maxzoom: BUILDINGS_MIN_ZOOM,
5680
+ // Zoom levels make no real difference, buildings
5681
+ // are pretty square
5682
+ // maxzoom: 20,
5683
+ tiles: [resolve.fn(function (context) {
5684
+ return ['$vtxUrl', {
5685
+ tiles: "".concat(VECTOR_TILE_SERVER_ENDPOINT, "/dvt/{z}/{x}/{y}?").concat($urlSearch([{
5686
+ view: 'overture_br_buildings',
5687
+ select: ["setor_".concat(year, "_id")],
5688
+ where: _defineProperty({}, "municipio_id", [context.app.municipioId])
5689
+ }])),
5690
+ data: [["setor_".concat(year, "_id:cd_setor"), _resolveDataUrl]]
5691
+ }];
5692
+ })]
5680
5693
  })),
5681
5694
  layers: _objectSpread2(_objectSpread2({}, globalRes.layers), {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({
5682
5695
  customGeoJSON_Areas_fill: {
@@ -5847,38 +5860,38 @@ function cem_censo_2010_2022(viewSpec, allViewSpecs, context) {
5847
5860
  // availableVariableIds: [variable_id, 'str_nome_fantasia', 'id_cnes'],
5848
5861
  fetchData: resolve.fn(function (context) {
5849
5862
  return /*#__PURE__*/function () {
5850
- var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref5) {
5863
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref3) {
5851
5864
  var data, geometries;
5852
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
5853
- while (1) switch (_context3.prev = _context3.next) {
5865
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
5866
+ while (1) switch (_context2.prev = _context2.next) {
5854
5867
  case 0:
5855
- _ref5.variableIds, _ref5.options;
5856
- _context3.next = 3;
5868
+ _ref3.variableIds, _ref3.options;
5869
+ _context2.next = 3;
5857
5870
  return resolveExprAsync(['$fetch', ['$template', "".concat(METADATA_API_ENDPOINT) + '/${source_table_id}?select=' + '${variableId},' + 'cd_setor' + '&cd_mun=eq.' + '${municipioId}', {
5858
5871
  variableId: ['$get', 'view.conf.data.variableId'],
5859
5872
  municipioId: ['$context', 'municipioId'],
5860
5873
  source_table_id: ['$get', ['$template', '${0}.source_table_id', ['$get', 'view.conf.data.variableId']], variantsByVariableId]
5861
5874
  }]], context);
5862
5875
  case 3:
5863
- data = _context3.sent;
5864
- _context3.next = 6;
5876
+ data = _context2.sent;
5877
+ _context2.next = 6;
5865
5878
  return resolveExprAsync(['$fetch', ['$template', "".concat(METADATA_API_ENDPOINT) + '/${collection_id}?select=geom,cd_setor' + '&cd_mun=eq.' + '${municipioId}', {
5866
5879
  municipioId: ['$context', 'municipioId'],
5867
5880
  collection_id: ['$get', ['$template', '${0}.collection_id', ['$get', 'view.conf.data.variableId']], variantsByVariableId]
5868
5881
  }]], context);
5869
5882
  case 6:
5870
- geometries = _context3.sent;
5871
- return _context3.abrupt("return", dataJoin([geometries, data], {
5883
+ geometries = _context2.sent;
5884
+ return _context2.abrupt("return", dataJoin([geometries, data], {
5872
5885
  key: 'cd_setor'
5873
5886
  }));
5874
5887
  case 8:
5875
5888
  case "end":
5876
- return _context3.stop();
5889
+ return _context2.stop();
5877
5890
  }
5878
- }, _callee3);
5891
+ }, _callee2);
5879
5892
  }));
5880
- return function (_x3) {
5881
- return _ref6.apply(this, arguments);
5893
+ return function (_x2) {
5894
+ return _ref4.apply(this, arguments);
5882
5895
  };
5883
5896
  }();
5884
5897
  })
@@ -7104,6 +7117,11 @@ function useMapStyle(input, modifier) {
7104
7117
 
7105
7118
  var _excluded = ["layerId", "__filterFeaturesForStep"];
7106
7119
  var _templateObject, _templateObject2, _templateObject3;
7120
+
7121
+ //
7122
+ // Sets up vtx:// protocol
7123
+ //
7124
+ vtxSetup();
7107
7125
  var LegendContainer = styled(Flex)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n box-shadow:\n rgba(0, 0, 0, 0.1) 0px 4px 6px -1px,\n rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;\n background-color: white;\n border-radius: 4px;\n"])));
7108
7126
  var SyncedMaps = makeSyncedMaps({
7109
7127
  components: {
@@ -7843,4 +7861,4 @@ function GeoReDUS(props) {
7843
7861
  }, /*#__PURE__*/React.createElement(DialogsProvider, null, /*#__PURE__*/React.createElement(GeoReDUSInner, props))));
7844
7862
  }
7845
7863
 
7846
- export { GeoReDUS };
7864
+ export { GeoReDUS, VTX_PROTOCOL, memoFetchData, vtx, vtxSetup, vtxUrl };
@@ -96,9 +96,6 @@ export function cem_censo_2010_2022(viewSpec: any, allViewSpecs: any, context: a
96
96
  };
97
97
  };
98
98
  metadata: {
99
- _dependencies: ({ viewConfState }: {
100
- viewConfState: any;
101
- }) => string;
102
99
  _value: (string | {
103
100
  customGeoJSON: (string | (string | string[])[] | {
104
101
  [x: string]: any;
@@ -110,11 +107,15 @@ export function cem_censo_2010_2022(viewSpec: any, allViewSpecs: any, context: a
110
107
  context?: any;
111
108
  } | null)[];
112
109
  } | (string | {
113
- variableValues: (string | (string | (string | (string | {
114
- variableId: string[];
115
- municipioId: string[];
116
- source_table_id: any[];
117
- })[])[])[] | (string | {
110
+ variableValues: (string | (string | (string | string[])[] | (string | {
111
+ [x: string]: any;
112
+ $$resolver: symbol;
113
+ $$unresolved?: Record<string | number, import("@orioro/resolve").ResolutionNode> | undefined;
114
+ dependencies: any;
115
+ value: (...args: any[]) => any;
116
+ defaultValue?: any;
117
+ context?: any;
118
+ })[])[] | (string | {
118
119
  href: any;
119
120
  pathname: string;
120
121
  method?: undefined;
@@ -137,22 +138,12 @@ export function cem_censo_2010_2022(viewSpec: any, allViewSpecs: any, context: a
137
138
  labels?: undefined;
138
139
  measureUnits?: undefined;
139
140
  customGeoJSON?: undefined;
140
- customGeoJSON2?: undefined;
141
141
  colorScaleStops?: undefined;
142
142
  } | {
143
143
  labels: any;
144
144
  measureUnits: any;
145
145
  variableValues: string[];
146
146
  customGeoJSON: string[];
147
- customGeoJSON2: {
148
- [x: string]: any;
149
- $$resolver: symbol;
150
- $$unresolved?: Record<string | number, import("@orioro/resolve").ResolutionNode> | undefined;
151
- dependencies: any;
152
- value: (...args: any[]) => any;
153
- defaultValue?: any;
154
- context?: any;
155
- };
156
147
  colorScaleStops: any[];
157
148
  })[])[];
158
149
  };
@@ -1,11 +1,13 @@
1
1
  import { ExpressionFn } from '@orioro/resolve/dist/resolvers/expressions/types';
2
2
  import { StringifyOptions } from 'query-string';
3
3
  import { ScaleNaturalBreaksProps } from '@orioro/react-maplibre-util';
4
+ import { vtxUrl } from '../../vtxProtocol';
4
5
  type SearchParams = Record<string, any>;
5
6
  export declare const $naturalBreaks: ExpressionFn<[
6
7
  number[],
7
8
  opt?: Pick<ScaleNaturalBreaksProps, 'k' | 'scalesByK'>
8
9
  ]>;
10
+ export declare const $vtxUrl: ExpressionFn<Parameters<typeof vtxUrl>>;
9
11
  export declare const $urlSearch: ExpressionFn<[
10
12
  SearchParams | [SearchParams, StringifyOptions]
11
13
  ]>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redus/georedus-ui",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "packageManager": "yarn@4.0.2",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
@@ -17,6 +17,7 @@
17
17
  },
18
18
  "license": "ISC",
19
19
  "scripts": {
20
+ "prepublish": "yarn build",
20
21
  "build": "rm -rf dist && rollup --config ./rollup.config.mjs",
21
22
  "dev": "storybook dev -p 6006",
22
23
  "build-storybook": "storybook build"
@@ -57,8 +58,9 @@
57
58
  "@orioro/resolve": "^0.1.2",
58
59
  "@orioro/scale-util": "^0.0.2",
59
60
  "@orioro/tree-model": "^0.0.2",
60
- "@orioro/util": "^0.11.2",
61
+ "@orioro/util": "^0.13.0",
61
62
  "@orioro/validate": "^0.0.2",
63
+ "@orioro/vector-tile-util": "^0.2.0",
62
64
  "@radix-ui/react-collapsible": "^1.1.3",
63
65
  "@tanstack/react-query": "^5.18.0",
64
66
  "@turf/turf": "^7.1.0",