From e8fcf93c8402d07e3ff229c388073e63f401e03d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Tue, 29 Jan 2019 17:02:35 +0100 Subject: [PATCH] Fix types in gmf objectediting --- .../datasource/ExternalDataSourcesManager.js | 4 +- contribs/gmf/src/editing/EditFeature.js | 6 +- contribs/gmf/src/objectediting/Manager.js | 15 ++-- contribs/gmf/src/objectediting/Query.js | 27 +++--- contribs/gmf/src/objectediting/component.js | 83 +++++++++---------- contribs/gmf/src/objectediting/coordinate.js | 68 +++++++++++++-- contribs/gmf/src/objectediting/geom.js | 26 +++--- .../objectediting/getWMSFeatureComponent.js | 6 +- contribs/gmf/src/theme/Themes.js | 2 +- package.json | 3 +- tsconfig.json | 1 + 11 files changed, 142 insertions(+), 99 deletions(-) diff --git a/contribs/gmf/src/datasource/ExternalDataSourcesManager.js b/contribs/gmf/src/datasource/ExternalDataSourcesManager.js index dfcf5838018e..541d2d32ce4a 100644 --- a/contribs/gmf/src/datasource/ExternalDataSourcesManager.js +++ b/contribs/gmf/src/datasource/ExternalDataSourcesManager.js @@ -679,11 +679,11 @@ export class ExternalDatSourcesManager { * using the `ol.getUid` method, plus a million. * * @param {!Object} layer WMS/WMTS Capability Layer object. - * @return {number} Data source id. + * @return {string} Data source id. * @export */ function getId(layer) { - return olUtilGetUid(layer) + 1000000; + return `${olUtilGetUid(layer)}+1000000`; } diff --git a/contribs/gmf/src/editing/EditFeature.js b/contribs/gmf/src/editing/EditFeature.js index e6175f80d43b..40908df88409 100644 --- a/contribs/gmf/src/editing/EditFeature.js +++ b/contribs/gmf/src/editing/EditFeature.js @@ -71,13 +71,11 @@ EditingEditFeature.prototype.getFeaturesInExtent = function(layerIds, extent) { * define the url to the GMF Protocol (layers) a dummy promise returns an * empty array of features if the url is not defined. * - * @param {!Array.} layerIds List of layer ids to get the features from. + * @param {!Array.} layerIds List of layer ids to get the features from. * @param {!Array.} filters List of comparison filters * @return {angular.IPromise} Promise. */ -EditingEditFeature.prototype.getFeaturesWithComparisonFilters = function( - layerIds, filters -) { +EditingEditFeature.prototype.getFeaturesWithComparisonFilters = function(layerIds, filters) { const properties = []; const params = {}; diff --git a/contribs/gmf/src/objectediting/Manager.js b/contribs/gmf/src/objectediting/Manager.js index d1eaa507eda8..18201c6e6cee 100644 --- a/contribs/gmf/src/objectediting/Manager.js +++ b/contribs/gmf/src/objectediting/Manager.js @@ -92,16 +92,11 @@ ObjecteditingManagerService.prototype.getFeature = function() { if (!this.getFeatureDefered_) { this.getFeatureDefered_ = this.q_.defer(); - const geomType = this.ngeoLocation_.getParam( - ObjecteditingParam.GEOM_TYPE); - const id = this.ngeoLocation_.getParam( - ObjecteditingParam.ID); - const layer = this.ngeoLocation_.getParam( - ObjecteditingParam.LAYER); - const property = this.ngeoLocation_.getParam( - ObjecteditingParam.PROPERTY); - const theme = this.ngeoLocation_.getParam( - ObjecteditingParam.THEME); + const geomType = this.ngeoLocation_.getParam(ObjecteditingParam.GEOM_TYPE); + const id = this.ngeoLocation_.getParam(ObjecteditingParam.ID); + const layer = this.ngeoLocation_.getParam(ObjecteditingParam.LAYER); + const property = this.ngeoLocation_.getParam(ObjecteditingParam.PROPERTY); + const theme = this.ngeoLocation_.getParam(ObjecteditingParam.THEME); if (geomType && id && layer && property && theme) { this.gmfEditFeature_.getFeaturesWithComparisonFilters( diff --git a/contribs/gmf/src/objectediting/Query.js b/contribs/gmf/src/objectediting/Query.js index 4cc2f8441901..a7e1bb710cf0 100644 --- a/contribs/gmf/src/objectediting/Query.js +++ b/contribs/gmf/src/objectediting/Query.js @@ -1,9 +1,10 @@ import angular from 'angular'; -import gmfThemeThemes from 'gmf/theme/Themes.js'; +import gmfThemeThemes, {getFlatNodes} from 'gmf/theme/Themes.js'; import {WMSInfoFormat} from 'ngeo/datasource/OGC.js'; import olFormatWMSGetFeatureInfo from 'ol/format/WMSGetFeatureInfo.js'; import olSourceImageWMS from 'ol/source/ImageWMS.js'; + /** * A service that collects all queryable layer nodes from all themes, stores * them and use them to make WMS GetFeatureInfo queries. Queries can be made @@ -90,7 +91,7 @@ ObjectEditingQuery.prototype.getQueryableLayersInfo = function() { * * @param {Array.} themes List of theme nodes. * @param {import('gmf/themes.js').GmfOgcServers} ogcServers List of ogc servers - * @return {Array.} List of + * @return {Array.} List of * queryable layers information. * @export */ @@ -101,7 +102,6 @@ function getQueryableLayersInfoFromThemes( let theme; let group; let nodes; - let node; for (let i = 0, ii = themes.length; i < ii; i++) { theme = /** @type {import('gmf/themes.js').GmfTheme} */ (themes[i]); @@ -114,23 +114,23 @@ function getQueryableLayersInfoFromThemes( } nodes = []; - gmfThemeThemes.getFlatNodes(group, nodes); + getFlatNodes(group, nodes); for (let k = 0, kk = nodes.length; k < kk; k++) { - node = /** @type {import('gmf/themes.js').GmfGroup|import('gmf/themes.js').GmfLayerWMS} */ ( - nodes[k]); - + const nodeGroup = /** @type {import('gmf/themes.js').GmfGroup} */ (nodes[k]); // Skip groups within groups - if (node.children && node.children.length) { + if (nodeGroup.children && nodeGroup.children.length) { continue; } - if (node.childLayers && - node.childLayers[0] && - node.childLayers[0].queryable + const nodeWMS = /** @type {import('gmf/themes.js').GmfLayerWMS} */ (nodes[k]); + + if (nodeWMS.childLayers && + nodeWMS.childLayers[0] && + nodeWMS.childLayers[0].queryable ) { queryableLayersInfo.push({ - layerNode: node, + layerNode: nodeWMS, ogcServer: ogcServers[group.ogcServer] }); } @@ -148,7 +148,7 @@ function getQueryableLayersInfoFromThemes( * specific map to fetch a single feature. If no feature is found, a `null` * value is returned. * - * @param {ObjectEditingQueryableLayerInfo} layerInfo Queryable layer + * @param {import('gmf/objectediting/toolsComponent.js').ObjectEditingQueryableLayerInfo} layerInfo Queryable layer * information. * @param {import("ol/coordinate.js").Coordinate} coordinate Coordinate. * @param {import("ol/Map.js").default} map Map. @@ -170,6 +170,7 @@ ObjectEditingQuery.prototype.getFeatureInfo = function(layerInfo, coordinate, ma const wmsSource = new olSourceImageWMS({ url: ogcServer.url, + projection: undefined, params: { layers: layersParam } diff --git a/contribs/gmf/src/objectediting/component.js b/contribs/gmf/src/objectediting/component.js index b9324300d937..c495be688ec1 100644 --- a/contribs/gmf/src/objectediting/component.js +++ b/contribs/gmf/src/objectediting/component.js @@ -1,6 +1,6 @@ import angular from 'angular'; import gmfEditingEditFeature from 'gmf/editing/EditFeature.js'; -import gmfLayertreeSyncLayertreeMap from 'gmf/layertree/SyncLayertreeMap.js'; +import gmfLayertreeSyncLayertreeMap, {getLayer as syncLayertreeMapGetLayer} from 'gmf/layertree/SyncLayertreeMap.js'; import gmfLayertreeTreeManager from 'gmf/layertree/TreeManager.js'; import {isEmpty, toXY} from 'gmf/objectediting/geom.js'; import gmfObjecteditingQuery from 'gmf/objectediting/Query.js'; @@ -28,12 +28,7 @@ import olStyleFill from 'ol/style/Fill.js'; import olStyleStroke from 'ol/style/Stroke.js'; import olStyleStyle from 'ol/style/Style.js'; -import {OL3Parser} from 'jsts/io'; -const jsts = { - io: { - OL3Parser, - }, -}; +import jsts from 'jsts'; /** @@ -50,6 +45,13 @@ const ObjecteditingState = { }; +/** + * @const + * @private + */ +export const NAMESPACE = 'oe'; + + /** * @type {!angular.IModule} */ @@ -233,13 +235,13 @@ function Controller($scope, $timeout, gettextCatalog, this.gmfObjectEditingQuery_ = gmfObjectEditingQuery; /** - * @type {Array.} + * @type {Array.} * @export */ this.queryableLayersInfo; /** - * @type {ObjectEditingQueryableLayerInfo} + * @type {import('gmf/objectediting/toolsComponent.js').ObjectEditingQueryableLayerInfo} * @export */ this.selectedQueryableLayerInfo; @@ -578,7 +580,7 @@ Controller.prototype.undo = function() { this.skipGeometryChange_ = true; this.geometryChanges_.pop(); - const clone = Controller.cloneGeometry_( + const clone = cloneGeometry( this.geometryChanges_[this.geometryChanges_.length - 1]); this.feature.setGeometry(clone); @@ -681,7 +683,7 @@ Controller.prototype.unregisterInteractions_ = function() { Controller.prototype.toggle_ = function(active) { const keys = this.listenerKeys_; - const uid = `${Controller.NAMESPACE_}-${olUtilGetUid(this)}`; + const uid = `${NAMESPACE}-${olUtilGetUid(this)}`; const toolMgr = this.ngeoToolActivateMgr_; if (active) { @@ -717,6 +719,7 @@ Controller.prototype.toggle_ = function(active) { olEvents.listen( window, 'beforeunload', + // @ts-ignore: strange API this.handleWindowBeforeUnload_, this ) @@ -758,7 +761,7 @@ Controller.prototype.toggle_ = function(active) { * @private */ Controller.prototype.undoAllChanges_ = function() { - const clone = Controller.cloneGeometry_( + const clone = cloneGeometry( this.geometryChanges_[0]); this.feature.setGeometry(clone); @@ -780,7 +783,7 @@ Controller.prototype.resetGeometryChanges_ = function() { } if (this.geometryChanges_.length === 0) { const geometry = this.feature.getGeometry(); - const clone = Controller.cloneGeometry_(geometry); + const clone = cloneGeometry(geometry); this.geometryChanges_.push(clone); } }; @@ -793,7 +796,7 @@ Controller.prototype.resetGeometryChanges_ = function() { * geometries intersects with one an other first. Those that does are merged * before being pushed to the changes. * - * @param {import("ol/interaction/Modify/Event.js").default} evt Event. + * @param {import("ol/interaction/Modify.js").ModifyEvent} evt Event. * @private */ Controller.prototype.handleModifyInteractionModifyEnd_ = function( @@ -803,14 +806,14 @@ Controller.prototype.handleModifyInteractionModifyEnd_ = function( if (geometry instanceof olGeomMultiPolygon) { const jstsGeom = this.jstsOL3Parser_.read(geometry); - const jstsBuffered = jstsGeom.buffer(0); + const jstsBuffered = jstsGeom.buffer(0, undefined, undefined); geometry = toMulti(this.jstsOL3Parser_.write(jstsBuffered)); this.skipGeometryChange_ = true; this.feature.setGeometry(geometry.clone()); this.skipGeometryChange_ = false; } - const clone = Controller.cloneGeometry_(geometry); + const clone = cloneGeometry(geometry); console.assert(clone); this.geometryChanges_.push(clone); this.scope_.$apply(); @@ -841,14 +844,14 @@ Controller.prototype.initializeStyles_ = function( fill: new olStyleFill({color: rgbaColor}) }); - styles['Point'] = new olStyleStyle({ + styles.Point = new olStyleStyle({ image }); - styles['MultiPoint'] = new olStyleStyle({ + styles.MultiPoint = new olStyleStyle({ image }); - styles['LineString'] = [ + styles.LineString = [ new olStyleStyle({ stroke: new olStyleStroke({ color: color, @@ -857,11 +860,11 @@ Controller.prototype.initializeStyles_ = function( }) ]; if (incVertice) { - styles['LineString'].push( + styles.LineString.push( this.ngeoFeatureHelper_.getVertexStyle(true) ); } - styles['MultiLineString'] = [ + styles.MultiLineString = [ new olStyleStyle({ stroke: new olStyleStroke({ color: color, @@ -870,12 +873,12 @@ Controller.prototype.initializeStyles_ = function( }) ]; if (incVertice) { - styles['MultiLineString'].push( + styles.MultiLineString.push( this.ngeoFeatureHelper_.getVertexStyle(true) ); } - styles['Polygon'] = [ + styles.Polygon = [ new olStyleStyle({ stroke: new olStyleStroke({ color: color, @@ -887,11 +890,11 @@ Controller.prototype.initializeStyles_ = function( }) ]; if (incVertice) { - styles['Polygon'].push( + styles.Polygon.push( this.ngeoFeatureHelper_.getVertexStyle(true) ); } - styles['MultiPolygon'] = [ + styles.MultiPolygon = [ new olStyleStyle({ stroke: new olStyleStroke({ color: color, @@ -903,7 +906,7 @@ Controller.prototype.initializeStyles_ = function( }) ]; if (incVertice) { - styles['MultiPolygon'].push( + styles.MultiPolygon.push( this.ngeoFeatureHelper_.getVertexStyle(true) ); } @@ -957,18 +960,18 @@ Controller.prototype.setFeatureStyle_ = function() { Controller.prototype.registerTreeCtrl_ = function(treeCtrl) { // Skip any Layertree controller that has a node that is not a leaf - const node = /** @type {import('gmf/themes.js').GmfGroup|import('gmf/themes.js').GmfLayer} */ ( - treeCtrl.node); - if (node.children && node.children.length) { + const nodeGroup = /** @type {import('gmf/themes.js').GmfGroup} */ (treeCtrl.node); + if (nodeGroup.children && nodeGroup.children.length) { return; } + const nodeLayer = /** @type {import('gmf/themes.js').GmfLayer} */ (treeCtrl.node); // Set editable WMS layer for refresh purpose - if (node.id === this.layerNodeId) { - const layer = gmfLayertreeSyncLayertreeMap.getLayer(treeCtrl); - console.assert( - layer instanceof olLayerImage || layer instanceof olLayerTile); - this.editableWMSLayer_ = layer; + if (nodeLayer.id === this.layerNodeId) { + const layer = syncLayertreeMapGetLayer(treeCtrl); + if (layer instanceof olLayerImage || layer instanceof olLayerTile) { + this.editableWMSLayer_ = layer; + } } }; @@ -1009,6 +1012,7 @@ Controller.prototype.handleWindowBeforeUnload_ = function(e) { const gettextCatalog = this.gettextCatalog_; if (this.dirty) { const msg = gettextCatalog.getString('There are unsaved changes.'); + // @ts-ignore: strange API (e || window.event).returnValue = msg; return msg; } @@ -1094,7 +1098,7 @@ Controller.prototype.handleFeatureGeometryChange_ = function() { /** - * @param {Array.} layersInfo List + * @param {Array.} layersInfo List * of queryable layers information, which contains the node and ogcServer. * @private */ @@ -1128,7 +1132,7 @@ Controller.prototype.handleDestroy_ = function() { * @return {?import("ol/geom/Geometry.js").default} A geometry clone or null value. * @private */ -export function cloneGeometry(geometry) { +function cloneGeometry(geometry) { let clone = null; if (geometry) { clone = geometry.clone(); @@ -1137,13 +1141,6 @@ export function cloneGeometry(geometry) { } -/** - * @const - * @private - */ -export const NAMESPACE = 'oe'; - - module.controller('GmfObjecteditingController', Controller); diff --git a/contribs/gmf/src/objectediting/coordinate.js b/contribs/gmf/src/objectediting/coordinate.js index 136564de8d2a..b5caf284b02f 100644 --- a/contribs/gmf/src/objectediting/coordinate.js +++ b/contribs/gmf/src/objectediting/coordinate.js @@ -1,20 +1,76 @@ +/** + * @typedef {import("ol/coordinate.js").Coordinate} Coordinate + */ + + +/** + * Convert a given coordinate or list of coordinates of any 'nesting' level + * to XY, i.e. remove any extra dimensions to the coordinates and keep only 2. + * + * @param {Coordinate} coordinates Coordinates + * @return {Coordinate} Converted coordinates. + */ +export function coordinatesToXY0(coordinates) { + if (coordinates.length > 2) { + const coord = /** @type{import("ol/coordinate.js").Coordinate} */(coordinates); + return [coord[0], coord[1]]; + } +} + + /** * Convert a given coordinate or list of coordinates of any 'nesting' level * to XY, i.e. remove any extra dimensions to the coordinates and keep only 2. * - * @param {Array.|import("ol/coordinate.js").Coordinate} coordinates Coordinates + * @template {number|Coordinate|Array|Array>} T + * @param {Array} coordinates Coordinates * @param {number} nesting Nesting level. - * @return {Array.|import("ol/coordinate.js").Coordinate} Converted coordinates. + * @return {Array} Converted coordinates. */ -export function toXY(coordinates, nesting) { +function toXY(coordinates, nesting) { if (nesting === 0) { - if (coordinates.length > 2) { - coordinates = [coordinates[0], coordinates[1]]; - } + return /** @type {Array} */(coordinatesToXY0(/** @type {Coordinate} */(coordinates))); } else { for (let i = 0, ii = coordinates.length; i < ii; i++) { + // @ts-ignore: TypeScript is not able to do recurtion with deferent type in generic coordinates[i] = toXY(coordinates[i], nesting - 1); } } return coordinates; } + + +/** + * Convert a given coordinate or list of coordinates of any 'nesting' level + * to XY, i.e. remove any extra dimensions to the coordinates and keep only 2. + * + * @param {Array} coordinates Coordinates + * @return {Array} Converted coordinates. + */ +export function coordinatesToXY1(coordinates) { + return toXY(coordinates, 1); +} + + +/** + * Convert a given coordinate or list of coordinates of any 'nesting' level + * to XY, i.e. remove any extra dimensions to the coordinates and keep only 2. + * + * @param {Array>} coordinates Coordinates + * @return {Array>} Converted coordinates. + */ +export function coordinatesToXY2(coordinates) { + return toXY(coordinates, 2); +} + + +/** + * Convert a given coordinate or list of coordinates of any 'nesting' level + * to XY, i.e. remove any extra dimensions to the coordinates and keep only 2. + * + * @param {Array>>} coordinates Coordinates + * @return {Array>>} Converted coordinates. + */ +export function coordinatesToXY3(coordinates) { + return toXY(coordinates, 3); +} diff --git a/contribs/gmf/src/objectediting/geom.js b/contribs/gmf/src/objectediting/geom.js index 9ffc1c5d3f58..09f552b102b6 100644 --- a/contribs/gmf/src/objectediting/geom.js +++ b/contribs/gmf/src/objectediting/geom.js @@ -1,4 +1,4 @@ -import {toXY as coordinateToXY} from 'gmf/objectediting/coordinate.js'; +import {coordinatesToXY0, coordinatesToXY1, coordinatesToXY2, coordinatesToXY3} from 'gmf/objectediting/coordinate.js'; import olGeomLineString from 'ol/geom/LineString.js'; import olGeomMultiLineString from 'ol/geom/MultiLineString.js'; import olGeomMultiPoint from 'ol/geom/MultiPoint.js'; @@ -35,21 +35,17 @@ export function isEmpty(geom) { */ export function toXY(geom) { if (geom instanceof olGeomPoint) { - geom.setCoordinates(coordinateToXY(geom.getCoordinates(), 0) - ); - } else if (geom instanceof olGeomMultiPoint || - geom instanceof olGeomLineString - ) { - geom.setCoordinates(coordinateToXY(geom.getCoordinates(), 1) - ); - } else if (geom instanceof olGeomMultiLineString || - geom instanceof olGeomPolygon - ) { - geom.setCoordinates(coordinateToXY(geom.getCoordinates(), 2) - ); + geom.setCoordinates(coordinatesToXY0(geom.getCoordinates())); + } else if (geom instanceof olGeomMultiPoint) { + geom.setCoordinates(coordinatesToXY1(geom.getCoordinates())); + } else if (geom instanceof olGeomLineString) { + geom.setCoordinates(coordinatesToXY1(geom.getCoordinates())); + } else if (geom instanceof olGeomMultiLineString) { + geom.setCoordinates(coordinatesToXY2(geom.getCoordinates())); + } else if (geom instanceof olGeomPolygon) { + geom.setCoordinates(coordinatesToXY2(geom.getCoordinates())); } else if (geom instanceof olGeomMultiPolygon) { - geom.setCoordinates(coordinateToXY(geom.getCoordinates(), 3) - ); + geom.setCoordinates(coordinatesToXY3(geom.getCoordinates())); } else { throw 'gmf.objectediting.geom.toXY - unsupported geometry type'; } diff --git a/contribs/gmf/src/objectediting/getWMSFeatureComponent.js b/contribs/gmf/src/objectediting/getWMSFeatureComponent.js index bcc3f44f0a78..0bec77a0d1e3 100644 --- a/contribs/gmf/src/objectediting/getWMSFeatureComponent.js +++ b/contribs/gmf/src/objectediting/getWMSFeatureComponent.js @@ -1,5 +1,3 @@ -/** - */ import angular from 'angular'; import gmfObjecteditingQuery from 'gmf/objectediting/Query.js'; import * as olEvents from 'ol/events.js'; @@ -30,7 +28,7 @@ const module = angular.module('gmfObjecteditingGetWMSFeatureComponent', [ * directive is active or not. * @htmlAttribute {import("ol/Collection.js").default} gmf-objecteditinggetwmsfeature-features * The collection of features where to add those created by this directive. - * @htmlAttribute {ObjectEditingQueryableLayerInfo} gmf-objecteditinggetwmsfeature-layerinfo Queryable layer info. + * @htmlAttribute {import('gmf/objectediting/toolsComponent.js').ObjectEditingQueryableLayerInfo} gmf-objecteditinggetwmsfeature-layerinfo Queryable layer info. * @htmlAttribute {import("ol/Map.js").default} gmf-objecteditinggetwmsfeature-map The map. * @return {angular.IDirective} The directive specs. * @ngInject @@ -85,7 +83,7 @@ function Controller($scope, gmfObjectEditingQuery) { this.features; /** - * @type {ObjectEditingQueryableLayerInfo} + * @type {import('gmf/objectediting/toolsComponent.js').ObjectEditingQueryableLayerInfo} * @export */ this.layerInfo; diff --git a/contribs/gmf/src/theme/Themes.js b/contribs/gmf/src/theme/Themes.js index 1777b915f2cc..8d7b967b5f7b 100644 --- a/contribs/gmf/src/theme/Themes.js +++ b/contribs/gmf/src/theme/Themes.js @@ -505,7 +505,7 @@ function getFlatInternalNodes(node, nodes) { * @param {import('gmf/themes.js').GmfGroup|import('gmf/themes.js').GmfLayer} node Layertree node. * @param {Array.} nodes An array. */ -function getFlatNodes(node, nodes) { +export function getFlatNodes(node, nodes) { // @ts-ignore: children only on GmfGroup const children = node.children; if (children !== undefined) { diff --git a/package.json b/package.json index 7b24b8caacc9..4bae849e91a1 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@geoblocks/proj": "0.3.0", "@openlayers/eslint-plugin": "4.0.0-beta.2", "@types/angular": "1.6.53", - "@types/angular-animate": "^1.5.10", + "@types/angular-animate": "1.5.10", "@types/angular-gettext": "2.1.34", "@types/bootstrap": "4.2.1", "@types/cesium": "1.47.3", @@ -47,6 +47,7 @@ "@types/jquery": "3.3.29", "@types/jquery.ui.datetimepicker": "0.3.29", "@types/jqueryui": "1.12.6", + "@types/jsts": "0.17.0", "@types/proj4": "2.5.0", "@types/typeahead": "0.11.32", "angular": "1.7.6", diff --git a/tsconfig.json b/tsconfig.json index ddd11d51d4ea..2869602dd16d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,6 +19,7 @@ "olcs/*": ["node_modules/ol-cesium/src/olcs/*"], "@geoblocks/proj/*": ["node_modules/@geoblocks/proj/*"], "moment": ["node_modules/moment/moment.d.ts"], + "jsts/*": ["node_modules/@types/jsts/index.d.ts"], } }, "include": [