@ng-maps/google
Version:
**@ng-maps/google** is a simple, modular and tree-shakable library for displaying google-maps inside an angular application
1 lines • 78 kB
Source Map (JSON)
{"version":3,"file":"ng-maps-google.mjs","sources":["../../../../libs/google/src/lib/google-maps-api-wrapper.ts","../../../../libs/google/src/lib/util/is-valid-marker-icon.ts","../../../../libs/google/src/lib/managers/marker.manager.ts","../../../../libs/google/src/lib/managers/circle.manager.ts","../../../../libs/google/src/lib/managers/polygon.manager.ts","../../../../libs/google/src/lib/managers/polyline.manager.ts","../../../../libs/google/src/lib/managers/rectangle.manager.ts","../../../../libs/google/src/lib/managers/info-window.manager.ts","../../../../libs/google/src/lib/google-maps-fit-bounds.service.ts","../../../../libs/google/src/lib/google.component.ts","../../../../libs/google/src/lib/options.ts","../../../../libs/google/src/lib/google-maps-script-loader.service.ts","../../../../libs/google/src/lib/google.module.ts","../../../../libs/google/src/public-api.ts","../../../../libs/google/src/ng-maps-google.ts"],"sourcesContent":["import { Injectable, NgZone } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport {\n BoundsLiteral,\n CircleOptions,\n GeoPoint,\n MapOptions,\n MapsAPILoader,\n MapsApiWrapper,\n MarkerOptions,\n RectangleOptions,\n} from '@ng-maps/core';\n\n/**\n * Wrapper class that handles the communication with the Google Maps Javascript\n * API v3\n */\n@Injectable()\nexport class GoogleMapsAPIWrapper extends MapsApiWrapper<\n google.maps.Map,\n google.maps.Circle,\n google.maps.Rectangle\n> {\n constructor(_loader: MapsAPILoader, _zone: NgZone) {\n super(_loader, _zone);\n }\n\n protected override _api?: Promise<google.maps.Map>;\n protected override _mapResolver?: (value: google.maps.Map) => void;\n\n public createMap(\n el: HTMLElement,\n center: GeoPoint,\n options: MapOptions,\n ): Promise<void> {\n return this._zone.runOutsideAngular(async () => {\n await this._loader.load();\n if (this._mapResolver) {\n this._mapResolver(new google.maps.Map(el, { center, ...options }));\n }\n return;\n });\n }\n\n public async setMapOptions(options: google.maps.MapOptions) {\n const map = await this._api;\n map?.setOptions(options);\n }\n\n /**\n * Creates a google map drawing manager with the map context\n */\n public async createDrawingManager(\n options: google.maps.drawing.DrawingManagerOptions = {},\n addToMap: boolean = true,\n ): Promise<google.maps.drawing.DrawingManager> {\n const map = await this._api;\n if (addToMap) {\n options.map = map;\n }\n return new google.maps.drawing.DrawingManager(options);\n }\n\n /**\n * Creates a google map marker with the map context\n */\n public async createMarker(\n position: GeoPoint,\n options: MarkerOptions,\n addToMap: boolean = true,\n ): Promise<google.maps.Marker> {\n const map = addToMap ? await this._api : null;\n return new google.maps.Marker({ position, map, ...options });\n }\n\n public async createInfoWindow(\n position: GeoPoint | null,\n options?: google.maps.InfoWindowOptions,\n ): Promise<google.maps.InfoWindow> {\n await this._api;\n if (position === null) {\n return new google.maps.InfoWindow({ ...options });\n } else {\n return new google.maps.InfoWindow({ position: position, ...options });\n }\n }\n\n /**\n * Creates a google.map.Circle for the current map.\n *\n * @todo check how to improve type casting\n */\n public async createCircle(\n center: GeoPoint,\n options: CircleOptions,\n ): Promise<google.maps.Circle> {\n const opt: google.maps.CircleOptions = {\n ...options,\n center,\n map: await this._api,\n };\n if (typeof opt.strokePosition === 'string') {\n opt.strokePosition = google.maps.StrokePosition[\n opt.strokePosition\n ] as any as google.maps.StrokePosition;\n }\n return new google.maps.Circle(opt);\n }\n\n /**\n * Creates a google.map.Rectangle for the current map.\n */\n public async createRectangle(\n bounds: BoundsLiteral,\n options: RectangleOptions,\n ): Promise<google.maps.Rectangle> {\n const map = await this._api;\n return new google.maps.Rectangle({\n ...options,\n bounds,\n map,\n });\n }\n\n public async createPolyline(\n options: google.maps.PolylineOptions,\n ): Promise<google.maps.Polyline> {\n return this.getNativeMap().then((map) => {\n const line = new google.maps.Polyline(options);\n if (map) {\n line.setMap(map);\n }\n return line;\n });\n }\n\n public createPolygon(\n options: google.maps.PolygonOptions,\n ): Promise<google.maps.Polygon> {\n return this.getNativeMap().then((map) => {\n const polygon = new google.maps.Polygon(options);\n if (map) {\n polygon.setMap(map);\n }\n return polygon;\n });\n }\n\n /**\n * Creates a new google.map.Data layer for the current map\n */\n public async createDataLayer(\n options?: google.maps.Data.DataOptions,\n ): Promise<google.maps.Data | undefined> {\n return this._api?.then((m) => {\n const data = new google.maps.Data(options);\n data.setMap(m);\n return data;\n });\n }\n\n /**\n * Determines if given coordinates are insite a Polygon path.\n */\n public containsLocation(\n latLng: google.maps.LatLng,\n polygon: google.maps.Polygon,\n ): boolean {\n return google.maps.geometry.poly.containsLocation(latLng, polygon);\n }\n\n /**\n * @fixme typings\n */\n public subscribeToMapEvent(eventName: string): Observable<any> {\n return new Observable((observer) => {\n this._api?.then((m) =>\n m.addListener(eventName, (...evArgs: Array<any>) =>\n this._zone.run(() => observer.next(evArgs)),\n ),\n );\n });\n }\n\n public clearInstanceListeners() {\n this._api?.then((map: google.maps.Map) => {\n google.maps.event.clearInstanceListeners(map);\n });\n }\n\n public async setCenter(latLng: google.maps.LatLngLiteral): Promise<void> {\n return this._api?.then((map: google.maps.Map) => map.setCenter(latLng));\n }\n\n public async getZoom(): Promise<number | undefined> {\n const map = await this._api;\n return map?.getZoom();\n }\n\n public async getBounds(): Promise<BoundsLiteral | undefined> {\n const map = await this._api;\n return map?.getBounds()?.toJSON();\n }\n\n public async getMapTypeId(): Promise<\n google.maps.MapTypeId | string | undefined\n > {\n return this._api?.then((map) => map.getMapTypeId());\n }\n\n public async setZoom(zoom: number): Promise<void> {\n this._api?.then((map) => map.setZoom(zoom));\n }\n\n public async getCenter(): Promise<GeoPoint | undefined> {\n const map = await this._api;\n return map?.getCenter()?.toJSON();\n }\n\n public async panTo(\n latLng: google.maps.LatLng | google.maps.LatLngLiteral,\n ): Promise<void> {\n this._api?.then((map) => map.panTo(latLng));\n }\n\n public async panBy(x: number, y: number): Promise<void> {\n this._api?.then((map) => map.panBy(x, y));\n }\n\n public async fitBounds(\n latLng: BoundsLiteral,\n padding?: number | google.maps.Padding,\n ): Promise<void> {\n const map = await this._api;\n map?.fitBounds(latLng, padding);\n }\n\n public async panToBounds(\n latLng: BoundsLiteral,\n padding?: number | google.maps.Padding,\n ): Promise<void> {\n const map = await this._api;\n return map?.panToBounds(latLng, padding);\n }\n\n /**\n * Triggers the given event name on the map instance.\n */\n public async triggerMapEvent(eventName: string): Promise<void> {\n const map = await this._api;\n if (map) {\n google.maps.event.trigger(map, eventName);\n }\n }\n\n protected _isLatLngBoundsLiteral(\n bounds: google.maps.LatLngBounds | google.maps.LatLngBoundsLiteral,\n ): bounds is google.maps.LatLngBoundsLiteral {\n return bounds != null && (bounds as any).extend === undefined;\n }\n}\n","export function isValidMarkerIcon(\n marker: unknown,\n): marker is string | google.maps.Icon | null | google.maps.Symbol {\n if (marker === null) {\n return true;\n } else if (typeof marker === 'string') {\n return true;\n } else if (typeof marker === 'object' && Object.hasOwn(marker, 'url')) {\n return true;\n } else if (typeof marker === 'object' && Object.hasOwn(marker, 'path')) {\n return true;\n } else {\n return false;\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { Observable, Observer } from 'rxjs';\n\nimport {\n MapsApiWrapper,\n MarkerManager,\n NgMapsMarkerComponent,\n} from '@ng-maps/core';\n\nimport { isValidMarkerIcon } from '../util/is-valid-marker-icon';\n\n@Injectable()\nexport class GoogleMapsMarkerManager extends MarkerManager<google.maps.Marker> {\n protected override _markers: Map<NgMapsMarkerComponent, google.maps.Marker> =\n new Map<NgMapsMarkerComponent, google.maps.Marker>();\n\n constructor(_mapsWrapper: MapsApiWrapper, _zone: NgZone) {\n super(_mapsWrapper, _zone);\n }\n\n public deleteMarker(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n if (m == null) {\n // marker already deleted\n return;\n } else {\n return this._zone.run(() => {\n m.setMap(null);\n this._markers.delete(marker);\n });\n }\n }\n\n public updateMarkerPosition(marker: NgMapsMarkerComponent): void {\n if (\n typeof marker.latitude !== 'number' ||\n typeof marker.longitude !== 'number'\n ) {\n return;\n }\n const m = this._markers.get(marker);\n m?.setPosition({ lat: marker.latitude, lng: marker.longitude });\n }\n\n public updateTitle(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n m?.setTitle(marker.title);\n }\n\n public updateLabel(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n m?.setLabel(marker.label);\n }\n\n public updateDraggable(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n m?.setDraggable(marker.draggable);\n }\n\n public updateIconLegacy(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n m?.setIcon(marker.iconUrl);\n }\n\n public updateOpacity(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n m?.setOpacity(marker.opacity);\n }\n\n public updateVisible(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n m?.setVisible(marker.visible);\n }\n\n public updateZIndex(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n m?.setZIndex(marker.zIndex);\n }\n\n public updateClickable(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n m?.setClickable(marker.clickable);\n }\n\n public updateAnimation(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n if (typeof marker.animation === 'string') {\n m?.setAnimation(google.maps.Animation[marker.animation]);\n } else {\n m?.setAnimation(marker.animation);\n }\n }\n\n public createEventObservable<T>(\n eventName: string | Array<string>,\n marker: NgMapsMarkerComponent,\n ): Observable<T> {\n return new Observable((observer: Observer<T>) => {\n const m = this._markers.get(marker);\n if (typeof eventName === 'string') {\n eventName = [eventName];\n }\n eventName.forEach((event) => {\n m?.addListener(event, (e: T) => this._zone.run(() => observer.next(e)));\n });\n });\n }\n\n public updateIcon(marker: NgMapsMarkerComponent): void {\n const m = this._markers.get(marker);\n if (m && isValidMarkerIcon(marker.icon)) {\n m.setIcon(marker.icon);\n }\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { Observable, Observer } from 'rxjs';\n\nimport {\n BoundsLiteral,\n CircleManager,\n GeoPoint,\n MapsApiWrapper,\n NgMapsCircleDirective,\n} from '@ng-maps/core';\n\n@Injectable()\nexport class GoogleCircleManager extends CircleManager<google.maps.Circle> {\n constructor(_mapsWrapper: MapsApiWrapper, _zone: NgZone) {\n super(_mapsWrapper, _zone);\n }\n\n /**\n * @fixme implement commented properties\n */\n public async addCircle(circle: NgMapsCircleDirective) {\n if (!circle.latitude || !circle.longitude) {\n return;\n }\n this._circles.set(\n circle,\n this._apiWrapper.createCircle(\n { lat: circle.latitude, lng: circle.longitude },\n {\n // clickable: circle.clickable,\n // draggable: circle.draggable,\n // editable: circle.editable,\n fillColor: circle.fillColor,\n fillOpacity: circle.fillOpacity,\n radius: circle.radius,\n strokeColor: circle.strokeColor,\n strokeOpacity: circle.strokeOpacity,\n // strokePosition: circle.strokePosition,\n strokeWeight: circle.strokeWeight,\n visible: circle.visible,\n zIndex: circle.zIndex,\n },\n ),\n );\n }\n\n /**\n * Removes the given circle from the map.\n */\n public async removeCircle(circle: NgMapsCircleDirective): Promise<void> {\n const c = await this._circles.get(circle);\n c?.setMap(null);\n this._circles.delete(circle);\n }\n\n /**\n * @todo check how to improve type casting\n * @param circle instance of {@link NgMapsCircleDirective}\n * @param options options for the circle\n */\n public async setOptions(\n circle: NgMapsCircleDirective,\n options: google.maps.CircleOptions,\n ): Promise<void> {\n const c = await this._circles.get(circle);\n\n if (typeof options.strokePosition === 'string') {\n options.strokePosition = google.maps.StrokePosition[\n options.strokePosition\n ] as any as google.maps.StrokePosition;\n }\n return c?.setOptions(options);\n }\n\n public async getBounds(\n circle: NgMapsCircleDirective,\n ): Promise<BoundsLiteral | null> {\n const c = await this._circles.get(circle);\n if (!c) {\n return null;\n }\n const bounds = c.getBounds();\n return bounds ? bounds.toJSON() : null;\n }\n\n public async getCenter(\n circle: NgMapsCircleDirective,\n ): Promise<GeoPoint | null> {\n const c = await this._circles.get(circle);\n const center = c?.getCenter();\n return center ? center.toJSON() : null;\n }\n\n public async getRadius(\n circle: NgMapsCircleDirective,\n ): Promise<number | null> {\n const c = await this._circles.get(circle);\n return c?.getRadius() ?? null;\n }\n\n public async setCenter(circle: NgMapsCircleDirective): Promise<void> {\n if (!circle.latitude || !circle.longitude) {\n return;\n }\n const c = await this._circles.get(circle);\n c?.setCenter({ lat: circle.latitude, lng: circle.longitude });\n }\n\n public async setEditable(circle: NgMapsCircleDirective): Promise<void> {\n const c = await this._circles.get(circle);\n c?.setEditable(circle.editable);\n }\n\n public async setDraggable(circle: NgMapsCircleDirective): Promise<void> {\n const c = await this._circles.get(circle);\n c?.setDraggable(circle.draggable);\n }\n\n public async setVisible(circle: NgMapsCircleDirective): Promise<void> {\n const c = await this._circles.get(circle);\n c?.setVisible(circle.visible);\n }\n\n public async setRadius(circle: NgMapsCircleDirective): Promise<void> {\n const c = await this._circles.get(circle);\n c?.setRadius(circle.radius);\n }\n\n public createEventObservable<T>(\n eventName: string,\n circle: NgMapsCircleDirective,\n ): Observable<T> {\n return new Observable((observer: Observer<T>) => {\n let listener: google.maps.MapsEventListener | null = null;\n this._circles?.get(circle)?.then((c) => {\n listener = c.addListener(eventName, (e: T) =>\n this._zone.run(() => observer.next(e)),\n );\n });\n\n return () => {\n if (listener !== null) {\n listener.remove();\n }\n };\n });\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { Observable, Observer } from 'rxjs';\n\nimport {\n MapsApiWrapper,\n NgMapsPolygonDirective,\n PolygonManager,\n} from '@ng-maps/core';\n\n@Injectable()\nexport class GooglePolygonManager extends PolygonManager<google.maps.Polygon> {\n constructor(_mapsWrapper: MapsApiWrapper, _zone: NgZone) {\n super(_mapsWrapper, _zone);\n }\n\n public addPolygon(path: NgMapsPolygonDirective) {\n const polygonPromise = this._mapsWrapper.createPolygon({\n clickable: path.clickable,\n draggable: path.draggable,\n editable: path.editable,\n fillColor: path.fillColor,\n fillOpacity: path.fillOpacity,\n geodesic: path.geodesic,\n paths: path.paths,\n strokeColor: path.strokeColor,\n strokeOpacity: path.strokeOpacity,\n strokeWeight: path.strokeWeight,\n visible: path.visible,\n zIndex: path.zIndex,\n });\n this._polygons.set(path, polygonPromise);\n }\n\n public async updatePolygon(polygon: NgMapsPolygonDirective): Promise<void> {\n const item = await this._polygons.get(polygon);\n if (item != null) {\n this._zone.run(() => {\n item.setPaths(polygon.paths);\n });\n }\n }\n\n public async setPolygonOptions(\n path: NgMapsPolygonDirective,\n options: { [propName: string]: any },\n ): Promise<void> {\n const l = await this._polygons.get(path);\n l?.setOptions(options);\n }\n\n public deletePolygon(paths: NgMapsPolygonDirective): Promise<void> {\n const m = this._polygons.get(paths);\n if (m == null) {\n return Promise.resolve();\n }\n return m.then((l: google.maps.Polygon) =>\n this._zone.run(() => {\n l.setMap(null);\n this._polygons.delete(paths);\n }),\n );\n }\n\n public createEventObservable<T>(\n eventName: string,\n path: NgMapsPolygonDirective,\n ): Observable<T> {\n return new Observable((observer: Observer<T>) => {\n this._polygons.get(path)?.then((l: google.maps.Polygon) => {\n l.addListener(eventName, (e: T) =>\n this._zone.run(() => observer.next(e)),\n );\n });\n });\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { Observable, Observer } from 'rxjs';\n\nimport {\n MapsApiWrapper,\n NgMapsPolyline,\n NgMapsPolylinePoint,\n PolylineManager,\n} from '@ng-maps/core';\n\n@Injectable()\nexport class GooglePolylineManager extends PolylineManager<google.maps.Polyline> {\n constructor(_mapsWrapper: MapsApiWrapper, _zone: NgZone) {\n super(_mapsWrapper, _zone);\n }\n\n protected override _convertPoints(\n line: NgMapsPolyline,\n ): Array<google.maps.LatLngLiteral> {\n return line._getPoints().map(\n (point: NgMapsPolylinePoint) =>\n ({\n lat: point.latitude,\n lng: point.longitude,\n } as google.maps.LatLngLiteral),\n );\n }\n\n public addPolyline(line: NgMapsPolyline) {\n const path = this._convertPoints(line);\n const polylinePromise = this._mapsWrapper.createPolyline({\n clickable: line.clickable,\n draggable: line.draggable,\n editable: line.editable,\n geodesic: line.geodesic,\n strokeColor: line.strokeColor,\n strokeOpacity: line.strokeOpacity,\n strokeWeight: line.strokeWeight,\n visible: line.visible,\n zIndex: line.zIndex,\n icons: line.icons,\n path,\n });\n this._polylines.set(line, polylinePromise);\n }\n\n public updatePolylinePoints(line: NgMapsPolyline): Promise<void> {\n const path = this._convertPoints(line);\n const m = this._polylines.get(line);\n if (m == null) {\n return Promise.resolve();\n }\n return m.then((l: google.maps.Polyline) =>\n this._zone.run(() => {\n l.setPath(path);\n }),\n );\n }\n\n public async setPolylineOptions(\n line: NgMapsPolyline,\n options: { [propName: string]: any },\n ): Promise<void> {\n const l = await this._polylines.get(line);\n l?.setOptions(options);\n }\n\n public deletePolyline(line: NgMapsPolyline): Promise<void> {\n const m = this._polylines.get(line);\n if (m == null) {\n return Promise.resolve();\n }\n return m.then((l: google.maps.Polyline) =>\n this._zone.run(() => {\n l.setMap(null);\n this._polylines.delete(line);\n }),\n );\n }\n\n public createEventObservable<T>(\n eventName: string,\n line: NgMapsPolyline,\n ): Observable<T> {\n return new Observable((observer: Observer<T>) => {\n this._polylines.get(line)?.then((l: google.maps.Polyline) => {\n l.addListener(eventName, (e: T) =>\n this._zone.run(() => observer.next(e)),\n );\n });\n });\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { Observable, Observer } from 'rxjs';\n\nimport {\n BoundsLiteral,\n MapsApiWrapper,\n NgMapsRectangleDirective,\n RectangleManager,\n} from '@ng-maps/core';\n\n@Injectable()\nexport class GoogleRectangleManager extends RectangleManager<google.maps.Rectangle> {\n constructor(_mapsWrapper: MapsApiWrapper, _zone: NgZone) {\n super(_mapsWrapper, _zone);\n }\n\n public addRectangle(rectangle: NgMapsRectangleDirective) {\n if (\n !rectangle.north ||\n !rectangle.east ||\n !rectangle.south ||\n !rectangle.west\n ) {\n return;\n }\n\n this._rectangles.set(\n rectangle,\n this._apiWrapper.createRectangle(\n {\n north: rectangle.north,\n east: rectangle.east,\n south: rectangle.south,\n west: rectangle.west,\n },\n {\n // clickable: rectangle.clickable,\n // draggable: rectangle.draggable,\n // editable: rectangle.editable,\n fillColor: rectangle.fillColor,\n fillOpacity: rectangle.fillOpacity,\n strokeColor: rectangle.strokeColor,\n strokeOpacity: rectangle.strokeOpacity,\n // strokePosition: rectangle.strokePosition,\n strokeWeight: rectangle.strokeWeight,\n visible: rectangle.visible,\n zIndex: rectangle.zIndex,\n },\n ),\n );\n }\n\n /**\n * Removes the given rectangle from the map.\n */\n public async removeRectangle(\n rectangle: NgMapsRectangleDirective,\n ): Promise<void> {\n return this._rectangles.get(rectangle)?.then((r) => {\n r.setMap(null);\n this._rectangles.delete(rectangle);\n });\n }\n\n public async setOptions(\n rectangle: NgMapsRectangleDirective,\n options: google.maps.RectangleOptions,\n ): Promise<void> {\n return this._rectangles.get(rectangle)?.then((r) => r.setOptions(options));\n }\n\n public async getBounds(\n rectangle: NgMapsRectangleDirective,\n ): Promise<BoundsLiteral | null> {\n const r = await this._rectangles.get(rectangle);\n const bounds = r?.getBounds();\n return bounds ? bounds.toJSON() : null;\n }\n\n public async setBounds(rectangle: NgMapsRectangleDirective): Promise<void> {\n if (\n !rectangle.north ||\n !rectangle.east ||\n !rectangle.south ||\n !rectangle.west\n ) {\n return;\n }\n const r = await this._rectangles.get(rectangle);\n r?.setBounds({\n north: rectangle.north,\n east: rectangle.east,\n south: rectangle.south,\n west: rectangle.west,\n });\n }\n\n public async setEditable(rectangle: NgMapsRectangleDirective): Promise<void> {\n return this._rectangles\n .get(rectangle)\n ?.then((r) => r.setEditable(rectangle.editable));\n }\n\n public async setDraggable(\n rectangle: NgMapsRectangleDirective,\n ): Promise<void> {\n return this._rectangles\n .get(rectangle)\n ?.then((r) => r.setDraggable(rectangle.draggable));\n }\n\n public async setVisible(rectangle: NgMapsRectangleDirective): Promise<void> {\n return this._rectangles\n .get(rectangle)\n ?.then((r) => r.setVisible(rectangle.visible));\n }\n\n public createEventObservable<T>(\n eventName: string,\n rectangle: NgMapsRectangleDirective,\n ): Observable<T> {\n return new Observable((observer: Observer<T>) => {\n let listener: google.maps.MapsEventListener | null = null;\n this._rectangles.get(rectangle)?.then((r) => {\n listener = r.addListener(eventName, (e: T) =>\n this._zone.run(() => observer.next(e)),\n );\n });\n\n return () => {\n if (listener !== null) {\n listener.remove();\n }\n };\n });\n }\n}\n","import { Injectable, NgZone } from '@angular/core';\nimport { Observable, Observer } from 'rxjs';\n\nimport {\n GeoPoint,\n InfoWindowManager,\n MapsApiWrapper,\n MarkerManager,\n NgMapsInfoWindowComponent,\n} from '@ng-maps/core';\n\n@Injectable()\nexport class GoogleInfoWindowManager extends InfoWindowManager<google.maps.InfoWindow> {\n constructor(\n _mapsWrapper: MapsApiWrapper,\n _zone: NgZone,\n _markerManager: MarkerManager,\n ) {\n super(_mapsWrapper, _zone, _markerManager);\n }\n\n public async deleteInfoWindow(\n infoWindow: NgMapsInfoWindowComponent,\n ): Promise<void> {\n const iWindow = await this._infoWindows.get(infoWindow);\n if (iWindow == null) {\n // info window already deleted\n return;\n } else {\n return this._zone.run(() => {\n iWindow.close();\n this._infoWindows.delete(infoWindow);\n });\n }\n }\n\n public setPosition(infoWindow: NgMapsInfoWindowComponent): void {\n if (!infoWindow.latitude || !infoWindow.longitude) {\n return;\n }\n const i = this._infoWindows.get(infoWindow);\n i?.setPosition({\n lat: infoWindow.latitude,\n lng: infoWindow.longitude,\n });\n }\n\n public setZIndex(infoWindow: NgMapsInfoWindowComponent): void {\n if (!infoWindow.zIndex) {\n return;\n }\n const i = this._infoWindows.get(infoWindow);\n i?.setZIndex(infoWindow.zIndex);\n }\n\n public async open(infoWindow: NgMapsInfoWindowComponent): Promise<void> {\n const w = this._infoWindows.get(infoWindow);\n const map = await this._mapsWrapper.getNativeMap();\n if (infoWindow.hostMarker != null) {\n const marker = await this._markerManager.getNativeMarker(\n infoWindow.hostMarker,\n );\n w?.open(map, marker);\n } else {\n w?.open(map);\n }\n }\n\n public close(infoWindow: NgMapsInfoWindowComponent): void {\n const w = this._infoWindows.get(infoWindow);\n w?.close();\n }\n\n public setOptions(\n infoWindow: NgMapsInfoWindowComponent,\n options: google.maps.InfoWindowOptions,\n ) {\n const i = this._infoWindows.get(infoWindow);\n i?.setOptions(options);\n }\n\n public async addInfoWindow(infoWindow: NgMapsInfoWindowComponent) {\n const options: google.maps.InfoWindowOptions = {\n content: infoWindow.content?.nativeElement,\n maxWidth: infoWindow.maxWidth,\n zIndex: infoWindow.zIndex,\n disableAutoPan: infoWindow.disableAutoPan,\n };\n const center: GeoPoint | null =\n typeof infoWindow.latitude === 'number' &&\n typeof infoWindow.longitude === 'number'\n ? {\n lat: infoWindow.latitude,\n lng: infoWindow.longitude,\n }\n : null;\n\n const instance = await this._mapsWrapper.createInfoWindow(center, options);\n this._infoWindows.set(infoWindow, instance);\n }\n\n /**\n * Creates a Google Maps event listener for the given InfoWindow as an Observable\n */\n public createEventObservable<T>(\n eventName: string,\n infoWindow: NgMapsInfoWindowComponent,\n ): Observable<T> {\n const i = this._infoWindows.get(infoWindow);\n return new Observable((observer: Observer<T>) => {\n i?.addListener(eventName, (e: T) =>\n this._zone.run(() => observer.next(e)),\n );\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport {\n BoundsLiteral,\n FitBoundsService,\n GeoPoint,\n MapsAPILoader,\n} from '@ng-maps/core';\n\n/**\n * The FitBoundsService is responsible for computing the bounds of the a single map.\n */\n@Injectable()\nexport class GoogleMapsFitBoundsService extends FitBoundsService {\n constructor(_loader: MapsAPILoader) {\n super(_loader);\n }\n\n protected generateBounds(\n includeInBounds: Map<string, GeoPoint>,\n ): BoundsLiteral {\n if (includeInBounds.size === 0) {\n return new google.maps.LatLngBounds().toJSON();\n } else {\n const bounds = new google.maps.LatLngBounds();\n includeInBounds.forEach((b) => bounds.extend(b));\n return bounds.toJSON();\n }\n }\n}\n","import { Component, NgZone } from '@angular/core';\n\nimport {\n CircleManager,\n FitBoundsService,\n InfoWindowManager,\n MapsApiWrapper,\n MarkerManager,\n NgMapsViewComponent,\n PolygonManager,\n PolylineManager,\n RectangleManager,\n} from '@ng-maps/core';\n\nimport { GoogleMapsAPIWrapper } from './google-maps-api-wrapper';\nimport { GoogleMapsFitBoundsService } from './google-maps-fit-bounds.service';\nimport { GoogleCircleManager } from './managers/circle.manager';\nimport { GoogleInfoWindowManager } from './managers/info-window.manager';\nimport { GoogleMapsMarkerManager } from './managers/marker.manager';\nimport { GooglePolygonManager } from './managers/polygon.manager';\nimport { GooglePolylineManager } from './managers/polyline.manager';\nimport { GoogleRectangleManager } from './managers/rectangle.manager';\n\n@Component({\n selector: 'map-view',\n providers: [\n { provide: MapsApiWrapper, useClass: GoogleMapsAPIWrapper },\n { provide: FitBoundsService, useClass: GoogleMapsFitBoundsService },\n { provide: MarkerManager, useClass: GoogleMapsMarkerManager },\n { provide: CircleManager, useClass: GoogleCircleManager },\n { provide: PolygonManager, useClass: GooglePolygonManager },\n { provide: PolylineManager, useClass: GooglePolylineManager },\n { provide: RectangleManager, useClass: GoogleRectangleManager },\n { provide: InfoWindowManager, useClass: GoogleInfoWindowManager },\n ],\n styles: [\n `\n .map-container-inner {\n width: inherit;\n height: inherit;\n }\n\n .map-content {\n display: none;\n }\n `,\n ],\n template: `\n <div class=\"map-container-inner\" #container></div>\n <div class=\"map-content\">\n <ng-content></ng-content>\n </div>\n `,\n})\nexport class GoogleComponent extends NgMapsViewComponent<google.maps.Map> {\n constructor(\n _mapsWrapper: MapsApiWrapper,\n _fitBoundsService: FitBoundsService,\n _zone: NgZone,\n ) {\n super(_mapsWrapper, _fitBoundsService, _zone);\n }\n\n protected override async _handleMapCenterChange() {\n const s = this._mapsWrapper\n .subscribeToMapEvent('center_changed')\n .subscribe(() => {\n this._mapsWrapper.getCenter().then((center) => {\n if (center) {\n this.latitude = center.lat;\n this.longitude = center.lng;\n this.centerChange.emit({\n lat: this.latitude,\n lng: this.longitude,\n } as google.maps.LatLngLiteral);\n }\n });\n });\n this.subscription.add(s);\n }\n\n protected override _handleBoundsChange() {\n const s = this._mapsWrapper\n .subscribeToMapEvent('bounds_changed')\n .subscribe(() => {\n this._mapsWrapper.getBounds().then((bounds) => {\n this.boundsChange.emit(bounds);\n });\n });\n this.subscription.add(s);\n }\n\n protected override async _handleMapTypeIdChange() {\n const s = this._mapsWrapper\n .subscribeToMapEvent('maptypeid_changed')\n .subscribe(() => {\n this._mapsWrapper.getMapTypeId().then((mapTypeId) => {\n this.mapTypeIdChange.emit(mapTypeId);\n });\n });\n this.subscription.add(s);\n }\n\n protected override _handleMapZoomChange() {\n const s = this._mapsWrapper\n .subscribeToMapEvent('zoom_changed')\n .subscribe(() => {\n this._mapsWrapper.getZoom().then((z) => {\n this.zoom = z ?? 8;\n this.zoomChange.emit(z);\n });\n });\n this.subscription.add(s);\n }\n\n protected override _handleIdleEvent() {\n const s = this._mapsWrapper.subscribeToMapEvent('idle').subscribe(() => {\n this.idle.emit(void 0);\n });\n this.subscription.add(s);\n }\n\n protected override _handleTilesLoadedEvent() {\n const s = this._mapsWrapper\n .subscribeToMapEvent('tilesloaded')\n .subscribe(() => this.tilesLoaded.emit(void 0));\n this.subscription.add(s);\n }\n\n protected override _handleMapMouseEvents() {\n interface Emitter {\n emit(value: any): void;\n }\n\n interface Event {\n name: string;\n emitter: Emitter;\n }\n\n const events: Array<Event> = [\n { name: 'click', emitter: this.mapClick },\n { name: 'rightclick', emitter: this.mapRightClick },\n { name: 'dblclick', emitter: this.mapDblClick },\n ];\n\n events.forEach((e: Event) => {\n const s = (this._mapsWrapper as GoogleMapsAPIWrapper)\n .subscribeToMapEvent(e.name)\n .subscribe((event) => {\n const value = {\n coords: { lat: event[0].latLng.lat(), lng: event[0].latLng.lng() },\n };\n e.emitter.emit(value);\n });\n this.subscription.add(s);\n });\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport enum GoogleMapsScriptProtocol {\n HTTP = 1,\n HTTPS = 2,\n AUTO = 3,\n}\n\n/**\n * Token for the config of google maps module\n * Please provide an object of type {@link GoogleModuleOptions}.\n */\nexport const GOOGLE_MAPS_API_CONFIG = new InjectionToken<\n GoogleModuleOptions | Promise<GoogleModuleOptions>\n>('angular-google-maps GOOGLE_MAPS_API_CONFIG');\n\nexport interface GoogleModuleOptions {\n /**\n * The Google Maps API Key (see:\n * https://developers.google.com/maps/documentation/javascript/get-api-key)\n */\n apiKey?: string;\n\n /**\n * The Google Maps client ID (for premium plans).\n * When you have a Google Maps APIs Premium Plan license, you must authenticate\n * your application with either an API key or a client ID.\n * The Google Maps API will fail to load if both a client ID and an API key are included.\n */\n clientId?: string;\n\n /**\n * The Google Maps channel name (for premium plans).\n * A channel parameter is an optional parameter that allows you to track usage under your client\n * ID by assigning a distinct channel to each of your applications.\n */\n channel?: string;\n\n /**\n * Google Maps API version.\n */\n apiVersion?: string;\n\n /**\n * Host and Path used for the `<script>` tag.\n */\n hostAndPath?: string;\n\n /**\n * Protocol used for the `<script>` tag.\n */\n protocol?: GoogleMapsScriptProtocol;\n\n /**\n * Defines which Google Maps libraries should get loaded.\n * For available libraries see: https://developers.google.com/maps/documentation/javascript/libraries\n */\n libraries?: Array<string>;\n\n /**\n * The default bias for the map behavior is US.\n * If you wish to alter your application to serve different map tiles or bias the\n * application, you can overwrite the default behavior (US) by defining a `region`.\n * See https://developers.google.com/maps/documentation/javascript/basics#Region\n */\n region?: string;\n\n /**\n * The Google Maps API uses the browser's preferred language when displaying\n * textual information. If you wish to overwrite this behavior and force the API\n * to use a given language, you can use this setting.\n * See https://developers.google.com/maps/documentation/javascript/basics#Language\n */\n language?: string;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { firstValueFrom, ReplaySubject } from 'rxjs';\n\nimport { MapsAPILoader } from '@ng-maps/core';\n\nimport {\n GoogleMapsScriptProtocol,\n GoogleModuleOptions,\n GOOGLE_MAPS_API_CONFIG,\n} from './options';\n\n@Injectable()\nexport class GoogleMapsScriptLoader extends MapsAPILoader {\n protected _scriptLoadingPromise?: Promise<void>;\n protected _config: ReplaySubject<GoogleModuleOptions> =\n new ReplaySubject<GoogleModuleOptions>(1);\n protected readonly _SCRIPT_ID: string = 'GoogleMapsApiScript';\n protected readonly callbackName: string = `LazyMapsAPILoader`;\n\n constructor(\n @Optional()\n @Inject(GOOGLE_MAPS_API_CONFIG)\n config: GoogleModuleOptions,\n @Inject(DOCUMENT) document: any,\n ) {\n super();\n if (config instanceof Promise) {\n config.then((c) => {\n this.configure(c);\n });\n } else if (typeof config === 'object') {\n this.configure(config);\n }\n this._document = document as Document;\n this._window = this._document.defaultView;\n }\n\n /**\n * If no configuration is provided at load time you can use this function to provide configuration at any time.\n * Loading scripts will be postponed until a configuration is provided\n *\n * @param config - {@link GoogleModuleOptions} configuration needed for bootstrapping\n */\n public configure(config: GoogleModuleOptions) {\n this._config.next(config);\n this._config.complete();\n }\n\n public load(): Promise<void> {\n if ((this._window as any).google && (this._window as any).google.maps) {\n // Google maps already loaded on the page\n return Promise.resolve();\n } else if (this._scriptLoadingPromise) {\n return this._scriptLoadingPromise;\n } else {\n this._scriptLoadingPromise = this.checkScriptElement();\n return this._scriptLoadingPromise;\n }\n }\n\n protected async checkScriptElement(): Promise<void> {\n let scriptElement: HTMLScriptElement = this._document?.getElementById(\n this._SCRIPT_ID,\n ) as HTMLScriptElement;\n if (scriptElement == null) {\n scriptElement = await this.createScriptElement();\n }\n return this.assignScriptLoadingPromise(scriptElement);\n }\n\n protected assignScriptLoadingPromise(\n scriptElement: HTMLScriptElement,\n ): Promise<void> {\n this._document?.body.appendChild(scriptElement);\n return new Promise((resolve, reject) => {\n // FIXME\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this._window[this.callbackName] = () => resolve();\n\n // FIXME\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n scriptElement.onerror = (error: Event) => reject(error);\n });\n }\n\n protected async createScriptElement() {\n if (!this._document) {\n throw new Error('Document is not defined');\n }\n const script = this._document.createElement('script');\n script.type = 'text/javascript';\n script.async = true;\n script.defer = true;\n script.id = this._SCRIPT_ID;\n script.src = await this._getScriptSrc(this.callbackName);\n return script;\n }\n\n protected async _getScriptSrc(callbackName: string): Promise<string> {\n const config = await firstValueFrom(this._config);\n if (!config) {\n throw new Error('No configuration provided');\n }\n const protocolType: GoogleMapsScriptProtocol =\n (config && config.protocol) || GoogleMapsScriptProtocol.HTTPS;\n let protocol: string;\n\n switch (protocolType) {\n case GoogleMapsScriptProtocol.AUTO:\n protocol = '';\n break;\n case GoogleMapsScriptProtocol.HTTP:\n protocol = 'http:';\n break;\n case GoogleMapsScriptProtocol.HTTPS:\n protocol = 'https:';\n break;\n }\n\n const hostAndPath: string =\n config.hostAndPath || 'maps.googleapis.com/maps/api/js';\n const queryParams: { [key: string]: string | Array<string> } = {\n v: config.apiVersion || 'quarterly',\n callback: callbackName,\n key: config.apiKey!,\n client: config.clientId!,\n channel: config.channel!,\n libraries: config.libraries!,\n region: config.region!,\n language: config.language!,\n };\n\n const params: string = Object.keys(queryParams)\n .filter((k: string) => queryParams[k] != null)\n .filter(\n (k: string) =>\n // remove empty arrays\n !Array.isArray(queryParams[k]) ||\n (Array.isArray(queryParams[k]) && queryParams[k].length > 0),\n )\n .map((k: string) => {\n // join arrays as comma seperated strings\n const i = queryParams[k];\n if (Array.isArray(i)) {\n return { key: k, value: i.join(',') };\n }\n return { key: k, value: queryParams[k] };\n })\n .map(\n // FIXME\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (entry: { key: string; value: string }) =>\n `${entry.key}=${entry.value}`,\n )\n .join('&');\n return `${protocol}//${hostAndPath}?${params}`;\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { MapsAPILoader, MAP_PROVIDER } from '@ng-maps/core';\n\nimport { GoogleMapsScriptLoader } from './google-maps-script-loader.service';\nimport { GoogleComponent } from './google.component';\nimport { GOOGLE_MAPS_API_CONFIG, GoogleModuleOptions } from './options';\n\n@NgModule({\n declarations: [GoogleComponent],\n exports: [GoogleComponent],\n providers: [\n { provide: MapsAPILoader, useClass: GoogleMapsScriptLoader },\n {\n provide: MAP_PROVIDER,\n useValue: 'GoogleMaps',\n },\n ],\n})\nexport class NgMapsGoogleModule {\n /**\n * configure the NgMapsGoogleModule with a value\n * @param config\n */\n public static forRoot(\n config: GoogleModuleOptions,\n ): ModuleWithProviders<NgMapsGoogleModule> {\n return {\n ngModule: NgMapsGoogleModule,\n providers: [\n {\n provide: GOOGLE_MAPS_API_CONFIG,\n useValue: config,\n },\n ],\n };\n }\n\n /**\n * configure the NgMapsGoogleModule with a factory\n * @param factory\n */\n public static forRootFactory(\n factory: (...args: Array<any>) => GoogleModuleOptions,\n deps?: Array<any>,\n ): ModuleWithProviders<NgMapsGoogleModule> {\n return {\n ngModule: NgMapsGoogleModule,\n providers: [\n {\n provide: GOOGLE_MAPS_API_CONFIG,\n useFactory: factory,\n deps,\n },\n ],\n };\n }\n}\n","/*\n * Public API Surface of google\n */\n\nexport * from './lib/google-maps-api-wrapper';\nexport * from './lib/managers/marker.manager';\nexport * from './lib/managers/circle.manager';\nexport * from './lib/managers/polygon.manager';\nexport * from './lib/managers/polyline.manager';\nexport * from './lib/managers/rectangle.manager';\nexport * from './lib/managers/info-window.manager';\nexport * from './lib/google.component';\nexport * from './lib/google.module';\nexport * from './lib/options';\nexport { isValidMarkerIcon } from './lib/util/is-valid-marker-icon';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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