-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
mapbox.js
106 lines (85 loc) · 3.56 KB
/
mapbox.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
'use strict';
const config = require('./config');
const browser = require('./browser');
const help = 'See https://www.mapbox.com/developers/api/#access-tokens';
function makeAPIURL(urlObject, accessToken) {
const apiUrlObject = parseUrl(config.API_URL);
urlObject.protocol = apiUrlObject.protocol;
urlObject.authority = apiUrlObject.authority;
if (!config.REQUIRE_ACCESS_TOKEN) return formatUrl(urlObject);
accessToken = accessToken || config.ACCESS_TOKEN;
if (!accessToken)
throw new Error(`An API access token is required to use Mapbox GL. ${help}`);
if (accessToken[0] === 's')
throw new Error(`Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). ${help}`);
urlObject.params.push(`access_token=${accessToken}`);
return formatUrl(urlObject);
}
function isMapboxURL(url) {
return url.indexOf('mapbox:') === 0;
}
exports.isMapboxURL = isMapboxURL;
exports.normalizeStyleURL = function(url, accessToken) {
if (!isMapboxURL(url)) return url;
const urlObject = parseUrl(url);
urlObject.path = `/styles/v1${urlObject.path}`;
return makeAPIURL(urlObject, accessToken);
};
exports.normalizeGlyphsURL = function(url, accessToken) {
if (!isMapboxURL(url)) return url;
const urlObject = parseUrl(url);
urlObject.path = `/fonts/v1${urlObject.path}`;
return makeAPIURL(urlObject, accessToken);
};
exports.normalizeSourceURL = function(url, accessToken) {
if (!isMapboxURL(url)) return url;
const urlObject = parseUrl(url);
urlObject.path = `/v4/${urlObject.authority}.json`;
// TileJSON requests need a secure flag appended to their URLs so
// that the server knows to send SSL-ified resource references.
urlObject.params.push('secure');
return makeAPIURL(urlObject, accessToken);
};
exports.normalizeSpriteURL = function(url, format, extension, accessToken) {
const urlObject = parseUrl(url);
if (!isMapboxURL(url)) {
urlObject.path += `${format}${extension}`;
return formatUrl(urlObject);
}
urlObject.path = `/styles/v1${urlObject.path}/sprite${format}${extension}`;
return makeAPIURL(urlObject, accessToken);
};
const imageExtensionRe = /(\.(png|jpg)\d*)(?=$)/;
exports.normalizeTileURL = function(tileURL, sourceURL, tileSize) {
if (!sourceURL || !isMapboxURL(sourceURL)) return tileURL;
const urlObject = parseUrl(tileURL);
// The v4 mapbox tile API supports 512x512 image tiles only when @2x
// is appended to the tile URL. If `tileSize: 512` is specified for
// a Mapbox raster source force the @2x suffix even if a non hidpi device.
const suffix = browser.devicePixelRatio >= 2 || tileSize === 512 ? '@2x' : '';
const extension = browser.supportsWebp ? '.webp' : '$1';
urlObject.path = urlObject.path.replace(imageExtensionRe, `${suffix}${extension}`);
replaceTempAccessToken(urlObject.params);
return formatUrl(urlObject);
};
function replaceTempAccessToken(params) {
for (let i = 0; i < params.length; i++) {
if (params[i].indexOf('access_token=tk.') === 0) {
params[i] = `access_token=${config.ACCESS_TOKEN}`;
}
}
}
const urlRe = /^(\w+):\/\/([^/?]+)(\/[^?]+)?\??(.+)?/;
function parseUrl(url) {
const parts = url.match(urlRe);
return {
protocol: parts[1],
authority: parts[2],
path: parts[3] || '/',
params: parts[4] ? parts[4].split('&') : []
};
}
function formatUrl(obj) {
const params = obj.params.length ? `?${obj.params.join('&')}` : '';
return `${obj.protocol}://${obj.authority}${obj.path}${params}`;
}