mobility-toolbox-js 2.0.0 → 2.0.1-beta.13

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 (102) hide show
  1. package/api/RoutingAPI.js +15 -0
  2. package/api/RoutingAPI.test.js +25 -0
  3. package/api/StopsAPI.js +12 -0
  4. package/api/StopsAPI.test.js +22 -0
  5. package/api/TralisAPI.js +359 -0
  6. package/api/TralisAPI.test.js +67 -0
  7. package/api/{tralis/TralisAPIUtils.js → TralisAPIUtils.js} +2 -32
  8. package/api/index.js +3 -3
  9. package/{ol/README.md → api/typedefs.js} +0 -0
  10. package/common/Tracker.js +14 -118
  11. package/common/api/HttpAPI.js +30 -0
  12. package/common/api/HttpAPI.test.js +50 -0
  13. package/common/api/WebSocketAPI.js +175 -0
  14. package/{api/tralis/WebSocketConnector.test.js → common/api/WebSocketAPI.test.js} +100 -145
  15. package/common/controls/Control.js +26 -91
  16. package/common/controls/Control.test.js +32 -43
  17. package/common/index.js +4 -0
  18. package/common/layers/Layer.js +53 -244
  19. package/common/layers/Layer.test.js +185 -244
  20. package/common/mixins/CopyrightMixin.js +20 -44
  21. package/common/mixins/SearchMixin.js +100 -166
  22. package/common/mixins/TralisLayerMixin.js +443 -894
  23. package/common/styles/index.js +4 -4
  24. package/common/styles/trackerDefaultStyle.js +39 -175
  25. package/common/styles/trackerDelayStyle.js +2 -11
  26. package/common/styles/trackerSimpleStyle.js +4 -8
  27. package/common/trackerConfig.js +61 -99
  28. package/common/trackerConfig.test.js +15 -17
  29. package/common/typedefs.js +0 -23
  30. package/common/utils/createTrackerFilters.js +10 -41
  31. package/common/utils/createTrackerFilters.test.js +40 -56
  32. package/common/utils/getMapboxMapCopyrights.js +3 -16
  33. package/common/utils/getMapboxMapCopyrights.test.js +32 -39
  34. package/common/utils/getMapboxStyleUrl.js +3 -13
  35. package/common/utils/getVehiclePosition.js +3 -33
  36. package/common/utils/index.js +5 -6
  37. package/common/utils/removeDuplicate.js +3 -17
  38. package/common/utils/removeDuplicate.test.js +17 -20
  39. package/common/utils/sortByDelay.js +2 -7
  40. package/common/utils/timeUtils.js +8 -32
  41. package/common/utils/timeUtils.test.js +7 -13
  42. package/index.js +8 -2
  43. package/mapbox/controls/CopyrightControl.js +9 -38
  44. package/mapbox/controls/index.js +1 -0
  45. package/mapbox/index.js +4 -3
  46. package/mapbox/layers/Layer.js +15 -76
  47. package/mapbox/layers/Layer.test.js +81 -101
  48. package/mapbox/layers/TralisLayer.js +46 -193
  49. package/mapbox/layers/TralisLayer.test.js +12 -14
  50. package/mapbox/layers/index.js +2 -0
  51. package/mapbox/utils.js +7 -21
  52. package/mbt.js +50444 -0
  53. package/mbt.js.map +7 -0
  54. package/mbt.min.js +1005 -0
  55. package/mbt.min.js.map +7 -0
  56. package/ol/controls/CopyrightControl.js +8 -46
  57. package/ol/controls/CopyrightControl.test.js +75 -121
  58. package/ol/controls/RoutingControl.js +167 -532
  59. package/ol/controls/RoutingControl.test.js +99 -164
  60. package/ol/controls/StopFinderControl.js +3 -31
  61. package/ol/controls/StopFinderControl.test.js +18 -29
  62. package/ol/controls/index.js +3 -0
  63. package/ol/index.js +5 -13
  64. package/ol/layers/Layer.js +23 -128
  65. package/ol/layers/Layer.test.js +79 -102
  66. package/ol/layers/MapboxLayer.js +62 -237
  67. package/ol/layers/MapboxLayer.test.js +58 -84
  68. package/ol/layers/MapboxStyleLayer.js +38 -268
  69. package/ol/layers/MapboxStyleLayer.test.js +97 -128
  70. package/ol/layers/MaplibreLayer.js +46 -187
  71. package/ol/layers/RoutingLayer.js +21 -51
  72. package/ol/layers/RoutingLayer.test.js +15 -24
  73. package/ol/layers/TralisLayer.js +102 -276
  74. package/ol/layers/TralisLayer.test.js +32 -50
  75. package/ol/layers/VectorLayer.js +3 -24
  76. package/ol/layers/VectorLayer.test.js +34 -45
  77. package/ol/layers/WMSLayer.js +15 -57
  78. package/ol/layers/WMSLayer.test.js +35 -43
  79. package/ol/layers/index.js +8 -0
  80. package/ol/styles/fullTrajectoryDelayStyle.js +11 -15
  81. package/ol/styles/fullTrajectoryStyle.js +17 -25
  82. package/ol/styles/index.js +2 -2
  83. package/package.json +35 -62
  84. package/api/routing/RoutingAPI.js +0 -44
  85. package/api/routing/RoutingAPI.test.js +0 -41
  86. package/api/stops/StopsAPI.js +0 -41
  87. package/api/stops/StopsAPI.test.js +0 -34
  88. package/api/tralis/TralisAPI.js +0 -731
  89. package/api/tralis/TralisAPI.test.js +0 -75
  90. package/api/tralis/WebSocketConnector.js +0 -338
  91. package/api/tralis/typedefs.js +0 -81
  92. package/common/api/api.js +0 -64
  93. package/common/api/api.test.js +0 -68
  94. package/index.js.map +0 -1
  95. package/module.js +0 -23
  96. package/ol/controls/snapshots/RoutingControlRouteGen10.json +0 -58
  97. package/ol/controls/snapshots/RoutingControlRouteGen100.json +0 -292
  98. package/ol/controls/snapshots/RoutingControlRouteGen30.json +0 -69
  99. package/ol/controls/snapshots/RoutingControlRouteGen5.json +0 -58
  100. package/ol/controls/snapshots/RoutingControlRouteOSM.json +0 -759
  101. package/ol/controls/snapshots/RoutingControlStation1.json +0 -60
  102. package/ol/controls/snapshots/RoutingControlStation2.json +0 -49
@@ -1,180 +1,162 @@
1
- import OlMap from 'ol/Map';
2
- import View from 'ol/View';
3
- import gllib from 'maplibre-gl';
4
- import Layer from './Layer';
5
- import MaplibreLayer from './MaplibreLayer';
6
- import MapboxStyleLayer from './MapboxStyleLayer';
7
-
1
+ import OlMap from "ol/Map";
2
+ import View from "ol/View";
3
+ import gllib from "maplibre-gl";
4
+ import Layer from "./Layer";
5
+ import MaplibreLayer from "./MaplibreLayer";
6
+ import MapboxStyleLayer from "./MapboxStyleLayer";
8
7
  let source;
9
8
  let layer;
10
9
  let map;
11
10
  let onClick;
12
-
13
11
  const styleLayer = {
14
- id: 'layer',
12
+ id: "layer"
15
13
  };
16
-
17
- describe('MapboxStyleLayer', () => {
14
+ describe("MapboxStyleLayer", () => {
18
15
  beforeEach(() => {
19
16
  onClick = jest.fn();
20
17
  source = new MaplibreLayer({
21
- name: 'Layer',
22
- apiKey: false,
18
+ name: "Layer",
19
+ apiKey: false
23
20
  });
24
21
  layer = new MapboxStyleLayer({
25
- name: 'mapbox layer',
22
+ name: "mapbox layer",
26
23
  visible: true,
27
24
  mapboxLayer: source,
28
25
  styleLayer,
29
- onClick,
26
+ onClick
30
27
  });
31
28
  map = new OlMap({
32
- target: document.createElement('div'),
33
- view: new View({ center: [0, 0] }),
29
+ target: document.createElement("div"),
30
+ view: new View({ center: [0, 0] })
34
31
  });
35
32
  });
36
-
37
33
  afterEach(() => {
38
34
  if (layer.map) {
39
- layer.terminate(map);
35
+ layer.detachFromMap(map);
40
36
  }
41
37
  if (source.map) {
42
- source.terminate(map);
38
+ source.detachFromMap(map);
43
39
  }
44
40
  });
45
-
46
- test('should be instanced.', () => {
41
+ test("should be instanced.", () => {
47
42
  expect(layer).toBeInstanceOf(MapboxStyleLayer);
48
43
  expect(layer.styleLayers[0]).toBe(styleLayer);
49
44
  expect(layer.clickCallbacks[0]).toBe(onClick);
50
45
  });
51
-
52
- test('should not initalized mapbox map.', () => {
53
- layer.init();
46
+ test("should not initalized mapbox map.", () => {
47
+ layer.attachToMap();
54
48
  expect(layer.mbMap).toBe();
55
- layer.terminate();
49
+ layer.detachFromMap();
56
50
  });
57
-
58
- test('should initalized mapbox map.', () => {
59
- source.init(map);
60
- layer.init(map);
51
+ test("should initalized mapbox map.", () => {
52
+ source.attachToMap(map);
53
+ layer.attachToMap(map);
61
54
  expect(layer.mapboxLayer.mbMap).toBeInstanceOf(gllib.Map);
62
- layer.terminate();
63
- source.terminate();
55
+ layer.detachFromMap();
56
+ source.detachFromMap();
64
57
  });
65
-
66
- test('should add onClick callback.', () => {
58
+ test("should add onClick callback.", () => {
67
59
  const onClick2 = jest.fn();
68
60
  layer.onClick(onClick2);
69
61
  expect(layer.clickCallbacks[1]).toBe(onClick2);
70
62
  });
71
-
72
- test('should called terminate on initalization.', () => {
73
- const spy = jest.spyOn(layer, 'terminate');
74
- layer.init();
63
+ test("should called terminate on initalization.", () => {
64
+ const spy = jest.spyOn(layer, "detachFromMap");
65
+ layer.attachToMap();
75
66
  expect(spy).toHaveBeenCalledTimes(1);
76
- layer.terminate(map);
67
+ layer.detachFromMap(map);
77
68
  });
78
-
79
- test('should return coordinates, features and a layer instance.', async () => {
80
- source.init(map);
81
- layer.init(map);
69
+ test("should return coordinates, features and a layer instance.", async () => {
70
+ source.attachToMap(map);
71
+ layer.attachToMap(map);
82
72
  const data = await layer.getFeatureInfoAtCoordinate([50, 50]);
83
73
  expect(data.coordinate).toEqual([50, 50]);
84
74
  expect(data.features).toEqual([]);
85
75
  expect(data.layer).toBeInstanceOf(MapboxStyleLayer);
86
- layer.terminate(map);
87
- source.terminate(map);
76
+ layer.detachFromMap(map);
77
+ source.detachFromMap(map);
88
78
  });
89
-
90
- test('should call onClick callback', async () => {
79
+ test("should call onClick callback", async () => {
91
80
  const coordinate = [500, 500];
92
81
  const features = [];
93
- const evt = { type: 'singleclick', map, coordinate };
94
- layer.init(map);
82
+ const evt = { type: "singleclick", map, coordinate };
83
+ layer.attachToMap(map);
95
84
  expect(onClick).toHaveBeenCalledTimes(0);
96
85
  await map.dispatchEvent(evt);
97
86
  expect(onClick).toHaveBeenCalledTimes(1);
98
87
  expect(onClick).toHaveBeenCalledWith(features, layer, coordinate);
99
- layer.terminate();
88
+ layer.detachFromMap();
100
89
  });
101
-
102
- test('should call super class terminate function.', () => {
103
- layer.init(map);
104
- const spy = jest.spyOn(Layer.prototype, 'terminate');
105
- layer.terminate(map);
90
+ test("should call super class terminate function.", () => {
91
+ layer.attachToMap(map);
92
+ const spy = jest.spyOn(Layer.prototype, "detachFromMap");
93
+ layer.detachFromMap(map);
106
94
  expect(spy).toHaveBeenCalledTimes(1);
107
95
  spy.mockRestore();
108
96
  });
109
-
110
- test('should call super class terminate if the mapboxLayer associated has been terminated before.', () => {
111
- layer.init(map);
112
- source.terminate(map);
113
- const spy = jest.spyOn(Layer.prototype, 'terminate');
114
- layer.terminate(map);
97
+ test("should call super class terminate if the mapboxLayer associated has been terminated before.", () => {
98
+ layer.attachToMap(map);
99
+ source.detachFromMap(map);
100
+ const spy = jest.spyOn(Layer.prototype, "detachFromMap");
101
+ layer.detachFromMap(map);
115
102
  expect(spy).toHaveBeenCalledTimes(1);
116
103
  spy.mockRestore();
117
104
  });
118
-
119
- test('should clone', () => {
120
- const clone = layer.clone({ name: 'clone' });
105
+ test("should clone", () => {
106
+ const clone = layer.clone({ name: "clone" });
121
107
  expect(clone).not.toBe(layer);
122
- expect(clone.name).toBe('clone');
108
+ expect(clone.name).toBe("clone");
123
109
  expect(clone).toBeInstanceOf(MapboxStyleLayer);
124
110
  });
125
-
126
- test('should add layer on load', () => {
111
+ test("should add layer on load", () => {
127
112
  const style = { layers: [] };
128
113
  layer.mapboxLayer.mbMap = {
129
114
  getStyle: () => style,
130
115
  getSource: () => ({}),
131
116
  getLayer: () => null,
132
117
  setLayoutProperty: () => null,
133
- addLayer: (styleLayerr) => style.layers.push(styleLayerr),
118
+ addLayer: (styleLayerr) => style.layers.push(styleLayerr)
134
119
  };
135
120
  layer.onLoad();
136
121
  expect(style.layers[0]).toBe(styleLayer);
137
122
  });
138
-
139
- describe('should set disabled property to false on load', () => {
140
- test('when layer uses styleLayer property', () => {
123
+ describe("should set disabled property to false on load", () => {
124
+ test("when layer uses styleLayer property", () => {
141
125
  const styles = { layers: [] };
142
126
  layer.mapboxLayer.mbMap = {
143
127
  getStyle: () => styles,
144
128
  getSource: () => ({}),
145
129
  getLayer: () => null,
146
130
  setLayoutProperty: () => null,
147
- addLayer: (styleLayerr) => styles.layers.push(styleLayerr),
131
+ addLayer: (styleLayerr) => styles.layers.push(styleLayerr)
148
132
  };
149
133
  expect(layer).toBeInstanceOf(MapboxStyleLayer);
150
134
  layer.onLoad();
151
135
  expect(layer.disabled).toBe(false);
152
136
  });
153
137
  });
154
-
155
- describe('should set disabled property to true on load', () => {
156
- test('when layer uses styleLayersFilter property', () => {
138
+ describe("should set disabled property to true on load", () => {
139
+ test("when layer uses styleLayersFilter property", () => {
157
140
  const styles = { layers: [styleLayer] };
158
141
  const layer2 = new MapboxStyleLayer({
159
- name: 'mapbox layer',
142
+ name: "mapbox layer",
160
143
  mapboxLayer: source,
161
- styleLayersFilter: () => false,
144
+ styleLayersFilter: () => false
162
145
  });
163
146
  layer2.mapboxLayer.mbMap = {
164
147
  getStyle: () => styles,
165
148
  getSource: () => ({}),
166
149
  getLayer: () => null,
167
150
  setLayoutProperty: () => null,
168
- addLayer: () => ({}),
151
+ addLayer: () => ({})
169
152
  };
170
153
  layer2.onLoad();
171
154
  expect(layer2.disabled).toBe(true);
172
155
  });
173
156
  });
174
-
175
- describe('#getFeatureInfoAtCoordinate()', () => {
157
+ describe("#getFeatureInfoAtCoordinate()", () => {
176
158
  beforeEach(() => {
177
- source.init(map);
159
+ source.attachToMap(map);
178
160
  source.mbMap.isStyleLoaded = jest.fn(() => true);
179
161
  source.mbMap.getSource = jest.fn(() => true);
180
162
  });
@@ -182,78 +164,65 @@ describe('MapboxStyleLayer', () => {
182
164
  source.mbMap.getSource.mockRestore();
183
165
  source.mbMap.isStyleLoaded.mockRestore();
184
166
  });
185
-
186
- test('should request features on layers ids from styleLayers property', () => {
167
+ test("should request features on layers ids from styleLayers property", () => {
187
168
  source.mbMap.getStyle = jest.fn(() => ({
188
- layers: [{ id: 'foo' }, { id: 'layer' }, { id: 'bar' }],
169
+ layers: [{ id: "foo" }, { id: "layer" }, { id: "bar" }]
189
170
  }));
190
- layer.init(map);
191
- layer.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() =>
192
- Promise.resolve({ features: [] }),
193
- );
194
- layer.getFeatureInfoAtCoordinate([0, 0]).then(() => {});
195
- expect(layer.mapboxLayer.getFeatureInfoAtCoordinate).toHaveBeenCalledWith(
196
- [0, 0],
197
- { layers: ['layer'], validate: false },
198
- );
171
+ layer.attachToMap(map);
172
+ layer.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() => Promise.resolve({ features: [] }));
173
+ layer.getFeatureInfoAtCoordinate([0, 0]).then(() => {
174
+ });
175
+ expect(layer.mapboxLayer.getFeatureInfoAtCoordinate).toHaveBeenCalledWith([0, 0], { layers: ["layer"], validate: false });
199
176
  layer.mapboxLayer.getFeatureInfoAtCoordinate.mockRestore();
200
177
  source.mbMap.getStyle.mockRestore();
201
178
  });
202
-
203
- test('should request features on layers ids from styleLayersFilter property', () => {
179
+ test("should request features on layers ids from styleLayersFilter property", () => {
204
180
  source.mbMap.getStyle = jest.fn(() => ({
205
- layers: [{ id: 'foo' }, { id: 'layer' }, { id: 'bar' }, { id: 'foo2' }],
181
+ layers: [{ id: "foo" }, { id: "layer" }, { id: "bar" }, { id: "foo2" }]
206
182
  }));
207
183
  const layer2 = new MapboxStyleLayer({
208
- name: 'mapbox layer',
184
+ name: "mapbox layer",
209
185
  visible: true,
210
186
  mapboxLayer: source,
211
187
  styleLayer,
212
- styleLayersFilter: ({ id }) => /foo/.test(id),
188
+ styleLayersFilter: ({ id }) => /foo/.test(id)
213
189
  });
214
- layer2.init(map);
215
- layer2.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() =>
216
- Promise.resolve({ features: [] }),
217
- );
218
- layer2.getFeatureInfoAtCoordinate([0, 0]).then(() => {});
219
- expect(
220
- layer2.mapboxLayer.getFeatureInfoAtCoordinate,
221
- ).toHaveBeenCalledWith([0, 0], {
222
- layers: ['foo', 'foo2'],
223
- validate: false,
190
+ layer2.attachToMap(map);
191
+ layer2.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() => Promise.resolve({ features: [] }));
192
+ layer2.getFeatureInfoAtCoordinate([0, 0]).then(() => {
193
+ });
194
+ expect(layer2.mapboxLayer.getFeatureInfoAtCoordinate).toHaveBeenCalledWith([0, 0], {
195
+ layers: ["foo", "foo2"],
196
+ validate: false
224
197
  });
225
198
  layer2.mapboxLayer.getFeatureInfoAtCoordinate.mockRestore();
226
199
  source.mbMap.getStyle.mockRestore();
227
200
  });
228
-
229
- test('should request features on layers ids from queryRenderedLayersFilter property', () => {
201
+ test("should request features on layers ids from queryRenderedLayersFilter property", () => {
230
202
  source.mbMap.getStyle = jest.fn(() => ({
231
203
  layers: [
232
- { id: 'foo' },
233
- { id: 'bar2' },
234
- { id: 'layer' },
235
- { id: 'bar' },
236
- { id: 'foo2' },
237
- ],
204
+ { id: "foo" },
205
+ { id: "bar2" },
206
+ { id: "layer" },
207
+ { id: "bar" },
208
+ { id: "foo2" }
209
+ ]
238
210
  }));
239
211
  const layer2 = new MapboxStyleLayer({
240
- name: 'mapbox layer',
212
+ name: "mapbox layer",
241
213
  visible: true,
242
214
  mapboxLayer: source,
243
215
  styleLayer,
244
216
  styleLayersFilter: ({ id }) => /foo/.test(id),
245
- queryRenderedLayersFilter: ({ id }) => /bar/.test(id),
217
+ queryRenderedLayersFilter: ({ id }) => /bar/.test(id)
218
+ });
219
+ layer2.attachToMap(map);
220
+ layer2.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() => Promise.resolve({ features: [] }));
221
+ layer2.getFeatureInfoAtCoordinate([0, 0]).then(() => {
246
222
  });
247
- layer2.init(map);
248
- layer2.mapboxLayer.getFeatureInfoAtCoordinate = jest.fn(() =>
249
- Promise.resolve({ features: [] }),
250
- );
251
- layer2.getFeatureInfoAtCoordinate([0, 0]).then(() => {});
252
- expect(
253
- layer2.mapboxLayer.getFeatureInfoAtCoordinate,
254
- ).toHaveBeenCalledWith([0, 0], {
255
- layers: ['bar2', 'bar'],
256
- validate: false,
223
+ expect(layer2.mapboxLayer.getFeatureInfoAtCoordinate).toHaveBeenCalledWith([0, 0], {
224
+ layers: ["bar2", "bar"],
225
+ validate: false
257
226
  });
258
227
  layer2.mapboxLayer.getFeatureInfoAtCoordinate.mockRestore();
259
228
  source.mbMap.getStyle.mockRestore();