UNPKG

@ng-maps/google

Version:

**@ng-maps/google** is a simple, modular and tree-shakable library for displaying google-maps inside an angular application

144 lines 18.9 kB
import { DOCUMENT } from '@angular/common'; import { Inject, Injectable, Optional } from '@angular/core'; import { firstValueFrom, ReplaySubject } from 'rxjs'; import { MapsAPILoader } from '@ng-maps/core'; import { GoogleMapsScriptProtocol, GOOGLE_MAPS_API_CONFIG, } from './options'; import * as i0 from "@angular/core"; export class GoogleMapsScriptLoader extends MapsAPILoader { constructor(config, document) { super(); this._config = new ReplaySubject(1); this._SCRIPT_ID = 'GoogleMapsApiScript'; this.callbackName = `LazyMapsAPILoader`; if (config instanceof Promise) { config.then((c) => { this.configure(c); }); } else if (typeof config === 'object') { this.configure(config); } this._document = document; this._window = this._document.defaultView; } /** * If no configuration is provided at load time you can use this function to provide configuration at any time. * Loading scripts will be postponed until a configuration is provided * * @param config - {@link GoogleModuleOptions} configuration needed for bootstrapping */ configure(config) { this._config.next(config); this._config.complete(); } load() { if (this._window.google && this._window.google.maps) { // Google maps already loaded on the page return Promise.resolve(); } else if (this._scriptLoadingPromise) { return this._scriptLoadingPromise; } else { this._scriptLoadingPromise = this.checkScriptElement(); return this._scriptLoadingPromise; } } async checkScriptElement() { let scriptElement = this._document?.getElementById(this._SCRIPT_ID); if (scriptElement == null) { scriptElement = await this.createScriptElement(); } return this.assignScriptLoadingPromise(scriptElement); } assignScriptLoadingPromise(scriptElement) { this._document?.body.appendChild(scriptElement); return new Promise((resolve, reject) => { // FIXME // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore this._window[this.callbackName] = () => resolve(); // FIXME // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore scriptElement.onerror = (error) => reject(error); }); } async createScriptElement() { if (!this._document) { throw new Error('Document is not defined'); } const script = this._document.createElement('script'); script.type = 'text/javascript'; script.async = true; script.defer = true; script.id = this._SCRIPT_ID; script.src = await this._getScriptSrc(this.callbackName); return script; } async _getScriptSrc(callbackName) { const config = await firstValueFrom(this._config); if (!config) { throw new Error('No configuration provided'); } const protocolType = (config && config.protocol) || GoogleMapsScriptProtocol.HTTPS; let protocol; switch (protocolType) { case GoogleMapsScriptProtocol.AUTO: protocol = ''; break; case GoogleMapsScriptProtocol.HTTP: protocol = 'http:'; break; case GoogleMapsScriptProtocol.HTTPS: protocol = 'https:'; break; } const hostAndPath = config.hostAndPath || 'maps.googleapis.com/maps/api/js'; const queryParams = { v: config.apiVersion || 'quarterly', callback: callbackName, key: config.apiKey, client: config.clientId, channel: config.channel, libraries: config.libraries, region: config.region, language: config.language, }; const params = Object.keys(queryParams) .filter((k) => queryParams[k] != null) .filter((k) => // remove empty arrays !Array.isArray(queryParams[k]) || (Array.isArray(queryParams[k]) && queryParams[k].length > 0)) .map((k) => { // join arrays as comma seperated strings const i = queryParams[k]; if (Array.isArray(i)) { return { key: k, value: i.join(',') }; } return { key: k, value: queryParams[k] }; }) .map( // FIXME // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore (entry) => `${entry.key}=${entry.value}`) .join('&'); return `${protocol}//${hostAndPath}?${params}`; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GoogleMapsScriptLoader, deps: [{ token: GOOGLE_MAPS_API_CONFIG, optional: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GoogleMapsScriptLoader }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GoogleMapsScriptLoader, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [GOOGLE_MAPS_API_CONFIG] }] }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtc2NyaXB0LWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9nb29nbGUvc3JjL2xpYi9nb29nbGUtbWFwcy1zY3JpcHQtbG9hZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTlDLE9BQU8sRUFDTCx3QkFBd0IsRUFFeEIsc0JBQXNCLEdBQ3ZCLE1BQU0sV0FBVyxDQUFDOztBQUduQixNQUFNLE9BQU8sc0JBQXVCLFNBQVEsYUFBYTtJQU92RCxZQUdFLE1BQTJCLEVBQ1QsUUFBYTtRQUUvQixLQUFLLEVBQUUsQ0FBQztRQVhBLFlBQU8sR0FDZixJQUFJLGFBQWEsQ0FBc0IsQ0FBQyxDQUFDLENBQUM7UUFDekIsZUFBVSxHQUFXLHFCQUFxQixDQUFDO1FBQzNDLGlCQUFZLEdBQVcsbUJBQW1CLENBQUM7UUFTNUQsSUFBSSxNQUFNLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFvQixD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JztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE1hcHNBUElMb2FkZXIgfSBmcm9tICdAbmctbWFwcy9jb3JlJztcblxuaW1wb3J0IHtcbiAgR29vZ2xlTWFwc1NjcmlwdFByb3RvY29sLFxuICBHb29nbGVNb2R1bGVPcHRpb25zLFxuICBHT09HTEVfTUFQU19BUElfQ09ORklHLFxufSBmcm9tICcuL29wdGlvbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR29vZ2xlTWFwc1NjcmlwdExvYWRlciBleHRlbmRzIE1hcHNBUElMb2FkZXIge1xuICBwcm90ZWN0ZWQgX3NjcmlwdExvYWRpbmdQcm9taXNlPzogUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIF9jb25maWc6IFJlcGxheVN1YmplY3Q8R29vZ2xlTW9kdWxlT3B0aW9ucz4gPVxuICAgIG5ldyBSZXBsYXlTdWJqZWN0PEdvb2dsZU1vZHVsZU9wdGlvbnM+KDEpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX1NDUklQVF9JRDogc3RyaW5nID0gJ0dvb2dsZU1hcHNBcGlTY3JpcHQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FsbGJhY2tOYW1lOiBzdHJpbmcgPSBgTGF6eU1hcHNBUElMb2FkZXJgO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChHT09HTEVfTUFQU19BUElfQ09ORklHKVxuICAgIGNvbmZpZzogR29vZ2xlTW9kdWxlT3B0aW9ucyxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudDogYW55LFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICBjb25maWcudGhlbigoYykgPT4ge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZShjKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuY29uZmlndXJlKGNvbmZpZyk7XG4gICAgfVxuICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQgYXMgRG9jdW1lbnQ7XG4gICAgdGhpcy5fd2luZG93ID0gdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gIH1cblxuICAvKipcbiAgICogSWYgbm8gY29uZmlndXJhdGlvbiBpcyBwcm92aWRlZCBhdCBsb2FkIHRpbWUgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gYXQgYW55IHRpbWUuXG4gICAqIExvYWRpbmcgc2NyaXB0cyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBhIGNvbmZpZ3VyYXRpb24gaXMgcHJvdmlkZWRcbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIHtAbGluayBHb29nbGVNb2R1bGVPcHRpb25zfSBjb25maWd1cmF0aW9uIG5lZWRlZCBmb3IgYm9vdHN0cmFwcGluZ1xuICAgKi9cbiAgcHVibGljIGNvbmZpZ3VyZShjb25maWc6IEdvb2dsZU1vZHVsZU9wdGlvbnMpIHtcbiAgICB0aGlzLl9jb25maWcubmV4dChjb25maWcpO1xuICAgIHRoaXMuX2NvbmZpZy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCh0aGlzLl93aW5kb3cgYXMgYW55KS5nb29nbGUgJiYgKHRoaXMuX3dpbmRvdyBhcyBhbnkpLmdvb2dsZS5tYXBzKSB7XG4gICAgICAvLyBHb29nbGUgbWFwcyBhbHJlYWR5IGxvYWRlZCBvbiB0aGUgcGFnZVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fc2NyaXB0TG9hZGluZ1Byb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JpcHRMb2FkaW5nUHJvbWlzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2NyaXB0TG9hZGluZ1Byb21pc2UgPSB0aGlzLmNoZWNrU2NyaXB0RWxlbWVudCgpO1xuICAgICAgcmV0dXJuIHRoaXMuX3NjcmlwdExvYWRpbmdQcm9taXNlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjaGVja1NjcmlwdEVsZW1lbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHNjcmlwdEVsZW1lbnQ6IEhUTUxTY3JpcHRFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQ/LmdldEVsZW1lbnRCeUlkKFxuICAgICAgdGhpcy5fU0NSSVBUX0lELFxuICAgICkgYXMgSFRNTFNjcmlwdEVsZW1lbnQ7XG4gICAgaWYgKHNjcmlwdEVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgc2NyaXB0RWxlbWVudCA9IGF3YWl0IHRoaXMuY3JlYXRlU2NyaXB0RWxlbWVudCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25TY3JpcHRMb2FkaW5nUHJvbWlzZShzY3JpcHRFbGVtZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3NpZ25TY3JpcHRMb2FkaW5nUHJvbWlzZShcbiAgICBzY3JpcHRFbGVtZW50OiBIVE1MU2NyaXB0RWxlbWVudCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZG9jdW1lbnQ/LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0RWxlbWVudCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIEZJWE1FXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLl93aW5kb3dbdGhpcy5jYWxsYmFja05hbWVdID0gKCkgPT4gcmVzb2x2ZSgpO1xuXG4gICAgICAvLyBGSVhNRVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgc2NyaXB0RWxlbWVudC5vbmVycm9yID0gKGVycm9yOiBFdmVudCkgPT4gcmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVTY3JpcHRFbGVtZW50KCkge1xuICAgIGlmICghdGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9jdW1lbnQgaXMgbm90IGRlZmluZWQnKTtcbiAgICB9XG4gICAgY29uc3Qgc2NyaXB0ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG4gICAgc2NyaXB0LmlkID0gdGhpcy5fU0NSSVBUX0lEO1xuICAgIHNjcmlwdC5zcmMgPSBhd2FpdCB0aGlzLl9nZXRTY3JpcHRTcmModGhpcy5jYWxsYmFja05hbWUpO1xuICAgIHJldHVybiBzY3JpcHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX2dldFNjcmlwdFNyYyhjYWxsYmFja05hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fY29uZmlnKTtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb25maWd1cmF0aW9uIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHByb3RvY29sVHlwZTogR29vZ2xlTWFwc1NjcmlwdFByb3RvY29sID1cbiAgICAgIChjb25maWcgJiYgY29uZmlnLnByb3RvY29sKSB8fCBHb29nbGVNYXBzU2NyaXB0UHJvdG9jb2wuSFRUUFM7XG4gICAgbGV0IHByb3RvY29sOiBzdHJpbmc7XG5cbiAgICBzd2l0Y2ggKHByb3RvY29sVHlwZSkge1xuICAgICAgY2FzZSBHb29nbGVNYXBzU2NyaXB0UHJvdG9jb2wuQVVUTzpcbiAgICAgICAgcHJvdG9jb2wgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEdvb2dsZU1hcHNTY3JpcHRQcm90b2NvbC5IVFRQOlxuICAgICAgICBwcm90b2NvbCA9ICdodHRwOic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBHb29nbGVNYXBzU2NyaXB0UHJvdG9jb2wuSFRUUFM6XG4gICAgICAgIHByb3RvY29sID0gJ2h0dHBzOic7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IGhvc3RBbmRQYXRoOiBzdHJpbmcgPVxuICAgICAgY29uZmlnLmhvc3RBbmRQYXRoIHx8ICdtYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzJztcbiAgICBjb25zdCBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IH0gPSB7XG4gICAgICB2OiBjb25maWcuYXBpVmVyc2lvbiB8fCAncXVhcnRlcmx5JyxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFja05hbWUsXG4gICAgICBrZXk6IGNvbmZpZy5hcGlLZXkhLFxuICAgICAgY2xpZW50OiBjb25maWcuY2xpZW50SWQhLFxuICAgICAgY2hhbm5lbDogY29uZmlnLmNoYW5uZWwhLFxuICAgICAgbGlicmFyaWVzOiBjb25maWcubGlicmFyaWVzISxcbiAgICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbiEsXG4gICAgICBsYW5ndWFnZTogY29uZmlnLmxhbmd1YWdlISxcbiAgICB9O1xuXG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmcgPSBPYmplY3Qua2V5cyhxdWVyeVBhcmFtcylcbiAgICAgIC5maWx0ZXIoKGs6IHN0cmluZykgPT4gcXVlcnlQYXJhbXNba10gIT0gbnVsbClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChrOiBzdHJpbmcpID0+XG4gICAgICAgICAgLy8gcmVtb3ZlIGVtcHR5IGFycmF5c1xuICAgICAgICAgICFBcnJheS5pc0FycmF5KHF1ZXJ5UGFyYW1zW2tdKSB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KHF1ZXJ5UGFyYW1zW2tdKSAmJiBxdWVyeVBhcmFtc1trXS5sZW5ndGggPiAwKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKGs6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBqb2luIGFycmF5cyBhcyBjb21tYSBzZXBlcmF0ZWQgc3RyaW5nc1xuICAgICAgICBjb25zdCBpID0gcXVlcnlQYXJhbXNba107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGkpKSB7XG4gICAgICAgICAgcmV0dXJuIHsga2V5OiBrLCB2YWx1ZTogaS5qb2luKCcsJykgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBrZXk6IGssIHZhbHVlOiBxdWVyeVBhcmFtc1trXSB9O1xuICAgICAgfSlcbiAgICAgIC5tYXAoXG4gICAgICAgIC8vIEZJWE1FXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAoZW50cnk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICBgJHtlbnRyeS5rZXl9PSR7ZW50cnkudmFsdWV9YCxcbiAgICAgIClcbiAgICAgIC5qb2luKCcmJyk7XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfS8vJHtob3N0QW5kUGF0aH0/JHtwYXJhbXN9YDtcbiAgfVxufVxuIl19