@vaadin/bundles 25.3.0-alpha13 → 25.3.0-alpha14

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 (105) hide show
  1. package/node_modules_vaadin_map_node_modules_ol_control_MousePosition_js.js +6 -6
  2. package/node_modules_vaadin_map_node_modules_ol_control_MousePosition_js.js.map +1 -1
  3. package/node_modules_vaadin_map_node_modules_ol_control_ZoomToExtent_js.js +10 -1
  4. package/node_modules_vaadin_map_node_modules_ol_control_ZoomToExtent_js.js.map +1 -1
  5. package/node_modules_vaadin_map_node_modules_ol_events_SnapEvent_js.js +5 -0
  6. package/node_modules_vaadin_map_node_modules_ol_events_SnapEvent_js.js.map +1 -1
  7. package/node_modules_vaadin_map_node_modules_ol_featureloader_js.js +9 -8
  8. package/node_modules_vaadin_map_node_modules_ol_featureloader_js.js.map +1 -1
  9. package/node_modules_vaadin_map_node_modules_ol_geom_GeometryCollection_js.js +1 -1
  10. package/node_modules_vaadin_map_node_modules_ol_geom_GeometryCollection_js.js.map +1 -1
  11. package/node_modules_vaadin_map_node_modules_ol_geom_flat_clip_js.js +172 -0
  12. package/node_modules_vaadin_map_node_modules_ol_geom_flat_clip_js.js.map +1 -0
  13. package/node_modules_vaadin_map_node_modules_ol_geom_flat_length_js-_95bd5.js +58 -0
  14. package/node_modules_vaadin_map_node_modules_ol_geom_flat_length_js-_95bd5.js.map +1 -0
  15. package/{node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-node_modules_vaadin_map_node_-a1378d.js → node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js-node_modules_vaadin_map_node_-304640.js} +244 -5
  16. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js-node_modules_vaadin_map_node_-304640.js.map +1 -0
  17. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js-node_modules_vaadin_map_node_-7a9288.js +383 -0
  18. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js-node_modules_vaadin_map_node_-7a9288.js.map +1 -0
  19. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js.js +243 -0
  20. package/node_modules_vaadin_map_node_modules_ol_geom_flat_lineoffset_js.js.map +1 -0
  21. package/node_modules_vaadin_map_node_modules_ol_geom_flat_textpath_js.js +18 -5
  22. package/node_modules_vaadin_map_node_modules_ol_geom_flat_textpath_js.js.map +1 -1
  23. package/node_modules_vaadin_map_node_modules_ol_interaction_DragAndDrop_js.js +8 -8
  24. package/node_modules_vaadin_map_node_modules_ol_interaction_DragAndDrop_js.js.map +1 -1
  25. package/{node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-_279c0.js → node_modules_vaadin_map_node_modules_ol_render_VectorContext_js.js} +2 -2
  26. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js.js.map +1 -0
  27. package/node_modules_vaadin_map_node_modules_ol_render_canvas_LineStringBuilder_js.js +17 -7
  28. package/node_modules_vaadin_map_node_modules_ol_render_canvas_LineStringBuilder_js.js.map +1 -1
  29. package/node_modules_vaadin_map_node_modules_ol_render_canvas_ZIndexContext_js-_abc10.js +18 -15
  30. package/node_modules_vaadin_map_node_modules_ol_render_canvas_ZIndexContext_js-_abc10.js.map +1 -1
  31. package/node_modules_vaadin_map_node_modules_ol_render_canvas_ZIndexContext_js-_abc11.js +18 -15
  32. package/node_modules_vaadin_map_node_modules_ol_render_canvas_ZIndexContext_js-_abc11.js.map +1 -1
  33. package/node_modules_vaadin_map_node_modules_ol_renderer_Layer_js.js +21 -1
  34. package/node_modules_vaadin_map_node_modules_ol_renderer_Layer_js.js.map +1 -1
  35. package/node_modules_vaadin_map_node_modules_ol_source_Source_js.js +34 -3
  36. package/node_modules_vaadin_map_node_modules_ol_source_Source_js.js.map +1 -1
  37. package/package.json +135 -135
  38. package/vaadin-bundle.json +1824 -1812
  39. package/vaadin.js +2725 -1726
  40. package/vaadin.js.map +1 -1
  41. package/vendors-node_modules_vaadin_map_node_modules_ol_Feature_js.js +30 -16
  42. package/vendors-node_modules_vaadin_map_node_modules_ol_Feature_js.js.map +1 -1
  43. package/vendors-node_modules_vaadin_map_node_modules_ol_Overlay_js.js +6 -6
  44. package/vendors-node_modules_vaadin_map_node_modules_ol_Overlay_js.js.map +1 -1
  45. package/vendors-node_modules_vaadin_map_node_modules_ol_control_FullScreen_js.js +7 -7
  46. package/vendors-node_modules_vaadin_map_node_modules_ol_control_FullScreen_js.js.map +1 -1
  47. package/vendors-node_modules_vaadin_map_node_modules_ol_control_OverviewMap_js.js +1 -1
  48. package/vendors-node_modules_vaadin_map_node_modules_ol_control_OverviewMap_js.js.map +1 -1
  49. package/vendors-node_modules_vaadin_map_node_modules_ol_control_ScaleLine_js.js +6 -6
  50. package/vendors-node_modules_vaadin_map_node_modules_ol_control_ScaleLine_js.js.map +1 -1
  51. package/vendors-node_modules_vaadin_map_node_modules_ol_control_ZoomSlider_js.js +1 -1
  52. package/vendors-node_modules_vaadin_map_node_modules_ol_control_ZoomSlider_js.js.map +1 -1
  53. package/vendors-node_modules_vaadin_map_node_modules_ol_control_js.js +34 -25
  54. package/vendors-node_modules_vaadin_map_node_modules_ol_control_js.js.map +1 -1
  55. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Draw_js.js +146 -943
  56. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Draw_js.js.map +1 -1
  57. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Extent_js.js +111 -34
  58. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Extent_js.js.map +1 -1
  59. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Link_js.js +3 -3
  60. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Link_js.js.map +1 -1
  61. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Modify_js.js +1055 -219
  62. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Modify_js.js.map +1 -1
  63. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Select_js.js +129 -57
  64. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Select_js.js.map +1 -1
  65. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Snap_js.js +74 -80
  66. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Snap_js.js.map +1 -1
  67. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Translate_js.js +11 -11
  68. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_Translate_js.js.map +1 -1
  69. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_js.js +54 -54
  70. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_js.js.map +1 -1
  71. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_tracing_js.js +801 -0
  72. package/vendors-node_modules_vaadin_map_node_modules_ol_interaction_tracing_js.js.map +1 -0
  73. package/vendors-node_modules_vaadin_map_node_modules_ol_render_Feature_js.js +36 -20
  74. package/vendors-node_modules_vaadin_map_node_modules_ol_render_Feature_js.js.map +1 -1
  75. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_BuilderGroup_js.js +17 -279
  76. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_BuilderGroup_js.js.map +1 -1
  77. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Builder_js.js +16 -7
  78. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Builder_js.js.map +1 -1
  79. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_ExecutorGroup_js.js +53 -17
  80. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_ExecutorGroup_js.js.map +1 -1
  81. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Executor_js.js +336 -38
  82. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Executor_js.js.map +1 -1
  83. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Immediate_js.js +75 -42
  84. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_Immediate_js.js.map +1 -1
  85. package/{node_modules_vaadin_map_node_modules_ol_render_canvas_PolygonBuilder_js.js → vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_PolygonBuilder_js.js} +77 -11
  86. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_PolygonBuilder_js.js.map +1 -0
  87. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_TextBuilder_js.js +210 -16
  88. package/vendors-node_modules_vaadin_map_node_modules_ol_render_canvas_TextBuilder_js.js.map +1 -1
  89. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_canvas_Layer_js.js +88 -32
  90. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_canvas_Layer_js.js.map +1 -1
  91. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_canvas_VectorLayer_js.js +62 -22
  92. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_canvas_VectorLayer_js.js.map +1 -1
  93. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_vector_js.js +2 -2
  94. package/vendors-node_modules_vaadin_map_node_modules_ol_renderer_vector_js.js.map +1 -1
  95. package/vendors-node_modules_vaadin_map_node_modules_ol_source_Vector_js.js +135 -81
  96. package/vendors-node_modules_vaadin_map_node_modules_ol_source_Vector_js.js.map +1 -1
  97. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-_279c0.js.map +0 -1
  98. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-_279c1.js +0 -144
  99. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-_279c1.js.map +0 -1
  100. package/node_modules_vaadin_map_node_modules_ol_render_VectorContext_js-node_modules_vaadin_map_node_-a1378d.js.map +0 -1
  101. package/node_modules_vaadin_map_node_modules_ol_render_canvas_PolygonBuilder_js.js.map +0 -1
  102. package/node_modules_vaadin_map_node_modules_ol_style_js.js +0 -48
  103. package/node_modules_vaadin_map_node_modules_ol_style_js.js.map +0 -1
  104. package/vendors-node_modules_vaadin_map_node_modules_ol_geom_js-node_modules_vaadin_map_node_modules_-f0f4bb.js +0 -769
  105. package/vendors-node_modules_vaadin_map_node_modules_ol_geom_js-node_modules_vaadin_map_node_modules_-f0f4bb.js.map +0 -1
@@ -27,13 +27,14 @@ let withCredentials = false;
27
27
  * {@link module:ol/source/Vector~VectorSource} sources use a function of this type to
28
28
  * load features.
29
29
  *
30
- * This function takes up to 5 arguments. These are an {@link module:ol/extent~Extent} representing
31
- * the area to be loaded, a `{number}` representing the resolution (map units per pixel), a
32
- * {@link module:ol/proj/Projection~Projection} for the projection, an optional success callback that should get
33
- * the loaded features passed as an argument and an optional failure callback with no arguments. If
34
- * the callbacks are not used, the corresponding vector source will not fire `'featuresloadend'` and
35
- * `'featuresloaderror'` events. `this` within the function is bound to the
36
- * {@link module:ol/source/Vector~VectorSource} it's called from.
30
+ * This function takes 3 arguments: an {@link module:ol/extent~Extent} representing
31
+ * the area to be loaded, a `{number}` representing the resolution (map units per pixel), and a
32
+ * {@link module:ol/proj/Projection~Projection} for the projection. The function is expeced to return
33
+ * a promise that resolves to an array of features.
34
+ *
35
+ * There are also a deprecated signature, with `void` as
36
+ * return, and two additional arguments: an optional success callback that should get
37
+ * the loaded features passed as an argument and an optional failure callback with no arguments.
37
38
  *
38
39
  * The function is responsible for loading the features and adding them to the
39
40
  * source.
@@ -44,7 +45,7 @@ let withCredentials = false;
44
45
  * resolution: number,
45
46
  * projection: import("./proj/Projection.js").default,
46
47
  * success?: (features: Array<FeatureType>) => void,
47
- * failure?: () => void) => void} FeatureLoader
48
+ * failure?: () => void) => void|Promise<Array<FeatureType>>} FeatureLoader
48
49
  * @api
49
50
  */
50
51
 
@@ -381,8 +382,8 @@ class Source extends _Object_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
381
382
 
382
383
  /**
383
384
  * This source is currently loading data. Sources that defer loading to the
384
- * map's tile queue never set this to `true`.
385
- * @type {boolean}
385
+ * map's tile queue never set this to a `truthy` value.
386
+ * @type {boolean|number}
386
387
  */
387
388
  this.loading = false;
388
389
 
@@ -454,7 +455,7 @@ class Source extends _Object_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
454
455
  }
455
456
 
456
457
  /**
457
- * @param {import("../proj/Projection").default} [projection] Projection.
458
+ * @param {import("../proj/Projection.js").default} [projection] Projection.
458
459
  * @return {Array<number>|null} Resolutions.
459
460
  */
460
461
  getResolutions(projection) {
@@ -468,6 +469,37 @@ class Source extends _Object_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
468
469
  return this.viewPromise_;
469
470
  }
470
471
 
472
+ /**
473
+ * Resolve once the source is ready to be used (its state is `ready`), or
474
+ * reject if it fails to load (its state is `error`). Sources that configure
475
+ * asynchronously can use this to expose data (e.g. dimensions) through a
476
+ * promise instead of the `change` event.
477
+ * @return {Promise<void>} Resolves when the source is ready.
478
+ * @protected
479
+ */
480
+ ready() {
481
+ const state = this.getState();
482
+ if (state === 'ready') {
483
+ return Promise.resolve();
484
+ }
485
+ if (state === 'error') {
486
+ return Promise.reject(new Error('Source failed to load'));
487
+ }
488
+ return new Promise((resolve, reject) => {
489
+ const onChange = () => {
490
+ const changedState = this.getState();
491
+ if (changedState === 'ready') {
492
+ this.un('change', onChange);
493
+ resolve();
494
+ } else if (changedState === 'error') {
495
+ this.un('change', onChange);
496
+ reject(new Error('Source failed to load'));
497
+ }
498
+ };
499
+ this.on('change', onChange);
500
+ });
501
+ }
502
+
471
503
  /**
472
504
  * Get the state of the source, see {@link import("./Source.js").State} for possible states.
473
505
  * @return {import("./Source.js").State} State.
@@ -560,9 +592,9 @@ __webpack_require__.r(__webpack_exports__);
560
592
  /* harmony import */ var _ObjectEventType_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../ObjectEventType.js */ "./node_modules/@vaadin/map/node_modules/ol/ObjectEventType.js");
561
593
  /* harmony import */ var _array_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../array.js */ "./node_modules/@vaadin/map/node_modules/ol/array.js");
562
594
  /* harmony import */ var _asserts_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../asserts.js */ "./node_modules/@vaadin/map/node_modules/ol/asserts.js");
595
+ /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../events.js */ "./node_modules/@vaadin/map/node_modules/ol/events.js");
563
596
  /* harmony import */ var _events_Event_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events/Event.js */ "./node_modules/@vaadin/map/node_modules/ol/events/Event.js");
564
597
  /* harmony import */ var _events_EventType_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../events/EventType.js */ "./node_modules/@vaadin/map/node_modules/ol/events/EventType.js");
565
- /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../events.js */ "./node_modules/@vaadin/map/node_modules/ol/events.js");
566
598
  /* harmony import */ var _extent_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../extent.js */ "./node_modules/@vaadin/map/node_modules/ol/extent.js");
567
599
  /* harmony import */ var _featureloader_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../featureloader.js */ "./node_modules/@vaadin/map/node_modules/ol/featureloader.js");
568
600
  /* harmony import */ var _functions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../functions.js */ "./node_modules/@vaadin/map/node_modules/ol/functions.js");
@@ -644,11 +676,11 @@ class VectorSourceEvent extends _events_Event_js__WEBPACK_IMPORTED_MODULE_0__["d
644
676
  /***
645
677
  * @template Return
646
678
  * @template {import("../Feature.js").FeatureLike} [FeatureType=import("../Feature.js").default]
647
- * @typedef {import("../Observable").OnSignature<import("../Observable").EventTypes, import("../events/Event.js").default, Return> &
648
- * import("../Observable").OnSignature<import("../ObjectEventType").Types, import("../Object").ObjectEvent, Return> &
649
- * import("../Observable").OnSignature<import("./VectorEventType").VectorSourceEventTypes, VectorSourceEvent<FeatureType>, Return> &
650
- * import("../Observable").CombinedOnSignature<import("../Observable").EventTypes|import("../ObjectEventType").Types|
651
- * import("./VectorEventType").VectorSourceEventTypes, Return>} VectorSourceOnSignature
679
+ * @typedef {import("../Observable.js").OnSignature<import("../Observable.js").EventTypes, import("../events/Event.js").default, Return> &
680
+ * import("../Observable.js").OnSignature<import("../ObjectEventType.js").Types, import("../Object.js").ObjectEvent, Return> &
681
+ * import("../Observable.js").OnSignature<import("./VectorEventType.js").VectorSourceEventTypes, VectorSourceEvent<FeatureType>, Return> &
682
+ * import("../Observable.js").CombinedOnSignature<import("../Observable.js").EventTypes|import("../ObjectEventType.js").Types|
683
+ * import("./VectorEventType.js").VectorSourceEventTypes, Return>} VectorSourceOnSignature
652
684
  */
653
685
 
654
686
  /**
@@ -674,34 +706,31 @@ class VectorSourceEvent extends _events_Event_js__WEBPACK_IMPORTED_MODULE_0__["d
674
706
  * import {bbox} from 'ol/loadingstrategy.js';
675
707
  *
676
708
  * const vectorSource = new Vector({
677
- * format: new GeoJSON(),
678
- * loader: function(extent, resolution, projection, success, failure) {
679
- * const proj = projection.getCode();
709
+ * loader: async (extent, resolution, projection) => {
680
710
  * const url = 'https://ahocevar.com/geoserver/wfs?service=WFS&' +
681
711
  * 'version=1.1.0&request=GetFeature&typename=osm:water_areas&' +
682
- * 'outputFormat=application/json&srsname=' + proj + '&' +
683
- * 'bbox=' + extent.join(',') + ',' + proj;
684
- * const xhr = new XMLHttpRequest();
685
- * xhr.open('GET', url);
686
- * const onError = function() {
687
- * vectorSource.removeLoadedExtent(extent);
688
- * failure();
712
+ * 'outputFormat=application/json' +
713
+ * 'bbox=' + extent.join(',') + ',' + projection.getCode();
714
+ * const response = await fetch(url);
715
+ * if (!response.ok) {
716
+ * throw new Error('Network response was not ok');
689
717
  * }
690
- * xhr.onerror = onError;
691
- * xhr.onload = function() {
692
- * if (xhr.status == 200) {
693
- * const features = vectorSource.getFormat().readFeatures(xhr.responseText);
694
- * vectorSource.addFeatures(features);
695
- * success(features);
696
- * } else {
697
- * onError();
698
- * }
699
- * }
700
- * xhr.send();
718
+ * const json = await response.json();
719
+ * const features = new GeoJSON().readFeatures(json, {
720
+ * featureProjection: projection,
721
+ * });
722
+ * return features;
701
723
  * },
702
724
  * strategy: bbox,
703
725
  * });
704
726
  * ```
727
+ *
728
+ * When you want to retry a failed request, use
729
+ * ```js
730
+ * vectorSource.removeLoadedExtent(extent);
731
+ * vectorSource.changed();
732
+ * ```
733
+ *
705
734
  * @property {boolean} [overlaps=true] This source may have overlapping geometries.
706
735
  * Setting this to `false` (e.g. for sources with polygons that represent administrative
707
736
  * boundaries or TopoJSON sources) allows the renderer to optimise fill and
@@ -770,12 +799,12 @@ class VectorSource extends _Source_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
770
799
  });
771
800
 
772
801
  /***
773
- * @type {VectorSourceOnSignature<import("../events").EventsKey, FeatureType>}
802
+ * @type {VectorSourceOnSignature<import("../events.js").EventsKey, FeatureType>}
774
803
  */
775
804
  this.on;
776
805
 
777
806
  /***
778
- * @type {VectorSourceOnSignature<import("../events").EventsKey, FeatureType>}
807
+ * @type {VectorSourceOnSignature<import("../events.js").EventsKey, FeatureType>}
779
808
  */
780
809
  this.once;
781
810
 
@@ -838,12 +867,6 @@ class VectorSource extends _Source_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
838
867
  */
839
868
  this.loadedExtentsRtree_ = new _structs_RBush_js__WEBPACK_IMPORTED_MODULE_6__["default"]();
840
869
 
841
- /**
842
- * @type {number}
843
- * @private
844
- */
845
- this.loadingExtentsCount_ = 0;
846
-
847
870
  /**
848
871
  * @private
849
872
  * @type {!Object<string, FeatureType>}
@@ -1416,15 +1439,15 @@ class VectorSource extends _Source_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
1416
1439
  /**
1417
1440
  * Get the extent of the features currently in the source.
1418
1441
  *
1419
- * This method is not available when the source is configured with
1442
+ * This will return `null` when the source is configured with
1420
1443
  * `useSpatialIndex` set to `false`.
1421
1444
  * @param {import("../extent.js").Extent} [extent] Destination extent. If provided, no new extent
1422
1445
  * will be created. Instead, that extent's coordinates will be overwritten.
1423
- * @return {import("../extent.js").Extent} Extent.
1446
+ * @return {import("../extent.js").Extent | null} Extent.
1424
1447
  * @api
1425
1448
  */
1426
1449
  getExtent(extent) {
1427
- return this.featuresRtree_.getExtent(extent);
1450
+ return this.featuresRtree_?.getExtent(extent) ?? null;
1428
1451
  }
1429
1452
 
1430
1453
  /**
@@ -1540,7 +1563,11 @@ class VectorSource extends _Source_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
1540
1563
  hasFeature(feature) {
1541
1564
  const id = feature.getId();
1542
1565
  if (id !== undefined) {
1543
- return id in this.idIndex_;
1566
+ const indexed = this.idIndex_[String(id)];
1567
+ if (Array.isArray(indexed)) {
1568
+ return indexed.includes(feature);
1569
+ }
1570
+ return indexed === feature;
1544
1571
  }
1545
1572
  return (0,_util_js__WEBPACK_IMPORTED_MODULE_8__.getUid)(feature) in this.uidIndex_;
1546
1573
  }
@@ -1581,40 +1608,59 @@ class VectorSource extends _Source_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
1581
1608
  },
1582
1609
  );
1583
1610
  if (!alreadyLoaded) {
1584
- ++this.loadingExtentsCount_;
1611
+ this.loading = Number(this.loading) + 1;
1585
1612
  this.dispatchEvent(
1586
1613
  new VectorSourceEvent(_VectorEventType_js__WEBPACK_IMPORTED_MODULE_9__["default"].FEATURESLOADSTART),
1587
1614
  );
1588
- this.loader_.call(
1615
+
1616
+ /**
1617
+ * @param {Array<FeatureType>} features Loaded features
1618
+ */
1619
+ const success = (features) => {
1620
+ this.loading = Number(this.loading) - 1;
1621
+ this.dispatchEvent(
1622
+ new VectorSourceEvent(
1623
+ _VectorEventType_js__WEBPACK_IMPORTED_MODULE_9__["default"].FEATURESLOADEND,
1624
+ undefined,
1625
+ features,
1626
+ ),
1627
+ );
1628
+ };
1629
+
1630
+ const failure = () => {
1631
+ this.changed();
1632
+ this.loading = Number(this.loading) - 1;
1633
+ this.dispatchEvent(
1634
+ new VectorSourceEvent(_VectorEventType_js__WEBPACK_IMPORTED_MODULE_9__["default"].FEATURESLOADERROR),
1635
+ );
1636
+ };
1637
+
1638
+ //TODO Remove this when the deprecatedsuccess and failure arguments are removed
1639
+ let disableCallbacks = false;
1640
+
1641
+ const loaded = this.loader_.call(
1589
1642
  this,
1590
1643
  extentToLoad,
1591
1644
  resolution,
1592
1645
  projection,
1593
- /**
1594
- * @param {Array<FeatureType>} features Loaded features
1595
- */
1596
- (features) => {
1597
- --this.loadingExtentsCount_;
1598
- this.dispatchEvent(
1599
- new VectorSourceEvent(
1600
- _VectorEventType_js__WEBPACK_IMPORTED_MODULE_9__["default"].FEATURESLOADEND,
1601
- undefined,
1602
- features,
1603
- ),
1604
- );
1605
- },
1606
- () => {
1607
- --this.loadingExtentsCount_;
1608
- this.dispatchEvent(
1609
- new VectorSourceEvent(_VectorEventType_js__WEBPACK_IMPORTED_MODULE_9__["default"].FEATURESLOADERROR),
1610
- );
1611
- },
1646
+ (features) => disableCallbacks || success(features),
1647
+ () => disableCallbacks || failure(),
1612
1648
  );
1649
+ if (loaded instanceof Promise) {
1650
+ //TODO Remove this when the deprecatedsuccess and failure arguments are removed
1651
+ disableCallbacks = true;
1652
+ loaded
1653
+ .then((features) => {
1654
+ this.addFeatures(features);
1655
+ success(features);
1656
+ })
1657
+ .catch(failure);
1658
+ } else if (this.loader_.length < 4) {
1659
+ this.loading = false;
1660
+ }
1613
1661
  loadedExtentsRtree.insert(extentToLoad, {extent: extentToLoad.slice()});
1614
1662
  }
1615
1663
  }
1616
- this.loading =
1617
- this.loader_.length < 4 ? false : this.loadingExtentsCount_ > 0;
1618
1664
  }
1619
1665
 
1620
1666
  /**
@@ -1627,20 +1673,28 @@ class VectorSource extends _Source_js__WEBPACK_IMPORTED_MODULE_1__["default"] {
1627
1673
  }
1628
1674
 
1629
1675
  /**
1630
- * Remove an extent from the list of loaded extents.
1631
- * @param {import("../extent.js").Extent} extent Extent.
1676
+ * Marks an extent as not loaded, preserving any loaded areas outside it.
1677
+ *
1678
+ * Any previously loaded extent overlapping the given extent is split into its
1679
+ * remaining non-overlapping parts using {@link module:ol/extent~getDifference getDifference()},
1680
+ * which are then re-inserted into the tree.
1681
+ *
1682
+ * @param {import("../extent.js").Extent} extent Extent to mark as not loaded.
1632
1683
  * @api
1633
1684
  */
1634
1685
  removeLoadedExtent(extent) {
1635
1686
  const loadedExtentsRtree = this.loadedExtentsRtree_;
1636
- const obj = loadedExtentsRtree.forEachInExtent(extent, function (object) {
1637
- if ((0,_extent_js__WEBPACK_IMPORTED_MODULE_17__.equals)(object.extent, extent)) {
1638
- return object;
1687
+ const intersectingExtents = [];
1688
+ loadedExtentsRtree.forEachInExtent(extent, function (object) {
1689
+ intersectingExtents.push(object);
1690
+ });
1691
+ intersectingExtents.forEach((intersectingExtent) => {
1692
+ loadedExtentsRtree.remove(intersectingExtent);
1693
+ const remainders = (0,_extent_js__WEBPACK_IMPORTED_MODULE_17__.getDifference)(intersectingExtent.extent, extent);
1694
+ for (const remainder of remainders) {
1695
+ loadedExtentsRtree.insert(remainder, {extent: remainder});
1639
1696
  }
1640
1697
  });
1641
- if (obj) {
1642
- loadedExtentsRtree.remove(obj);
1643
- }
1644
1698
  }
1645
1699
 
1646
1700
  /**