{"version":3,"file":"js/chunk-vendors-f945abb9.b90c4954.js","mappings":"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","sources":["webpack://uhmi-web-maps/./node_modules/vue-gtag/dist/vue-gtag.esm.js","webpack://uhmi-web-maps/./node_modules/vue-loader/dist/exportHelper.js","webpack://uhmi-web-maps/./node_modules/@maptiler/sdk/node_modules/uuid/dist/esm-browser/native.js","webpack://uhmi-web-maps/./node_modules/@maptiler/sdk/node_modules/uuid/dist/esm-browser/rng.js","webpack://uhmi-web-maps/./node_modules/@maptiler/sdk/node_modules/uuid/dist/esm-browser/stringify.js","webpack://uhmi-web-maps/./node_modules/@maptiler/sdk/node_modules/uuid/dist/esm-browser/v4.js","webpack://uhmi-web-maps/../src/config.ts","webpack://uhmi-web-maps/../src/language.ts","webpack://uhmi-web-maps/../src/callFetch.ts","webpack://uhmi-web-maps/../src/defaults.ts","webpack://uhmi-web-maps/../src/services/ServiceError.ts","webpack://uhmi-web-maps/../src/services/geolocation.ts","webpack://uhmi-web-maps/../src/mapstyle.ts","webpack://uhmi-web-maps/../src/services/staticMaps.ts","webpack://uhmi-web-maps/../src/LogoControl.ts","webpack://uhmi-web-maps/../src/MaptilerLogoControl.ts","webpack://uhmi-web-maps/../src/tools.ts","webpack://uhmi-web-maps/../src/MaptilerTerrainControl.ts","webpack://uhmi-web-maps/../src/NavigationControl.ts","webpack://uhmi-web-maps/../src/MaptilerNavigationControl.ts","webpack://uhmi-web-maps/../src/GeolocateControl.ts","webpack://uhmi-web-maps/../src/MaptilerGeolocateControl.ts","webpack://uhmi-web-maps/../src/AttributionControl.ts","webpack://uhmi-web-maps/../src/ScaleControl.ts","webpack://uhmi-web-maps/../src/FullscreenControl.ts","webpack://uhmi-web-maps/../src/Map.ts","webpack://uhmi-web-maps/../src/Marker.ts","webpack://uhmi-web-maps/../src/Popup.ts","webpack://uhmi-web-maps/../src/Style.ts","webpack://uhmi-web-maps/../src/CanvasSource.ts","webpack://uhmi-web-maps/../src/GeoJSONSource.ts","webpack://uhmi-web-maps/../src/ImageSource.ts","webpack://uhmi-web-maps/../src/RasterTileSource.ts","webpack://uhmi-web-maps/../src/RasterDEMTileSource.ts","webpack://uhmi-web-maps/../src/VectorTileSource.ts","webpack://uhmi-web-maps/../src/VideoSource.ts","webpack://uhmi-web-maps/../src/TerrainControl.ts","webpack://uhmi-web-maps/../src/index.ts","webpack://uhmi-web-maps/./node_modules/pinia/node_modules/vue-demi/lib/index.mjs","webpack://uhmi-web-maps/./node_modules/pinia/dist/pinia.mjs"],"sourcesContent":["import { isPlainObject, isFunction } from '@vue/shared';\nimport { nextTick } from 'vue';\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nvar load = function load(url) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return new Promise(function (resolve, reject) {\n if (typeof document === \"undefined\") {\n return;\n }\n\n var head = document.head || document.getElementsByTagName(\"head\")[0];\n var script = document.createElement(\"script\");\n script.async = true;\n script.src = url;\n script.defer = options.defer;\n\n if (options.preconnectOrigin) {\n var link = document.createElement(\"link\");\n link.href = options.preconnectOrigin;\n link.rel = \"preconnect\";\n head.appendChild(link);\n }\n\n head.appendChild(script);\n script.onload = resolve;\n script.onerror = reject;\n });\n};\nvar mergeDeep = function mergeDeep(target) {\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!isPlainObject(target) || !isPlainObject(source)) {\n return;\n }\n\n for (var key in source) {\n if (isPlainObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n mergeDeep(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n }\n\n return mergeDeep.apply(void 0, [target].concat(sources));\n};\nvar isBrowser = function isBrowser() {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return false;\n }\n\n return true;\n};\nvar warn = function warn(text) {\n var shouldLog = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!isBrowser() || process.env.NODE_ENV === \"production\") {\n return;\n }\n\n if (!shouldLog) {\n return;\n }\n\n console.warn(\"[vue-gtag] \".concat(text));\n};\nvar validateScreenviewShape = function validateScreenviewShape() {\n var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n warn(\"Missing \\\"appName\\\" property inside the plugin options.\", obj.app_name == null);\n warn(\"Missing \\\"name\\\" property in the route.\", obj.screen_name == null);\n return obj;\n};\nfunction getPathWithBase() {\n var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"\";\n var base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n var pathAsArray = path.split(\"/\");\n var baseAsArray = base.split(\"/\");\n\n if (pathAsArray[0] === \"\" && base[base.length - 1] === \"/\") {\n pathAsArray.shift();\n }\n\n return baseAsArray.join(\"/\") + pathAsArray.join(\"/\");\n}\n\nvar getDefaultParams = function getDefaultParams() {\n return {\n bootstrap: true,\n onReady: null,\n onError: null,\n onBeforeTrack: null,\n onAfterTrack: null,\n pageTrackerTemplate: null,\n customResourceURL: \"https://www.googletagmanager.com/gtag/js\",\n customPreconnectOrigin: \"https://www.googletagmanager.com\",\n deferScriptLoad: false,\n pageTrackerExcludedRoutes: [],\n pageTrackerEnabled: true,\n enabled: true,\n disableScriptLoad: false,\n pageTrackerScreenviewEnabled: false,\n appName: null,\n pageTrackerUseFullPath: false,\n pageTrackerPrependBase: true,\n pageTrackerSkipSamePath: true,\n globalDataLayerName: \"dataLayer\",\n globalObjectName: \"gtag\",\n defaultGroupName: \"default\",\n includes: null,\n config: {\n id: null,\n params: {\n send_page_view: false\n }\n }\n };\n};\nvar params = {};\nvar setOptions = function setOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var defaultParams = getDefaultParams();\n params = mergeDeep(defaultParams, options);\n};\nvar getOptions = function getOptions() {\n return params;\n};\n\nvar query = (function () {\n var _window;\n\n var _getOptions = getOptions(),\n globalObjectName = _getOptions.globalObjectName;\n\n if (!isBrowser() || typeof window[globalObjectName] === \"undefined\") {\n return;\n }\n\n (_window = window)[globalObjectName].apply(_window, arguments);\n});\n\nvar config = (function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var _getOptions = getOptions(),\n config = _getOptions.config,\n includes = _getOptions.includes;\n\n query.apply(void 0, [\"config\", config.id].concat(args));\n\n if (Array.isArray(includes)) {\n includes.forEach(function (domain) {\n query.apply(void 0, [\"config\", domain.id].concat(args));\n });\n }\n});\n\nvar assignGlobalProperty = function assignGlobalProperty(id, value) {\n if (!isBrowser()) {\n return;\n }\n\n window[\"ga-disable-\".concat(id)] = value;\n};\n\nvar disable = (function () {\n var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n var _getOptions = getOptions(),\n config = _getOptions.config,\n includes = _getOptions.includes;\n\n assignGlobalProperty(config.id, value);\n\n if (Array.isArray(includes)) {\n includes.forEach(function (domain) {\n return assignGlobalProperty(domain.id, value);\n });\n }\n});\n\nvar optOut = (function () {\n disable(true);\n});\n\nvar optIn = (function () {\n disable(false);\n});\n\nvar router;\nvar setRouter = function setRouter(instance) {\n router = instance;\n};\nvar getRouter = function getRouter() {\n return router;\n};\n\nvar event = (function (name) {\n var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var _getOptions = getOptions(),\n includes = _getOptions.includes,\n defaultGroupName = _getOptions.defaultGroupName;\n\n if (params.send_to == null && Array.isArray(includes) && includes.length) {\n params.send_to = includes.map(function (domain) {\n return domain.id;\n }).concat(defaultGroupName);\n }\n\n query(\"event\", name, params);\n});\n\nvar pageview = (function (param) {\n if (!isBrowser()) {\n return;\n }\n\n var template;\n\n if (typeof param === \"string\") {\n template = {\n page_path: param\n };\n } else if (param.path || param.fullPath) {\n var _getOptions = getOptions(),\n useFullPath = _getOptions.pageTrackerUseFullPath,\n useBase = _getOptions.pageTrackerPrependBase;\n\n var router = getRouter();\n var base = router && router.options.base;\n var path = useFullPath ? param.fullPath : param.path;\n template = _objectSpread2(_objectSpread2({}, param.name && {\n page_title: param.name\n }), {}, {\n page_path: useBase ? getPathWithBase(path, base) : path\n });\n } else {\n template = param;\n }\n\n if (template.page_location == null) {\n template.page_location = window.location.href;\n }\n\n if (template.send_page_view == null) {\n template.send_page_view = true;\n }\n\n event(\"page_view\", template);\n});\n\nvar screenview = (function (param) {\n var _getOptions = getOptions(),\n appName = _getOptions.appName;\n\n if (!param) {\n return;\n }\n\n var template;\n\n if (typeof param === \"string\") {\n template = {\n screen_name: param\n };\n } else {\n template = param;\n }\n\n template.app_name = template.app_name || appName;\n event(\"screen_view\", template);\n});\n\nvar exception = (function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n event.apply(void 0, [\"exception\"].concat(args));\n});\n\nvar linker = (function (params) {\n config(\"linker\", params);\n});\n\nvar time = (function (params) {\n event(\"timing_complete\", params);\n});\n\nvar set = (function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n query.apply(void 0, [\"set\"].concat(args));\n});\n\nvar refund = (function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n event.apply(void 0, [\"refund\"].concat(args));\n});\n\nvar purchase = (function (params) {\n event(\"purchase\", params);\n});\n\nvar customMap = (function (map) {\n config({\n custom_map: map\n });\n});\n\nvar api = /*#__PURE__*/Object.freeze({\n __proto__: null,\n query: query,\n config: config,\n optOut: optOut,\n optIn: optIn,\n pageview: pageview,\n screenview: screenview,\n exception: exception,\n linker: linker,\n time: time,\n set: set,\n refund: refund,\n purchase: purchase,\n customMap: customMap,\n event: event\n});\n\nvar attachApi = function attachApi(app) {\n app.config.globalProperties.$gtag = api;\n};\n\nvar registerGlobals = (function () {\n if (!isBrowser()) {\n return;\n }\n\n var _getOptions = getOptions(),\n enabled = _getOptions.enabled,\n globalObjectName = _getOptions.globalObjectName,\n globalDataLayerName = _getOptions.globalDataLayerName;\n\n if (window[globalObjectName] == null) {\n window[globalDataLayerName] = window[globalDataLayerName] || [];\n\n window[globalObjectName] = function () {\n window[globalDataLayerName].push(arguments);\n };\n }\n\n window[globalObjectName](\"js\", new Date());\n\n if (!enabled) {\n optOut();\n }\n\n return window[globalObjectName];\n});\n\nvar mergeDefaultParams = function mergeDefaultParams(params) {\n return _objectSpread2({\n send_page_view: false\n }, params);\n};\n\nvar addConfiguration = (function () {\n var _getOptions = getOptions(),\n config = _getOptions.config,\n includes = _getOptions.includes;\n\n query(\"config\", config.id, mergeDefaultParams(config.params));\n\n if (Array.isArray(includes)) {\n includes.forEach(function (domain) {\n query(\"config\", domain.id, mergeDefaultParams(domain.params));\n });\n }\n});\n\nvar track = (function () {\n var to = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var _getOptions = getOptions(),\n appName = _getOptions.appName,\n proxy = _getOptions.pageTrackerTemplate,\n useScreenview = _getOptions.pageTrackerScreenviewEnabled,\n skipSamePath = _getOptions.pageTrackerSkipSamePath;\n\n if (skipSamePath && to.path === from.path) {\n return;\n }\n\n var template = to;\n\n if (isFunction(proxy)) {\n template = proxy(to, from);\n } else if (useScreenview) {\n template = validateScreenviewShape({\n app_name: appName,\n screen_name: to.name\n });\n }\n\n if (useScreenview) {\n screenview(template);\n return;\n }\n\n pageview(template);\n});\n\nvar isRouteExcluded = function isRouteExcluded(route) {\n var _getOptions = getOptions(),\n routes = _getOptions.pageTrackerExcludedRoutes;\n\n return routes.includes(route.path) || routes.includes(route.name);\n};\n\nvar addRoutesTracker = (function () {\n var _getOptions2 = getOptions(),\n onBeforeTrack = _getOptions2.onBeforeTrack,\n onAfterTrack = _getOptions2.onAfterTrack;\n\n var router = getRouter();\n router.isReady().then(function () {\n nextTick().then(function () {\n var currentRoute = router.currentRoute;\n addConfiguration();\n\n if (isRouteExcluded(currentRoute.value)) {\n return;\n }\n\n track(currentRoute.value);\n });\n router.afterEach(function (to, from) {\n nextTick().then(function () {\n if (isRouteExcluded(to)) {\n return;\n }\n\n if (isFunction(onBeforeTrack)) {\n onBeforeTrack(to, from);\n }\n\n track(to, from);\n\n if (isFunction(onAfterTrack)) {\n onAfterTrack(to, from);\n }\n });\n });\n });\n});\n\nvar bootstrap = (function () {\n var _getOptions = getOptions(),\n onReady = _getOptions.onReady,\n onError = _getOptions.onError,\n globalObjectName = _getOptions.globalObjectName,\n globalDataLayerName = _getOptions.globalDataLayerName,\n config = _getOptions.config,\n customResourceURL = _getOptions.customResourceURL,\n customPreconnectOrigin = _getOptions.customPreconnectOrigin,\n deferScriptLoad = _getOptions.deferScriptLoad,\n pageTrackerEnabled = _getOptions.pageTrackerEnabled,\n disableScriptLoad = _getOptions.disableScriptLoad;\n\n var isPageTrackerEnabled = Boolean(pageTrackerEnabled && getRouter());\n registerGlobals();\n\n if (isPageTrackerEnabled) {\n addRoutesTracker();\n } else {\n addConfiguration();\n }\n\n if (disableScriptLoad) {\n return;\n }\n\n return load(\"\".concat(customResourceURL, \"?id=\").concat(config.id, \"&l=\").concat(globalDataLayerName), {\n preconnectOrigin: customPreconnectOrigin,\n defer: deferScriptLoad\n }).then(function () {\n if (onReady) {\n onReady(window[globalObjectName]);\n }\n })[\"catch\"](function (error) {\n if (onError) {\n onError(error);\n }\n\n return error;\n });\n});\n\nvar install = function install(app) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var router = arguments.length > 2 ? arguments[2] : undefined;\n attachApi(app);\n setOptions(options);\n setRouter(router);\n\n if (getOptions().bootstrap) {\n bootstrap();\n }\n};\n\nexport default install;\nexport { addRoutesTracker, bootstrap, config, customMap, event, exception, install, linker, optIn, optOut, pageview, purchase, query, refund, screenview, set, setOptions, setRouter, time };\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// runtime helper for setting properties on components\n// in a tree-shakable way\nexports.default = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","export type FetchFunction = (url: string, options: object) => Promise;\n\nfunction tryGettingFetch() {\n // this is browser, fetch exists\n if (typeof self !== \"undefined\") {\n return fetch.bind(self);\n }\n\n if (typeof global !== \"undefined\" && global.fetch) {\n return global.fetch;\n }\n\n return null;\n}\n\n/**\n * The configuration object definition\n */\nclass ClientConfig {\n /**\n * MapTiler Cloud API key\n */\n private _apiKey = \"\";\n\n /**\n * The fetch function. To be set if in Node < 18, otherwise\n * will be automatically resolved.\n */\n private _fetch: FetchFunction | null = tryGettingFetch();\n\n /**\n * Set the MapTiler Cloud API key\n */\n set apiKey(k: string) {\n this._apiKey = k;\n }\n\n /**\n * Get the MapTiler Cloud API key\n */\n get apiKey(): string {\n return this._apiKey;\n }\n\n /**\n * Set a the custom fetch function to replace the default one\n */\n set fetch(f: FetchFunction) {\n this._fetch = f;\n }\n\n /**\n * Get the fetch fucntion\n */\n get fetch(): FetchFunction | null {\n return this._fetch;\n }\n}\n\n/**\n * Configuration object\n */\nconst config = new ClientConfig();\n\nexport { ClientConfig, config };\n","/**\n * Languages. Note that not all the languages of this list are available but the compatibility list may be expanded in the future.\n */\nconst LanguageGeocoding = {\n AUTO: \"auto\",\n ALBANIAN: \"sq\",\n ARABIC: \"ar\",\n ARMENIAN: \"hy\",\n AZERBAIJANI: \"az\",\n BELORUSSIAN: \"be\",\n BOSNIAN: \"bs\",\n BRETON: \"br\",\n BULGARIAN: \"bg\",\n CATALAN: \"ca\",\n CHINESE: \"zh\",\n CROATIAN: \"hr\",\n CZECH: \"cs\",\n DANISH: \"da\",\n DUTCH: \"nl\",\n ENGLISH: \"en\",\n ESPERANTO: \"eo\",\n ESTONIAN: \"et\",\n FINNISH: \"fi\",\n FRENCH: \"fr\",\n FRISIAN: \"fy\",\n GEORGIAN: \"ka\",\n GERMAN: \"de\",\n GREEK: \"el\",\n HEBREW: \"he\",\n HUNGARIAN: \"hu\",\n ICELANDIC: \"is\",\n IRISH: \"ga\",\n ITALIAN: \"it\",\n JAPANESE: \"ja\",\n KANNADA: \"kn\",\n KAZAKH: \"kk\",\n KOREAN: \"ko\",\n ROMAN_LATIN: \"la\",\n LATVIAN: \"lv\",\n LITHUANIAN: \"lt\",\n LUXEMBOURGISH: \"lb\",\n MACEDONIAN: \"mk\",\n MALTESE: \"mt\",\n NORWEGIAN: \"no\",\n POLISH: \"pl\",\n PORTUGUESE: \"pt\",\n ROMANIAN: \"ro\",\n ROMANSH: \"rm\",\n RUSSIAN: \"ru\",\n SCOTTISH_GAELIC: \"gd\",\n SERBIAN_CYRILLIC: \"sr\",\n SLOVAK: \"sk\",\n SLOVENE: \"sl\",\n SPANISH: \"es\",\n SWEDISH: \"sv\",\n THAI: \"th\",\n TURKISH: \"tr\",\n UKRAINIAN: \"uk\",\n WELSH: \"cy\",\n};\n\nconst languageCodeSet = new Set(Object.values(LanguageGeocoding));\n\ntype Values = T[keyof T];\n\n/**\n * Built-in languages values as strings\n */\ntype LanguageGeocodingString = Values;\n\nfunction getAutoLanguageGeocoding(): LanguageGeocodingString {\n if (typeof navigator === \"undefined\") {\n return Intl.DateTimeFormat()\n .resolvedOptions()\n .locale.split(\"-\")[0] as LanguageGeocodingString;\n }\n\n const canditatelangs = Array.from(\n new Set(navigator.languages.map((l) => l.split(\"-\")[0]))\n ).filter((l) => languageCodeSet.has(l as LanguageGeocodingString));\n\n return canditatelangs.length\n ? (canditatelangs[0] as LanguageGeocodingString)\n : LanguageGeocoding.ENGLISH;\n}\n\nexport { LanguageGeocoding, LanguageGeocodingString, getAutoLanguageGeocoding };\n","import { config } from \"./config\";\n\nexport async function callFetch(resource, options = {}) {\n if (config.fetch === null) {\n throw new Error(\n \"The fetch function was not found. If on NodeJS < 18 please specify the fetch function with config.fetch\"\n );\n }\n\n // Control if URL contains the api key\n if (new URL(resource).searchParams.get(\"key\").trim() === \"\") {\n throw new Error(\n \"The MapTiler Cloud API key is missing. Set it in `config.apiKey` or get one for free at https://maptiler.com\"\n );\n }\n\n return config.fetch(resource, options);\n}\n","/**\n * Some default settings for the SDK\n */\nconst defaults = {\n maptilerApiURL: \"https://api.maptiler.com/\",\n mapStyle: \"streets-v2\",\n};\n\nObject.freeze(defaults);\n\nexport { defaults };\n","/**\n * A ServiceError is an Error that includes the HTTP response details\n */\nexport class ServiceError extends Error {\n constructor(public res: Response, customMessage = \"\") {\n super(\n `Call to enpoint ${res.url} failed with the status code ${res.status}. ${customMessage}`\n );\n }\n}\n","import { BBox } from \"geojson\";\nimport { callFetch } from \"../callFetch\";\nimport { config } from \"../config\";\nimport { defaults } from \"../defaults\";\nimport { ServiceError } from \"./ServiceError\";\n\nconst customMessages = {\n 403: \"Key is missing, invalid or restricted\",\n};\n\n/**\n * Options that can be provided to get user data.\n */\nexport type GeolocationInfoOptions = {\n /**\n * Custom MapTiler Cloud API key to use instead of the one in global `config`\n */\n apiKey?: string;\n};\n\nexport type GeolocationResult = {\n /**\n * Name of the country\n * Example: Switzerland\n */\n country?: string;\n\n /**\n * Two-letter code of the country ISO 3166-1 alpha-2 codes\n * Example: CH\n */\n country_code?: string;\n\n /**\n * Bounds of the country in WGS84 degrees [west, south, east, north].\n * Example: [5.95538,45.818852,10.490936,47.809357]\n */\n country_bounds?: BBox;\n\n /**\n * Official country languages in ISO 639-1 format. ISO 639-1 codes\n * Example: [\"de\",\"fr\",\"it\"]\n */\n country_languages?: Array;\n\n /**\n * Name of the continent\n * Example: Europe\n */\n continent?: string;\n\n /**\n * Two-letter code of the continent\n * Example: EU\n */\n continent_code?: string;\n\n /**\n * Indicated whether the country is part of the European Union.\n */\n eu?: boolean;\n\n /**\n * Name of the city\n * Example: Zurich\n */\n city?: string;\n\n /**\n * Latitude of the location\n * Example: 47.36667\n */\n latitude?: number;\n\n /**\n * Longitude of the location\n * Example: 8.55\n */\n longitude?: number;\n\n /**\n * Postal code\n * Example: 8000\n */\n postal?: string;\n\n /**\n * If known, the ISO 3166-2 name for the first level region. ISO 3166-2 codes\n * Example: Zurich\n */\n region?: string;\n\n /**\n * If known, the ISO 3166-2 code for the first level region. ISO 3166-2 codes\n * Example: ZH\n */\n region_code?: string;\n\n /**\n * Name of the timezone\n * Example: Europe/Zurich\n */\n timezone?: string;\n};\n\n/**\n * Looks up geolocation details from IP address using MapTiler API.\n * Learn more on the MapTiler API reference page: https://docs.maptiler.com/cloud/api/geolocation/#ip-geolocation\n * @returns\n */\nasync function info(\n options: GeolocationInfoOptions = {}\n): Promise {\n const endpoint = new URL(`geolocation/ip.json`, defaults.maptilerApiURL);\n endpoint.searchParams.set(\"key\", options.apiKey ?? config.apiKey);\n const urlWithParams = endpoint.toString();\n\n const res = await callFetch(urlWithParams);\n\n if (!res.ok) {\n throw new ServiceError(\n res,\n res.status in customMessages ? customMessages[res.status] : \"\"\n );\n }\n\n const obj = await res.json();\n return obj as GeolocationResult;\n}\n\n/**\n * The **geolocation** namespace contains an asynchronous function to call the [MapTiler Geolocation API](https://docs.maptiler.com/cloud/api/geolocation/).\n * The **Geolocation API** provides a way to retrieve the IP address as well as geographic informations of a machine performing the query (most likely: a user)\n */\nconst geolocation = {\n info,\n};\n\nexport { geolocation };\n","/**\n * Expand the map style provided as argument of the Map constructor\n * @param style\n * @returns\n */\nexport function expandMapStyle(style): string {\n // testing if the style provided is of form \"maptiler://some-style\"\n const maptilerDomainRegex = /^maptiler:\\/\\/(.*)/;\n let match;\n const trimmed = style.trim();\n let expandedStyle;\n\n // The style was possibly already given as expanded URL\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n expandedStyle = trimmed;\n } else if ((match = maptilerDomainRegex.exec(trimmed)) !== null) {\n expandedStyle = `https://api.maptiler.com/maps/${match[1]}/style.json`;\n } else {\n // The style could also possibly just be the name of the style without any URI style\n expandedStyle = `https://api.maptiler.com/maps/${trimmed}/style.json`;\n }\n\n return expandedStyle;\n}\n\n/**\n * Type for object containing style details\n */\nexport type MapStylePreset = {\n referenceStyleID: string;\n name: string;\n description: string;\n variants: Array<{\n id: string;\n name: string;\n variantType: string;\n description: string;\n imageURL: string;\n }>;\n};\n\n/**\n * An instance of MapStyleVariant contains information about a style to use that belong to a reference style\n */\nexport class MapStyleVariant {\n constructor(\n /**\n * Human-friendly name\n */\n private name: string,\n\n /**\n * Variant name the variant is addressed to from its reference style: `MapStyle.REFERNCE_STYLE_NAME.VARIANT_TYPE`\n */\n private variantType: string,\n\n /**\n * MapTiler Cloud id\n */\n private id: string,\n\n /**\n * Reference map style, used to retrieve sibling variants\n */\n private referenceStyle: ReferenceMapStyle,\n\n /**\n * Human-friendly description\n */\n private description: string,\n\n /**\n * URL to an image describing the style variant\n */\n private imageURL: string\n ) {}\n\n /**\n * Get the human-friendly name\n * @returns\n */\n getName(): string {\n return this.name;\n }\n\n getFullName(): string {\n return `${this.referenceStyle.getName()} ${this.name}`;\n }\n\n /**\n * Get the variant type (eg. \"DEFAULT\", \"DARK\", \"PASTEL\", etc.)\n * @returns\n */\n getType(): string {\n return this.variantType;\n }\n\n /**\n * Get the MapTiler Cloud id\n * @returns\n */\n getId(): string {\n return this.id;\n }\n\n /**\n * Get the human-friendly description\n */\n getDescription(): string {\n return this.description;\n }\n\n /**\n * Get the reference style this variant belongs to\n * @returns\n */\n getReferenceStyle(): ReferenceMapStyle {\n return this.referenceStyle;\n }\n\n /**\n * Check if a variant of a given type exists for _this_ variants\n * (eg. if this is a \"DARK\", then we can check if there is a \"LIGHT\" variant of it)\n * @param variantType\n * @returns\n */\n hasVariant(variantType: string): boolean {\n return this.referenceStyle.hasVariant(variantType);\n }\n\n /**\n * Retrieve the variant of a given type. If not found, will return the \"DEFAULT\" variant.\n * (eg. _this_ \"DARK\" variant does not have any \"PASTEL\" variant, then the \"DEFAULT\" is returned)\n * @param variantType\n * @returns\n */\n getVariant(variantType: string): MapStyleVariant {\n return this.referenceStyle.getVariant(variantType);\n }\n\n /**\n * Get all the variants for _this_ variants, except _this_ current one\n * @returns\n */\n getVariants(): Array {\n return this.referenceStyle.getVariants().filter((v) => v !== this);\n }\n\n /**\n * Get the image URL that represent _this_ variant\n * @returns\n */\n getImageURL(): string {\n return this.imageURL;\n }\n\n /**\n * Get the style as usable by MapLibre, a string (URL) or a plain style description (StyleSpecification)\n * @returns\n */\n getExpandedStyleURL(): string {\n return expandMapStyle(this.getId());\n }\n}\n\n/**\n * An instance of reference style contains a list of StyleVariants ordered by relevance\n */\nexport class ReferenceMapStyle {\n /**\n * Variants that belong to this reference style, key being the reference type\n */\n private variants: { [key: string]: MapStyleVariant } = {};\n\n /**\n * Variants that belong to this reference style, ordered by relevance\n */\n private orderedVariants: Array = [];\n\n constructor(\n /**\n * Human-friendly name of this reference style\n */\n private name: string,\n\n /**\n * ID of this reference style\n */\n private id: string\n ) {}\n\n /**\n * Get the human-friendly name of this reference style\n * @returns\n */\n getName(): string {\n return this.name;\n }\n\n /**\n * Get the id of _this_ reference style\n * @returns\n */\n getId(): string {\n return this.id;\n }\n\n /**\n * Add a variant to _this_ reference style\n * @param v\n */\n addVariant(v: MapStyleVariant) {\n this.variants[v.getType()] = v;\n this.orderedVariants.push(v);\n }\n\n /**\n * Check if a given variant type exists for this reference style\n * @param variantType\n * @returns\n */\n hasVariant(variantType: string): boolean {\n return variantType in this.variants;\n }\n\n /**\n * Get a given variant. If the given type of variant does not exist for this reference style,\n * then the most relevant default variant is returned instead\n * @param variantType\n * @returns\n */\n getVariant(variantType: string): MapStyleVariant {\n return variantType in this.variants\n ? this.variants[variantType]\n : this.orderedVariants[0];\n }\n\n /**\n * Get the list of variants for this reference style\n * @returns\n */\n getVariants(): Array {\n return Object.values(this.variants);\n }\n\n /**\n * Get the defualt variant for this reference style\n * @returns\n */\n getDefaultVariant(): MapStyleVariant {\n return this.orderedVariants[0];\n }\n}\n\n/**\n * All the styles and variants maintained by MapTiler.\n */\nexport type MapStyleType = {\n /**\n * Suitable for navigation, with high level of detail on urban areas, plenty of POIs and 3D buildings\n */\n STREETS: ReferenceMapStyle & {\n /**\n * Suitable for navigation, with high level of detail on urban areas, plenty of POIs and 3D buildings.\n */\n DEFAULT: MapStyleVariant;\n /**\n * Suitable for navigation, with high level of detail on urban areas, plenty of POIs and 3D buildings, in dark mode.\n */\n DARK: MapStyleVariant;\n /**\n * Suitable for navigation, with high level of detail on urban areas, plenty of POIs and 3D buildings, in light mode.\n */\n LIGHT: MapStyleVariant;\n /**\n * Suitable for navigation, with high level of detail on urban areas, plenty of POIs and 3D buildings, in blue night mode.\n */\n NIGHT: MapStyleVariant;\n /**\n * Suitable for navigation, with high level of detail on urban areas, plenty of POIs and 3D buildings, with a pastel color palette.\n */\n PASTEL: MapStyleVariant;\n };\n\n /**\n * Suitable for outdoor activities. With elevation isolines and hillshading.\n */\n OUTDOOR: ReferenceMapStyle & {\n /**\n * Suitable for outdoor activities. With elevation isolines and hillshading.\n */\n DEFAULT: MapStyleVariant;\n\n /**\n * Suitable for outdoor activities. With elevation isolines and hillshading, in dark mode.\n */\n DARK: MapStyleVariant;\n };\n\n /**\n * Suitabe for winter outdoor activities. With ski tracks, elevation isolines and hillshading.\n */\n WINTER: ReferenceMapStyle & {\n /**\n * Suitabe for winter outdoor activities. With ski tracks, elevation isolines and hillshading.\n */\n DEFAULT: MapStyleVariant;\n /**\n * Suitabe for winter outdoor activities. With ski tracks, elevation isolines and hillshading, in dark mode.\n */\n DARK: MapStyleVariant;\n };\n\n /**\n * High resolution imagery only, without any label.\n */\n SATELLITE: ReferenceMapStyle & {\n /**\n * High resolution imagery only, without any label.\n */\n DEFAULT: MapStyleVariant;\n };\n\n /**\n * High resolution imagery with labels, political borders and roads.\n */\n HYBRID: ReferenceMapStyle & {\n /**\n * High resolution imagery with labels, political borders and roads.\n */\n DEFAULT: MapStyleVariant;\n };\n\n /**\n * A minimalist street-oriented style without POI\n */\n BASIC: ReferenceMapStyle & {\n /**\n * A minimalist street-oriented style without POI\n */\n DEFAULT: MapStyleVariant;\n /**\n * A minimalist street-oriented style without POI, in dark mode\n */\n DARK: MapStyleVariant;\n /**\n * A minimalist street-oriented style without POI, in light mode\n */\n LIGHT: MapStyleVariant;\n };\n\n /**\n * A bright street-oriented style, a nice alternative to `streets`\n */\n BRIGHT: ReferenceMapStyle & {\n /**\n * A bright street-oriented style, a nice alternative to `streets`\n */\n DEFAULT: MapStyleVariant;\n /**\n * A bright street-oriented style, a nice alternative to `streets`, in dark mode\n */\n DARK: MapStyleVariant;\n /**\n * A bright street-oriented style, a nice alternative to `streets`, in light mode\n */\n LIGHT: MapStyleVariant;\n /**\n * A bright street-oriented style, a nice alternative to `streets`, with a soft pastel color palette\n */\n PASTEL: MapStyleVariant;\n };\n\n /**\n * Classic OpenStreetMap style\n */\n OPENSTREETMAP: ReferenceMapStyle & {\n DEFAULT: MapStyleVariant;\n };\n\n /**\n * A nice high-contrast, yet less saturated alternative to the `outdoor` style, with hillshading, 3D buildings and fairly high street details\n */\n TOPO: ReferenceMapStyle & {\n /**\n * A nice high-contrast, yet less saturated alternative to the `outdoor` style, with hillshading, 3D buildings and fairly high street details\n */\n DEFAULT: MapStyleVariant;\n /**\n * A nice high-contrast, yet less saturated alternative to the `outdoor` style, with hillshading, 3D buildings and fairly high street details, in dark mode\n */\n DARK: MapStyleVariant;\n /**\n * A nice high-contrast, and high saturation alternative to the `outdoor` style, with hillshading, 3D buildings and fairly high street details\n */\n SHINY: MapStyleVariant;\n /**\n * A nice low-contrast, alternative to the `outdoor` style, with hillshading, 3D buildings and fairly high street details, using a soft pastel color palette\n */\n PASTEL: MapStyleVariant;\n\n /**\n * A nice very high-contrast, yet less saturated alternative to the `outdoor` style, with hillshading, 3D buildings and fairly high street details\n */\n TOPOGRAPHIQUE: MapStyleVariant;\n };\n\n /**\n * A nice alternative to `streets` with a soft color palette\n */\n VOYAGER: ReferenceMapStyle & {\n /**\n * A nice alternative to `streets` with a soft color palette\n */\n DEFAULT: MapStyleVariant;\n /**\n * A nice alternative to `streets`, in very dark mode\n */\n DARK: MapStyleVariant;\n /**\n * A nice alternative to `streets`, in light mode\n */\n LIGHT: MapStyleVariant;\n /**\n * A nice alternative to `streets` with a soft sepia color palette and vintage look\n */\n VINTAGE: MapStyleVariant;\n };\n\n /**\n * A bold very high contrast black and white (no gray!) style for the city\n */\n TONER: ReferenceMapStyle & {\n /**\n * A bold very high contrast black and white (no gray!) style for the city\n */\n DEFAULT: MapStyleVariant;\n /**\n * A bold very high contrast black and white (no gray!) style for the city, without any label\n */\n BACKGROUND: MapStyleVariant;\n /**\n * A bold very high contrast, yet faded, style for the city\n */\n LITE: MapStyleVariant;\n /**\n * A bold very high contrast black and white (no gray!) style for the city, with no building, only roads!\n */\n LINES: MapStyleVariant;\n };\n\n /**\n * Minimalist style, perfect for data visualization\n */\n DATAVIZ: ReferenceMapStyle & {\n /**\n * Minimalist style, perfect for data visualization\n */\n DEFAULT: MapStyleVariant;\n\n /**\n * Minimalist style, perfect for data visualization in dark mode\n */\n DARK: MapStyleVariant;\n\n /**\n * Minimalist style, perfect for data visualization in light mode\n */\n LIGHT: MapStyleVariant;\n };\n\n /**\n * Explore deep see trenches and mountains, with isolines and depth labels\n */\n OCEAN: ReferenceMapStyle & {\n /**\n * Explore deep see trenches and mountains, with isolines and depth labels\n */\n DEFAULT: MapStyleVariant;\n };\n};\n\nexport const mapStylePresetList: Array = [\n {\n referenceStyleID: \"STREETS\",\n name: \"Streets\",\n description: \"\",\n variants: [\n {\n id: \"streets-v2\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"streets-v2-dark\",\n name: \"Dark\",\n variantType: \"DARK\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"streets-v2-light\",\n name: \"Light\",\n variantType: \"LIGHT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"streets-v2-night\",\n name: \"Night\",\n variantType: \"NIGHT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"streets-v2-pastel\",\n name: \"Pastel\",\n variantType: \"PASTEL\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"OUTDOOR\",\n name: \"Outdoor\",\n description: \"\",\n variants: [\n {\n id: \"outdoor-v2\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"outdoor-v2-dark\",\n name: \"Dark\",\n variantType: \"DARK\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"WINTER\",\n name: \"Winter\",\n description: \"\",\n variants: [\n {\n id: \"winter-v2\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"winter-v2-dark\",\n name: \"Dark\",\n variantType: \"DARK\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"SATELLITE\",\n name: \"Satellite\",\n description: \"\",\n variants: [\n {\n id: \"satellite\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"HYBRID\",\n name: \"Hybrid\",\n description: \"\",\n variants: [\n {\n id: \"hybrid\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"BASIC\",\n name: \"Basic\",\n description: \"\",\n variants: [\n {\n id: \"basic-v2\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"basic-v2-dark\",\n name: \"Dark\",\n variantType: \"DARK\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"basic-v2-light\",\n name: \"Light\",\n variantType: \"LIGHT\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"BRIGHT\",\n name: \"Bright\",\n description: \"\",\n variants: [\n {\n id: \"bright-v2\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"bright-v2-dark\",\n name: \"Dark\",\n variantType: \"DARK\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"bright-v2-light\",\n name: \"Light\",\n variantType: \"LIGHT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"bright-v2-pastel\",\n name: \"Pastel\",\n variantType: \"PASTEL\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"OPENSTREETMAP\",\n name: \"OpenStreetMap\",\n description: \"\",\n variants: [\n {\n id: \"openstreetmap\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"TOPO\",\n name: \"Topo\",\n description: \"\",\n variants: [\n {\n id: \"topo-v2\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"topo-v2-dark\",\n name: \"Dark\",\n variantType: \"DARK\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"topo-v2-shiny\",\n name: \"Shiny\",\n variantType: \"SHINY\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"topo-v2-pastel\",\n name: \"Pastel\",\n variantType: \"PASTEL\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"topo-v2-topographique\",\n name: \"Topographique\",\n variantType: \"TOPOGRAPHIQUE\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"VOYAGER\",\n name: \"Voyager\",\n description: \"\",\n variants: [\n {\n id: \"voyager-v2\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"voyager-v2-darkmatter\",\n name: \"Darkmatter\",\n variantType: \"DARK\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"voyager-v2-positron\",\n name: \"Positron\",\n variantType: \"LIGHT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"voyager-v2-vintage\",\n name: \"Vintage\",\n variantType: \"VINTAGE\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"TONER\",\n name: \"Toner\",\n description: \"\",\n variants: [\n {\n id: \"toner-v2\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"toner-v2-background\",\n name: \"Background\",\n variantType: \"BACKGROUND\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"toner-v2-lite\",\n name: \"Lite\",\n variantType: \"LITE\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"toner-v2-lines\",\n name: \"Lines\",\n variantType: \"LINES\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"DATAVIZ\",\n name: \"Dataviz\",\n description: \"\",\n variants: [\n {\n id: \"dataviz\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"dataviz-dark\",\n name: \"Dark\",\n variantType: \"DARK\",\n description: \"\",\n imageURL: \"\",\n },\n {\n id: \"dataviz-light\",\n name: \"Light\",\n variantType: \"LIGHT\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n\n {\n referenceStyleID: \"OCEAN\",\n name: \"Ocean\",\n description: \"\",\n variants: [\n {\n id: \"ocean\",\n name: \"Default\",\n variantType: \"DEFAULT\",\n description: \"\",\n imageURL: \"\",\n },\n ],\n },\n];\n\nfunction makeReferenceStyleProxy(referenceStyle: ReferenceMapStyle) {\n return new Proxy(referenceStyle, {\n get(target, prop, receiver) {\n if (target.hasVariant(prop as string)) {\n return target.getVariant(prop as string);\n }\n\n // This variant does not exist for this style, but since it's full uppercase\n // we guess that the dev tries to access a style variant. So instead of\n // returning the default (STREETS.DEFAULT), we return the non-variant of the current style\n if (prop.toString().toUpperCase() === (prop as string)) {\n return referenceStyle.getDefaultVariant();\n }\n\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n\nfunction buildMapStyles(): MapStyleType {\n const mapStyle = {};\n\n for (let i = 0; i < mapStylePresetList.length; i += 1) {\n const refStyleInfo = mapStylePresetList[i];\n\n const refStyle = makeReferenceStyleProxy(\n new ReferenceMapStyle(refStyleInfo.name, refStyleInfo.referenceStyleID)\n );\n\n for (let j = 0; j < refStyleInfo.variants.length; j += 1) {\n const variantInfo = refStyleInfo.variants[j];\n const variant = new MapStyleVariant(\n variantInfo.name, // name\n variantInfo.variantType, // variantType\n variantInfo.id, // id\n refStyle, // referenceStyle\n variantInfo.description,\n variantInfo.imageURL // imageURL\n );\n\n refStyle.addVariant(variant);\n }\n mapStyle[refStyleInfo.referenceStyleID] = refStyle;\n }\n return mapStyle as MapStyleType;\n}\n\nexport function styleToStyle(\n style: string | ReferenceMapStyle | MapStyleVariant | null | undefined\n): string {\n if (!style) {\n return MapStyle[mapStylePresetList[0].referenceStyleID]\n .getDefaultVariant()\n .getId();\n }\n\n // If the provided style is a shorthand (eg. \"streets-v2\") then we make sure it's trimmed and lowercase\n if (typeof style === \"string\" || style instanceof String) {\n return style.trim().toLowerCase();\n }\n\n if (style instanceof MapStyleVariant) {\n return style.getId();\n }\n\n if (style instanceof ReferenceMapStyle) {\n return style.getDefaultVariant().getId();\n }\n}\n\n/**\n * Contains all the reference map style created by MapTiler team as well as all the variants.\n * For example, `MapStyle.STREETS` and the variants:\n * - `MapStyle.STREETS.DARK`\n * - `MapStyle.STREETS.LIGHT`\n * - `MapStyle.STREETS.PASTEL`\n *\n */\nexport const MapStyle: MapStyleType = buildMapStyles();\n","import { BBox, Position } from \"geojson\";\nimport { config } from \"../config\";\nimport { defaults } from \"../defaults\";\nimport { MapStyleVariant, ReferenceMapStyle, styleToStyle } from \"../mapstyle\";\nimport simplify from \"./simplify\";\n\n/**\n * Base set of options that can be provided to all the types of static maps\n */\nexport type StaticMapBaseOptions = {\n /**\n * Custom MapTiler Cloud API key to use instead of the one in global `config`\n */\n apiKey?: string;\n\n /**\n * Style of the map (not full style URL). Example: \"winter\", \"streets-v2\".\n * Default: `\"streets-v2\"`\n */\n style?: string | ReferenceMapStyle | MapStyleVariant;\n\n /**\n * Double the size of the static map image to support hiDPI/Retina monitors.\n * Default: `false`\n */\n hiDPI?: boolean;\n\n /**\n * Image format.\n * Default: `\"png\"`\n */\n format?: \"png\" | \"jpg\" | \"webp\";\n\n /**\n * Width of the output image. Maximum value: `2048`.\n * Default: `1024`\n */\n width?: number;\n\n /**\n * Height of the output image. Maximum value: `2048`.\n * Default: `1024`\n */\n height?: number;\n\n /**\n * Placement of the attribution. Can also be set to `false` to not show attribution.\n * Default: `\"bottomright\"`\n */\n attribution?: \"bottomright\" | \"bottomleft\" | \"topleft\" | \"topright\" | false;\n\n /**\n * A marker or list of markers to show on the map\n * Default: none provided\n */\n markers?: StaticMapMarker | Array;\n\n /**\n * URL of the marker image. Applies only if one or multiple markers positions are provided.\n * Default: none provided\n */\n markerIcon?: string;\n\n /**\n * Position of the marker regarding its coordinates. Applies only:\n * - with a custom icon provided with `markerIcon`\n * - if one or multiple markers positions are provided.\n * Default: `\"bottom\"`\n */\n markerAnchor?:\n | \"top\"\n | \"left\"\n | \"bottom\"\n | \"right\"\n | \"center\"\n | \"topleft\"\n | \"bottomleft\"\n | \"topright\"\n | \"bottomright\";\n\n /**\n * Draw a path or polygon on top of the map. If the path is too long it will be simplified, yet remaining accurate.\n * Default: none provided\n */\n path?: Array;\n\n /**\n * Color of the path line. The color must be CSS compatible.\n * Examples:\n * - long form hex without transparency `\"#FF0000\"` (red)\n * - short form hex without transparency `\"#F00\"` (red)\n * - long form hex with transparency `\"#FF000008\"` (red, half opacity)\n * - short form hex with transparency `\"#F008\"` (red, half opacity)\n * - CSS color shorthands: `\"red\"`, `\"chartreuse\"`, etc.\n * - decimal RGB values without transparency: `\"rgb(128, 100, 255)\"`\n * - decimal RGB values with transparency: `\"rgb(128, 100, 255, 0.5)\"`\n * Default: `\"blue\"`\n */\n pathStrokeColor?: string;\n\n /**\n * Color of the filling, also works if the polygon is not closed. The color must be CSS compatible.\n * Examples:\n * - long form hex without transparency `\"#FF0000\"` (red)\n * - short form hex without transparency `\"#F00\"` (red)\n * - long form hex with transparency `\"#FF000008\"` (red, half opacity)\n * - short form hex with transparency `\"#F008\"` (red, half opacity)\n * - CSS color shorthands: `\"red\"`, `\"chartreuse\"`, etc.\n * - decimal RGB values without transparency: `\"rgb(128, 100, 255)\"`\n * - decimal RGB values with transparency: `\"rgb(128, 100, 255, 0.5)\"`\n * Default: none (transparent filling)\n */\n pathFillColor?: string;\n\n /**\n * Width of the path line in pixel. It can be floating point precision (ex: `0.5`)\n * Default: `1` if `hiDPI` is `false` and `2` if `hiDPI` is `true`.\n */\n pathWidth?: number;\n};\n\n/**\n * Options that can be provided to centered static maps\n */\nexport type CenteredStaticMapOptions = StaticMapBaseOptions;\n\n/**\n * Options that can be provided to bounded static maps\n */\nexport type BoundedStaticMapOptions = StaticMapBaseOptions & {\n /**\n * Extra space added around the regio of interest, in percentage.\n * Default: `0.1` (for 10%)\n */\n padding?: number;\n};\n\n/**\n * Options that can be provided to automatic static maps\n */\nexport type AutomaticStaticMapOptions = BoundedStaticMapOptions;\n\n/**\n * Definition of a maker to show on a static map\n */\nexport type StaticMapMarker = [\n /**\n * Longitude of the marker\n */\n number,\n /**\n * latitude of the marker\n */\n number,\n /**\n * Color of the marker with CSS syntax. Applies only if a custom `markerIcon` is not provided.\n */\n string\n];\n\nfunction staticMapMarkerToString(\n marker: StaticMapMarker,\n includeColor = true\n): string {\n let str = `${marker[0]},${marker[1]}`;\n\n if (marker.length === 3 && includeColor) {\n str += `,${marker[2]}`;\n }\n\n return str;\n}\n\nfunction simplifyAndStringify(path: Array, maxNbChar = 3000): string {\n let str = path.map((point) => point.join(\",\")).join(\"|\");\n let tolerance = 0.000005;\n const toleranceStep = 0.00001;\n\n while (str.length > maxNbChar) {\n const simplerPath = simplify(path, tolerance);\n // str = simplerPath.map(point => point.join(',')).join('|');\n str = simplerPath.map((point) => `${point[0]},${point[1]}`).join(\"|\");\n tolerance += toleranceStep;\n }\n\n return str;\n}\n\n/**\n * Construct the URL for a static map centered on one point.\n * Note: this function does not fetch the binary content of the image since\n * the purpose of a static map is generally to have its URL as a `src` property of a element.\n * If a path is provided and is too long, it will be simplified in an accurate way.\n * @param center\n * @param zoom\n * @param options\n * @returns\n */\nfunction centered(\n center: Position,\n zoom: number,\n options: CenteredStaticMapOptions = {}\n): string {\n const style = styleToStyle(options.style);\n const scale = options.hiDPI ? \"@2x\" : \"\";\n const format = options.format ?? \"png\";\n let width = ~~(options.width ?? 1024);\n let height = ~~(options.height ?? 1024);\n\n if (options.hiDPI) {\n width = ~~(width / 2);\n height = ~~(height / 2);\n }\n\n const endpoint = new URL(\n `maps/${encodeURIComponent(style)}/static/${center[0]},${\n center[1]\n },${zoom}/${width}x${height}${scale}.${format}`,\n defaults.maptilerApiURL\n );\n\n if (\"attribution\" in options) {\n endpoint.searchParams.set(\"attribution\", options.attribution.toString());\n }\n\n if (\"markers\" in options) {\n let markerStr = \"\";\n\n const hasIcon = \"markerIcon\" in options;\n\n if (hasIcon) {\n markerStr += `icon:${options.markerIcon}|`;\n }\n\n if (hasIcon && \"markerAnchor\" in options) {\n markerStr += `anchor:${options.markerAnchor}|`;\n }\n\n if (hasIcon && options.hiDPI) {\n markerStr += `scale:2|`;\n }\n\n const markerList = Array.isArray(options.markers[0])\n ? options.markers\n : [options.markers];\n markerStr += markerList\n .map((m) => staticMapMarkerToString(m, !hasIcon))\n .join(\"|\");\n endpoint.searchParams.set(\"markers\", markerStr);\n }\n\n if (\"path\" in options) {\n let pathStr = \"\";\n\n pathStr += `fill:${options.pathFillColor ?? \"none\"}|`;\n\n if (\"pathStrokeColor\" in options) {\n pathStr += `stroke:${options.pathStrokeColor}|`;\n }\n\n if (\"pathWidth\" in options) {\n const pathWidth = options.pathWidth / (options.hiDPI ? 2 : 1);\n pathStr += `width:${pathWidth.toString()}|`;\n }\n\n pathStr += simplifyAndStringify(options.path);\n endpoint.searchParams.set(\"path\", pathStr);\n }\n\n endpoint.searchParams.set(\"key\", options.apiKey ?? config.apiKey);\n\n return endpoint.toString();\n}\n\n/**\n * Construct the URL for a static map using a bounding box\n * Note: this function does not fetch the binary content of the image since\n * the purpose of a static map is generally to have its URL as a `src` property of a element.\n * If a path is provided and is too long, it will be simplified in an accurate way.\n * @param boundingBox\n * @param options\n * @returns\n */\nfunction bounded(\n boundingBox: BBox,\n options: BoundedStaticMapOptions = {}\n): string {\n const style = styleToStyle(options.style);\n const scale = options.hiDPI ? \"@2x\" : \"\";\n const format = options.format ?? \"png\";\n let width = ~~(options.width ?? 1024);\n let height = ~~(options.height ?? 1024);\n\n if (options.hiDPI) {\n width = ~~(width / 2);\n height = ~~(height / 2);\n }\n\n const endpoint = new URL(\n `maps/${encodeURIComponent(style)}/static/${boundingBox[0]},${\n boundingBox[1]\n },${boundingBox[2]},${boundingBox[3]}/${width}x${height}${scale}.${format}`,\n defaults.maptilerApiURL\n );\n\n if (\"attribution\" in options) {\n endpoint.searchParams.set(\"attribution\", options.attribution.toString());\n }\n\n if (\"padding\" in options) {\n endpoint.searchParams.set(\"padding\", options.padding.toString());\n }\n\n if (\"markers\" in options) {\n let markerStr = \"\";\n\n const hasIcon = \"markerIcon\" in options;\n\n if (hasIcon) {\n markerStr += `icon:${options.markerIcon}|`;\n }\n\n if (hasIcon && \"markerAnchor\" in options) {\n markerStr += `anchor:${options.markerAnchor}|`;\n }\n\n if (hasIcon && options.hiDPI) {\n markerStr += `scale:2|`;\n }\n\n const markerList = Array.isArray(options.markers[0])\n ? options.markers\n : [options.markers];\n markerStr += markerList\n .map((m) => staticMapMarkerToString(m, !hasIcon))\n .join(\"|\");\n endpoint.searchParams.set(\"markers\", markerStr);\n }\n\n if (\"path\" in options) {\n let pathStr = \"\";\n\n pathStr += `fill:${options.pathFillColor ?? \"none\"}|`;\n\n if (\"pathStrokeColor\" in options) {\n pathStr += `stroke:${options.pathStrokeColor}|`;\n }\n\n if (\"pathWidth\" in options) {\n const pathWidth = options.pathWidth / (options.hiDPI ? 2 : 1);\n pathStr += `width:${pathWidth.toString()}|`;\n }\n\n pathStr += simplifyAndStringify(options.path);\n endpoint.searchParams.set(\"path\", pathStr);\n }\n\n endpoint.searchParams.set(\"key\", options.apiKey ?? config.apiKey);\n\n return endpoint.toString();\n}\n\n/**\n * Construct the URL for a static map automatically fitted around the provided path or markers.\n * Note: this function does not fetch the binary content of the image since\n * the purpose of a static map is generally to have its URL as a `src` property of a element.\n * If a path is provided and is too long, it will be simplified in an accurate way.\n * @param options\n * @returns\n */\nfunction automatic(options: AutomaticStaticMapOptions = {}): string {\n if (!(\"markers\" in options) && !(\"path\" in options)) {\n throw new Error(\n \"Automatic static maps require markers and/or path to be created.\"\n );\n }\n\n const style = styleToStyle(options.style);\n const scale = options.hiDPI ? \"@2x\" : \"\";\n const format = options.format ?? \"png\";\n let width = ~~(options.width ?? 1024);\n let height = ~~(options.height ?? 1024);\n\n if (options.hiDPI) {\n width = ~~(width / 2);\n height = ~~(height / 2);\n }\n\n const endpoint = new URL(\n `maps/${encodeURIComponent(\n style\n )}/static/auto/${width}x${height}${scale}.${format}`,\n defaults.maptilerApiURL\n );\n\n if (\"attribution\" in options) {\n endpoint.searchParams.set(\"attribution\", options.attribution.toString());\n }\n\n if (\"padding\" in options) {\n endpoint.searchParams.set(\"padding\", options.padding.toString());\n }\n\n if (\"markers\" in options) {\n let markerStr = \"\";\n\n const hasIcon = \"markerIcon\" in options;\n\n if (hasIcon) {\n markerStr += `icon:${options.markerIcon}|`;\n }\n\n if (hasIcon && \"markerAnchor\" in options) {\n markerStr += `anchor:${options.markerAnchor}|`;\n }\n\n if (hasIcon && options.hiDPI) {\n markerStr += `scale:2|`;\n }\n\n const markerList = Array.isArray(options.markers[0])\n ? options.markers\n : [options.markers];\n markerStr += markerList\n .map((m) => staticMapMarkerToString(m, !hasIcon))\n .join(\"|\");\n endpoint.searchParams.set(\"markers\", markerStr);\n }\n\n if (\"path\" in options) {\n let pathStr = \"\";\n\n pathStr += `fill:${options.pathFillColor ?? \"none\"}|`;\n\n if (\"pathStrokeColor\" in options) {\n pathStr += `stroke:${options.pathStrokeColor}|`;\n }\n\n if (\"pathWidth\" in options) {\n const pathWidth = options.pathWidth / (options.hiDPI ? 2 : 1);\n pathStr += `width:${pathWidth.toString()}|`;\n }\n\n pathStr += simplifyAndStringify(options.path);\n endpoint.searchParams.set(\"path\", pathStr);\n }\n\n endpoint.searchParams.set(\"key\", options.apiKey ?? config.apiKey);\n\n return endpoint.toString();\n}\n\n/**\n * The **staticMaps** namespace contains an synchronous function build image URL of static map, as specified by the [MapTiler Static Map API](https://docs.maptiler.com/cloud/api/static-maps/).\n * The URL of static maps can then be used within a `` markup element, as the `src` property value.\n */\nconst staticMaps = {\n centered,\n bounded,\n automatic,\n};\n\nexport { staticMaps };\n","/**\n * This is an extension of MapLibre LogoControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class LogoControl extends maplibregl.LogoControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import maplibregl from \"maplibre-gl\";\nimport type { LogoOptions as LogoOptionsML } from \"maplibre-gl\";\nimport { defaults } from \"./defaults\";\nimport { Map } from \"./Map\";\nimport { LogoControl } from \"./LogoControl\";\n\ntype LogoOptions = LogoOptionsML & {\n logoURL?: string;\n linkURL?: string;\n};\n\n/**\n * This LogoControl extends the MapLibre LogoControl but instead can use any image URL and\n * any link URL. By default this is using MapTiler logo and URL.\n */\nexport class MaptilerLogoControl extends LogoControl {\n private logoURL = \"\";\n private linkURL = \"\";\n\n constructor(options: LogoOptions = {}) {\n super(options);\n\n this.logoURL = options.logoURL ?? defaults.maptilerLogoURL;\n this.linkURL = options.linkURL ?? defaults.maptilerURL;\n }\n\n onAdd(map: Map): HTMLElement {\n this._map = map;\n this._compact = this.options && this.options.compact;\n this._container = window.document.createElement(\"div\");\n this._container.className = \"maplibregl-ctrl\";\n const anchor = window.document.createElement(\"a\");\n anchor.style.backgroundRepeat = \"no-repeat\";\n anchor.style.cursor = \"pointer\";\n anchor.style.display = \"block\";\n anchor.style.height = \"23px\";\n anchor.style.margin = \"0 0 -4px -4px\";\n anchor.style.overflow = \"hidden\";\n anchor.style.width = \"88px\";\n anchor.style.backgroundImage = `url(${this.logoURL})`;\n anchor.style.backgroundSize = \"100px 30px\";\n anchor.style.width = \"100px\";\n anchor.style.height = \"30px\";\n\n anchor.target = \"_blank\";\n anchor.rel = \"noopener nofollow\";\n anchor.href = this.linkURL;\n anchor.setAttribute(\n \"aria-label\",\n this._map._getUIString(\"LogoControl.Title\")\n );\n anchor.setAttribute(\"rel\", \"noopener nofollow\");\n this._container.appendChild(anchor);\n this._container.style.display = \"block\";\n\n this._map.on(\"resize\", this._updateCompact);\n this._updateCompact();\n\n return this._container;\n }\n}\n","import maplibregl from \"maplibre-gl\";\nimport { defaults } from \"./defaults\";\n\nexport function enableRTL() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (maplibregl.getRTLTextPluginStatus() === \"unavailable\") {\n maplibregl.setRTLTextPlugin(\n defaults.rtlPluginURL,\n null,\n true // Lazy load the plugin\n );\n }\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/util.ts#L223\nexport function bindAll(fns: Array, context: any): void {\n fns.forEach((fn) => {\n if (!context[fn]) {\n return;\n }\n context[fn] = context[fn].bind(context);\n });\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/dom.ts#L22\nexport function DOMcreate(\n tagName: K,\n className?: string,\n container?: HTMLElement\n): HTMLElementTagNameMap[K] {\n const el = window.document.createElement(tagName);\n if (className !== undefined) el.className = className;\n if (container) container.appendChild(el);\n return el;\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/dom.ts#L111\nexport function DOMremove(node: HTMLElement) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\n","import { bindAll, DOMcreate, DOMremove } from \"./tools\";\n\nimport { Map } from \"./Map\";\nimport maplibregl from \"maplibre-gl\";\n\n/**\n * A `MaptilerTerrainControl` control adds a button to turn terrain on and off\n * by triggering the terrain logic that is already deployed in the Map object.\n */\nexport class MaptilerTerrainControl implements maplibregl.IControl {\n _map: Map;\n _container: HTMLElement;\n _terrainButton: HTMLButtonElement;\n\n constructor() {\n bindAll([\"_toggleTerrain\", \"_updateTerrainIcon\"], this);\n }\n\n onAdd(map: Map) {\n this._map = map;\n this._container = DOMcreate(\"div\", \"maplibregl-ctrl maplibregl-ctrl-group\");\n this._terrainButton = DOMcreate(\n \"button\",\n \"maplibregl-ctrl-terrain\",\n this._container\n );\n DOMcreate(\"span\", \"maplibregl-ctrl-icon\", this._terrainButton).setAttribute(\n \"aria-hidden\",\n \"true\"\n );\n this._terrainButton.type = \"button\";\n this._terrainButton.addEventListener(\"click\", this._toggleTerrain);\n\n this._updateTerrainIcon();\n this._map.on(\"terrain\", this._updateTerrainIcon);\n return this._container;\n }\n\n onRemove() {\n DOMremove(this._container);\n this._map.off(\"terrain\", this._updateTerrainIcon);\n this._map = undefined;\n }\n\n _toggleTerrain() {\n if (this._map.hasTerrain()) {\n this._map.disableTerrain();\n } else {\n this._map.enableTerrain();\n }\n\n this._updateTerrainIcon();\n }\n\n _updateTerrainIcon() {\n this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain\");\n this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain-enabled\");\n // if (this._map.terrain) {\n if (this._map.hasTerrain()) {\n this._terrainButton.classList.add(\"maplibregl-ctrl-terrain-enabled\");\n this._terrainButton.title = this._map._getUIString(\n \"TerrainControl.disableTerrain\"\n );\n } else {\n this._terrainButton.classList.add(\"maplibregl-ctrl-terrain\");\n this._terrainButton.title = this._map._getUIString(\n \"TerrainControl.enableTerrain\"\n );\n }\n }\n}\n","/**\n * This is an extension of MapLibre NavigationControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class NavigationControl extends maplibregl.NavigationControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import { NavigationControl } from \"./NavigationControl\";\n\ntype HTMLButtonElementPlus = HTMLButtonElement & {\n clickFunction: (e?: any) => unknown;\n};\n\nexport class MaptilerNavigationControl extends NavigationControl {\n constructor() {\n super({\n showCompass: true,\n showZoom: true,\n visualizePitch: true,\n });\n\n // Removing the default click event\n this._compass.removeEventListener(\n \"click\",\n (this._compass as HTMLButtonElementPlus).clickFunction\n );\n\n // Adding custom click event\n this._compass.addEventListener(\"click\", (e) => {\n {\n const currentPitch = this._map.getPitch();\n if (currentPitch === 0) {\n this._map.easeTo({ pitch: Math.min(this._map.getMaxPitch(), 80) });\n } else {\n if (this.options.visualizePitch) {\n this._map.resetNorthPitch({}, { originalEvent: e });\n } else {\n this._map.resetNorth({}, { originalEvent: e });\n }\n }\n }\n });\n }\n\n /**\n * Overloading: the button now stores its click callback so that we can later on delete it and replace it\n */\n _createButton(\n className: string,\n fn: (e?: any) => unknown\n ): HTMLButtonElementPlus {\n const button = super._createButton(className, fn) as HTMLButtonElementPlus;\n button.clickFunction = fn;\n return button;\n }\n\n /**\n * Overloading: Limit how flat the compass icon can get\n */\n _rotateCompassArrow() {\n const rotate = this.options.visualizePitch\n ? `scale(${Math.min(\n 1.5,\n 1 /\n Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), 0.5)\n )}) rotateX(${Math.min(70, this._map.transform.pitch)}deg) rotateZ(${\n this._map.transform.angle * (180 / Math.PI)\n }deg)`\n : `rotate(${this._map.transform.angle * (180 / Math.PI)}deg)`;\n\n this._compassIcon.style.transform = rotate;\n }\n}\n","/**\n * This is an extension of MapLibre GeolocateControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class GeolocateControl extends maplibregl.GeolocateControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import type { LngLatLike } from \"maplibre-gl\";\nimport maplibregl from \"maplibre-gl\";\nimport { GeolocateControl } from \"./GeolocateControl\";\nimport { DOMcreate } from \"./tools\";\n\nconst Marker = maplibregl.Marker;\nconst LngLat = maplibregl.LngLat;\n\n/**\n * The MaptilerGeolocateControl is an extension of the original GeolocateControl\n * with a few changes. In this version, the active mode persists as long as the\n * location is still centered. This means it's robust to rotation, pitch and zoom.\n *\n */\nexport class MaptilerGeolocateControl extends GeolocateControl {\n private lastUpdatedCenter = new LngLat(0, 0);\n\n /**\n * Update the camera location to center on the current position\n *\n * @param {Position} position the Geolocation API Position\n * @private\n */\n _updateCamera(position: GeolocationPosition) {\n const center = new LngLat(\n position.coords.longitude,\n position.coords.latitude\n );\n const radius = position.coords.accuracy;\n const bearing = this._map.getBearing();\n const options = {\n bearing,\n ...this.options.fitBoundsOptions,\n linear: true,\n };\n\n const currentMapZoom = this._map.getZoom();\n\n if (currentMapZoom > this.options.fitBoundsOptions.maxZoom) {\n options.zoom = currentMapZoom;\n }\n\n this._map.fitBounds(center.toBounds(radius), options, {\n geolocateSource: true, // tag this camera change so it won't cause the control to change to background state\n });\n\n let hasFittingBeenDisrupted = false;\n\n const flagFittingDisruption = () => {\n hasFittingBeenDisrupted = true;\n };\n\n this._map.once(\"click\", flagFittingDisruption);\n this._map.once(\"dblclick\", flagFittingDisruption);\n this._map.once(\"dragstart\", flagFittingDisruption);\n this._map.once(\"mousedown\", flagFittingDisruption);\n this._map.once(\"touchstart\", flagFittingDisruption);\n this._map.once(\"wheel\", flagFittingDisruption);\n\n this._map.once(\"moveend\", () => {\n // Removing the events if not used\n this._map.off(\"click\", flagFittingDisruption);\n this._map.off(\"dblclick\", flagFittingDisruption);\n this._map.off(\"dragstart\", flagFittingDisruption);\n this._map.off(\"mousedown\", flagFittingDisruption);\n this._map.off(\"touchstart\", flagFittingDisruption);\n this._map.off(\"wheel\", flagFittingDisruption);\n\n if (hasFittingBeenDisrupted) {\n return;\n }\n\n this.lastUpdatedCenter = this._map.getCenter();\n });\n }\n\n _setupUI(supported: boolean) {\n this.lastUpdatedCenter = this._map.getCenter();\n\n this._container.addEventListener(\"contextmenu\", (e: MouseEvent) =>\n e.preventDefault()\n );\n this._geolocateButton = DOMcreate(\n \"button\",\n \"maplibregl-ctrl-geolocate\",\n this._container\n );\n DOMcreate(\n \"span\",\n \"maplibregl-ctrl-icon\",\n this._geolocateButton\n ).setAttribute(\"aria-hidden\", \"true\");\n this._geolocateButton.type = \"button\";\n\n if (supported === false) {\n // warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.');\n const title = this._map._getUIString(\n \"GeolocateControl.LocationNotAvailable\"\n );\n this._geolocateButton.disabled = true;\n this._geolocateButton.title = title;\n this._geolocateButton.setAttribute(\"aria-label\", title);\n } else {\n const title = this._map._getUIString(\"GeolocateControl.FindMyLocation\");\n this._geolocateButton.title = title;\n this._geolocateButton.setAttribute(\"aria-label\", title);\n }\n\n if (this.options.trackUserLocation) {\n this._geolocateButton.setAttribute(\"aria-pressed\", \"false\");\n this._watchState = \"OFF\";\n }\n\n // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map\n if (this.options.showUserLocation) {\n this._dotElement = DOMcreate(\"div\", \"maplibregl-user-location-dot\");\n\n this._userLocationDotMarker = new Marker(this._dotElement);\n\n this._circleElement = DOMcreate(\n \"div\",\n \"maplibregl-user-location-accuracy-circle\"\n );\n this._accuracyCircleMarker = new Marker({\n element: this._circleElement,\n pitchAlignment: \"map\",\n });\n\n if (this.options.trackUserLocation) this._watchState = \"OFF\";\n\n this._map.on(\"move\", this._onZoom);\n }\n\n this._geolocateButton.addEventListener(\"click\", this.trigger.bind(this));\n\n this._setup = true;\n\n // when the camera is changed (and it's not as a result of the Geolocation Control) change\n // the watch mode to background watch, so that the marker is updated but not the camera.\n // Addition: Yet the status change does not occur if the ditance it has moved to is less than\n // one meter from the last auto-updated position. This is to guarrantee that if the move\n // is a zoom, rotation or pitch (where the center stays the same) then we can keep the ACTIVE_LOCK\n // mode ON.\n if (this.options.trackUserLocation) {\n this._map.on(\"moveend\", (event: any) => {\n const fromResize =\n event.originalEvent && event.originalEvent.type === \"resize\";\n const movingDistance = this.lastUpdatedCenter.distanceTo(\n this._map.getCenter()\n );\n\n if (\n !event.geolocateSource &&\n this._watchState === \"ACTIVE_LOCK\" &&\n !fromResize &&\n movingDistance > 1\n ) {\n this._watchState = \"BACKGROUND\";\n this._geolocateButton.classList.add(\n \"maplibregl-ctrl-geolocate-background\"\n );\n this._geolocateButton.classList.remove(\n \"maplibregl-ctrl-geolocate-active\"\n );\n\n this.fire(new Event(\"trackuserlocationend\"));\n }\n });\n }\n }\n\n _updateCircleRadius() {\n if (\n this._watchState !== \"BACKGROUND\" &&\n this._watchState !== \"ACTIVE_LOCK\"\n ) {\n return;\n }\n\n const lastKnownLocation: LngLatLike = [\n this._lastKnownPosition.coords.longitude,\n this._lastKnownPosition.coords.latitude,\n ];\n\n const projectedLocation = this._map.project(lastKnownLocation);\n const a = this._map.unproject([projectedLocation.x, projectedLocation.y]);\n const b = this._map.unproject([\n projectedLocation.x + 20,\n projectedLocation.y,\n ]);\n const metersPerPixel = a.distanceTo(b) / 20;\n\n const circleDiameter = Math.ceil((2.0 * this._accuracy) / metersPerPixel);\n this._circleElement.style.width = `${circleDiameter}px`;\n this._circleElement.style.height = `${circleDiameter}px`;\n }\n\n _onZoom() {\n if (this.options.showUserLocation && this.options.showAccuracyCircle) {\n this._updateCircleRadius();\n }\n }\n}\n","/**\n * This is an extension of MapLibre AttributionControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class AttributionControl extends maplibregl.AttributionControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre ScaleControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class ScaleControl extends maplibregl.ScaleControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre FullscreenControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class FullscreenControl extends maplibregl.FullscreenControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","import maplibregl from \"maplibre-gl\";\nimport { Base64 } from \"js-base64\";\nimport type {\n StyleSpecification,\n MapOptions as MapOptionsML,\n ControlPosition,\n StyleOptions,\n MapDataEvent,\n Tile,\n RasterDEMSourceSpecification,\n TerrainSpecification,\n MapTerrainEvent,\n} from \"maplibre-gl\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { ReferenceMapStyle, MapStyleVariant } from \"@maptiler/client\";\nimport { config, SdkConfig } from \"./config\";\nimport { defaults } from \"./defaults\";\nimport { MaptilerLogoControl } from \"./MaptilerLogoControl\";\nimport { enableRTL } from \"./tools\";\nimport {\n getBrowserLanguage,\n isLanguageSupported,\n Language,\n LanguageString,\n} from \"./language\";\nimport { styleToStyle } from \"./mapstyle\";\nimport { MaptilerTerrainControl } from \"./MaptilerTerrainControl\";\nimport { MaptilerNavigationControl } from \"./MaptilerNavigationControl\";\nimport { geolocation } from \"@maptiler/client\";\nimport { MaptilerGeolocateControl } from \"./MaptilerGeolocateControl\";\nimport { AttributionControl } from \"./AttributionControl\";\nimport { ScaleControl } from \"./ScaleControl\";\nimport { FullscreenControl } from \"./FullscreenControl\";\n\nfunction sleepAsync(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport type LoadWithTerrainEvent = {\n type: \"loadWithTerrain\";\n target: Map;\n terrain: {\n source: string;\n exaggeration: number;\n };\n};\n\n// StyleSwapOptions is not exported by Maplibre, but we can redefine it (used for setStyle)\nexport type TransformStyleFunction = (\n previous: StyleSpecification,\n next: StyleSpecification\n) => StyleSpecification;\n\nexport type StyleSwapOptions = {\n diff?: boolean;\n transformStyle?: TransformStyleFunction;\n};\n\nconst MAPTILER_SESSION_ID = uuidv4();\n\nexport const GeolocationType: {\n POINT: \"POINT\";\n COUNTRY: \"COUNTRY\";\n} = {\n POINT: \"POINT\",\n COUNTRY: \"COUNTRY\",\n} as const;\n\ntype MapTerrainDataEvent = MapDataEvent & {\n isSourceLoaded: boolean;\n tile: Tile;\n sourceId: string;\n source: RasterDEMSourceSpecification;\n};\n\n/**\n * Options to provide to the `Map` constructor\n */\nexport type MapOptions = Omit & {\n /**\n * Style of the map. Can be:\n * - a full style URL (possibly with API key)\n * - a shorthand with only the MapTIler style name (eg. `\"streets-v2\"`)\n * - a longer form with the prefix `\"maptiler://\"` (eg. `\"maptiler://streets-v2\"`)\n */\n style?: ReferenceMapStyle | MapStyleVariant | StyleSpecification | string;\n\n /**\n * Define the language of the map. This can be done directly with a language ISO code (eg. \"en\")\n * or with a built-in shorthand (eg. Language.ENGLISH).\n * Note that this is equivalent to setting the `config.primaryLanguage` and will overwrite it.\n */\n language?: LanguageString;\n\n /**\n * Define the MapTiler Cloud API key to be used. This is strictly equivalent to setting\n * `config.apiKey` and will overwrite it.\n */\n apiKey?: string;\n\n /**\n * Shows or hides the MapTiler logo in the bottom left corner.\n *\n * For paid plans:\n * - `true` shows MapTiler logo\n * - `false` hodes MapTiler logo\n * - default: `false` (hide)\n *\n * For free plans: MapTiler logo always shows, regardless of the value.\n */\n maptilerLogo?: boolean;\n\n /**\n * Enables 3D terrain if `true`. (default: `false`)\n */\n terrain?: boolean;\n\n /**\n * Exaggeration factor of the terrain. (default: `1`, no exaggeration)\n */\n terrainExaggeration?: number;\n\n /**\n * Show the navigation control. (default: `true`, will hide if `false`)\n */\n navigationControl?: boolean | ControlPosition;\n\n /**\n * Show the terrain control. (default: `false`, will show if `true`)\n */\n terrainControl?: boolean | ControlPosition;\n\n /**\n * Show the geolocate control. (default: `true`, will hide if `false`)\n */\n geolocateControl?: boolean | ControlPosition;\n\n /**\n * Show the scale control. (default: `false`, will show if `true`)\n */\n scaleControl?: boolean | ControlPosition;\n\n /**\n * Show the full screen control. (default: `false`, will show if `true`)\n */\n fullscreenControl?: boolean | ControlPosition;\n\n /**\n * Method to position the map at a given geolocation. Only if:\n * - `hash` is `false`\n * - `center` is not provided\n *\n * If the value is `true` of `\"POINT\"` (given by `GeolocationType.POINT`) then the positionning uses the MapTiler Cloud\n * Geolocation to find the non-GPS location point.\n * The zoom level can be provided in the `Map` constructor with the `zoom` option or will be `13` if not provided.\n *\n * If the value is `\"COUNTRY\"` (given by `GeolocationType.COUNTRY`) then the map is centered around the bounding box of the country.\n * In this case, the `zoom` option will be ignored.\n *\n * If the value is `false`, no geolocation is performed and the map centering and zooming depends on other options or on\n * the built-in defaults.\n *\n * If this option is non-false and the options `center` is also provided, then `center` prevails.\n *\n * Default: `false`\n */\n geolocate?: (typeof GeolocationType)[keyof typeof GeolocationType] | boolean;\n};\n\n/**\n * The Map class can be instanciated to display a map in a `
`\n */\nexport class Map extends maplibregl.Map {\n private isTerrainEnabled = false;\n private terrainExaggeration = 1;\n private primaryLanguage: LanguageString | null = null;\n private secondaryLanguage: LanguageString | null = null;\n private terrainGrowing = false;\n private terrainFlattening = false;\n\n constructor(options: MapOptions) {\n if (options.apiKey) {\n config.apiKey = options.apiKey;\n }\n\n const style = styleToStyle(options.style);\n const hashPreConstructor = location.hash;\n\n if (!config.apiKey) {\n console.warn(\n \"MapTiler Cloud API key is not set. Visit https://maptiler.com and try Cloud for free!\"\n );\n }\n\n // calling the map constructor with full length style\n super({\n ...options,\n style,\n maplibreLogo: false,\n\n transformRequest: (url: string) => {\n let reqUrl = null;\n\n try {\n // The URL is expected to be absolute.\n // Yet, if it's local we just return it without assuming a 'base' url (in the URL constructor)\n // and we let the URL be locally resolved with a potential base path.\n reqUrl = new URL(url);\n } catch (e) {\n return {\n url,\n headers: {},\n };\n }\n\n if (reqUrl.host === defaults.maptilerApiHost) {\n if (!reqUrl.searchParams.has(\"key\")) {\n reqUrl.searchParams.append(\"key\", config.apiKey);\n }\n\n if (config.session) {\n reqUrl.searchParams.append(\"mtsid\", MAPTILER_SESSION_ID);\n }\n }\n\n return {\n url: reqUrl.href,\n headers: {},\n };\n },\n });\n\n this.primaryLanguage = options.language ?? config.primaryLanguage;\n this.secondaryLanguage = config.secondaryLanguage;\n this.terrainExaggeration =\n options.terrainExaggeration ?? this.terrainExaggeration;\n\n // Map centering and geolocation\n this.once(\"styledata\", async () => {\n // Not using geolocation centering if...\n\n // the geolcoate option is not provided or is falsy\n if (!options.geolocate) {\n return;\n }\n\n // ... a center is provided in options\n if (options.center) {\n return;\n }\n\n // ... the hash option is enabled and a hash is present in the URL\n if (options.hash && !!hashPreConstructor) {\n return;\n }\n\n // If the geolocation is set to COUNTRY:\n try {\n if (options.geolocate === GeolocationType.COUNTRY) {\n await this.fitToIpBounds();\n return;\n }\n } catch (e) {\n // not raising\n console.warn(e.message);\n }\n\n // As a fallback, we want to center the map on the visitor. First with IP geolocation...\n let ipLocatedCameraHash = null;\n try {\n await this.centerOnIpPoint(options.zoom);\n ipLocatedCameraHash = this.getCameraHash();\n } catch (e) {\n // not raising\n console.warn(e.message);\n }\n\n // A more precise localization\n\n // This more advanced localization is commented out because the easeTo animation\n // triggers an error if the terrain grow is enabled (due to being nable to project the center while moving)\n\n // Then, the get a more precise location, we rely on the browser location, but only if it was already granted\n // before (we don't want to ask wih a popup at launch time)\n const locationResult = await navigator.permissions.query({\n name: \"geolocation\",\n });\n\n if (locationResult.state === \"granted\") {\n navigator.geolocation.getCurrentPosition(\n // success callback\n (data) => {\n // If the user has already moved since the ip location, then we no longer want to move the center\n if (ipLocatedCameraHash !== this.getCameraHash()) {\n return;\n }\n\n if (this.terrain) {\n this.easeTo({\n center: [data.coords.longitude, data.coords.latitude],\n zoom: options.zoom || 12,\n duration: 2000,\n });\n } else {\n this.once(\"terrain\", () => {\n this.easeTo({\n center: [data.coords.longitude, data.coords.latitude],\n zoom: options.zoom || 12,\n duration: 2000,\n });\n });\n }\n },\n\n // error callback\n null,\n\n // options\n {\n maximumAge: 24 * 3600 * 1000, // a day in millisec\n timeout: 5000, // milliseconds\n enableHighAccuracy: false,\n }\n );\n }\n });\n\n // If the config includes language changing, we must update the map language\n this.on(\"styledata\", () => {\n this.setPrimaryLanguage(this.primaryLanguage);\n this.setSecondaryLanguage(this.secondaryLanguage);\n });\n\n // this even is in charge of reaplying the terrain elevation after the\n // style has changed because depending on the src/tgt style,\n // the style logic is not always able to resolve the application of terrain\n this.on(\"styledata\", () => {\n // the styling resolver did no manage to reaply the terrain,\n // so let's reload it\n if (this.getTerrain() === null && this.isTerrainEnabled) {\n this.enableTerrain(this.terrainExaggeration);\n }\n });\n\n // load the Right-to-Left text plugin (will happen only once)\n this.once(\"load\", async () => {\n enableRTL();\n });\n\n // Update logo and attibution\n this.once(\"load\", async () => {\n let tileJsonContent = { logo: null };\n\n try {\n const possibleSources = Object.keys(this.style.sourceCaches)\n .map((sourceName) => this.getSource(sourceName))\n .filter(\n (s: any) =>\n typeof s.url === \"string\" && s.url.includes(\"tiles.json\")\n );\n\n const styleUrl = new URL(\n (possibleSources[0] as maplibregl.VectorTileSource).url\n );\n\n if (!styleUrl.searchParams.has(\"key\")) {\n styleUrl.searchParams.append(\"key\", config.apiKey);\n }\n\n const tileJsonRes = await fetch(styleUrl.href);\n tileJsonContent = await tileJsonRes.json();\n } catch (e) {\n // No tiles.json found (should not happen on maintained styles)\n }\n\n // The attribution and logo must show when required\n if (\"logo\" in tileJsonContent && tileJsonContent.logo) {\n const logoURL: string = tileJsonContent.logo;\n\n this.addControl(\n new MaptilerLogoControl({ logoURL }),\n options.logoPosition\n );\n\n // if attribution in option is `false` but the the logo shows up in the tileJson, then the attribution must show anyways\n if (options.attributionControl === false) {\n this.addControl(new AttributionControl(options));\n }\n } else if (options.maptilerLogo) {\n this.addControl(new MaptilerLogoControl(), options.logoPosition);\n }\n\n // the other controls at init time but be after\n // (due to the async nature of logo control)\n\n // By default, no scale control\n if (options.scaleControl) {\n // default position, if not provided, is top left corner\n const position = (\n options.scaleControl === true || options.scaleControl === undefined\n ? \"bottom-right\"\n : options.scaleControl\n ) as ControlPosition;\n\n const scaleControl = new ScaleControl({ unit: config.unit });\n this.addControl(scaleControl, position);\n config.on(\"unit\", (unit) => {\n scaleControl.setUnit(unit);\n });\n }\n\n if (options.navigationControl !== false) {\n // default position, if not provided, is top left corner\n const position = (\n options.navigationControl === true ||\n options.navigationControl === undefined\n ? \"top-right\"\n : options.navigationControl\n ) as ControlPosition;\n this.addControl(new MaptilerNavigationControl(), position);\n }\n\n if (options.geolocateControl !== false) {\n // default position, if not provided, is top left corner\n const position = (\n options.geolocateControl === true ||\n options.geolocateControl === undefined\n ? \"top-right\"\n : options.geolocateControl\n ) as ControlPosition;\n\n this.addControl(\n // new maplibregl.GeolocateControl({\n new MaptilerGeolocateControl({\n positionOptions: {\n enableHighAccuracy: true,\n maximumAge: 0,\n timeout: 6000 /* 6 sec */,\n },\n fitBoundsOptions: {\n maxZoom: 15,\n },\n trackUserLocation: true,\n showAccuracyCircle: true,\n showUserLocation: true,\n }),\n position\n );\n }\n\n if (options.terrainControl) {\n // default position, if not provided, is top left corner\n const position = (\n options.terrainControl === true ||\n options.terrainControl === undefined\n ? \"top-right\"\n : options.terrainControl\n ) as ControlPosition;\n this.addControl(new MaptilerTerrainControl(), position);\n }\n\n // By default, no fullscreen control\n if (options.fullscreenControl) {\n // default position, if not provided, is top left corner\n const position = (\n options.fullscreenControl === true ||\n options.fullscreenControl === undefined\n ? \"top-right\"\n : options.fullscreenControl\n ) as ControlPosition;\n\n this.addControl(new FullscreenControl({}), position);\n }\n });\n\n // Creating a custom event: \"loadWithTerrain\"\n // that fires only once when both:\n // - the map has full loaded (corresponds to the the \"load\" event)\n // - the terrain has loaded (corresponds to the \"terrain\" event with terrain beion non-null)\n // This custom event is necessary to wait for when the map is instanciated with `terrain: true`\n // and some animation (flyTo, easeTo) are running from the begining.\n let loadEventTriggered = false;\n let terrainEventTriggered = false;\n let terrainEventData: LoadWithTerrainEvent = null;\n\n this.once(\"load\", (_) => {\n loadEventTriggered = true;\n if (terrainEventTriggered) {\n this.fire(\"loadWithTerrain\", terrainEventData);\n }\n });\n\n const terrainCallback = (evt) => {\n if (!evt.terrain) return;\n terrainEventTriggered = true;\n terrainEventData = {\n type: \"loadWithTerrain\",\n target: this,\n terrain: evt.terrain,\n };\n this.off(\"terrain\", terrainCallback);\n\n if (loadEventTriggered) {\n this.fire(\"loadWithTerrain\", terrainEventData as LoadWithTerrainEvent);\n }\n };\n\n this.on(\"terrain\", terrainCallback);\n\n // enable 3D terrain if provided in options\n if (options.terrain) {\n this.enableTerrain(\n options.terrainExaggeration ?? this.terrainExaggeration\n );\n }\n }\n\n /**\n * Awaits for _this_ Map instance to be \"loaded\" and returns a Promise to the Map.\n * If _this_ Map instance is already loaded, the Promise is resolved directly,\n * otherwise, it is resolved as a result of the \"load\" event.\n * @returns\n */\n async onLoadAsync() {\n return new Promise((resolve, reject) => {\n if (this.loaded()) {\n return resolve(this);\n }\n\n this.once(\"load\", (_) => {\n resolve(this);\n });\n });\n }\n\n /**\n * Awaits for _this_ Map instance to be \"loaded\" as well as with terrain being non-null for the first time\n * and returns a Promise to the Map.\n * If _this_ Map instance is already loaded with terrain, the Promise is resolved directly,\n * otherwise, it is resolved as a result of the \"loadWithTerrain\" event.\n * @returns\n */\n async onLoadWithTerrainAsync() {\n return new Promise((resolve, reject) => {\n if (this.loaded() && this.terrain) {\n return resolve(this);\n }\n\n this.once(\"loadWithTerrain\", (_) => {\n resolve(this);\n });\n });\n }\n\n /**\n * Update the style of the map.\n * Can be:\n * - a full style URL (possibly with API key)\n * - a shorthand with only the MapTIler style name (eg. `\"streets-v2\"`)\n * - a longer form with the prefix `\"maptiler://\"` (eg. `\"maptiler://streets-v2\"`)\n * @param style\n * @param options\n * @returns\n */\n setStyle(\n style: ReferenceMapStyle | MapStyleVariant | StyleSpecification | string,\n options?: StyleSwapOptions & StyleOptions\n ) {\n return super.setStyle(styleToStyle(style), options);\n }\n\n /**\n * Define the primary language of the map. Note that not all the languages shorthands provided are available.\n * This function is a short for `.setPrimaryLanguage()`\n * @param language\n */\n setLanguage(language: LanguageString = defaults.primaryLanguage) {\n if (language === Language.AUTO) {\n return this.setLanguage(getBrowserLanguage());\n }\n this.setPrimaryLanguage(language);\n }\n\n /**\n * Define the primary language of the map. Note that not all the languages shorthands provided are available.\n * @param language\n */\n setPrimaryLanguage(language: LanguageString = defaults.primaryLanguage) {\n if (!isLanguageSupported(language as string)) {\n return;\n }\n\n this.primaryLanguage = language;\n\n this.onStyleReady(() => {\n if (language === Language.AUTO) {\n return this.setPrimaryLanguage(getBrowserLanguage());\n }\n\n const layers = this.getStyle().layers;\n\n // detects pattern like \"{name:somelanguage}\" with loose spacing\n const strLanguageRegex = /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n // detects pattern like \"name:somelanguage\" with loose spacing\n const strLanguageInArrayRegex = /^\\s*name\\s*(:\\s*(\\S*))?\\s*$/;\n\n // for string based bilingual lang such as \"{name:latin} {name:nonlatin}\" or \"{name:latin} {name}\"\n const strBilingualRegex =\n /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}(\\s*){\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n // Regex to capture when there are more info, such as mountains elevation with unit m/ft\n const strMoreInfoRegex = /^(.*)({\\s*name\\s*(:\\s*(\\S*))?\\s*})(.*)$/;\n\n const langStr = language ? `name:${language}` : \"name\"; // to handle local lang\n const replacer = [\n \"case\",\n [\"has\", langStr],\n [\"get\", langStr],\n [\"get\", \"name:latin\"],\n ];\n\n for (let i = 0; i < layers.length; i += 1) {\n const layer = layers[i];\n const layout = layer.layout;\n\n if (!layout) {\n continue;\n }\n\n if (!layout[\"text-field\"]) {\n continue;\n }\n\n const textFieldLayoutProp = this.getLayoutProperty(\n layer.id,\n \"text-field\"\n );\n\n // Note:\n // The value of the 'text-field' property can take multiple shape;\n // 1. can be an array with 'concat' on its first element (most likely means bilingual)\n // 2. can be an array with 'get' on its first element (monolingual)\n // 3. can be a string of shape '{name:latin}'\n // 4. can be a string referencing another prop such as '{housenumber}' or '{ref}'\n //\n // The case 1, 2 and 3 will be updated while maintaining their original type and shape.\n // The case 3 will not be updated\n\n let regexMatch;\n\n // This is case 1\n if (\n Array.isArray(textFieldLayoutProp) &&\n textFieldLayoutProp.length >= 2 &&\n textFieldLayoutProp[0].trim().toLowerCase() === \"concat\"\n ) {\n const newProp = textFieldLayoutProp.slice(); // newProp is Array\n // The style could possibly have defined more than 2 concatenated language strings but we only want to edit the first\n // The style could also define that there are more things being concatenated and not only languages\n\n for (let j = 0; j < textFieldLayoutProp.length; j += 1) {\n const elem = textFieldLayoutProp[j];\n\n // we are looking for an elem of shape '{name:somelangage}' (string) of `[\"get\", \"name:somelanguage\"]` (array)\n\n // the entry of of shape '{name:somelangage}', possibly with loose spacing\n if (\n (typeof elem === \"string\" || elem instanceof String) &&\n strLanguageRegex.exec(elem.toString())\n ) {\n newProp[j] = replacer;\n break; // we just want to update the primary language\n }\n // the entry is of an array of shape `[\"get\", \"name:somelanguage\"]`\n else if (\n Array.isArray(elem) &&\n elem.length >= 2 &&\n elem[0].trim().toLowerCase() === \"get\" &&\n strLanguageInArrayRegex.exec(elem[1].toString())\n ) {\n newProp[j] = replacer;\n break; // we just want to update the primary language\n } else if (\n Array.isArray(elem) &&\n elem.length === 4 &&\n elem[0].trim().toLowerCase() === \"case\"\n ) {\n newProp[j] = replacer;\n break; // we just want to update the primary language\n }\n }\n\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n\n // This is case 2\n else if (\n Array.isArray(textFieldLayoutProp) &&\n textFieldLayoutProp.length >= 2 &&\n textFieldLayoutProp[0].trim().toLowerCase() === \"get\" &&\n strLanguageInArrayRegex.exec(textFieldLayoutProp[1].toString())\n ) {\n const newProp = replacer;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n\n // This is case 3\n else if (\n (typeof textFieldLayoutProp === \"string\" ||\n textFieldLayoutProp instanceof String) &&\n strLanguageRegex.exec(textFieldLayoutProp.toString())\n ) {\n const newProp = replacer;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n } else if (\n Array.isArray(textFieldLayoutProp) &&\n textFieldLayoutProp.length === 4 &&\n textFieldLayoutProp[0].trim().toLowerCase() === \"case\"\n ) {\n const newProp = replacer;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n } else if (\n (typeof textFieldLayoutProp === \"string\" ||\n textFieldLayoutProp instanceof String) &&\n (regexMatch = strBilingualRegex.exec(\n textFieldLayoutProp.toString()\n )) !== null\n ) {\n const newProp = `{${langStr}}${regexMatch[3]}{name${\n regexMatch[4] || \"\"\n }}`;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n } else if (\n (typeof textFieldLayoutProp === \"string\" ||\n textFieldLayoutProp instanceof String) &&\n (regexMatch = strMoreInfoRegex.exec(\n textFieldLayoutProp.toString()\n )) !== null\n ) {\n const newProp = `${regexMatch[1]}{${langStr}}${regexMatch[5]}`;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n }\n });\n }\n\n /**\n * Define the secondary language of the map. Note that this is not supported by all the map styles\n * Note that most styles do not allow a secondary language and this function only works if the style allows (no force adding)\n * @param language\n */\n setSecondaryLanguage(language: LanguageString = defaults.secondaryLanguage) {\n if (!isLanguageSupported(language as string)) {\n return;\n }\n\n this.secondaryLanguage = language;\n\n this.onStyleReady(() => {\n if (language === Language.AUTO) {\n return this.setSecondaryLanguage(getBrowserLanguage());\n }\n\n const layers = this.getStyle().layers;\n\n // detects pattern like \"{name:somelanguage}\" with loose spacing\n const strLanguageRegex = /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n // detects pattern like \"name:somelanguage\" with loose spacing\n const strLanguageInArrayRegex = /^\\s*name\\s*(:\\s*(\\S*))?\\s*$/;\n\n // for string based bilingual lang such as \"{name:latin} {name:nonlatin}\" or \"{name:latin} {name}\"\n const strBilingualRegex =\n /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}(\\s*){\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n let regexMatch;\n\n for (let i = 0; i < layers.length; i += 1) {\n const layer = layers[i];\n const layout = layer.layout;\n\n if (!layout) {\n continue;\n }\n\n if (!layout[\"text-field\"]) {\n continue;\n }\n\n const textFieldLayoutProp = this.getLayoutProperty(\n layer.id,\n \"text-field\"\n );\n\n let newProp;\n\n // Note:\n // The value of the 'text-field' property can take multiple shape;\n // 1. can be an array with 'concat' on its first element (most likely means bilingual)\n // 2. can be an array with 'get' on its first element (monolingual)\n // 3. can be a string of shape '{name:latin}'\n // 4. can be a string referencing another prop such as '{housenumber}' or '{ref}'\n //\n // Only the case 1 will be updated because we don't want to change the styling (read: add a secondary language where the original styling is only displaying 1)\n\n // This is case 1\n if (\n Array.isArray(textFieldLayoutProp) &&\n textFieldLayoutProp.length >= 2 &&\n textFieldLayoutProp[0].trim().toLowerCase() === \"concat\"\n ) {\n newProp = textFieldLayoutProp.slice(); // newProp is Array\n // The style could possibly have defined more than 2 concatenated language strings but we only want to edit the first\n // The style could also define that there are more things being concatenated and not only languages\n\n let languagesAlreadyFound = 0;\n\n for (let j = 0; j < textFieldLayoutProp.length; j += 1) {\n const elem = textFieldLayoutProp[j];\n\n // we are looking for an elem of shape '{name:somelangage}' (string) of `[\"get\", \"name:somelanguage\"]` (array)\n\n // the entry of of shape '{name:somelangage}', possibly with loose spacing\n if (\n (typeof elem === \"string\" || elem instanceof String) &&\n strLanguageRegex.exec(elem.toString())\n ) {\n if (languagesAlreadyFound === 1) {\n newProp[j] = `{name:${language}}`;\n break; // we just want to update the secondary language\n }\n\n languagesAlreadyFound += 1;\n }\n // the entry is of an array of shape `[\"get\", \"name:somelanguage\"]`\n else if (\n Array.isArray(elem) &&\n elem.length >= 2 &&\n elem[0].trim().toLowerCase() === \"get\" &&\n strLanguageInArrayRegex.exec(elem[1].toString())\n ) {\n if (languagesAlreadyFound === 1) {\n newProp[j][1] = `name:${language}`;\n break; // we just want to update the secondary language\n }\n\n languagesAlreadyFound += 1;\n } else if (\n Array.isArray(elem) &&\n elem.length === 4 &&\n elem[0].trim().toLowerCase() === \"case\"\n ) {\n if (languagesAlreadyFound === 1) {\n newProp[j] = [\"get\", `name:${language}`]; // the situation with 'case' is supposed to only happen with the primary lang\n break; // but in case a styling also does that for secondary...\n }\n\n languagesAlreadyFound += 1;\n }\n }\n\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n\n // the language (both first and second) are defined into a single string model\n else if (\n (typeof textFieldLayoutProp === \"string\" ||\n textFieldLayoutProp instanceof String) &&\n (regexMatch = strBilingualRegex.exec(\n textFieldLayoutProp.toString()\n )) !== null\n ) {\n const langStr = language ? `name:${language}` : \"name\"; // to handle local lang\n newProp = `{name${regexMatch[1] || \"\"}}${regexMatch[3]}{${langStr}}`;\n this.setLayoutProperty(layer.id, \"text-field\", newProp);\n }\n }\n });\n }\n\n /**\n * Get the primary language\n * @returns\n */\n getPrimaryLanguage(): LanguageString {\n return this.primaryLanguage;\n }\n\n /**\n * Get the secondary language\n * @returns\n */\n getSecondaryLanguage(): LanguageString {\n return this.secondaryLanguage;\n }\n\n /**\n * Get the exaggeration factor applied to the terrain\n * @returns\n */\n getTerrainExaggeration(): number {\n return this.terrainExaggeration;\n }\n\n /**\n * Know if terrian is enabled or not\n * @returns\n */\n hasTerrain(): boolean {\n return this.isTerrainEnabled;\n }\n\n private growTerrain(exaggeration, durationMs = 1000) {\n // This method assumes the terrain is already built\n if (!this.terrain) {\n return;\n }\n\n const startTime = performance.now();\n // This is supposedly 0, but it could be something else (e.g. already in the middle of growing, or user defined other)\n const currentExaggeration = this.terrain.exaggeration;\n const deltaExaggeration = exaggeration - currentExaggeration;\n\n // This is again called in a requestAnimationFrame ~loop, until the terrain has grown enough\n // that it has reached the target\n const updateExaggeration = () => {\n if (!this.terrain) {\n return;\n }\n\n // If the flattening animation is triggered while the growing animation\n // is running, then the flattening animation is stopped\n if (this.terrainFlattening) {\n return;\n }\n\n // normalized value in interval [0, 1] of where we are currently in the animation loop\n const positionInLoop = (performance.now() - startTime) / durationMs;\n\n // The animation goes on until we reached 99% of the growing sequence duration\n if (positionInLoop < 0.99) {\n const exaggerationFactor = 1 - Math.pow(1 - positionInLoop, 4);\n const newExaggeration =\n currentExaggeration + exaggerationFactor * deltaExaggeration;\n this.terrain.exaggeration = newExaggeration;\n requestAnimationFrame(updateExaggeration);\n } else {\n this.terrainGrowing = false;\n this.terrainFlattening = false;\n this.terrain.exaggeration = exaggeration;\n }\n\n this.triggerRepaint();\n };\n\n this.terrainGrowing = true;\n this.terrainFlattening = false;\n requestAnimationFrame(updateExaggeration);\n }\n\n /**\n * Enables the 3D terrain visualization\n * @param exaggeration\n * @returns\n */\n enableTerrain(exaggeration = this.terrainExaggeration) {\n if (exaggeration < 0) {\n console.warn(\"Terrain exaggeration cannot be negative.\");\n return;\n }\n\n // This function is mapped to a map \"data\" event. It checks that the terrain\n // tiles are loaded and when so, it starts an animation to make the terrain grow\n const dataEventTerrainGrow = async (evt: MapTerrainDataEvent) => {\n if (!this.terrain) {\n return;\n }\n\n if (\n evt.type !== \"data\" ||\n evt.dataType !== \"source\" ||\n !(\"source\" in evt)\n ) {\n return;\n }\n\n if (evt.sourceId !== \"maptiler-terrain\") {\n return;\n }\n\n const source = evt.source;\n\n if (source.type !== \"raster-dem\") {\n return;\n }\n\n if (!evt.isSourceLoaded) {\n return;\n }\n\n // We shut this event off because we want it to happen only once.\n // Yet, we cannot use the \"once\" method because only the last event of the series\n // has `isSourceLoaded` true\n this.off(\"data\", dataEventTerrainGrow);\n\n this.growTerrain(exaggeration);\n };\n\n // This is put into a function so that it can be called regardless\n // of the loading state of _this_ the map instance\n const addTerrain = () => {\n // When style is changed,\n this.isTerrainEnabled = true;\n this.terrainExaggeration = exaggeration;\n\n // Mapping it to the \"data\" event so that we can check that the terrain\n // growing starts only when terrain tiles are loaded (to reduce glitching)\n this.on(\"data\", dataEventTerrainGrow);\n\n this.addSource(defaults.terrainSourceId, {\n type: \"raster-dem\",\n url: defaults.terrainSourceURL,\n });\n\n // Setting up the terrain with a 0 exaggeration factor\n // so it loads ~seamlessly and then can grow from there\n this.setTerrain({\n source: defaults.terrainSourceId,\n exaggeration: 0,\n });\n };\n\n // The terrain has already been loaded,\n // we just update the exaggeration.\n if (this.getTerrain()) {\n this.isTerrainEnabled = true;\n this.growTerrain(exaggeration);\n return;\n }\n\n if (this.loaded() || this.isTerrainEnabled) {\n addTerrain();\n } else {\n this.once(\"load\", () => {\n if (this.getTerrain() && this.getSource(defaults.terrainSourceId)) {\n return;\n }\n addTerrain();\n });\n }\n }\n\n /**\n * Disable the 3D terrain visualization\n */\n disableTerrain() {\n // It could be disabled already\n if (!this.terrain) {\n return;\n }\n\n this.isTerrainEnabled = false;\n // this.stopFlattening = false;\n\n // Duration of the animation in millisec\n const animationLoopDuration = 1 * 1000;\n const startTime = performance.now();\n // This is supposedly 0, but it could be something else (e.g. already in the middle of growing, or user defined other)\n const currentExaggeration = this.terrain.exaggeration;\n\n // This is again called in a requestAnimationFrame ~loop, until the terrain has grown enough\n // that it has reached the target\n const updateExaggeration = () => {\n if (!this.terrain) {\n return;\n }\n\n // If the growing animation is triggered while flattening,\n // then we exist the flatening\n if (this.terrainGrowing) {\n return;\n }\n\n // normalized value in interval [0, 1] of where we are currently in the animation loop\n const positionInLoop =\n (performance.now() - startTime) / animationLoopDuration;\n\n // The animation goes on until we reached 99% of the growing sequence duration\n if (positionInLoop < 0.99) {\n const exaggerationFactor = Math.pow(1 - positionInLoop, 4);\n const newExaggeration = currentExaggeration * exaggerationFactor;\n this.terrain.exaggeration = newExaggeration;\n requestAnimationFrame(updateExaggeration);\n } else {\n this.terrain.exaggeration = 0;\n this.terrainGrowing = false;\n this.terrainFlattening = false;\n this.setTerrain(null);\n if (this.getSource(defaults.terrainSourceId)) {\n this.removeSource(defaults.terrainSourceId);\n }\n }\n\n this.triggerRepaint();\n };\n\n this.terrainGrowing = false;\n this.terrainFlattening = true;\n requestAnimationFrame(updateExaggeration);\n }\n\n /**\n * Sets the 3D terrain exageration factor.\n * If the terrain was not enabled prior to the call of this method,\n * the method `.enableTerrain()` will be called.\n * If `animate` is `true`, the terrain transformation will be animated in the span of 1 second.\n * If `animate` is `false`, no animated transition to the newly defined exaggeration.\n * @param exaggeration\n * @param animate\n */\n setTerrainExaggeration(exaggeration: number, animate = true) {\n if (!animate && this.terrain) {\n this.terrainExaggeration = exaggeration;\n this.terrain.exaggeration = exaggeration;\n this.triggerRepaint();\n } else {\n this.enableTerrain(exaggeration);\n }\n }\n\n /**\n * Perform an action when the style is ready. It could be at the moment of calling this method\n * or later.\n * @param cb\n */\n private onStyleReady(cb) {\n if (this.isStyleLoaded()) {\n cb();\n } else {\n this.once(\"styledata\", () => {\n cb();\n });\n }\n }\n\n async fitToIpBounds() {\n const ipGeolocateResult = await geolocation.info();\n this.fitBounds(\n ipGeolocateResult.country_bounds as [number, number, number, number],\n {\n duration: 0,\n padding: 100,\n }\n );\n }\n\n async centerOnIpPoint(zoom: number | undefined) {\n const ipGeolocateResult = await geolocation.info();\n this.jumpTo({\n center: [ipGeolocateResult.longitude, ipGeolocateResult.latitude],\n zoom: zoom || 11,\n });\n }\n\n getCameraHash() {\n const hashBin = new Float32Array(5);\n const center = this.getCenter();\n hashBin[0] = center.lng;\n hashBin[1] = center.lat;\n hashBin[2] = this.getZoom();\n hashBin[3] = this.getPitch();\n hashBin[4] = this.getBearing();\n return Base64.fromUint8Array(new Uint8Array(hashBin.buffer));\n }\n\n /**\n * Get the SDK config object.\n * This is convenient to dispatch the SDK configuration to externally built layers\n * that do not directly have access to the SDK configuration but do have access to a Map instance.\n * @returns\n */\n getSdkConfig(): SdkConfig {\n return config;\n }\n\n /**\n * Get the MapTiler session ID. Convenient to dispatch to externaly built component\n * that do not directly have access to the SDK configuration but do have access to a Map instance.\n * @returns\n */\n getMaptilerSessionId(): string {\n return MAPTILER_SESSION_ID;\n }\n}\n","/**\n * This is an extension of MapLibre Marker to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Marker extends maplibregl.Marker {\n addTo(map: Map | MapMLGL): this {\n return super.addTo(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre Popup to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Popup extends maplibregl.Popup {\n addTo(map: Map | MapMLGL): this {\n return super.addTo(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre Style to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL, StyleOptions } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Style extends maplibregl.Style {\n constructor(map: Map, options: StyleOptions = {}) {\n super(map as MapMLGL, options);\n }\n}\n","/**\n * This is an extension of MapLibre CanvasSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class CanvasSource extends maplibregl.CanvasSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre GeoJSONSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class GeoJSONSource extends maplibregl.GeoJSONSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre ImageSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class ImageSource extends maplibregl.ImageSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre RasterTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class RasterTileSource extends maplibregl.RasterTileSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre RasterDEMTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class RasterDEMTileSource extends maplibregl.RasterDEMTileSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre VectorTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class VectorTileSource extends maplibregl.VectorTileSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre VideoSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class VideoSource extends maplibregl.VideoSource {\n onAdd(map: Map | MapMLGL) {\n super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * This is an extension of MapLibre TerrainControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class TerrainControl extends maplibregl.TerrainControl {\n onAdd(map: Map | MapMLGL) {\n return super.onAdd(map as MapMLGL);\n }\n}\n","/**\n * Maplibre export first, then extensions can overload the exports.\n */\nexport * from \"maplibre-gl\";\n\n/**\n * To perform explicit named export so that they are included in the UMD bundle\n */\n// import * as ML from \"maplibre-gl\";\n\nimport maplibregl from \"maplibre-gl\";\n\nconst {\n supported,\n setRTLTextPlugin,\n getRTLTextPluginStatus,\n LngLat,\n LngLatBounds,\n MercatorCoordinate,\n Evented,\n AJAXError,\n prewarm,\n clearPrewarmedResources,\n version,\n workerCount,\n maxParallelImageRequests,\n workerUrl,\n addProtocol,\n removeProtocol,\n} = maplibregl;\n\n// We still want to export maplibregl.Map, but as a different name\nconst MapMLGL = maplibregl.Map;\nconst MarkerMLGL = maplibregl.Marker;\nconst PopupMLGL = maplibregl.Popup;\nconst StyleMLGL = maplibregl.Style;\nconst CanvasSourceMLGL = maplibregl.CanvasSource;\nconst GeoJSONSourceMLGL = maplibregl.GeoJSONSource;\nconst ImageSourceMLGL = maplibregl.ImageSource;\nconst RasterTileSourceMLGL = maplibregl.RasterTileSource;\nconst RasterDEMTileSourceMLGL = maplibregl.RasterDEMTileSource;\nconst VectorTileSourceMLGL = maplibregl.VectorTileSource;\nconst VideoSourceMLGL = maplibregl.VideoSource;\nconst NavigationControlMLGL = maplibregl.NavigationControl;\nconst GeolocateControlMLGL = maplibregl.GeolocateControl;\nconst AttributionControlMLGL = maplibregl.AttributionControl;\nconst LogoControlMLGL = maplibregl.LogoControl;\nconst ScaleControlMLGL = maplibregl.ScaleControl;\nconst FullscreenControlMLGL = maplibregl.FullscreenControl;\nconst TerrainControlMLGL = maplibregl.TerrainControl;\n\nexport {\n supported,\n setRTLTextPlugin,\n getRTLTextPluginStatus,\n PopupMLGL,\n MarkerMLGL,\n StyleMLGL,\n LngLat,\n LngLatBounds,\n MercatorCoordinate,\n Evented,\n AJAXError,\n CanvasSourceMLGL,\n GeoJSONSourceMLGL,\n ImageSourceMLGL,\n RasterDEMTileSourceMLGL,\n RasterTileSourceMLGL,\n VectorTileSourceMLGL,\n VideoSourceMLGL,\n prewarm,\n clearPrewarmedResources,\n version,\n workerCount,\n maxParallelImageRequests,\n workerUrl,\n addProtocol,\n removeProtocol,\n MapMLGL,\n};\n\n// Exporting types of class instances from MapLibre:\nexport type NavigationControlMLGL = InstanceType;\nexport type GeolocateControlMLGL = InstanceType;\nexport type AttributionControlMLGL = InstanceType<\n typeof AttributionControlMLGL\n>;\nexport type LogoControlMLGL = InstanceType;\nexport type ScaleControlMLGL = InstanceType;\nexport type FullscreenControlMLGL = InstanceType;\nexport type TerrainControlMLGL = InstanceType;\nexport type MarkerMLGL = InstanceType;\nexport type PopupMLGL = InstanceType;\nexport type StyleMLGL = InstanceType;\nexport type LngLat = InstanceType;\nexport type LngLatBounds = InstanceType;\nexport type MercatorCoordinate = InstanceType;\nexport type Evented = InstanceType;\nexport type AJAXError = InstanceType;\nexport type CanvasSourceMLGL = InstanceType;\nexport type GeoJSONSourceMLGL = InstanceType;\nexport type ImageSourceMLGL = InstanceType;\nexport type RasterDEMTileSourceMLGL = InstanceType<\n typeof RasterDEMTileSourceMLGL\n>;\nexport type RasterTileSourceMLGL = InstanceType;\nexport type VectorTileSourceMLGL = InstanceType;\nexport type VideoSourceMLGL = InstanceType;\nexport type MapMLGL = InstanceType;\n\n// SDK specific\nimport { Map, GeolocationType } from \"./Map\";\nimport type { MapOptions, LoadWithTerrainEvent } from \"./Map\";\n\nimport { Marker } from \"./Marker\";\nimport { Popup } from \"./Popup\";\nimport { Style } from \"./Style\";\nimport { CanvasSource } from \"./CanvasSource\";\nimport { GeoJSONSource } from \"./GeoJSONSource\";\nimport { ImageSource } from \"./ImageSource\";\nimport { RasterTileSource } from \"./RasterTileSource\";\nimport { RasterDEMTileSource } from \"./RasterDEMTileSource\";\nimport { VectorTileSource } from \"./VectorTileSource\";\nimport { VideoSource } from \"./VideoSource\";\nimport { NavigationControl } from \"./NavigationControl\";\nimport { GeolocateControl } from \"./GeolocateControl\";\nimport { AttributionControl } from \"./AttributionControl\";\nimport { LogoControl } from \"./LogoControl\";\nimport { ScaleControl } from \"./ScaleControl\";\nimport { FullscreenControl } from \"./FullscreenControl\";\nimport { TerrainControl } from \"./TerrainControl\";\n\n// Import of modified versions of the controls\nimport { MaptilerGeolocateControl } from \"./MaptilerGeolocateControl\";\nimport { MaptilerLogoControl } from \"./MaptilerLogoControl\";\nimport { MaptilerTerrainControl } from \"./MaptilerTerrainControl\";\nimport { MaptilerNavigationControl } from \"./MaptilerNavigationControl\";\n\n// importing client functions to expose them as part of the SDK\nimport type {\n BBox,\n Position,\n GeocodingOptions,\n CoordinatesSearchOptions,\n CenteredStaticMapOptions,\n AutomaticStaticMapOptions,\n BoundedStaticMapOptions,\n} from \"@maptiler/client\";\n\nimport {\n geocoding,\n geolocation,\n coordinates,\n data,\n staticMaps,\n ServiceError,\n LanguageGeocoding,\n LanguageGeocodingString,\n ReferenceMapStyle,\n MapStyle,\n MapStyleVariant,\n} from \"@maptiler/client\";\n\nimport type { MapStyleType } from \"@maptiler/client\";\n\nimport { Point } from \"./Point\";\nimport type { Matrix2 } from \"./Point\";\n\n// Importing enums and configs\nimport { config, SdkConfig } from \"./config\";\nimport { Language, LanguageString, LanguageKey } from \"./language\";\nimport type { Unit } from \"./unit\";\n\n// Exporting types\nexport type {\n MapOptions,\n LoadWithTerrainEvent,\n GeocodingOptions,\n BBox,\n Position,\n CoordinatesSearchOptions,\n CenteredStaticMapOptions,\n BoundedStaticMapOptions,\n AutomaticStaticMapOptions,\n LanguageString,\n LanguageKey,\n LanguageGeocodingString,\n Unit,\n MapStyleType,\n Matrix2,\n};\n\n// Exporting classes, objects, functions, etc.\nexport {\n Map,\n Marker,\n Popup,\n Style,\n CanvasSource,\n GeoJSONSource,\n ImageSource,\n RasterTileSource,\n RasterDEMTileSource,\n VideoSource,\n NavigationControl,\n GeolocateControl,\n AttributionControl,\n LogoControl,\n ScaleControl,\n FullscreenControl,\n TerrainControl,\n VectorTileSource,\n GeolocationType,\n SdkConfig,\n config,\n ServiceError,\n geocoding,\n geolocation,\n coordinates,\n data,\n staticMaps,\n MapStyle,\n Language,\n LanguageGeocoding,\n Point,\n ReferenceMapStyle,\n MapStyleVariant,\n MaptilerGeolocateControl,\n MaptilerLogoControl,\n MaptilerTerrainControl,\n MaptilerNavigationControl,\n};\n","import * as Vue from 'vue'\n\nvar isVue2 = false\nvar isVue3 = true\nvar Vue2 = undefined\n\nfunction install() {}\n\nexport function set(target, key, val) {\n if (Array.isArray(target)) {\n target.length = Math.max(target.length, key)\n target.splice(key, 1, val)\n return val\n }\n target[key] = val\n return val\n}\n\nexport function del(target, key) {\n if (Array.isArray(target)) {\n target.splice(key, 1)\n return\n }\n delete target[key]\n}\n\nexport * from 'vue'\nexport {\n Vue,\n Vue2,\n isVue2,\n isVue3,\n install,\n}\n","/*!\n * pinia v2.0.35\n * (c) 2023 Eduardo San Martin Morote\n * @license MIT\n */\nimport { getCurrentInstance, inject, toRaw, watch, unref, markRaw, effectScope, ref, isVue2, isRef, isReactive, set, getCurrentScope, onScopeDispose, reactive, toRef, del, nextTick, computed, toRefs } from 'vue-demi';\nimport { setupDevtoolsPlugin } from '@vue/devtools-api';\n\n/**\n * setActivePinia must be called to handle SSR at the top of functions like\n * `fetch`, `setup`, `serverPrefetch` and others\n */\nlet activePinia;\n/**\n * Sets or unsets the active pinia. Used in SSR and internally when calling\n * actions and getters\n *\n * @param pinia - Pinia instance\n */\n// @ts-expect-error: cannot constrain the type of the return\nconst setActivePinia = (pinia) => (activePinia = pinia);\n/**\n * Get the currently active pinia if there is any.\n */\nconst getActivePinia = () => (getCurrentInstance() && inject(piniaSymbol)) || activePinia;\nconst piniaSymbol = ((process.env.NODE_ENV !== 'production') ? Symbol('pinia') : /* istanbul ignore next */ Symbol());\n\nfunction isPlainObject(\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\no) {\n return (o &&\n typeof o === 'object' &&\n Object.prototype.toString.call(o) === '[object Object]' &&\n typeof o.toJSON !== 'function');\n}\n// type DeepReadonly = { readonly [P in keyof T]: DeepReadonly }\n// TODO: can we change these to numbers?\n/**\n * Possible types for SubscriptionCallback\n */\nvar MutationType;\n(function (MutationType) {\n /**\n * Direct mutation of the state:\n *\n * - `store.name = 'new name'`\n * - `store.$state.name = 'new name'`\n * - `store.list.push('new item')`\n */\n MutationType[\"direct\"] = \"direct\";\n /**\n * Mutated the state with `$patch` and an object\n *\n * - `store.$patch({ name: 'newName' })`\n */\n MutationType[\"patchObject\"] = \"patch object\";\n /**\n * Mutated the state with `$patch` and a function\n *\n * - `store.$patch(state => state.name = 'newName')`\n */\n MutationType[\"patchFunction\"] = \"patch function\";\n // maybe reset? for $state = {} and $reset\n})(MutationType || (MutationType = {}));\n\nconst IS_CLIENT = typeof window !== 'undefined';\n/**\n * Should we add the devtools plugins.\n * - only if dev mode or forced through the prod devtools flag\n * - not in test\n * - only if window exists (could change in the future)\n */\nconst USE_DEVTOOLS = ((process.env.NODE_ENV !== 'production') || (typeof __VUE_PROD_DEVTOOLS__ !== 'undefined' && __VUE_PROD_DEVTOOLS__)) && !(process.env.NODE_ENV === 'test') && IS_CLIENT;\n\n/*\n * FileSaver.js A saveAs() FileSaver implementation.\n *\n * Originally by Eli Grey, adapted as an ESM module by Eduardo San Martin\n * Morote.\n *\n * License : MIT\n */\n// The one and only way of getting global scope in all environments\n// https://stackoverflow.com/q/3277182/1008999\nconst _global = /*#__PURE__*/ (() => typeof window === 'object' && window.window === window\n ? window\n : typeof self === 'object' && self.self === self\n ? self\n : typeof global === 'object' && global.global === global\n ? global\n : typeof globalThis === 'object'\n ? globalThis\n : { HTMLElement: null })();\nfunction bom(blob, { autoBom = false } = {}) {\n // prepend BOM for UTF-8 XML and text/* types (including HTML)\n // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n if (autoBom &&\n /^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n return new Blob([String.fromCharCode(0xfeff), blob], { type: blob.type });\n }\n return blob;\n}\nfunction download(url, name, opts) {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url);\n xhr.responseType = 'blob';\n xhr.onload = function () {\n saveAs(xhr.response, name, opts);\n };\n xhr.onerror = function () {\n console.error('could not download file');\n };\n xhr.send();\n}\nfunction corsEnabled(url) {\n const xhr = new XMLHttpRequest();\n // use sync to avoid popup blocker\n xhr.open('HEAD', url, false);\n try {\n xhr.send();\n }\n catch (e) { }\n return xhr.status >= 200 && xhr.status <= 299;\n}\n// `a.click()` doesn't work for all browsers (#465)\nfunction click(node) {\n try {\n node.dispatchEvent(new MouseEvent('click'));\n }\n catch (e) {\n const evt = document.createEvent('MouseEvents');\n evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);\n node.dispatchEvent(evt);\n }\n}\nconst _navigator = \n typeof navigator === 'object' ? navigator : { userAgent: '' };\n// Detect WebView inside a native macOS app by ruling out all browsers\n// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too\n// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos\nconst isMacOSWebView = /*#__PURE__*/ (() => /Macintosh/.test(_navigator.userAgent) &&\n /AppleWebKit/.test(_navigator.userAgent) &&\n !/Safari/.test(_navigator.userAgent))();\nconst saveAs = !IS_CLIENT\n ? () => { } // noop\n : // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView or mini program\n typeof HTMLAnchorElement !== 'undefined' &&\n 'download' in HTMLAnchorElement.prototype &&\n !isMacOSWebView\n ? downloadSaveAs\n : // Use msSaveOrOpenBlob as a second approach\n 'msSaveOrOpenBlob' in _navigator\n ? msSaveAs\n : // Fallback to using FileReader and a popup\n fileSaverSaveAs;\nfunction downloadSaveAs(blob, name = 'download', opts) {\n const a = document.createElement('a');\n a.download = name;\n a.rel = 'noopener'; // tabnabbing\n // TODO: detect chrome extensions & packaged apps\n // a.target = '_blank'\n if (typeof blob === 'string') {\n // Support regular links\n a.href = blob;\n if (a.origin !== location.origin) {\n if (corsEnabled(a.href)) {\n download(blob, name, opts);\n }\n else {\n a.target = '_blank';\n click(a);\n }\n }\n else {\n click(a);\n }\n }\n else {\n // Support blobs\n a.href = URL.createObjectURL(blob);\n setTimeout(function () {\n URL.revokeObjectURL(a.href);\n }, 4e4); // 40s\n setTimeout(function () {\n click(a);\n }, 0);\n }\n}\nfunction msSaveAs(blob, name = 'download', opts) {\n if (typeof blob === 'string') {\n if (corsEnabled(blob)) {\n download(blob, name, opts);\n }\n else {\n const a = document.createElement('a');\n a.href = blob;\n a.target = '_blank';\n setTimeout(function () {\n click(a);\n });\n }\n }\n else {\n // @ts-ignore: works on windows\n navigator.msSaveOrOpenBlob(bom(blob, opts), name);\n }\n}\nfunction fileSaverSaveAs(blob, name, opts, popup) {\n // Open a popup immediately do go around popup blocker\n // Mostly only available on user interaction and the fileReader is async so...\n popup = popup || open('', '_blank');\n if (popup) {\n popup.document.title = popup.document.body.innerText = 'downloading...';\n }\n if (typeof blob === 'string')\n return download(blob, name, opts);\n const force = blob.type === 'application/octet-stream';\n const isSafari = /constructor/i.test(String(_global.HTMLElement)) || 'safari' in _global;\n const isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent);\n if ((isChromeIOS || (force && isSafari) || isMacOSWebView) &&\n typeof FileReader !== 'undefined') {\n // Safari doesn't allow downloading of blob URLs\n const reader = new FileReader();\n reader.onloadend = function () {\n let url = reader.result;\n if (typeof url !== 'string') {\n popup = null;\n throw new Error('Wrong reader.result type');\n }\n url = isChromeIOS\n ? url\n : url.replace(/^data:[^;]*;/, 'data:attachment/file;');\n if (popup) {\n popup.location.href = url;\n }\n else {\n location.assign(url);\n }\n popup = null; // reverse-tabnabbing #460\n };\n reader.readAsDataURL(blob);\n }\n else {\n const url = URL.createObjectURL(blob);\n if (popup)\n popup.location.assign(url);\n else\n location.href = url;\n popup = null; // reverse-tabnabbing #460\n setTimeout(function () {\n URL.revokeObjectURL(url);\n }, 4e4); // 40s\n }\n}\n\n/**\n * Shows a toast or console.log\n *\n * @param message - message to log\n * @param type - different color of the tooltip\n */\nfunction toastMessage(message, type) {\n const piniaMessage = '๐Ÿ ' + message;\n if (typeof __VUE_DEVTOOLS_TOAST__ === 'function') {\n __VUE_DEVTOOLS_TOAST__(piniaMessage, type);\n }\n else if (type === 'error') {\n console.error(piniaMessage);\n }\n else if (type === 'warn') {\n console.warn(piniaMessage);\n }\n else {\n console.log(piniaMessage);\n }\n}\nfunction isPinia(o) {\n return '_a' in o && 'install' in o;\n}\n\nfunction checkClipboardAccess() {\n if (!('clipboard' in navigator)) {\n toastMessage(`Your browser doesn't support the Clipboard API`, 'error');\n return true;\n }\n}\nfunction checkNotFocusedError(error) {\n if (error instanceof Error &&\n error.message.toLowerCase().includes('document is not focused')) {\n toastMessage('You need to activate the \"Emulate a focused page\" setting in the \"Rendering\" panel of devtools.', 'warn');\n return true;\n }\n return false;\n}\nasync function actionGlobalCopyState(pinia) {\n if (checkClipboardAccess())\n return;\n try {\n await navigator.clipboard.writeText(JSON.stringify(pinia.state.value));\n toastMessage('Global state copied to clipboard.');\n }\n catch (error) {\n if (checkNotFocusedError(error))\n return;\n toastMessage(`Failed to serialize the state. Check the console for more details.`, 'error');\n console.error(error);\n }\n}\nasync function actionGlobalPasteState(pinia) {\n if (checkClipboardAccess())\n return;\n try {\n pinia.state.value = JSON.parse(await navigator.clipboard.readText());\n toastMessage('Global state pasted from clipboard.');\n }\n catch (error) {\n if (checkNotFocusedError(error))\n return;\n toastMessage(`Failed to deserialize the state from clipboard. Check the console for more details.`, 'error');\n console.error(error);\n }\n}\nasync function actionGlobalSaveState(pinia) {\n try {\n saveAs(new Blob([JSON.stringify(pinia.state.value)], {\n type: 'text/plain;charset=utf-8',\n }), 'pinia-state.json');\n }\n catch (error) {\n toastMessage(`Failed to export the state as JSON. Check the console for more details.`, 'error');\n console.error(error);\n }\n}\nlet fileInput;\nfunction getFileOpener() {\n if (!fileInput) {\n fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.accept = '.json';\n }\n function openFile() {\n return new Promise((resolve, reject) => {\n fileInput.onchange = async () => {\n const files = fileInput.files;\n if (!files)\n return resolve(null);\n const file = files.item(0);\n if (!file)\n return resolve(null);\n return resolve({ text: await file.text(), file });\n };\n // @ts-ignore: TODO: changed from 4.3 to 4.4\n fileInput.oncancel = () => resolve(null);\n fileInput.onerror = reject;\n fileInput.click();\n });\n }\n return openFile;\n}\nasync function actionGlobalOpenStateFile(pinia) {\n try {\n const open = await getFileOpener();\n const result = await open();\n if (!result)\n return;\n const { text, file } = result;\n pinia.state.value = JSON.parse(text);\n toastMessage(`Global state imported from \"${file.name}\".`);\n }\n catch (error) {\n toastMessage(`Failed to export the state as JSON. Check the console for more details.`, 'error');\n console.error(error);\n }\n}\n\nfunction formatDisplay(display) {\n return {\n _custom: {\n display,\n },\n };\n}\nconst PINIA_ROOT_LABEL = '๐Ÿ Pinia (root)';\nconst PINIA_ROOT_ID = '_root';\nfunction formatStoreForInspectorTree(store) {\n return isPinia(store)\n ? {\n id: PINIA_ROOT_ID,\n label: PINIA_ROOT_LABEL,\n }\n : {\n id: store.$id,\n label: store.$id,\n };\n}\nfunction formatStoreForInspectorState(store) {\n if (isPinia(store)) {\n const storeNames = Array.from(store._s.keys());\n const storeMap = store._s;\n const state = {\n state: storeNames.map((storeId) => ({\n editable: true,\n key: storeId,\n value: store.state.value[storeId],\n })),\n getters: storeNames\n .filter((id) => storeMap.get(id)._getters)\n .map((id) => {\n const store = storeMap.get(id);\n return {\n editable: false,\n key: id,\n value: store._getters.reduce((getters, key) => {\n getters[key] = store[key];\n return getters;\n }, {}),\n };\n }),\n };\n return state;\n }\n const state = {\n state: Object.keys(store.$state).map((key) => ({\n editable: true,\n key,\n value: store.$state[key],\n })),\n };\n // avoid adding empty getters\n if (store._getters && store._getters.length) {\n state.getters = store._getters.map((getterName) => ({\n editable: false,\n key: getterName,\n value: store[getterName],\n }));\n }\n if (store._customProperties.size) {\n state.customProperties = Array.from(store._customProperties).map((key) => ({\n editable: true,\n key,\n value: store[key],\n }));\n }\n return state;\n}\nfunction formatEventData(events) {\n if (!events)\n return {};\n if (Array.isArray(events)) {\n // TODO: handle add and delete for arrays and objects\n return events.reduce((data, event) => {\n data.keys.push(event.key);\n data.operations.push(event.type);\n data.oldValue[event.key] = event.oldValue;\n data.newValue[event.key] = event.newValue;\n return data;\n }, {\n oldValue: {},\n keys: [],\n operations: [],\n newValue: {},\n });\n }\n else {\n return {\n operation: formatDisplay(events.type),\n key: formatDisplay(events.key),\n oldValue: events.oldValue,\n newValue: events.newValue,\n };\n }\n}\nfunction formatMutationType(type) {\n switch (type) {\n case MutationType.direct:\n return 'mutation';\n case MutationType.patchFunction:\n return '$patch';\n case MutationType.patchObject:\n return '$patch';\n default:\n return 'unknown';\n }\n}\n\n// timeline can be paused when directly changing the state\nlet isTimelineActive = true;\nconst componentStateTypes = [];\nconst MUTATIONS_LAYER_ID = 'pinia:mutations';\nconst INSPECTOR_ID = 'pinia';\nconst { assign: assign$1 } = Object;\n/**\n * Gets the displayed name of a store in devtools\n *\n * @param id - id of the store\n * @returns a formatted string\n */\nconst getStoreType = (id) => '๐Ÿ ' + id;\n/**\n * Add the pinia plugin without any store. Allows displaying a Pinia plugin tab\n * as soon as it is added to the application.\n *\n * @param app - Vue application\n * @param pinia - pinia instance\n */\nfunction registerPiniaDevtools(app, pinia) {\n setupDevtoolsPlugin({\n id: 'dev.esm.pinia',\n label: 'Pinia ๐Ÿ',\n logo: 'https://pinia.vuejs.org/logo.svg',\n packageName: 'pinia',\n homepage: 'https://pinia.vuejs.org',\n componentStateTypes,\n app,\n }, (api) => {\n if (typeof api.now !== 'function') {\n toastMessage('You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.');\n }\n api.addTimelineLayer({\n id: MUTATIONS_LAYER_ID,\n label: `Pinia ๐Ÿ`,\n color: 0xe5df88,\n });\n api.addInspector({\n id: INSPECTOR_ID,\n label: 'Pinia ๐Ÿ',\n icon: 'storage',\n treeFilterPlaceholder: 'Search stores',\n actions: [\n {\n icon: 'content_copy',\n action: () => {\n actionGlobalCopyState(pinia);\n },\n tooltip: 'Serialize and copy the state',\n },\n {\n icon: 'content_paste',\n action: async () => {\n await actionGlobalPasteState(pinia);\n api.sendInspectorTree(INSPECTOR_ID);\n api.sendInspectorState(INSPECTOR_ID);\n },\n tooltip: 'Replace the state with the content of your clipboard',\n },\n {\n icon: 'save',\n action: () => {\n actionGlobalSaveState(pinia);\n },\n tooltip: 'Save the state as a JSON file',\n },\n {\n icon: 'folder_open',\n action: async () => {\n await actionGlobalOpenStateFile(pinia);\n api.sendInspectorTree(INSPECTOR_ID);\n api.sendInspectorState(INSPECTOR_ID);\n },\n tooltip: 'Import the state from a JSON file',\n },\n ],\n nodeActions: [\n {\n icon: 'restore',\n tooltip: 'Reset the state (option store only)',\n action: (nodeId) => {\n const store = pinia._s.get(nodeId);\n if (!store) {\n toastMessage(`Cannot reset \"${nodeId}\" store because it wasn't found.`, 'warn');\n }\n else if (!store._isOptionsAPI) {\n toastMessage(`Cannot reset \"${nodeId}\" store because it's a setup store.`, 'warn');\n }\n else {\n store.$reset();\n toastMessage(`Store \"${nodeId}\" reset.`);\n }\n },\n },\n ],\n });\n api.on.inspectComponent((payload, ctx) => {\n const proxy = (payload.componentInstance &&\n payload.componentInstance.proxy);\n if (proxy && proxy._pStores) {\n const piniaStores = payload.componentInstance.proxy._pStores;\n Object.values(piniaStores).forEach((store) => {\n payload.instanceData.state.push({\n type: getStoreType(store.$id),\n key: 'state',\n editable: true,\n value: store._isOptionsAPI\n ? {\n _custom: {\n value: toRaw(store.$state),\n actions: [\n {\n icon: 'restore',\n tooltip: 'Reset the state of this store',\n action: () => store.$reset(),\n },\n ],\n },\n }\n : // NOTE: workaround to unwrap transferred refs\n Object.keys(store.$state).reduce((state, key) => {\n state[key] = store.$state[key];\n return state;\n }, {}),\n });\n if (store._getters && store._getters.length) {\n payload.instanceData.state.push({\n type: getStoreType(store.$id),\n key: 'getters',\n editable: false,\n value: store._getters.reduce((getters, key) => {\n try {\n getters[key] = store[key];\n }\n catch (error) {\n // @ts-expect-error: we just want to show it in devtools\n getters[key] = error;\n }\n return getters;\n }, {}),\n });\n }\n });\n }\n });\n api.on.getInspectorTree((payload) => {\n if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n let stores = [pinia];\n stores = stores.concat(Array.from(pinia._s.values()));\n payload.rootNodes = (payload.filter\n ? stores.filter((store) => '$id' in store\n ? store.$id\n .toLowerCase()\n .includes(payload.filter.toLowerCase())\n : PINIA_ROOT_LABEL.toLowerCase().includes(payload.filter.toLowerCase()))\n : stores).map(formatStoreForInspectorTree);\n }\n });\n api.on.getInspectorState((payload) => {\n if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n const inspectedStore = payload.nodeId === PINIA_ROOT_ID\n ? pinia\n : pinia._s.get(payload.nodeId);\n if (!inspectedStore) {\n // this could be the selected store restored for a different project\n // so it's better not to say anything here\n return;\n }\n if (inspectedStore) {\n payload.state = formatStoreForInspectorState(inspectedStore);\n }\n }\n });\n api.on.editInspectorState((payload, ctx) => {\n if (payload.app === app && payload.inspectorId === INSPECTOR_ID) {\n const inspectedStore = payload.nodeId === PINIA_ROOT_ID\n ? pinia\n : pinia._s.get(payload.nodeId);\n if (!inspectedStore) {\n return toastMessage(`store \"${payload.nodeId}\" not found`, 'error');\n }\n const { path } = payload;\n if (!isPinia(inspectedStore)) {\n // access only the state\n if (path.length !== 1 ||\n !inspectedStore._customProperties.has(path[0]) ||\n path[0] in inspectedStore.$state) {\n path.unshift('$state');\n }\n }\n else {\n // Root access, we can omit the `.value` because the devtools API does it for us\n path.unshift('state');\n }\n isTimelineActive = false;\n payload.set(inspectedStore, path, payload.state.value);\n isTimelineActive = true;\n }\n });\n api.on.editComponentState((payload) => {\n if (payload.type.startsWith('๐Ÿ')) {\n const storeId = payload.type.replace(/^๐Ÿ\\s*/, '');\n const store = pinia._s.get(storeId);\n if (!store) {\n return toastMessage(`store \"${storeId}\" not found`, 'error');\n }\n const { path } = payload;\n if (path[0] !== 'state') {\n return toastMessage(`Invalid path for store \"${storeId}\":\\n${path}\\nOnly state can be modified.`);\n }\n // rewrite the first entry to be able to directly set the state as\n // well as any other path\n path[0] = '$state';\n isTimelineActive = false;\n payload.set(store, path, payload.state.value);\n isTimelineActive = true;\n }\n });\n });\n}\nfunction addStoreToDevtools(app, store) {\n if (!componentStateTypes.includes(getStoreType(store.$id))) {\n componentStateTypes.push(getStoreType(store.$id));\n }\n setupDevtoolsPlugin({\n id: 'dev.esm.pinia',\n label: 'Pinia ๐Ÿ',\n logo: 'https://pinia.vuejs.org/logo.svg',\n packageName: 'pinia',\n homepage: 'https://pinia.vuejs.org',\n componentStateTypes,\n app,\n settings: {\n logStoreChanges: {\n label: 'Notify about new/deleted stores',\n type: 'boolean',\n defaultValue: true,\n },\n // useEmojis: {\n // label: 'Use emojis in messages โšก๏ธ',\n // type: 'boolean',\n // defaultValue: true,\n // },\n },\n }, (api) => {\n // gracefully handle errors\n const now = typeof api.now === 'function' ? api.now.bind(api) : Date.now;\n store.$onAction(({ after, onError, name, args }) => {\n const groupId = runningActionId++;\n api.addTimelineEvent({\n layerId: MUTATIONS_LAYER_ID,\n event: {\n time: now(),\n title: '๐Ÿ›ซ ' + name,\n subtitle: 'start',\n data: {\n store: formatDisplay(store.$id),\n action: formatDisplay(name),\n args,\n },\n groupId,\n },\n });\n after((result) => {\n activeAction = undefined;\n api.addTimelineEvent({\n layerId: MUTATIONS_LAYER_ID,\n event: {\n time: now(),\n title: '๐Ÿ›ฌ ' + name,\n subtitle: 'end',\n data: {\n store: formatDisplay(store.$id),\n action: formatDisplay(name),\n args,\n result,\n },\n groupId,\n },\n });\n });\n onError((error) => {\n activeAction = undefined;\n api.addTimelineEvent({\n layerId: MUTATIONS_LAYER_ID,\n event: {\n time: now(),\n logType: 'error',\n title: '๐Ÿ’ฅ ' + name,\n subtitle: 'end',\n data: {\n store: formatDisplay(store.$id),\n action: formatDisplay(name),\n args,\n error,\n },\n groupId,\n },\n });\n });\n }, true);\n store._customProperties.forEach((name) => {\n watch(() => unref(store[name]), (newValue, oldValue) => {\n api.notifyComponentUpdate();\n api.sendInspectorState(INSPECTOR_ID);\n if (isTimelineActive) {\n api.addTimelineEvent({\n layerId: MUTATIONS_LAYER_ID,\n event: {\n time: now(),\n title: 'Change',\n subtitle: name,\n data: {\n newValue,\n oldValue,\n },\n groupId: activeAction,\n },\n });\n }\n }, { deep: true });\n });\n store.$subscribe(({ events, type }, state) => {\n api.notifyComponentUpdate();\n api.sendInspectorState(INSPECTOR_ID);\n if (!isTimelineActive)\n return;\n // rootStore.state[store.id] = state\n const eventData = {\n time: now(),\n title: formatMutationType(type),\n data: assign$1({ store: formatDisplay(store.$id) }, formatEventData(events)),\n groupId: activeAction,\n };\n // reset for the next mutation\n activeAction = undefined;\n if (type === MutationType.patchFunction) {\n eventData.subtitle = 'โคต๏ธ';\n }\n else if (type === MutationType.patchObject) {\n eventData.subtitle = '๐Ÿงฉ';\n }\n else if (events && !Array.isArray(events)) {\n eventData.subtitle = events.type;\n }\n if (events) {\n eventData.data['rawEvent(s)'] = {\n _custom: {\n display: 'DebuggerEvent',\n type: 'object',\n tooltip: 'raw DebuggerEvent[]',\n value: events,\n },\n };\n }\n api.addTimelineEvent({\n layerId: MUTATIONS_LAYER_ID,\n event: eventData,\n });\n }, { detached: true, flush: 'sync' });\n const hotUpdate = store._hotUpdate;\n store._hotUpdate = markRaw((newStore) => {\n hotUpdate(newStore);\n api.addTimelineEvent({\n layerId: MUTATIONS_LAYER_ID,\n event: {\n time: now(),\n title: '๐Ÿ”ฅ ' + store.$id,\n subtitle: 'HMR update',\n data: {\n store: formatDisplay(store.$id),\n info: formatDisplay(`HMR update`),\n },\n },\n });\n // update the devtools too\n api.notifyComponentUpdate();\n api.sendInspectorTree(INSPECTOR_ID);\n api.sendInspectorState(INSPECTOR_ID);\n });\n const { $dispose } = store;\n store.$dispose = () => {\n $dispose();\n api.notifyComponentUpdate();\n api.sendInspectorTree(INSPECTOR_ID);\n api.sendInspectorState(INSPECTOR_ID);\n api.getSettings().logStoreChanges &&\n toastMessage(`Disposed \"${store.$id}\" store ๐Ÿ—‘`);\n };\n // trigger an update so it can display new registered stores\n api.notifyComponentUpdate();\n api.sendInspectorTree(INSPECTOR_ID);\n api.sendInspectorState(INSPECTOR_ID);\n api.getSettings().logStoreChanges &&\n toastMessage(`\"${store.$id}\" store installed ๐Ÿ†•`);\n });\n}\nlet runningActionId = 0;\nlet activeAction;\n/**\n * Patches a store to enable action grouping in devtools by wrapping the store with a Proxy that is passed as the\n * context of all actions, allowing us to set `runningAction` on each access and effectively associating any state\n * mutation to the action.\n *\n * @param store - store to patch\n * @param actionNames - list of actionst to patch\n */\nfunction patchActionForGrouping(store, actionNames) {\n // original actions of the store as they are given by pinia. We are going to override them\n const actions = actionNames.reduce((storeActions, actionName) => {\n // use toRaw to avoid tracking #541\n storeActions[actionName] = toRaw(store)[actionName];\n return storeActions;\n }, {});\n for (const actionName in actions) {\n store[actionName] = function () {\n // setActivePinia(store._p)\n // the running action id is incremented in a before action hook\n const _actionId = runningActionId;\n const trackedStore = new Proxy(store, {\n get(...args) {\n activeAction = _actionId;\n return Reflect.get(...args);\n },\n set(...args) {\n activeAction = _actionId;\n return Reflect.set(...args);\n },\n });\n return actions[actionName].apply(trackedStore, arguments);\n };\n }\n}\n/**\n * pinia.use(devtoolsPlugin)\n */\nfunction devtoolsPlugin({ app, store, options }) {\n // HMR module\n if (store.$id.startsWith('__hot:')) {\n return;\n }\n // detect option api vs setup api\n if (options.state) {\n store._isOptionsAPI = true;\n }\n // only wrap actions in option-defined stores as this technique relies on\n // wrapping the context of the action with a proxy\n if (typeof options.state === 'function') {\n patchActionForGrouping(\n // @ts-expect-error: can cast the store...\n store, Object.keys(options.actions));\n const originalHotUpdate = store._hotUpdate;\n // Upgrade the HMR to also update the new actions\n toRaw(store)._hotUpdate = function (newStore) {\n originalHotUpdate.apply(this, arguments);\n patchActionForGrouping(store, Object.keys(newStore._hmrPayload.actions));\n };\n }\n addStoreToDevtools(app, \n // FIXME: is there a way to allow the assignment from Store to StoreGeneric?\n store);\n}\n\n/**\n * Creates a Pinia instance to be used by the application\n */\nfunction createPinia() {\n const scope = effectScope(true);\n // NOTE: here we could check the window object for a state and directly set it\n // if there is anything like it with Vue 3 SSR\n const state = scope.run(() => ref({}));\n let _p = [];\n // plugins added before calling app.use(pinia)\n let toBeInstalled = [];\n const pinia = markRaw({\n install(app) {\n // this allows calling useStore() outside of a component setup after\n // installing pinia's plugin\n setActivePinia(pinia);\n if (!isVue2) {\n pinia._a = app;\n app.provide(piniaSymbol, pinia);\n app.config.globalProperties.$pinia = pinia;\n /* istanbul ignore else */\n if (USE_DEVTOOLS) {\n registerPiniaDevtools(app, pinia);\n }\n toBeInstalled.forEach((plugin) => _p.push(plugin));\n toBeInstalled = [];\n }\n },\n use(plugin) {\n if (!this._a && !isVue2) {\n toBeInstalled.push(plugin);\n }\n else {\n _p.push(plugin);\n }\n return this;\n },\n _p,\n // it's actually undefined here\n // @ts-expect-error\n _a: null,\n _e: scope,\n _s: new Map(),\n state,\n });\n // pinia devtools rely on dev only features so they cannot be forced unless\n // the dev build of Vue is used. Avoid old browsers like IE11.\n if (USE_DEVTOOLS && typeof Proxy !== 'undefined') {\n pinia.use(devtoolsPlugin);\n }\n return pinia;\n}\n\n/**\n * Checks if a function is a `StoreDefinition`.\n *\n * @param fn - object to test\n * @returns true if `fn` is a StoreDefinition\n */\nconst isUseStore = (fn) => {\n return typeof fn === 'function' && typeof fn.$id === 'string';\n};\n/**\n * Mutates in place `newState` with `oldState` to _hot update_ it. It will\n * remove any key not existing in `newState` and recursively merge plain\n * objects.\n *\n * @param newState - new state object to be patched\n * @param oldState - old state that should be used to patch newState\n * @returns - newState\n */\nfunction patchObject(newState, oldState) {\n // no need to go through symbols because they cannot be serialized anyway\n for (const key in oldState) {\n const subPatch = oldState[key];\n // skip the whole sub tree\n if (!(key in newState)) {\n continue;\n }\n const targetValue = newState[key];\n if (isPlainObject(targetValue) &&\n isPlainObject(subPatch) &&\n !isRef(subPatch) &&\n !isReactive(subPatch)) {\n newState[key] = patchObject(targetValue, subPatch);\n }\n else {\n // objects are either a bit more complex (e.g. refs) or primitives, so we\n // just set the whole thing\n if (isVue2) {\n set(newState, key, subPatch);\n }\n else {\n newState[key] = subPatch;\n }\n }\n }\n return newState;\n}\n/**\n * Creates an _accept_ function to pass to `import.meta.hot` in Vite applications.\n *\n * @example\n * ```js\n * const useUser = defineStore(...)\n * if (import.meta.hot) {\n * import.meta.hot.accept(acceptHMRUpdate(useUser, import.meta.hot))\n * }\n * ```\n *\n * @param initialUseStore - return of the defineStore to hot update\n * @param hot - `import.meta.hot`\n */\nfunction acceptHMRUpdate(initialUseStore, hot) {\n // strip as much as possible from iife.prod\n if (!(process.env.NODE_ENV !== 'production')) {\n return () => { };\n }\n return (newModule) => {\n const pinia = hot.data.pinia || initialUseStore._pinia;\n if (!pinia) {\n // this store is still not used\n return;\n }\n // preserve the pinia instance across loads\n hot.data.pinia = pinia;\n // console.log('got data', newStore)\n for (const exportName in newModule) {\n const useStore = newModule[exportName];\n // console.log('checking for', exportName)\n if (isUseStore(useStore) && pinia._s.has(useStore.$id)) {\n // console.log('Accepting update for', useStore.$id)\n const id = useStore.$id;\n if (id !== initialUseStore.$id) {\n console.warn(`The id of the store changed from \"${initialUseStore.$id}\" to \"${id}\". Reloading.`);\n // return import.meta.hot.invalidate()\n return hot.invalidate();\n }\n const existingStore = pinia._s.get(id);\n if (!existingStore) {\n console.log(`[Pinia]: skipping hmr because store doesn't exist yet`);\n return;\n }\n useStore(pinia, existingStore);\n }\n }\n };\n}\n\nconst noop = () => { };\nfunction addSubscription(subscriptions, callback, detached, onCleanup = noop) {\n subscriptions.push(callback);\n const removeSubscription = () => {\n const idx = subscriptions.indexOf(callback);\n if (idx > -1) {\n subscriptions.splice(idx, 1);\n onCleanup();\n }\n };\n if (!detached && getCurrentScope()) {\n onScopeDispose(removeSubscription);\n }\n return removeSubscription;\n}\nfunction triggerSubscriptions(subscriptions, ...args) {\n subscriptions.slice().forEach((callback) => {\n callback(...args);\n });\n}\n\nfunction mergeReactiveObjects(target, patchToApply) {\n // Handle Map instances\n if (target instanceof Map && patchToApply instanceof Map) {\n patchToApply.forEach((value, key) => target.set(key, value));\n }\n // Handle Set instances\n if (target instanceof Set && patchToApply instanceof Set) {\n patchToApply.forEach(target.add, target);\n }\n // no need to go through symbols because they cannot be serialized anyway\n for (const key in patchToApply) {\n if (!patchToApply.hasOwnProperty(key))\n continue;\n const subPatch = patchToApply[key];\n const targetValue = target[key];\n if (isPlainObject(targetValue) &&\n isPlainObject(subPatch) &&\n target.hasOwnProperty(key) &&\n !isRef(subPatch) &&\n !isReactive(subPatch)) {\n // NOTE: here I wanted to warn about inconsistent types but it's not possible because in setup stores one might\n // start the value of a property as a certain type e.g. a Map, and then for some reason, during SSR, change that\n // to `undefined`. When trying to hydrate, we want to override the Map with `undefined`.\n target[key] = mergeReactiveObjects(targetValue, subPatch);\n }\n else {\n // @ts-expect-error: subPatch is a valid value\n target[key] = subPatch;\n }\n }\n return target;\n}\nconst skipHydrateSymbol = (process.env.NODE_ENV !== 'production')\n ? Symbol('pinia:skipHydration')\n : /* istanbul ignore next */ Symbol();\nconst skipHydrateMap = /*#__PURE__*/ new WeakMap();\n/**\n * Tells Pinia to skip the hydration process of a given object. This is useful in setup stores (only) when you return a\n * stateful object in the store but it isn't really state. e.g. returning a router instance in a setup store.\n *\n * @param obj - target object\n * @returns obj\n */\nfunction skipHydrate(obj) {\n return isVue2\n ? // in @vue/composition-api, the refs are sealed so defineProperty doesn't work...\n /* istanbul ignore next */ skipHydrateMap.set(obj, 1) && obj\n : Object.defineProperty(obj, skipHydrateSymbol, {});\n}\n/**\n * Returns whether a value should be hydrated\n *\n * @param obj - target variable\n * @returns true if `obj` should be hydrated\n */\nfunction shouldHydrate(obj) {\n return isVue2\n ? /* istanbul ignore next */ !skipHydrateMap.has(obj)\n : !isPlainObject(obj) || !obj.hasOwnProperty(skipHydrateSymbol);\n}\nconst { assign } = Object;\nfunction isComputed(o) {\n return !!(isRef(o) && o.effect);\n}\nfunction createOptionsStore(id, options, pinia, hot) {\n const { state, actions, getters } = options;\n const initialState = pinia.state.value[id];\n let store;\n function setup() {\n if (!initialState && (!(process.env.NODE_ENV !== 'production') || !hot)) {\n /* istanbul ignore if */\n if (isVue2) {\n set(pinia.state.value, id, state ? state() : {});\n }\n else {\n pinia.state.value[id] = state ? state() : {};\n }\n }\n // avoid creating a state in pinia.state.value\n const localState = (process.env.NODE_ENV !== 'production') && hot\n ? // use ref() to unwrap refs inside state TODO: check if this is still necessary\n toRefs(ref(state ? state() : {}).value)\n : toRefs(pinia.state.value[id]);\n return assign(localState, actions, Object.keys(getters || {}).reduce((computedGetters, name) => {\n if ((process.env.NODE_ENV !== 'production') && name in localState) {\n console.warn(`[๐Ÿ]: A getter cannot have the same name as another state property. Rename one of them. Found with \"${name}\" in store \"${id}\".`);\n }\n computedGetters[name] = markRaw(computed(() => {\n setActivePinia(pinia);\n // it was created just before\n const store = pinia._s.get(id);\n // allow cross using stores\n /* istanbul ignore next */\n if (isVue2 && !store._r)\n return;\n // @ts-expect-error\n // return getters![name].call(context, context)\n // TODO: avoid reading the getter while assigning with a global variable\n return getters[name].call(store, store);\n }));\n return computedGetters;\n }, {}));\n }\n store = createSetupStore(id, setup, options, pinia, hot, true);\n return store;\n}\nfunction createSetupStore($id, setup, options = {}, pinia, hot, isOptionsStore) {\n let scope;\n const optionsForPlugin = assign({ actions: {} }, options);\n /* istanbul ignore if */\n if ((process.env.NODE_ENV !== 'production') && !pinia._e.active) {\n throw new Error('Pinia destroyed');\n }\n // watcher options for $subscribe\n const $subscribeOptions = {\n deep: true,\n // flush: 'post',\n };\n /* istanbul ignore else */\n if ((process.env.NODE_ENV !== 'production') && !isVue2) {\n $subscribeOptions.onTrigger = (event) => {\n /* istanbul ignore else */\n if (isListening) {\n debuggerEvents = event;\n // avoid triggering this while the store is being built and the state is being set in pinia\n }\n else if (isListening == false && !store._hotUpdating) {\n // let patch send all the events together later\n /* istanbul ignore else */\n if (Array.isArray(debuggerEvents)) {\n debuggerEvents.push(event);\n }\n else {\n console.error('๐Ÿ debuggerEvents should be an array. This is most likely an internal Pinia bug.');\n }\n }\n };\n }\n // internal state\n let isListening; // set to true at the end\n let isSyncListening; // set to true at the end\n let subscriptions = markRaw([]);\n let actionSubscriptions = markRaw([]);\n let debuggerEvents;\n const initialState = pinia.state.value[$id];\n // avoid setting the state for option stores if it is set\n // by the setup\n if (!isOptionsStore && !initialState && (!(process.env.NODE_ENV !== 'production') || !hot)) {\n /* istanbul ignore if */\n if (isVue2) {\n set(pinia.state.value, $id, {});\n }\n else {\n pinia.state.value[$id] = {};\n }\n }\n const hotState = ref({});\n // avoid triggering too many listeners\n // https://github.com/vuejs/pinia/issues/1129\n let activeListener;\n function $patch(partialStateOrMutator) {\n let subscriptionMutation;\n isListening = isSyncListening = false;\n // reset the debugger events since patches are sync\n /* istanbul ignore else */\n if ((process.env.NODE_ENV !== 'production')) {\n debuggerEvents = [];\n }\n if (typeof partialStateOrMutator === 'function') {\n partialStateOrMutator(pinia.state.value[$id]);\n subscriptionMutation = {\n type: MutationType.patchFunction,\n storeId: $id,\n events: debuggerEvents,\n };\n }\n else {\n mergeReactiveObjects(pinia.state.value[$id], partialStateOrMutator);\n subscriptionMutation = {\n type: MutationType.patchObject,\n payload: partialStateOrMutator,\n storeId: $id,\n events: debuggerEvents,\n };\n }\n const myListenerId = (activeListener = Symbol());\n nextTick().then(() => {\n if (activeListener === myListenerId) {\n isListening = true;\n }\n });\n isSyncListening = true;\n // because we paused the watcher, we need to manually call the subscriptions\n triggerSubscriptions(subscriptions, subscriptionMutation, pinia.state.value[$id]);\n }\n const $reset = isOptionsStore\n ? function $reset() {\n const { state } = options;\n const newState = state ? state() : {};\n // we use a patch to group all changes into one single subscription\n this.$patch(($state) => {\n assign($state, newState);\n });\n }\n : /* istanbul ignore next */\n (process.env.NODE_ENV !== 'production')\n ? () => {\n throw new Error(`๐Ÿ: Store \"${$id}\" is built using the setup syntax and does not implement $reset().`);\n }\n : noop;\n function $dispose() {\n scope.stop();\n subscriptions = [];\n actionSubscriptions = [];\n pinia._s.delete($id);\n }\n /**\n * Wraps an action to handle subscriptions.\n *\n * @param name - name of the action\n * @param action - action to wrap\n * @returns a wrapped action to handle subscriptions\n */\n function wrapAction(name, action) {\n return function () {\n setActivePinia(pinia);\n const args = Array.from(arguments);\n const afterCallbackList = [];\n const onErrorCallbackList = [];\n function after(callback) {\n afterCallbackList.push(callback);\n }\n function onError(callback) {\n onErrorCallbackList.push(callback);\n }\n // @ts-expect-error\n triggerSubscriptions(actionSubscriptions, {\n args,\n name,\n store,\n after,\n onError,\n });\n let ret;\n try {\n ret = action.apply(this && this.$id === $id ? this : store, args);\n // handle sync errors\n }\n catch (error) {\n triggerSubscriptions(onErrorCallbackList, error);\n throw error;\n }\n if (ret instanceof Promise) {\n return ret\n .then((value) => {\n triggerSubscriptions(afterCallbackList, value);\n return value;\n })\n .catch((error) => {\n triggerSubscriptions(onErrorCallbackList, error);\n return Promise.reject(error);\n });\n }\n // trigger after callbacks\n triggerSubscriptions(afterCallbackList, ret);\n return ret;\n };\n }\n const _hmrPayload = /*#__PURE__*/ markRaw({\n actions: {},\n getters: {},\n state: [],\n hotState,\n });\n const partialStore = {\n _p: pinia,\n // _s: scope,\n $id,\n $onAction: addSubscription.bind(null, actionSubscriptions),\n $patch,\n $reset,\n $subscribe(callback, options = {}) {\n const removeSubscription = addSubscription(subscriptions, callback, options.detached, () => stopWatcher());\n const stopWatcher = scope.run(() => watch(() => pinia.state.value[$id], (state) => {\n if (options.flush === 'sync' ? isSyncListening : isListening) {\n callback({\n storeId: $id,\n type: MutationType.direct,\n events: debuggerEvents,\n }, state);\n }\n }, assign({}, $subscribeOptions, options)));\n return removeSubscription;\n },\n $dispose,\n };\n /* istanbul ignore if */\n if (isVue2) {\n // start as non ready\n partialStore._r = false;\n }\n const store = reactive((process.env.NODE_ENV !== 'production') || USE_DEVTOOLS\n ? assign({\n _hmrPayload,\n _customProperties: markRaw(new Set()), // devtools custom properties\n }, partialStore\n // must be added later\n // setupStore\n )\n : partialStore);\n // store the partial store now so the setup of stores can instantiate each other before they are finished without\n // creating infinite loops.\n pinia._s.set($id, store);\n // TODO: idea create skipSerialize that marks properties as non serializable and they are skipped\n const setupStore = pinia._e.run(() => {\n scope = effectScope();\n return scope.run(() => setup());\n });\n // overwrite existing actions to support $onAction\n for (const key in setupStore) {\n const prop = setupStore[key];\n if ((isRef(prop) && !isComputed(prop)) || isReactive(prop)) {\n // mark it as a piece of state to be serialized\n if ((process.env.NODE_ENV !== 'production') && hot) {\n set(hotState.value, key, toRef(setupStore, key));\n // createOptionStore directly sets the state in pinia.state.value so we\n // can just skip that\n }\n else if (!isOptionsStore) {\n // in setup stores we must hydrate the state and sync pinia state tree with the refs the user just created\n if (initialState && shouldHydrate(prop)) {\n if (isRef(prop)) {\n prop.value = initialState[key];\n }\n else {\n // probably a reactive object, lets recursively assign\n // @ts-expect-error: prop is unknown\n mergeReactiveObjects(prop, initialState[key]);\n }\n }\n // transfer the ref to the pinia state to keep everything in sync\n /* istanbul ignore if */\n if (isVue2) {\n set(pinia.state.value[$id], key, prop);\n }\n else {\n pinia.state.value[$id][key] = prop;\n }\n }\n /* istanbul ignore else */\n if ((process.env.NODE_ENV !== 'production')) {\n _hmrPayload.state.push(key);\n }\n // action\n }\n else if (typeof prop === 'function') {\n // @ts-expect-error: we are overriding the function we avoid wrapping if\n const actionValue = (process.env.NODE_ENV !== 'production') && hot ? prop : wrapAction(key, prop);\n // this a hot module replacement store because the hotUpdate method needs\n // to do it with the right context\n /* istanbul ignore if */\n if (isVue2) {\n set(setupStore, key, actionValue);\n }\n else {\n // @ts-expect-error\n setupStore[key] = actionValue;\n }\n /* istanbul ignore else */\n if ((process.env.NODE_ENV !== 'production')) {\n _hmrPayload.actions[key] = prop;\n }\n // list actions so they can be used in plugins\n // @ts-expect-error\n optionsForPlugin.actions[key] = prop;\n }\n else if ((process.env.NODE_ENV !== 'production')) {\n // add getters for devtools\n if (isComputed(prop)) {\n _hmrPayload.getters[key] = isOptionsStore\n ? // @ts-expect-error\n options.getters[key]\n : prop;\n if (IS_CLIENT) {\n const getters = setupStore._getters ||\n // @ts-expect-error: same\n (setupStore._getters = markRaw([]));\n getters.push(key);\n }\n }\n }\n }\n // add the state, getters, and action properties\n /* istanbul ignore if */\n if (isVue2) {\n Object.keys(setupStore).forEach((key) => {\n set(store, key, setupStore[key]);\n });\n }\n else {\n assign(store, setupStore);\n // allows retrieving reactive objects with `storeToRefs()`. Must be called after assigning to the reactive object.\n // Make `storeToRefs()` work with `reactive()` #799\n assign(toRaw(store), setupStore);\n }\n // use this instead of a computed with setter to be able to create it anywhere\n // without linking the computed lifespan to wherever the store is first\n // created.\n Object.defineProperty(store, '$state', {\n get: () => ((process.env.NODE_ENV !== 'production') && hot ? hotState.value : pinia.state.value[$id]),\n set: (state) => {\n /* istanbul ignore if */\n if ((process.env.NODE_ENV !== 'production') && hot) {\n throw new Error('cannot set hotState');\n }\n $patch(($state) => {\n assign($state, state);\n });\n },\n });\n // add the hotUpdate before plugins to allow them to override it\n /* istanbul ignore else */\n if ((process.env.NODE_ENV !== 'production')) {\n store._hotUpdate = markRaw((newStore) => {\n store._hotUpdating = true;\n newStore._hmrPayload.state.forEach((stateKey) => {\n if (stateKey in store.$state) {\n const newStateTarget = newStore.$state[stateKey];\n const oldStateSource = store.$state[stateKey];\n if (typeof newStateTarget === 'object' &&\n isPlainObject(newStateTarget) &&\n isPlainObject(oldStateSource)) {\n patchObject(newStateTarget, oldStateSource);\n }\n else {\n // transfer the ref\n newStore.$state[stateKey] = oldStateSource;\n }\n }\n // patch direct access properties to allow store.stateProperty to work as\n // store.$state.stateProperty\n set(store, stateKey, toRef(newStore.$state, stateKey));\n });\n // remove deleted state properties\n Object.keys(store.$state).forEach((stateKey) => {\n if (!(stateKey in newStore.$state)) {\n del(store, stateKey);\n }\n });\n // avoid devtools logging this as a mutation\n isListening = false;\n isSyncListening = false;\n pinia.state.value[$id] = toRef(newStore._hmrPayload, 'hotState');\n isSyncListening = true;\n nextTick().then(() => {\n isListening = true;\n });\n for (const actionName in newStore._hmrPayload.actions) {\n const action = newStore[actionName];\n set(store, actionName, wrapAction(actionName, action));\n }\n // TODO: does this work in both setup and option store?\n for (const getterName in newStore._hmrPayload.getters) {\n const getter = newStore._hmrPayload.getters[getterName];\n const getterValue = isOptionsStore\n ? // special handling of options api\n computed(() => {\n setActivePinia(pinia);\n return getter.call(store, store);\n })\n : getter;\n set(store, getterName, getterValue);\n }\n // remove deleted getters\n Object.keys(store._hmrPayload.getters).forEach((key) => {\n if (!(key in newStore._hmrPayload.getters)) {\n del(store, key);\n }\n });\n // remove old actions\n Object.keys(store._hmrPayload.actions).forEach((key) => {\n if (!(key in newStore._hmrPayload.actions)) {\n del(store, key);\n }\n });\n // update the values used in devtools and to allow deleting new properties later on\n store._hmrPayload = newStore._hmrPayload;\n store._getters = newStore._getters;\n store._hotUpdating = false;\n });\n }\n if (USE_DEVTOOLS) {\n const nonEnumerable = {\n writable: true,\n configurable: true,\n // avoid warning on devtools trying to display this property\n enumerable: false,\n };\n ['_p', '_hmrPayload', '_getters', '_customProperties'].forEach((p) => {\n Object.defineProperty(store, p, assign({ value: store[p] }, nonEnumerable));\n });\n }\n /* istanbul ignore if */\n if (isVue2) {\n // mark the store as ready before plugins\n store._r = true;\n }\n // apply all plugins\n pinia._p.forEach((extender) => {\n /* istanbul ignore else */\n if (USE_DEVTOOLS) {\n const extensions = scope.run(() => extender({\n store,\n app: pinia._a,\n pinia,\n options: optionsForPlugin,\n }));\n Object.keys(extensions || {}).forEach((key) => store._customProperties.add(key));\n assign(store, extensions);\n }\n else {\n assign(store, scope.run(() => extender({\n store,\n app: pinia._a,\n pinia,\n options: optionsForPlugin,\n })));\n }\n });\n if ((process.env.NODE_ENV !== 'production') &&\n store.$state &&\n typeof store.$state === 'object' &&\n typeof store.$state.constructor === 'function' &&\n !store.$state.constructor.toString().includes('[native code]')) {\n console.warn(`[๐Ÿ]: The \"state\" must be a plain object. It cannot be\\n` +\n `\\tstate: () => new MyClass()\\n` +\n `Found in store \"${store.$id}\".`);\n }\n // only apply hydrate to option stores with an initial state in pinia\n if (initialState &&\n isOptionsStore &&\n options.hydrate) {\n options.hydrate(store.$state, initialState);\n }\n isListening = true;\n isSyncListening = true;\n return store;\n}\nfunction defineStore(\n// TODO: add proper types from above\nidOrOptions, setup, setupOptions) {\n let id;\n let options;\n const isSetupStore = typeof setup === 'function';\n if (typeof idOrOptions === 'string') {\n id = idOrOptions;\n // the option store setup will contain the actual options in this case\n options = isSetupStore ? setupOptions : setup;\n }\n else {\n options = idOrOptions;\n id = idOrOptions.id;\n }\n function useStore(pinia, hot) {\n const currentInstance = getCurrentInstance();\n pinia =\n // in test mode, ignore the argument provided as we can always retrieve a\n // pinia instance with getActivePinia()\n ((process.env.NODE_ENV === 'test') && activePinia && activePinia._testing ? null : pinia) ||\n (currentInstance && inject(piniaSymbol, null));\n if (pinia)\n setActivePinia(pinia);\n if ((process.env.NODE_ENV !== 'production') && !activePinia) {\n throw new Error(`[๐Ÿ]: getActivePinia was called with no active Pinia. Did you forget to install pinia?\\n` +\n `\\tconst pinia = createPinia()\\n` +\n `\\tapp.use(pinia)\\n` +\n `This will fail in production.`);\n }\n pinia = activePinia;\n if (!pinia._s.has(id)) {\n // creating the store registers it in `pinia._s`\n if (isSetupStore) {\n createSetupStore(id, setup, options, pinia);\n }\n else {\n createOptionsStore(id, options, pinia);\n }\n /* istanbul ignore else */\n if ((process.env.NODE_ENV !== 'production')) {\n // @ts-expect-error: not the right inferred type\n useStore._pinia = pinia;\n }\n }\n const store = pinia._s.get(id);\n if ((process.env.NODE_ENV !== 'production') && hot) {\n const hotId = '__hot:' + id;\n const newStore = isSetupStore\n ? createSetupStore(hotId, setup, options, pinia, true)\n : createOptionsStore(hotId, assign({}, options), pinia, true);\n hot._hotUpdate(newStore);\n // cleanup the state properties and the store from the cache\n delete pinia.state.value[hotId];\n pinia._s.delete(hotId);\n }\n // save stores in instances to access them devtools\n if ((process.env.NODE_ENV !== 'production') &&\n IS_CLIENT &&\n currentInstance &&\n currentInstance.proxy &&\n // avoid adding stores that are just built for hot module replacement\n !hot) {\n const vm = currentInstance.proxy;\n const cache = '_pStores' in vm ? vm._pStores : (vm._pStores = {});\n cache[id] = store;\n }\n // StoreGeneric cannot be casted towards Store\n return store;\n }\n useStore.$id = id;\n return useStore;\n}\n\nlet mapStoreSuffix = 'Store';\n/**\n * Changes the suffix added by `mapStores()`. Can be set to an empty string.\n * Defaults to `\"Store\"`. Make sure to extend the MapStoresCustomization\n * interface if you are using TypeScript.\n *\n * @param suffix - new suffix\n */\nfunction setMapStoreSuffix(suffix // could be 'Store' but that would be annoying for JS\n) {\n mapStoreSuffix = suffix;\n}\n/**\n * Allows using stores without the composition API (`setup()`) by generating an\n * object to be spread in the `computed` field of a component. It accepts a list\n * of store definitions.\n *\n * @example\n * ```js\n * export default {\n * computed: {\n * // other computed properties\n * ...mapStores(useUserStore, useCartStore)\n * },\n *\n * created() {\n * this.userStore // store with id \"user\"\n * this.cartStore // store with id \"cart\"\n * }\n * }\n * ```\n *\n * @param stores - list of stores to map to an object\n */\nfunction mapStores(...stores) {\n if ((process.env.NODE_ENV !== 'production') && Array.isArray(stores[0])) {\n console.warn(`[๐Ÿ]: Directly pass all stores to \"mapStores()\" without putting them in an array:\\n` +\n `Replace\\n` +\n `\\tmapStores([useAuthStore, useCartStore])\\n` +\n `with\\n` +\n `\\tmapStores(useAuthStore, useCartStore)\\n` +\n `This will fail in production if not fixed.`);\n stores = stores[0];\n }\n return stores.reduce((reduced, useStore) => {\n // @ts-expect-error: $id is added by defineStore\n reduced[useStore.$id + mapStoreSuffix] = function () {\n return useStore(this.$pinia);\n };\n return reduced;\n }, {});\n}\n/**\n * Allows using state and getters from one store without using the composition\n * API (`setup()`) by generating an object to be spread in the `computed` field\n * of a component.\n *\n * @param useStore - store to map from\n * @param keysOrMapper - array or object\n */\nfunction mapState(useStore, keysOrMapper) {\n return Array.isArray(keysOrMapper)\n ? keysOrMapper.reduce((reduced, key) => {\n reduced[key] = function () {\n return useStore(this.$pinia)[key];\n };\n return reduced;\n }, {})\n : Object.keys(keysOrMapper).reduce((reduced, key) => {\n // @ts-expect-error\n reduced[key] = function () {\n const store = useStore(this.$pinia);\n const storeKey = keysOrMapper[key];\n // for some reason TS is unable to infer the type of storeKey to be a\n // function\n return typeof storeKey === 'function'\n ? storeKey.call(this, store)\n : store[storeKey];\n };\n return reduced;\n }, {});\n}\n/**\n * Alias for `mapState()`. You should use `mapState()` instead.\n * @deprecated use `mapState()` instead.\n */\nconst mapGetters = mapState;\n/**\n * Allows directly using actions from your store without using the composition\n * API (`setup()`) by generating an object to be spread in the `methods` field\n * of a component.\n *\n * @param useStore - store to map from\n * @param keysOrMapper - array or object\n */\nfunction mapActions(useStore, keysOrMapper) {\n return Array.isArray(keysOrMapper)\n ? keysOrMapper.reduce((reduced, key) => {\n // @ts-expect-error\n reduced[key] = function (...args) {\n return useStore(this.$pinia)[key](...args);\n };\n return reduced;\n }, {})\n : Object.keys(keysOrMapper).reduce((reduced, key) => {\n // @ts-expect-error\n reduced[key] = function (...args) {\n return useStore(this.$pinia)[keysOrMapper[key]](...args);\n };\n return reduced;\n }, {});\n}\n/**\n * Allows using state and getters from one store without using the composition\n * API (`setup()`) by generating an object to be spread in the `computed` field\n * of a component.\n *\n * @param useStore - store to map from\n * @param keysOrMapper - array or object\n */\nfunction mapWritableState(useStore, keysOrMapper) {\n return Array.isArray(keysOrMapper)\n ? keysOrMapper.reduce((reduced, key) => {\n // @ts-ignore\n reduced[key] = {\n get() {\n return useStore(this.$pinia)[key];\n },\n set(value) {\n // it's easier to type it here as any\n return (useStore(this.$pinia)[key] = value);\n },\n };\n return reduced;\n }, {})\n : Object.keys(keysOrMapper).reduce((reduced, key) => {\n // @ts-ignore\n reduced[key] = {\n get() {\n return useStore(this.$pinia)[keysOrMapper[key]];\n },\n set(value) {\n // it's easier to type it here as any\n return (useStore(this.$pinia)[keysOrMapper[key]] = value);\n },\n };\n return reduced;\n }, {});\n}\n\n/**\n * Creates an object of references with all the state, getters, and plugin-added\n * state properties of the store. Similar to `toRefs()` but specifically\n * designed for Pinia stores so methods and non reactive properties are\n * completely ignored.\n *\n * @param store - store to extract the refs from\n */\nfunction storeToRefs(store) {\n // See https://github.com/vuejs/pinia/issues/852\n // It's easier to just use toRefs() even if it includes more stuff\n if (isVue2) {\n // @ts-expect-error: toRefs include methods and others\n return toRefs(store);\n }\n else {\n store = toRaw(store);\n const refs = {};\n for (const key in store) {\n const value = store[key];\n if (isRef(value) || isReactive(value)) {\n // @ts-expect-error: the key is state or getter\n refs[key] =\n // ---\n toRef(store, key);\n }\n }\n return refs;\n }\n}\n\n/**\n * Vue 2 Plugin that must be installed for pinia to work. Note **you don't need\n * this plugin if you are using Nuxt.js**. Use the `buildModule` instead:\n * https://pinia.vuejs.org/ssr/nuxt.html.\n *\n * @example\n * ```js\n * import Vue from 'vue'\n * import { PiniaVuePlugin, createPinia } from 'pinia'\n *\n * Vue.use(PiniaVuePlugin)\n * const pinia = createPinia()\n *\n * new Vue({\n * el: '#app',\n * // ...\n * pinia,\n * })\n * ```\n *\n * @param _Vue - `Vue` imported from 'vue'.\n */\nconst PiniaVuePlugin = function (_Vue) {\n // Equivalent of\n // app.config.globalProperties.$pinia = pinia\n _Vue.mixin({\n beforeCreate() {\n const options = this.$options;\n if (options.pinia) {\n const pinia = options.pinia;\n // HACK: taken from provide(): https://github.com/vuejs/composition-api/blob/main/src/apis/inject.ts#L31\n /* istanbul ignore else */\n if (!this._provided) {\n const provideCache = {};\n Object.defineProperty(this, '_provided', {\n get: () => provideCache,\n set: (v) => Object.assign(provideCache, v),\n });\n }\n this._provided[piniaSymbol] = pinia;\n // propagate the pinia instance in an SSR friendly way\n // avoid adding it to nuxt twice\n /* istanbul ignore else */\n if (!this.$pinia) {\n this.$pinia = pinia;\n }\n pinia._a = this;\n if (IS_CLIENT) {\n // this allows calling useStore() outside of a component setup after\n // installing pinia's plugin\n setActivePinia(pinia);\n }\n if (USE_DEVTOOLS) {\n registerPiniaDevtools(pinia._a, pinia);\n }\n }\n else if (!this.$pinia && options.parent && options.parent.$pinia) {\n this.$pinia = options.parent.$pinia;\n }\n },\n destroyed() {\n delete this._pStores;\n },\n });\n};\n\nexport { MutationType, PiniaVuePlugin, acceptHMRUpdate, createPinia, defineStore, getActivePinia, mapActions, mapGetters, mapState, mapStores, mapWritableState, setActivePinia, setMapStoreSuffix, skipHydrate, storeToRefs };\n"],"names":["_defineProperty","obj","key","value","Object","defineProperty","enumerable","configurable","writable","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","push","apply","_objectSpread2","target","i","arguments","length","source","forEach","getOwnPropertyDescriptors","defineProperties","load","url","options","undefined","Promise","resolve","reject","document","head","getElementsByTagName","script","createElement","async","src","defer","preconnectOrigin","link","href","rel","appendChild","onload","onerror","mergeDeep","_len","sources","Array","_key","shift","isPlainObject","assign","concat","isBrowser","window","warn","text","validateScreenviewShape","app_name","screen_name","getPathWithBase","path","base","pathAsArray","split","baseAsArray","join","router","getDefaultParams","bootstrap","onReady","onError","onBeforeTrack","onAfterTrack","pageTrackerTemplate","customResourceURL","customPreconnectOrigin","deferScriptLoad","pageTrackerExcludedRoutes","pageTrackerEnabled","enabled","disableScriptLoad","pageTrackerScreenviewEnabled","appName","pageTrackerUseFullPath","pageTrackerPrependBase","pageTrackerSkipSamePath","globalDataLayerName","globalObjectName","defaultGroupName","includes","config","id","params","send_page_view","setOptions","defaultParams","getOptions","query","_window","_getOptions","args","isArray","domain","assignGlobalProperty","disable","optOut","optIn","setRouter","instance","getRouter","event","name","send_to","map","pageview","param","template","page_path","fullPath","useFullPath","useBase","page_title","page_location","location","screenview","exception","linker","time","set","refund","purchase","customMap","custom_map","api","freeze","__proto__","attachApi","app","globalProperties","$gtag","registerGlobals","Date","mergeDefaultParams","addConfiguration","track","to","from","proxy","useScreenview","skipSamePath","isFunction","isRouteExcluded","route","routes","addRoutesTracker","_getOptions2","isReady","then","nextTick","currentRoute","afterEach","isPageTrackerEnabled","Boolean","error","install","exports","sfc","props","__vccOpts","val","randomUUID","crypto","bind","getRandomValues","rnds8","Uint8Array","rng","Error","byteToHex","toString","slice","unsafeStringify","arr","offset","toLowerCase","v4","buf","native","rnds","random","tryGettingFetch","self","fetch","global","ClientConfig","constructor","_apiKey","_fetch","apiKey","k","this","f","LanguageGeocoding","AUTO","ALBANIAN","ARABIC","ARMENIAN","AZERBAIJANI","BELORUSSIAN","BOSNIAN","BRETON","BULGARIAN","CATALAN","CHINESE","CROATIAN","CZECH","DANISH","DUTCH","ENGLISH","ESPERANTO","ESTONIAN","FINNISH","FRENCH","FRISIAN","GEORGIAN","GERMAN","GREEK","HEBREW","HUNGARIAN","ICELANDIC","IRISH","ITALIAN","JAPANESE","KANNADA","KAZAKH","KOREAN","ROMAN_LATIN","LATVIAN","LITHUANIAN","LUXEMBOURGISH","MACEDONIAN","MALTESE","NORWEGIAN","POLISH","PORTUGUESE","ROMANIAN","ROMANSH","RUSSIAN","SCOTTISH_GAELIC","SERBIAN_CYRILLIC","SLOVAK","SLOVENE","SPANISH","SWEDISH","THAI","TURKISH","UKRAINIAN","WELSH","Set","values","callFetch","_0","__async$4","resource","URL","searchParams","get","trim","defaults","maptilerApiURL","mapStyle","ServiceError","res","customMessage","super","status","customMessages$2","info","__async$2","_a","endpoint","urlWithParams","ok","json","geolocation","expandMapStyle","style","maptilerDomainRegex","match","trimmed","expandedStyle","startsWith","exec","MapStyleVariant","variantType","referenceStyle","description","imageURL","getName","getFullName","getType","getId","getDescription","getReferenceStyle","hasVariant","getVariant","getVariants","v","getImageURL","getExpandedStyleURL","ReferenceMapStyle","variants","orderedVariants","addVariant","getDefaultVariant","mapStylePresetList","referenceStyleID","makeReferenceStyleProxy","Proxy","prop","receiver","toUpperCase","Reflect","buildMapStyles","refStyleInfo","refStyle","j","variantInfo","variant","MapStyle","Language","LATIN","NON_LATIN","LOCAL","AMHARIC","BASQUE","CORSICAN","HINDI","INDONESIAN","JAPANESE_HIRAGANA","JAPANESE_KANA","JAPANESE_LATIN","JAPANESE_2018","KOREAN_LATIN","KURDISH","MALAYALAM","OCCITAN","SERBIAN_LATIN","TAMIL","TELUGU","languagesIsoSet","isLanguageSupported","lang","has","languageCodeSet","getBrowserLanguage","navigator","Intl","DateTimeFormat","resolvedOptions","locale","canditatelangs","languages","l","SdkConfig","EventEmitter","primaryLanguage","secondaryLanguage","session","_unit","unit","u","emit","config$1","maptilerLogoURL","maptilerURL","maptilerApiHost","rtlPluginURL","terrainSourceURL","terrainSourceId","LogoControl","maplibregl__default","onAdd","MaptilerLogoControl","_b","logoURL","linkURL","_map","_compact","compact","_container","className","anchor","backgroundRepeat","cursor","display","height","margin","overflow","width","backgroundImage","backgroundSize","setAttribute","_getUIString","on","_updateCompact","enableRTL","bindAll","fns","context","fn","DOMcreate","tagName","container","el","DOMremove","node","parentNode","removeChild","styleToStyle","String","MaptilerTerrainControl","_terrainButton","type","addEventListener","_toggleTerrain","_updateTerrainIcon","onRemove","off","hasTerrain","disableTerrain","enableTerrain","classList","remove","add","title","NavigationControl","MaptilerNavigationControl","showCompass","showZoom","visualizePitch","_compass","removeEventListener","clickFunction","e","currentPitch","getPitch","easeTo","pitch","Math","min","getMaxPitch","resetNorthPitch","originalEvent","resetNorth","_createButton","button","_rotateCompassArrow","rotate","pow","cos","transform","PI","angle","_compassIcon","GeolocateControl","Marker$1","LngLat$1","MaptilerGeolocateControl","lastUpdatedCenter","_updateCamera","position","center","coords","longitude","latitude","radius","accuracy","bearing","getBearing","__spreadProps$1","__spreadValues$1","fitBoundsOptions","linear","currentMapZoom","getZoom","maxZoom","zoom","fitBounds","toBounds","geolocateSource","hasFittingBeenDisrupted","flagFittingDisruption","once","getCenter","_setupUI","supported","preventDefault","_geolocateButton","disabled","trackUserLocation","_watchState","showUserLocation","_dotElement","_userLocationDotMarker","_circleElement","_accuracyCircleMarker","element","pitchAlignment","_onZoom","trigger","_setup","fromResize","movingDistance","distanceTo","fire","Event","_updateCircleRadius","lastKnownLocation","_lastKnownPosition","projectedLocation","project","a","unproject","x","y","b","metersPerPixel","circleDiameter","ceil","_accuracy","showAccuracyCircle","AttributionControl","ScaleControl","FullscreenControl","MAPTILER_SESSION_ID","GeolocationType","POINT","COUNTRY","Map","_c","hashPreConstructor","hash","console","__spreadProps","__spreadValues","maplibreLogo","transformRequest","reqUrl","headers","host","append","isTerrainEnabled","terrainExaggeration","terrainGrowing","terrainFlattening","language","__async","geolocate","fitToIpBounds","message","ipLocatedCameraHash","centerOnIpPoint","getCameraHash","locationResult","permissions","state","getCurrentPosition","data","terrain","duration","maximumAge","timeout","enableHighAccuracy","setPrimaryLanguage","setSecondaryLanguage","getTerrain","tileJsonContent","logo","possibleSources","sourceCaches","sourceName","getSource","s","styleUrl","tileJsonRes","addControl","logoPosition","attributionControl","maptilerLogo","scaleControl","setUnit","navigationControl","geolocateControl","positionOptions","terrainControl","fullscreenControl","loadEventTriggered","terrainEventTriggered","terrainEventData","_","terrainCallback","evt","onLoadAsync","loaded","onLoadWithTerrainAsync","setStyle","setLanguage","onStyleReady","layers","getStyle","strLanguageRegex","strLanguageInArrayRegex","strBilingualRegex","strMoreInfoRegex","langStr","replacer","layer","layout","textFieldLayoutProp","getLayoutProperty","regexMatch","newProp","elem","setLayoutProperty","languagesAlreadyFound","getPrimaryLanguage","getSecondaryLanguage","getTerrainExaggeration","growTerrain","exaggeration","durationMs","startTime","performance","now","currentExaggeration","deltaExaggeration","updateExaggeration","positionInLoop","exaggerationFactor","newExaggeration","requestAnimationFrame","triggerRepaint","dataEventTerrainGrow","dataType","sourceId","isSourceLoaded","addTerrain","addSource","setTerrain","animationLoopDuration","removeSource","setTerrainExaggeration","animate","cb","isStyleLoaded","ipGeolocateResult","country_bounds","padding","jumpTo","hashBin","Float32Array","lng","lat","Base64","buffer","getSdkConfig","getMaptilerSessionId","Marker","addTo","Popup","Style","CanvasSource","GeoJSONSource","ImageSource","RasterTileSource","RasterDEMTileSource","VectorTileSource","VideoSource","TerrainControl","setRTLTextPlugin","getRTLTextPluginStatus","LngLat","LngLatBounds","MercatorCoordinate","Evented","AJAXError","prewarm","clearPrewarmedResources","version","workerCount","maxParallelImageRequests","workerUrl","addProtocol","removeProtocol","isVue2","max","splice","activePinia","setActivePinia","pinia","piniaSymbol","Symbol","o","prototype","call","toJSON","MutationType","IS_CLIENT","USE_DEVTOOLS","_global","globalThis","HTMLElement","bom","blob","autoBom","test","Blob","fromCharCode","download","opts","xhr","XMLHttpRequest","open","responseType","saveAs","response","send","corsEnabled","click","dispatchEvent","MouseEvent","createEvent","initMouseEvent","_navigator","userAgent","isMacOSWebView","HTMLAnchorElement","downloadSaveAs","msSaveAs","fileSaverSaveAs","origin","createObjectURL","setTimeout","revokeObjectURL","msSaveOrOpenBlob","popup","body","innerText","force","isSafari","isChromeIOS","FileReader","reader","onloadend","result","replace","readAsDataURL","toastMessage","piniaMessage","__VUE_DEVTOOLS_TOAST__","log","isPinia","checkClipboardAccess","checkNotFocusedError","actionGlobalCopyState","clipboard","writeText","JSON","stringify","actionGlobalPasteState","parse","readText","actionGlobalSaveState","fileInput","getFileOpener","openFile","onchange","files","file","item","oncancel","accept","actionGlobalOpenStateFile","formatDisplay","_custom","PINIA_ROOT_LABEL","PINIA_ROOT_ID","formatStoreForInspectorTree","store","label","$id","formatStoreForInspectorState","storeNames","_s","storeMap","storeId","editable","getters","_getters","reduce","$state","getterName","_customProperties","size","customProperties","formatEventData","events","operations","oldValue","newValue","operation","formatMutationType","direct","patchFunction","patchObject","isTimelineActive","componentStateTypes","MUTATIONS_LAYER_ID","INSPECTOR_ID","assign$1","getStoreType","registerPiniaDevtools","setupDevtoolsPlugin","packageName","homepage","addTimelineLayer","color","addInspector","icon","treeFilterPlaceholder","actions","action","tooltip","sendInspectorTree","sendInspectorState","nodeActions","nodeId","_isOptionsAPI","$reset","inspectComponent","payload","ctx","componentInstance","_pStores","piniaStores","instanceData","toRaw","getInspectorTree","inspectorId","stores","rootNodes","getInspectorState","inspectedStore","editInspectorState","unshift","editComponentState","addStoreToDevtools","settings","logStoreChanges","defaultValue","$onAction","after","groupId","runningActionId","addTimelineEvent","layerId","subtitle","activeAction","logType","watch","unref","notifyComponentUpdate","deep","$subscribe","eventData","detached","flush","hotUpdate","_hotUpdate","markRaw","newStore","$dispose","getSettings","patchActionForGrouping","actionNames","storeActions","actionName","_actionId","trackedStore","devtoolsPlugin","originalHotUpdate","_hmrPayload","createPinia","scope","effectScope","run","ref","_p","toBeInstalled","provide","$pinia","plugin","use","_e","noop","addSubscription","subscriptions","callback","onCleanup","removeSubscription","idx","indexOf","getCurrentScope","onScopeDispose","triggerSubscriptions","mergeReactiveObjects","patchToApply","hasOwnProperty","subPatch","targetValue","isRef","isReactive","skipHydrateSymbol","skipHydrateMap","WeakMap","shouldHydrate","isComputed","effect","createOptionsStore","hot","initialState","setup","localState","toRefs","computedGetters","computed","_r","createSetupStore","isOptionsStore","optionsForPlugin","$subscribeOptions","isListening","isSyncListening","debuggerEvents","actionSubscriptions","hotState","activeListener","$patch","partialStateOrMutator","subscriptionMutation","myListenerId","newState","stop","delete","wrapAction","afterCallbackList","onErrorCallbackList","ret","catch","partialStore","stopWatcher","reactive","setupStore","actionValue","process","nonEnumerable","p","extender","extensions","hydrate","defineStore","idOrOptions","setupOptions","isSetupStore","useStore","currentInstance","getCurrentInstance","inject","storeToRefs","refs","toRef"],"sourceRoot":""}