@geospatial-sdk/core 0.0.5-dev.19 → 0.0.5-dev.21

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.
@@ -30,6 +30,6 @@ export interface MapContextDiff {
30
30
  layersReordered: MapContextLayerReordered[];
31
31
  layersRemoved: MapContextLayerPositioned[];
32
32
  layersAdded: MapContextLayerPositioned[];
33
- viewChanges?: MapContextView;
33
+ viewChanges?: MapContextView | null;
34
34
  }
35
35
  //# sourceMappingURL=map-context-diff.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-context-diff.d.ts","sourceRoot":"","sources":["../../lib/model/map-context-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,eAAe,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,yBAAyB,EAAE,CAAC;IAC3C,eAAe,EAAE,wBAAwB,EAAE,CAAC;IAC5C,aAAa,EAAE,yBAAyB,EAAE,CAAC;IAC3C,WAAW,EAAE,yBAAyB,EAAE,CAAC;IACzC,WAAW,CAAC,EAAE,cAAc,CAAC;CAC9B"}
1
+ {"version":3,"file":"map-context-diff.d.ts","sourceRoot":"","sources":["../../lib/model/map-context-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,eAAe,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,yBAAyB,EAAE,CAAC;IAC3C,eAAe,EAAE,wBAAwB,EAAE,CAAC;IAC5C,aAAa,EAAE,yBAAyB,EAAE,CAAC;IAC3C,WAAW,EAAE,yBAAyB,EAAE,CAAC;IACzC,WAAW,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACrC"}
@@ -1,4 +1,5 @@
1
1
  import { FeatureCollection, Geometry } from "geojson";
2
+ import { VectorStyle } from "./style";
2
3
  export type LayerDimensions = Record<string, string>;
3
4
  export type LayerExtras = Record<string, unknown>;
4
5
  export interface MapContextBaseLayer {
@@ -33,6 +34,7 @@ export interface MapContextLayerWfs extends MapContextBaseLayer {
33
34
  type: "wfs";
34
35
  url: string;
35
36
  featureType: string;
37
+ style?: VectorStyle;
36
38
  }
37
39
  export interface MapContextLayerOgcApi extends MapContextBaseLayer {
38
40
  type: "ogcapi";
@@ -41,6 +43,7 @@ export interface MapContextLayerOgcApi extends MapContextBaseLayer {
41
43
  useTiles?: "vector" | "map";
42
44
  tileMatrixSet?: string;
43
45
  options?: Record<string, string>;
46
+ style?: VectorStyle;
44
47
  }
45
48
  export interface MapContextLayerMapLibreStyle extends MapContextBaseLayer {
46
49
  type: "maplibre-style";
@@ -53,6 +56,7 @@ export interface MapContextLayerXyz extends MapContextBaseLayer {
53
56
  }
54
57
  interface LayerGeojson extends MapContextBaseLayer {
55
58
  type: "geojson";
59
+ style?: VectorStyle;
56
60
  }
57
61
  interface LayerGeojsonWithUrl extends LayerGeojson {
58
62
  url: string;
@@ -101,7 +105,7 @@ export type MapContextView = (ViewByZoomAndCenter | ViewByExtent | ViewByGeometr
101
105
  };
102
106
  export interface MapContext {
103
107
  layers: MapContextLayer[];
104
- view: MapContextView;
108
+ view: MapContextView | null;
105
109
  }
106
110
  export {};
107
111
  //# sourceMappingURL=map-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-context.d.ts","sourceRoot":"","sources":["../../lib/model/map-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"map-context.d.ts","sourceRoot":"","sources":["../../lib/model/map-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FlatStyleLike } from "ol/style/flat";
2
+ export type VectorStyle = FlatStyleLike;
3
+ //# sourceMappingURL=style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../lib/model/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../lib/utils/hash.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,MAAM,CAezE"}
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../lib/utils/hash.ts"],"names":[],"mappings":"AAIA,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,MAAM,CAiBzE"}
@@ -1,5 +1,11 @@
1
+ function isGeoJsonGeometry(object) {
2
+ return "type" in object && "coordinates" in object;
3
+ }
1
4
  export function getHash(input, ignoreKeys = []) {
2
- if (input instanceof Object) {
5
+ if (input instanceof Object && isGeoJsonGeometry(input)) {
6
+ return JSON.stringify(input); // do not compute an actual hash as it will take too long
7
+ }
8
+ else if (input instanceof Object) {
3
9
  const obj = {};
4
10
  const keys = Object.keys(input).sort();
5
11
  for (const key of keys) {
@@ -1 +1 @@
1
- {"version":3,"file":"map-context-diff.d.ts","sourceRoot":"","sources":["../../lib/utils/map-context-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EAIf,MAAM,UAAU,CAAC;AAIlB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,UAAU,EACvB,eAAe,EAAE,UAAU,GAC1B,cAAc,CAyEhB"}
1
+ {"version":3,"file":"map-context-diff.d.ts","sourceRoot":"","sources":["../../lib/utils/map-context-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,cAAc,EAIf,MAAM,UAAU,CAAC;AAIlB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,UAAU,EACvB,eAAe,EAAE,UAAU,GAC1B,cAAc,CA4EhB"}
@@ -69,10 +69,14 @@ export function computeMapContextDiff(nextContext, previousContext) {
69
69
  });
70
70
  }
71
71
  }
72
- const viewChanges = getHash(nextContext.view) !== getHash(previousContext.view)
73
- ? Object.assign({}, nextContext.view) : undefined;
72
+ let viewChanges = getHash(nextContext.view) !== getHash(previousContext.view)
73
+ ? nextContext.view
74
+ : undefined;
75
+ if (viewChanges !== null && viewChanges !== undefined) {
76
+ viewChanges = Object.assign({}, viewChanges); // copy the view to avoid unexpected mutations
77
+ }
74
78
  return Object.assign({ layersAdded,
75
79
  layersChanged,
76
80
  layersRemoved,
77
- layersReordered }, (viewChanges && { viewChanges }));
81
+ layersReordered }, (viewChanges !== undefined && { viewChanges }));
78
82
  }
@@ -33,5 +33,5 @@ export interface MapContextDiff {
33
33
  layersReordered: MapContextLayerReordered[];
34
34
  layersRemoved: MapContextLayerPositioned[];
35
35
  layersAdded: MapContextLayerPositioned[];
36
- viewChanges?: MapContextView;
36
+ viewChanges?: MapContextView | null;
37
37
  }
@@ -1,4 +1,5 @@
1
1
  import { FeatureCollection, Geometry } from "geojson";
2
+ import { VectorStyle } from "./style";
2
3
 
3
4
  export type LayerDimensions = Record<string, string>;
4
5
 
@@ -40,6 +41,7 @@ export interface MapContextLayerWfs extends MapContextBaseLayer {
40
41
  type: "wfs";
41
42
  url: string;
42
43
  featureType: string;
44
+ style?: VectorStyle;
43
45
  }
44
46
 
45
47
  export interface MapContextLayerOgcApi extends MapContextBaseLayer {
@@ -49,6 +51,7 @@ export interface MapContextLayerOgcApi extends MapContextBaseLayer {
49
51
  useTiles?: "vector" | "map";
50
52
  tileMatrixSet?: string;
51
53
  options?: Record<string, string>;
54
+ style?: VectorStyle;
52
55
  }
53
56
 
54
57
  // Layer pointing to a MapLibre Style spec, see https://maplibre.org/maplibre-style-spec/
@@ -65,6 +68,7 @@ export interface MapContextLayerXyz extends MapContextBaseLayer {
65
68
 
66
69
  interface LayerGeojson extends MapContextBaseLayer {
67
70
  type: "geojson";
71
+ style?: VectorStyle;
68
72
  }
69
73
  interface LayerGeojsonWithUrl extends LayerGeojson {
70
74
  url: string;
@@ -133,5 +137,5 @@ export type MapContextView = (
133
137
 
134
138
  export interface MapContext {
135
139
  layers: MapContextLayer[];
136
- view: MapContextView;
140
+ view: MapContextView | null; // a view of "null" means the map will show a default view;
137
141
  }
@@ -0,0 +1,3 @@
1
+ import { FlatStyleLike } from "ol/style/flat";
2
+
3
+ export type VectorStyle = FlatStyleLike;
@@ -23,4 +23,80 @@ describe("getHash", () => {
23
23
  ]);
24
24
  expect(hashB).toEqual(hashA);
25
25
  });
26
+ it("stable for null", () => {
27
+ const hashA = getHash(null);
28
+ const hashB = getHash(null);
29
+ expect(hashB).toEqual(hashA);
30
+ });
31
+ it("different when casting null to string", () => {
32
+ const hashA = getHash(null);
33
+ const hashB = getHash("null");
34
+ expect(hashB).not.toEqual(hashA);
35
+ });
36
+ it("stable with identical GeoJSON geometry", () => {
37
+ const hashA = getHash({
38
+ geometry: {
39
+ type: "Polygon",
40
+ properties: {},
41
+ coordinates: [
42
+ [
43
+ [-10, -10],
44
+ [-10, 20],
45
+ [10, 20],
46
+ [10, -10],
47
+ [-10, -10],
48
+ ],
49
+ ],
50
+ },
51
+ });
52
+ const hashB = getHash({
53
+ geometry: {
54
+ type: "Polygon",
55
+ properties: {},
56
+ coordinates: [
57
+ [
58
+ [-10, -10],
59
+ [-10, 20],
60
+ [10, 20],
61
+ [10, -10],
62
+ [-10, -10],
63
+ ],
64
+ ],
65
+ },
66
+ });
67
+ expect(hashB).toEqual(hashA);
68
+ });
69
+ it("different if GeoJSON geometry properties are not in the same order", () => {
70
+ const hashA = getHash({
71
+ geometry: {
72
+ coordinates: [
73
+ [
74
+ [-10, -10],
75
+ [-10, 20],
76
+ [10, 20],
77
+ [10, -10],
78
+ [-10, -10],
79
+ ],
80
+ ],
81
+ type: "Polygon",
82
+ properties: {},
83
+ },
84
+ });
85
+ const hashB = getHash({
86
+ geometry: {
87
+ type: "Polygon",
88
+ properties: {},
89
+ coordinates: [
90
+ [
91
+ [-10, -10],
92
+ [-10, 20],
93
+ [10, 20],
94
+ [10, -10],
95
+ [-10, -10],
96
+ ],
97
+ ],
98
+ },
99
+ });
100
+ expect(hashB).not.toEqual(hashA);
101
+ });
26
102
  });
package/lib/utils/hash.ts CHANGED
@@ -1,5 +1,11 @@
1
+ function isGeoJsonGeometry(object: object) {
2
+ return "type" in object && "coordinates" in object;
3
+ }
4
+
1
5
  export function getHash(input: unknown, ignoreKeys: string[] = []): string {
2
- if (input instanceof Object) {
6
+ if (input instanceof Object && isGeoJsonGeometry(input)) {
7
+ return JSON.stringify(input); // do not compute an actual hash as it will take too long
8
+ } else if (input instanceof Object) {
3
9
  const obj: Record<string, string> = {};
4
10
  const keys = Object.keys(input).sort();
5
11
  for (const key of keys) {
@@ -213,32 +213,87 @@ describe("Context diff utils", () => {
213
213
  });
214
214
 
215
215
  describe("view changes", () => {
216
- beforeEach(() => {
217
- contextOld = {
218
- ...SAMPLE_CONTEXT,
219
- view: {
220
- center: [0, 0],
221
- zoom: 1,
222
- },
223
- };
224
- contextNew = {
225
- ...SAMPLE_CONTEXT,
226
- view: {
227
- center: [1, 1],
228
- zoom: 2,
229
- },
230
- };
216
+ describe("both values", () => {
217
+ beforeEach(() => {
218
+ contextOld = {
219
+ ...SAMPLE_CONTEXT,
220
+ view: {
221
+ center: [0, 0],
222
+ zoom: 1,
223
+ },
224
+ };
225
+ contextNew = {
226
+ ...SAMPLE_CONTEXT,
227
+ view: {
228
+ center: [1, 1],
229
+ zoom: 2,
230
+ },
231
+ };
232
+ });
233
+ it("outputs the correct diff", () => {
234
+ diff = computeMapContextDiff(contextNew, contextOld);
235
+ expect(diff).toEqual({
236
+ layersAdded: [],
237
+ layersChanged: [],
238
+ layersRemoved: [],
239
+ layersReordered: [],
240
+ viewChanges: { ...contextNew.view },
241
+ });
242
+ expect(diff.viewChanges).not.toBe(contextNew.view); // the object reference should be different
243
+ });
231
244
  });
232
- it("outputs the correct diff", () => {
233
- diff = computeMapContextDiff(contextNew, contextOld);
234
- expect(diff).toEqual({
235
- layersAdded: [],
236
- layersChanged: [],
237
- layersRemoved: [],
238
- layersReordered: [],
239
- viewChanges: { ...contextNew.view },
245
+ describe("value to null", () => {
246
+ beforeEach(() => {
247
+ contextOld = {
248
+ ...SAMPLE_CONTEXT,
249
+ view: {
250
+ center: [0, 0],
251
+ zoom: 1,
252
+ },
253
+ };
254
+ contextNew = {
255
+ ...SAMPLE_CONTEXT,
256
+ view: null,
257
+ };
258
+ });
259
+ it("outputs the correct diff", () => {
260
+ diff = computeMapContextDiff(contextNew, contextOld);
261
+ expect(diff).toEqual({
262
+ layersAdded: [],
263
+ layersChanged: [],
264
+ layersRemoved: [],
265
+ layersReordered: [],
266
+ viewChanges: null,
267
+ });
268
+ });
269
+ });
270
+ describe("null to value", () => {
271
+ beforeEach(() => {
272
+ contextOld = {
273
+ ...SAMPLE_CONTEXT,
274
+ view: null,
275
+ };
276
+ contextNew = {
277
+ ...SAMPLE_CONTEXT,
278
+ view: {
279
+ center: [0, 0],
280
+ zoom: 1,
281
+ },
282
+ };
283
+ });
284
+ it("outputs the correct diff", () => {
285
+ diff = computeMapContextDiff(contextNew, contextOld);
286
+ expect(diff).toEqual({
287
+ layersAdded: [],
288
+ layersChanged: [],
289
+ layersRemoved: [],
290
+ layersReordered: [],
291
+ viewChanges: {
292
+ center: [0, 0],
293
+ zoom: 1,
294
+ },
295
+ });
240
296
  });
241
- expect(diff.viewChanges).not.toBe(contextNew.view); // the object reference should be different
242
297
  });
243
298
  });
244
299
 
@@ -91,16 +91,19 @@ export function computeMapContextDiff(
91
91
  }
92
92
  }
93
93
 
94
- const viewChanges =
94
+ let viewChanges =
95
95
  getHash(nextContext.view) !== getHash(previousContext.view)
96
- ? { ...nextContext.view }
96
+ ? nextContext.view
97
97
  : undefined;
98
+ if (viewChanges !== null && viewChanges !== undefined) {
99
+ viewChanges = { ...viewChanges }; // copy the view to avoid unexpected mutations
100
+ }
98
101
 
99
102
  return {
100
103
  layersAdded,
101
104
  layersChanged,
102
105
  layersRemoved,
103
106
  layersReordered,
104
- ...(viewChanges && { viewChanges }),
107
+ ...(viewChanges !== undefined && { viewChanges }),
105
108
  };
106
109
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geospatial-sdk/core",
3
- "version": "0.0.5-dev.19+45eafe3",
3
+ "version": "0.0.5-dev.21+89507d8",
4
4
  "description": "Core functions and models for the SDK",
5
5
  "author": "Olivia <olivia.guyot@camptocamp.com>",
6
6
  "homepage": "",
@@ -22,9 +22,12 @@
22
22
  "test": "vitest",
23
23
  "build": "tsc"
24
24
  },
25
- "gitHead": "45eafe3503dc41b6326708fdb2e84a8340f28c4f",
25
+ "gitHead": "89507d8f401028ad8340d960ace5de574fa6e966",
26
26
  "dependencies": {
27
- "@camptocamp/ogc-client": "1.1.1-dev.9671ef4",
27
+ "@camptocamp/ogc-client": "1.1.1-dev.c75dcba",
28
28
  "proj4": "^2.9.2"
29
+ },
30
+ "devDependencies": {
31
+ "ol": "^8.2.0"
29
32
  }
30
33
  }