@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
JavaScript
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