@deck.gl/carto 9.0.14 → 9.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/api/basemap.d.ts +17 -0
  2. package/dist/api/basemap.d.ts.map +1 -0
  3. package/dist/api/basemap.js +76 -0
  4. package/dist/api/fetch-map.d.ts +10 -12
  5. package/dist/api/fetch-map.d.ts.map +1 -1
  6. package/dist/api/fetch-map.js +7 -3
  7. package/dist/api/index.d.ts +2 -2
  8. package/dist/api/index.d.ts.map +1 -1
  9. package/dist/api/parse-map.d.ts +21 -1
  10. package/dist/api/parse-map.d.ts.map +1 -1
  11. package/dist/api/parse-map.js +1 -0
  12. package/dist/api/query.d.ts.map +1 -1
  13. package/dist/api/query.js +4 -3
  14. package/dist/api/request-with-parameters.js +1 -1
  15. package/dist/api/types.d.ts +82 -1
  16. package/dist/api/types.d.ts.map +1 -1
  17. package/dist/basemap.d.ts +17 -0
  18. package/dist/basemap.d.ts.map +1 -1
  19. package/dist/basemap.js +97 -7
  20. package/dist/cartoRasterTile-worker.js +1 -1
  21. package/dist/cartoSpatialTile-worker.js +1 -1
  22. package/dist/cartoVectorTile-worker.js +1 -1
  23. package/dist/dist.dev.js +1734 -2360
  24. package/dist/index.cjs +260 -82
  25. package/dist/index.cjs.map +4 -4
  26. package/dist/index.d.ts +3 -2
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +2 -1
  29. package/dist/layers/heatmap.d.ts +3 -2
  30. package/dist/layers/heatmap.d.ts.map +1 -1
  31. package/dist/layers/heatmap.js +18 -6
  32. package/dist/layers/quadbin-heatmap-tile-layer.d.ts +5 -2
  33. package/dist/layers/quadbin-heatmap-tile-layer.d.ts.map +1 -1
  34. package/dist/layers/quadbin-heatmap-tile-layer.js +3 -2
  35. package/dist/layers/schema/carto-raster-tile-loader.js +1 -1
  36. package/dist/layers/schema/carto-spatial-tile-loader.js +1 -1
  37. package/dist/layers/schema/carto-vector-tile-loader.js +1 -1
  38. package/dist/utils.d.ts +2 -0
  39. package/dist/utils.d.ts.map +1 -1
  40. package/dist/utils.js +2 -0
  41. package/dist.min.js +21 -15
  42. package/package.json +6 -6
  43. package/src/api/basemap.ts +100 -0
  44. package/src/api/fetch-map.ts +20 -6
  45. package/src/api/index.ts +11 -2
  46. package/src/api/parse-map.ts +24 -3
  47. package/src/api/query.ts +4 -2
  48. package/src/api/request-with-parameters.ts +1 -1
  49. package/src/api/types.ts +103 -1
  50. package/src/basemap.ts +134 -7
  51. package/src/index.ts +14 -2
  52. package/src/layers/heatmap.ts +23 -8
  53. package/src/layers/quadbin-heatmap-tile-layer.ts +8 -5
  54. package/src/utils.ts +5 -0
package/dist/index.cjs CHANGED
@@ -36,12 +36,18 @@ __export(dist_exports, {
36
36
  RasterTileLayer: () => RasterTileLayer,
37
37
  SOURCE_DEFAULTS: () => SOURCE_DEFAULTS,
38
38
  VectorTileLayer: () => VectorTileLayer,
39
+ _GOOGLE_BASEMAPS: () => GOOGLE_BASEMAPS,
39
40
  _PointLabelLayer: () => PointLabelLayer,
41
+ _STYLE_LAYER_GROUPS: () => STYLE_LAYER_GROUPS,
42
+ _applyLayerGroupFilters: () => applyLayerGroupFilters,
43
+ _fetchStyle: () => fetchStyle,
44
+ _getStyleUrl: () => getStyleUrl,
40
45
  boundaryQuerySource: () => boundaryQuerySource,
41
46
  boundaryTableSource: () => boundaryTableSource,
42
47
  colorBins: () => colorBins,
43
48
  colorCategories: () => colorCategories,
44
49
  colorContinuous: () => colorContinuous,
50
+ fetchBasemapProps: () => fetchBasemapProps,
45
51
  fetchMap: () => fetchMap,
46
52
  h3QuerySource: () => h3QuerySource,
47
53
  h3TableSource: () => h3TableSource,
@@ -263,9 +269,11 @@ function scaleIdentity() {
263
269
  };
264
270
  return scale;
265
271
  }
272
+ var isObject = (x) => x !== null && typeof x === "object";
273
+ var isPureObject = (x) => isObject(x) && x.constructor === {}.constructor;
266
274
 
267
275
  // dist/layers/schema/carto-raster-tile-loader.js
268
- var VERSION = true ? "9.0.14" : "latest";
276
+ var VERSION = true ? "9.0.15" : "latest";
269
277
  var id = "cartoRasterTile";
270
278
  var DEFAULT_OPTIONS = {
271
279
  cartoRasterTile: {
@@ -536,7 +544,7 @@ function binaryToSpatialjson(binary) {
536
544
  }
537
545
 
538
546
  // dist/layers/schema/carto-spatial-tile-loader.js
539
- var VERSION2 = true ? "9.0.14" : "latest";
547
+ var VERSION2 = true ? "9.0.15" : "latest";
540
548
  var id2 = "cartoSpatialTile";
541
549
  var DEFAULT_OPTIONS2 = {
542
550
  cartoSpatialTile: {
@@ -1042,6 +1050,7 @@ var import_layers2 = require("@deck.gl/layers");
1042
1050
  // dist/layers/heatmap.js
1043
1051
  var import_shadertools = require("@luma.gl/shadertools");
1044
1052
  var fs = `uniform heatmapUniforms {
1053
+ vec2 delta;
1045
1054
  float radiusPixels;
1046
1055
  vec2 colorDomain;
1047
1056
  vec3 color1;
@@ -1081,24 +1090,29 @@ float f = (value - range.x) / (range.y - range.x);
1081
1090
  return mix(c1, c2, f) / 255.0;
1082
1091
  }
1083
1092
  const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
1093
+ vec4 pack(float value) {
1094
+ return vec4(mod(vec3(value, floor(value / SHIFT.yz)), 256.0), 255.0) / 255.0;
1095
+ }
1084
1096
  float unpack(vec3 color) {
1085
1097
  return 255.0 * dot(color, SHIFT);
1086
1098
  }
1087
1099
  vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
1100
+ bool firstPass = (heatmap.delta.y < 0.5);
1088
1101
  float accumulator = 0.0;
1089
1102
  float offset = 0.5 * random(vec3(12.9898, 78.233, 151.7182), 0.0);
1090
1103
  const float sigma = SUPPORT / 3.0;
1091
1104
  const float a = -0.5 / (sigma * sigma);
1092
- const float w0 = 1.0 / (2.0 * 3.141592653589793 * sigma * sigma);
1105
+ const float w0 = 0.3989422804014327 / sigma;
1093
1106
  for (float t = -SUPPORT; t <= SUPPORT; t++) {
1094
- for (float s = -SUPPORT; s <= SUPPORT; s++) {
1095
- vec2 percent = (vec2(s, t) + offset - 0.5) / SUPPORT;
1107
+ vec2 percent = (t * heatmap.delta + offset - 0.5) / SUPPORT;
1096
1108
  vec2 delta = percent * heatmap.radiusPixels / texSize;
1097
1109
  vec4 offsetColor = texture(source, texCoord + delta);
1098
1110
  float value = unpack(offsetColor.rgb);
1099
- float weight = w0 * exp(a * (s * s + t * t));
1111
+ float weight = w0 * exp(a * t * t);
1100
1112
  accumulator += value * weight;
1101
1113
  }
1114
+ if (firstPass) {
1115
+ return pack(accumulator);
1102
1116
  }
1103
1117
  float f = (accumulator - heatmap.colorDomain[0]) / (heatmap.colorDomain[1] - heatmap.colorDomain[0]);
1104
1118
  vec4 color = vec4(0.0);
@@ -1120,6 +1134,7 @@ var defaultColorRange = [
1120
1134
  var heatmap = {
1121
1135
  name: "heatmap",
1122
1136
  uniformPropTypes: {
1137
+ delta: { value: [0, 1] },
1123
1138
  radiusPixels: { value: 20, min: 0, softMax: 100 },
1124
1139
  colorDomain: { value: [0, 1] },
1125
1140
  color1: { value: [0, 0, 0] },
@@ -1131,6 +1146,7 @@ var heatmap = {
1131
1146
  opacity: { value: 1, min: 0, max: 1 }
1132
1147
  },
1133
1148
  uniformTypes: {
1149
+ delta: "vec2<f32>",
1134
1150
  radiusPixels: "f32",
1135
1151
  colorDomain: "vec2<f32>",
1136
1152
  color1: "vec3<f32>",
@@ -1142,9 +1158,10 @@ var heatmap = {
1142
1158
  opacity: "f32"
1143
1159
  },
1144
1160
  getUniforms: (opts) => {
1145
- const { colorRange = defaultColorRange, radiusPixels = 20, colorDomain = [0, 1], opacity = 1 } = opts;
1161
+ const { delta = [1, 0], colorRange = defaultColorRange, radiusPixels = 20, colorDomain = [0, 1], opacity = 1 } = opts;
1146
1162
  const [color1, color2, color3, color4, color5, color6] = colorRange;
1147
1163
  return {
1164
+ delta,
1148
1165
  color1,
1149
1166
  color2,
1150
1167
  color3,
@@ -1158,7 +1175,10 @@ var heatmap = {
1158
1175
  },
1159
1176
  dependencies: [import_shadertools.random],
1160
1177
  fs,
1161
- passes: [{ sampler: true }]
1178
+ passes: [
1179
+ { sampler: true, uniforms: { delta: [1, 0] } },
1180
+ { sampler: true, uniforms: { delta: [0, 1] } }
1181
+ ]
1162
1182
  };
1163
1183
 
1164
1184
  // dist/layers/post-process-utils.js
@@ -1293,7 +1313,7 @@ var _RTTSolidPolygonLayer = class extends RTTModifier(import_layers2.SolidPolygo
1293
1313
  float value = 255.0 * dot(SHIFT, color.rgb);
1294
1314
 
1295
1315
  // Keep "power" delivered to screen constant when tiles update
1296
- float relativeZoom = log2(project_uScale) - cellResolution + 3.5; // range 0-1
1316
+ float relativeZoom = log2(project.scale) - cellResolution + 3.5; // range 0-1
1297
1317
  float relativeArea = pow(2.0, -2.0 * relativeZoom); // range 0.25-1
1298
1318
  value *= relativeArea;
1299
1319
 
@@ -1321,7 +1341,7 @@ function encodeWeight(w) {
1321
1341
  return [w % 256, Math.floor(w / 256), Math.floor(w / (256 * 256))];
1322
1342
  }
1323
1343
  var defaultProps6 = {
1324
- ...QuadbinTileLayer.defaultProps,
1344
+ data: TilejsonPropType,
1325
1345
  getWeight: { type: "accessor", value: 1 }
1326
1346
  };
1327
1347
  var _QuadbinHeatmapTileLayer = class extends import_core9.CompositeLayer {
@@ -1619,7 +1639,7 @@ var carto_properties_tile_loader_default = CartoPropertiesTileLoader;
1619
1639
 
1620
1640
  // dist/layers/schema/carto-vector-tile-loader.js
1621
1641
  var import_earcut = __toESM(require("earcut"), 1);
1622
- var VERSION3 = true ? "9.0.14" : "latest";
1642
+ var VERSION3 = true ? "9.0.15" : "latest";
1623
1643
  var id3 = "cartoVectorTile";
1624
1644
  var DEFAULT_OPTIONS3 = {
1625
1645
  cartoVectorTile: {
@@ -1777,15 +1797,140 @@ var VectorTileLayer = _VectorTileLayer;
1777
1797
  _VectorTileLayer.defaultProps = defaultProps9;
1778
1798
  })();
1779
1799
 
1800
+ // dist/api/carto-api-error.js
1801
+ var CartoAPIError = class extends Error {
1802
+ constructor(error, errorContext, response) {
1803
+ let responseString = "Failed to connect";
1804
+ if (response) {
1805
+ responseString = "Server returned: ";
1806
+ if (response.status === 400) {
1807
+ responseString += "Bad request";
1808
+ } else if (response.status === 401 || response.status === 403) {
1809
+ responseString += "Unauthorized access";
1810
+ } else if (response.status === 404) {
1811
+ responseString += "Not found";
1812
+ } else {
1813
+ responseString += "Error";
1814
+ }
1815
+ responseString += ` (${response.status}):`;
1816
+ }
1817
+ responseString += ` ${error.message || error}`;
1818
+ let message = `${errorContext.requestType} API request failed`;
1819
+ message += `
1820
+ ${responseString}`;
1821
+ for (const key of Object.keys(errorContext)) {
1822
+ if (key === "requestType")
1823
+ continue;
1824
+ message += `
1825
+ ${formatErrorKey(key)}: ${errorContext[key]}`;
1826
+ }
1827
+ message += "\n";
1828
+ super(message);
1829
+ this.name = "CartoAPIError";
1830
+ this.response = response;
1831
+ this.error = error;
1832
+ this.errorContext = errorContext;
1833
+ }
1834
+ };
1835
+ function formatErrorKey(key) {
1836
+ return key.replace(/([A-Z])/g, " $1").replace(/^./, (s) => s.toUpperCase());
1837
+ }
1838
+
1780
1839
  // dist/basemap.js
1781
- var baseUrl = "https://basemaps.cartocdn.com/gl/{basemap}-gl-style/style.json";
1840
+ var cartoStyleUrlTemplate = "https://basemaps.cartocdn.com/gl/{basemap}-gl-style/style.json";
1841
+ var CARTO_MAP_STYLES = ["positron", "dark-matter", "voyager"];
1842
+ var GOOGLE_BASEMAPS = {
1843
+ roadmap: {
1844
+ mapTypeId: "roadmap",
1845
+ mapId: "3754c817b510f791"
1846
+ },
1847
+ "google-positron": {
1848
+ mapTypeId: "roadmap",
1849
+ mapId: "ea84ae4203ef21cd"
1850
+ },
1851
+ "google-dark-matter": {
1852
+ mapTypeId: "roadmap",
1853
+ mapId: "2fccc3b36c22a0e2"
1854
+ },
1855
+ "google-voyager": {
1856
+ mapTypeId: "roadmap",
1857
+ mapId: "885caf1e15bb9ef2"
1858
+ },
1859
+ satellite: {
1860
+ mapTypeId: "satellite"
1861
+ },
1862
+ hybrid: {
1863
+ mapTypeId: "hybrid"
1864
+ },
1865
+ terrain: {
1866
+ mapTypeId: "terrain"
1867
+ }
1868
+ };
1869
+ var STYLE_LAYER_GROUPS = [
1870
+ {
1871
+ slug: "label",
1872
+ filter: ({ id: id4 }) => Boolean(id4.match(/(?=(label|_label|place-|place_|poi-|poi_|watername_|roadname_|housenumber))/)),
1873
+ defaultVisibility: true
1874
+ },
1875
+ {
1876
+ slug: "road",
1877
+ filter: ({ id: id4 }) => Boolean(id4.match(/(?=(road|railway|tunnel|street|bridge))(?!.*label)/)),
1878
+ defaultVisibility: true
1879
+ },
1880
+ {
1881
+ slug: "border",
1882
+ filter: ({ id: id4 }) => Boolean(id4.match(/border|boundaries|boundary_/)),
1883
+ defaultVisibility: false
1884
+ },
1885
+ {
1886
+ slug: "building",
1887
+ filter: ({ id: id4 }) => Boolean(id4.match(/building/)),
1888
+ defaultVisibility: true
1889
+ },
1890
+ {
1891
+ slug: "water",
1892
+ filter: ({ id: id4 }) => Boolean(id4.match(/(?=(water|stream|ferry))/)),
1893
+ defaultVisibility: true
1894
+ },
1895
+ {
1896
+ slug: "land",
1897
+ filter: ({ id: id4 }) => Boolean(id4.match(/(?=(parks|landcover|industrial|sand|hillshade|park_))/)),
1898
+ defaultVisibility: true
1899
+ }
1900
+ ];
1901
+ function applyLayerGroupFilters(style, visibleLayerGroups) {
1902
+ if (!Array.isArray(style == null ? void 0 : style.layers)) {
1903
+ return style;
1904
+ }
1905
+ const removedLayerFilters = STYLE_LAYER_GROUPS.filter((lg) => !visibleLayerGroups[lg.slug]).map((lg) => lg.filter);
1906
+ const visibleLayers = style.layers.filter((layer) => removedLayerFilters.every((match) => !match(layer)));
1907
+ return {
1908
+ ...style,
1909
+ layers: visibleLayers
1910
+ };
1911
+ }
1912
+ function someLayerGroupsDisabled(visibleLayerGroups) {
1913
+ return visibleLayerGroups && Object.values(visibleLayerGroups).every(Boolean) === false;
1914
+ }
1915
+ function getStyleUrl(styleType) {
1916
+ return cartoStyleUrlTemplate.replace("{basemap}", styleType);
1917
+ }
1918
+ async function fetchStyle({ styleUrl, errorContext }) {
1919
+ let response;
1920
+ return await fetch(styleUrl, { mode: "cors" }).then((res) => {
1921
+ response = res;
1922
+ return res.json();
1923
+ }).catch((error) => {
1924
+ throw new CartoAPIError(error, { ...errorContext, requestType: "Basemap style" }, response);
1925
+ });
1926
+ }
1782
1927
  var basemap_default = {
1783
- VOYAGER: baseUrl.replace("{basemap}", "voyager"),
1784
- POSITRON: baseUrl.replace("{basemap}", "positron"),
1785
- DARK_MATTER: baseUrl.replace("{basemap}", "dark-matter"),
1786
- VOYAGER_NOLABELS: baseUrl.replace("{basemap}", "voyager-nolabels"),
1787
- POSITRON_NOLABELS: baseUrl.replace("{basemap}", "positron-nolabels"),
1788
- DARK_MATTER_NOLABELS: baseUrl.replace("{basemap}", "dark-matter-nolabels")
1928
+ VOYAGER: getStyleUrl("voyager"),
1929
+ POSITRON: getStyleUrl("positron"),
1930
+ DARK_MATTER: getStyleUrl("dark-matter"),
1931
+ VOYAGER_NOLABELS: getStyleUrl("voyager-nolabels"),
1932
+ POSITRON_NOLABELS: getStyleUrl("positron-nolabels"),
1933
+ DARK_MATTER_NOLABELS: getStyleUrl("dark-matter-nolabels")
1789
1934
  };
1790
1935
 
1791
1936
  // dist/style/color-bins-style.js
@@ -1896,45 +2041,6 @@ function colorContinuous({ attr, domain, colors = DEFAULT_PALETTE, nullColor = N
1896
2041
  };
1897
2042
  }
1898
2043
 
1899
- // dist/api/carto-api-error.js
1900
- var CartoAPIError = class extends Error {
1901
- constructor(error, errorContext, response) {
1902
- let responseString = "Failed to connect";
1903
- if (response) {
1904
- responseString = "Server returned: ";
1905
- if (response.status === 400) {
1906
- responseString += "Bad request";
1907
- } else if (response.status === 401 || response.status === 403) {
1908
- responseString += "Unauthorized access";
1909
- } else if (response.status === 404) {
1910
- responseString += "Not found";
1911
- } else {
1912
- responseString += "Error";
1913
- }
1914
- responseString += ` (${response.status}):`;
1915
- }
1916
- responseString += ` ${error.message || error}`;
1917
- let message = `${errorContext.requestType} API request failed`;
1918
- message += `
1919
- ${responseString}`;
1920
- for (const key of Object.keys(errorContext)) {
1921
- if (key === "requestType")
1922
- continue;
1923
- message += `
1924
- ${formatErrorKey(key)}: ${errorContext[key]}`;
1925
- }
1926
- message += "\n";
1927
- super(message);
1928
- this.name = "CartoAPIError";
1929
- this.response = response;
1930
- this.error = error;
1931
- this.errorContext = errorContext;
1932
- }
1933
- };
1934
- function formatErrorKey(key) {
1935
- return key.replace(/([A-Z])/g, " $1").replace(/^./, (s) => s.toUpperCase());
1936
- }
1937
-
1938
2044
  // dist/api/common.js
1939
2045
  var import_core13 = require("@deck.gl/core");
1940
2046
  var DEFAULT_API_BASE_URL = "https://gcp-us-east1.api.carto.com";
@@ -1974,23 +2080,22 @@ function buildQueryUrl({ apiBaseUrl, connectionName }) {
1974
2080
  }
1975
2081
 
1976
2082
  // dist/api/request-with-parameters.js
1977
- var import_core14 = require("@loaders.gl/core");
1978
2083
  function encodeParameter(name, value) {
1979
- if ((0, import_core14.isPureObject)(value) || Array.isArray(value)) {
2084
+ if (isPureObject(value) || Array.isArray(value)) {
1980
2085
  return `${name}=${encodeURIComponent(JSON.stringify(value))}`;
1981
2086
  }
1982
2087
  return `${name}=${encodeURIComponent(value)}`;
1983
2088
  }
1984
2089
  var REQUEST_CACHE = /* @__PURE__ */ new Map();
1985
- async function requestWithParameters({ baseUrl: baseUrl2, parameters, headers: customHeaders, errorContext }) {
2090
+ async function requestWithParameters({ baseUrl, parameters, headers: customHeaders, errorContext }) {
1986
2091
  parameters = { ...DEFAULT_PARAMETERS, ...parameters };
1987
- const key = createCacheKey(baseUrl2, parameters || {}, customHeaders || {});
2092
+ const key = createCacheKey(baseUrl, parameters || {}, customHeaders || {});
1988
2093
  if (REQUEST_CACHE.has(key)) {
1989
2094
  return REQUEST_CACHE.get(key);
1990
2095
  }
1991
- const url = parameters ? createURLWithParameters(baseUrl2, parameters) : baseUrl2;
2096
+ const url = parameters ? createURLWithParameters(baseUrl, parameters) : baseUrl;
1992
2097
  const headers = { ...DEFAULT_HEADERS, ...customHeaders };
1993
- const fetchPromise = url.length > MAX_GET_LENGTH ? fetch(baseUrl2, { method: "POST", body: JSON.stringify(parameters), headers }) : fetch(url, { headers });
2098
+ const fetchPromise = url.length > MAX_GET_LENGTH ? fetch(baseUrl, { method: "POST", body: JSON.stringify(parameters), headers }) : fetch(url, { headers });
1994
2099
  let response;
1995
2100
  const jsonPromise = fetchPromise.then((_response) => {
1996
2101
  response = _response;
@@ -2007,14 +2112,14 @@ async function requestWithParameters({ baseUrl: baseUrl2, parameters, headers: c
2007
2112
  REQUEST_CACHE.set(key, jsonPromise);
2008
2113
  return jsonPromise;
2009
2114
  }
2010
- function createCacheKey(baseUrl2, parameters, headers) {
2115
+ function createCacheKey(baseUrl, parameters, headers) {
2011
2116
  const parameterEntries = Object.entries(parameters).sort(([a], [b]) => a > b ? 1 : -1);
2012
2117
  const headerEntries = Object.entries(headers).sort(([a], [b]) => a > b ? 1 : -1);
2013
- return JSON.stringify({ baseUrl: baseUrl2, parameters: parameterEntries, headers: headerEntries });
2118
+ return JSON.stringify({ baseUrl, parameters: parameterEntries, headers: headerEntries });
2014
2119
  }
2015
- function createURLWithParameters(baseUrl2, parameters) {
2120
+ function createURLWithParameters(baseUrl, parameters) {
2016
2121
  const encodedParameters = Object.entries(parameters).map(([key, value]) => encodeParameter(key, value));
2017
- return `${baseUrl2}?${encodedParameters.join("&")}`;
2122
+ return `${baseUrl}?${encodedParameters.join("&")}`;
2018
2123
  }
2019
2124
 
2020
2125
  // dist/sources/base-source.js
@@ -2032,7 +2137,7 @@ async function baseSource(endpoint, options, urlParameters) {
2032
2137
  mergedOptions[key] = optionalOptions[key];
2033
2138
  }
2034
2139
  }
2035
- const baseUrl2 = buildSourceUrl(mergedOptions);
2140
+ const baseUrl = buildSourceUrl(mergedOptions);
2036
2141
  const { clientId, format } = mergedOptions;
2037
2142
  const headers = { Authorization: `Bearer ${options.accessToken}`, ...options.headers };
2038
2143
  const parameters = { client: clientId, ...urlParameters };
@@ -2043,7 +2148,7 @@ async function baseSource(endpoint, options, urlParameters) {
2043
2148
  source: JSON.stringify(parameters, void 0, 2)
2044
2149
  };
2045
2150
  const mapInstantiation = await requestWithParameters({
2046
- baseUrl: baseUrl2,
2151
+ baseUrl,
2047
2152
  parameters,
2048
2153
  headers,
2049
2154
  errorContext
@@ -2243,7 +2348,7 @@ var vectorTilesetSource = async function(options) {
2243
2348
 
2244
2349
  // dist/api/parse-map.js
2245
2350
  var import_constants12 = require("@luma.gl/constants");
2246
- var import_core15 = require("@deck.gl/core");
2351
+ var import_core14 = require("@deck.gl/core");
2247
2352
 
2248
2353
  // dist/api/layer-map.js
2249
2354
  var import_d3_array = require("d3-array");
@@ -2634,7 +2739,7 @@ function parseMap(json) {
2634
2739
  ...createLoadOptions(token)
2635
2740
  });
2636
2741
  } catch (e) {
2637
- import_core15.log.error(e.message)();
2742
+ import_core14.log.error(e.message)();
2638
2743
  return void 0;
2639
2744
  }
2640
2745
  })
@@ -2842,6 +2947,75 @@ function createLoadOptions(accessToken) {
2842
2947
  };
2843
2948
  }
2844
2949
 
2950
+ // dist/api/basemap.js
2951
+ var CUSTOM_STYLE_ID_PREFIX = "custom:";
2952
+ var DEFAULT_CARTO_STYLE = "positron";
2953
+ function mapLibreViewpros(config) {
2954
+ const { longitude, latitude, ...rest } = config.mapState;
2955
+ return {
2956
+ center: [longitude, latitude],
2957
+ ...rest
2958
+ };
2959
+ }
2960
+ async function fetchBasemapProps({ config, errorContext, applyLayerFilters = true }) {
2961
+ var _a;
2962
+ const { mapStyle } = config;
2963
+ const styleType = mapStyle.styleType || DEFAULT_CARTO_STYLE;
2964
+ if (styleType.startsWith(CUSTOM_STYLE_ID_PREFIX)) {
2965
+ const currentCustomStyle = (_a = config.customBaseMaps) == null ? void 0 : _a.customStyle;
2966
+ if (currentCustomStyle) {
2967
+ return {
2968
+ type: "maplibre",
2969
+ props: {
2970
+ style: currentCustomStyle.style || currentCustomStyle.url,
2971
+ ...mapLibreViewpros(config)
2972
+ },
2973
+ attribution: currentCustomStyle.customAttribution
2974
+ };
2975
+ }
2976
+ }
2977
+ if (CARTO_MAP_STYLES.includes(styleType)) {
2978
+ const { visibleLayerGroups } = mapStyle;
2979
+ const styleUrl = getStyleUrl(styleType);
2980
+ let style = styleUrl;
2981
+ let rawStyle = styleUrl;
2982
+ if (applyLayerFilters && visibleLayerGroups && someLayerGroupsDisabled(visibleLayerGroups)) {
2983
+ rawStyle = await fetchStyle({ styleUrl, errorContext });
2984
+ style = applyLayerGroupFilters(rawStyle, visibleLayerGroups);
2985
+ }
2986
+ return {
2987
+ type: "maplibre",
2988
+ props: {
2989
+ style,
2990
+ ...mapLibreViewpros(config)
2991
+ },
2992
+ visibleLayerGroups,
2993
+ rawStyle
2994
+ };
2995
+ }
2996
+ const googleBasemapDef = GOOGLE_BASEMAPS[styleType];
2997
+ if (googleBasemapDef) {
2998
+ const { mapState } = config;
2999
+ return {
3000
+ type: "google-maps",
3001
+ props: {
3002
+ ...googleBasemapDef,
3003
+ center: { lat: mapState.latitude, lng: mapState.longitude },
3004
+ zoom: mapState.zoom + 1,
3005
+ tilt: mapState.pitch,
3006
+ heading: mapState.bearing
3007
+ }
3008
+ };
3009
+ }
3010
+ return {
3011
+ type: "maplibre",
3012
+ props: {
3013
+ style: getStyleUrl(DEFAULT_CARTO_STYLE),
3014
+ ...mapLibreViewpros(config)
3015
+ }
3016
+ };
3017
+ }
3018
+
2845
3019
  // dist/api/fetch-map.js
2846
3020
  async function _fetchMapDataset(dataset, accessToken, apiBaseUrl, clientId, headers) {
2847
3021
  const { aggregationExp, aggregationResLevel, connectionName, columns, format, geoColumn, source, type, queryParameters } = dataset;
@@ -2905,7 +3079,7 @@ async function _fetchTilestats(attribute, dataset, accessToken, apiBaseUrl) {
2905
3079
  if (!("tilestats" in data)) {
2906
3080
  throw new CartoAPIError(new Error(`Invalid dataset for tilestats: ${id4}`), errorContext);
2907
3081
  }
2908
- const baseUrl2 = buildStatsUrl({ attribute, apiBaseUrl, ...dataset });
3082
+ const baseUrl = buildStatsUrl({ attribute, apiBaseUrl, ...dataset });
2909
3083
  const client = new URLSearchParams(data.tiles[0]).get("client");
2910
3084
  const headers = { Authorization: `Bearer ${accessToken}` };
2911
3085
  const parameters = {};
@@ -2919,7 +3093,7 @@ async function _fetchTilestats(attribute, dataset, accessToken, apiBaseUrl) {
2919
3093
  }
2920
3094
  }
2921
3095
  const stats = await requestWithParameters({
2922
- baseUrl: baseUrl2,
3096
+ baseUrl,
2923
3097
  headers,
2924
3098
  parameters,
2925
3099
  errorContext
@@ -2965,9 +3139,9 @@ async function fetchMap({ apiBaseUrl = DEFAULT_API_BASE_URL, cartoMapId, clientI
2965
3139
  assert(typeof onNewData === "function", "`onNewData` must be a function");
2966
3140
  assert(typeof autoRefresh === "number" && autoRefresh > 0, "`autoRefresh` must be a positive number");
2967
3141
  }
2968
- const baseUrl2 = buildPublicMapUrl({ apiBaseUrl, cartoMapId });
3142
+ const baseUrl = buildPublicMapUrl({ apiBaseUrl, cartoMapId });
2969
3143
  const errorContext = { requestType: "Public map", mapId: cartoMapId };
2970
- const map = await requestWithParameters({ baseUrl: baseUrl2, headers, errorContext });
3144
+ const map = await requestWithParameters({ baseUrl, headers, errorContext });
2971
3145
  let stopAutoRefresh;
2972
3146
  if (autoRefresh) {
2973
3147
  const intervalId = setInterval(async () => {
@@ -2994,9 +3168,12 @@ async function fetchMap({ apiBaseUrl = DEFAULT_API_BASE_URL, cartoMapId, clientI
2994
3168
  }
2995
3169
  }
2996
3170
  });
2997
- await fillInMapDatasets(map, clientId, apiBaseUrl, headers);
3171
+ const [basemap] = await Promise.all([
3172
+ fetchBasemapProps({ config: map.keplerMapConfig.config, errorContext }),
3173
+ fillInMapDatasets(map, clientId, apiBaseUrl, headers)
3174
+ ]);
2998
3175
  await fillInTileStats(map, apiBaseUrl);
2999
- const out = { ...parseMap(map), ...{ stopAutoRefresh } };
3176
+ const out = { ...parseMap(map), basemap, ...{ stopAutoRefresh } };
3000
3177
  const textLayers = out.layers.filter((layer) => {
3001
3178
  const pointType = layer.props.pointType || "";
3002
3179
  return pointType.includes("text");
@@ -3010,22 +3187,23 @@ async function fetchMap({ apiBaseUrl = DEFAULT_API_BASE_URL, cartoMapId, clientI
3010
3187
 
3011
3188
  // dist/api/query.js
3012
3189
  var query = async function(options) {
3013
- const { apiBaseUrl = SOURCE_DEFAULTS.apiBaseUrl, connectionName, sqlQuery, queryParameters } = options;
3190
+ const { apiBaseUrl = SOURCE_DEFAULTS.apiBaseUrl, clientId = SOURCE_DEFAULTS.clientId, connectionName, sqlQuery, queryParameters } = options;
3014
3191
  const urlParameters = { q: sqlQuery };
3015
3192
  if (queryParameters) {
3016
3193
  urlParameters.queryParameters = JSON.stringify(queryParameters);
3017
3194
  }
3018
- const baseUrl2 = buildQueryUrl({ apiBaseUrl, connectionName });
3195
+ const baseUrl = buildQueryUrl({ apiBaseUrl, connectionName });
3019
3196
  const headers = { Authorization: `Bearer ${options.accessToken}`, ...options.headers };
3197
+ const parameters = { client: clientId, ...urlParameters };
3020
3198
  const errorContext = {
3021
3199
  requestType: "SQL",
3022
3200
  connection: options.connectionName,
3023
3201
  type: "query",
3024
- source: JSON.stringify(urlParameters, void 0, 2)
3202
+ source: JSON.stringify(parameters, void 0, 2)
3025
3203
  };
3026
3204
  return await requestWithParameters({
3027
- baseUrl: baseUrl2,
3028
- parameters: urlParameters,
3205
+ baseUrl,
3206
+ parameters,
3029
3207
  headers,
3030
3208
  errorContext
3031
3209
  });