Skip to content

Commit

Permalink
Refactor for clarity and robustness
Browse files Browse the repository at this point in the history
  • Loading branch information
Lucas Wojciechowski committed Jun 13, 2016
1 parent 6a1f48e commit aa1ab07
Showing 1 changed file with 84 additions and 66 deletions.
150 changes: 84 additions & 66 deletions js/util/mapbox.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,106 +2,124 @@

var config = require('./config');
var browser = require('./browser');
var url = require('url');
var querystring = require('querystring');
var URL = require('url');
var util = require('./util');

function normalizeURL(mapboxURL, pathPrefix, accessToken) {
function normalizeURL(url, pathPrefix, accessToken) {
accessToken = accessToken || config.ACCESS_TOKEN;

if (!accessToken && config.REQUIRE_ACCESS_TOKEN) {
throw new Error('An API access token is required to use Mapbox GL. ' +
'See https://www.mapbox.com/developers/api/#access-tokens');
}

var httpsURL = mapboxURL.replace(/^mapbox:\/\//, config.API_URL + pathPrefix);
httpsURL += httpsURL.indexOf('?') !== -1 ? '&access_token=' : '?access_token=';
url = url.replace(/^mapbox:\/\//, config.API_URL + pathPrefix);
url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token=';

if (config.REQUIRE_ACCESS_TOKEN) {
if (accessToken[0] === 's') {
throw new Error('Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). ' +
'See https://www.mapbox.com/developers/api/#access-tokens');
}

httpsURL += accessToken;
url += accessToken;
}

return httpsURL;
return url;
}

module.exports.normalizeStyleURL = function(styleURL, accessToken) {
var urlObject = url.parse(styleURL, true);

if (urlObject.protocol !== 'mapbox:')
return styleURL;

var formattedQuery = '';

if (Object.keys(urlObject.query).length !== 0) {
formattedQuery = '?' + querystring.stringify(urlObject.query);
module.exports.normalizeStyleURL = function(url, accessToken) {
var urlObject = URL.parse(url);

if (urlObject.protocol !== 'mapbox:') {
return url;
} else {
return normalizeURL(
'mapbox:/' + urlObject.pathname + formatQuery(urlObject.query),
'/styles/v1/',
accessToken
);
}

var parsedURL = urlObject.protocol + '/' + urlObject.pathname + formattedQuery;

return normalizeURL(parsedURL, '/styles/v1/', accessToken);
};

module.exports.normalizeSourceURL = function(sourceURL, accessToken) {
var sourceURLJson = sourceURL + '.json';

var urlObject = url.parse(sourceURLJson);

if (urlObject.protocol !== 'mapbox:')
return sourceURL;

urlObject.pathname = urlObject.hostname;
module.exports.normalizeSourceURL = function(url, accessToken) {
var urlObject = URL.parse(url);

if (urlObject.protocol !== 'mapbox:') {
return url;
} else {
// TileJSON requests need a secure flag appended to their URLs so
// that the server knows to send SSL-ified resource references.
return normalizeURL(
'mapbox://' + urlObject.hostname + '.json',
'/v4/',
accessToken
) + '&secure';
}

var parsedURL = urlObject.protocol + '//' + urlObject.pathname;
// TileJSON requests need a secure flag appended to their URLs so
// that the server knows to send SSL-ified resource references.
return normalizeURL(parsedURL, '/v4/', accessToken) + '&secure';
};

module.exports.normalizeGlyphsURL = function(glyphsURL, accessToken) {
var urlObject = url.parse(glyphsURL);

if (urlObject.protocol !== 'mapbox:')
return glyphsURL;

var splitAlongQueryURL = glyphsURL.split('?');
var user = splitAlongQueryURL[0].split('/')[3];
var queryString = splitAlongQueryURL[1] ? '?' + splitAlongQueryURL[1] : '';

return normalizeURL('mapbox://' + user + '/{fontstack}/{range}.pbf' + queryString, '/fonts/v1/', accessToken);
module.exports.normalizeGlyphsURL = function(url, accessToken) {
var urlObject = URL.parse(url);

if (urlObject.protocol !== 'mapbox:') {
return url;
} else {
var user = urlObject.pathname.split('/')[1];
return normalizeURL(
'mapbox://' + user + '/{fontstack}/{range}.pbf' + formatQuery(urlObject.query),
'/fonts/v1/',
accessToken
);
}
};

module.exports.normalizeSpriteURL = function(spriteURL, format, ext, accessToken) {
var urlObject = url.parse(spriteURL, true);

if (urlObject.protocol !== 'mapbox:')
return spriteURL + format + ext;

var formattedQuery = '';

urlObject.pathname = urlObject.pathname + '/sprite' + format + ext;

if (Object.keys(urlObject.query).length !== 0) {
formattedQuery = '?' + querystring.stringify(urlObject.query);
module.exports.normalizeSpriteURL = function(url, format, extension, accessToken) {
var urlObject = URL.parse(url);

if (urlObject.protocol !== 'mapbox:') {
return url + format + extension;
} else {
return normalizeURL(
'mapbox:/' + urlObject.pathname + '/sprite' + format + extension + formatQuery(urlObject.query),
'/styles/v1/',
accessToken
);
}

var parsedURL = urlObject.protocol + '/' + urlObject.pathname + formattedQuery;

return normalizeURL(parsedURL, '/styles/v1/', accessToken);
};

module.exports.normalizeTileURL = function(tileURL, sourceURL, tileSize) {
if (!sourceURL || !sourceURL.match(/^mapbox:\/\//))
return tileURL;
var tileURLObject = URL.parse(tileURL, true);
if (!sourceURL) return tileURL;
var sourceURLObject = URL.parse(sourceURL);
if (sourceURLObject.protocol !== 'mapbox:') return 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.
var httpsURL = tileURL.replace(/([?&]access_token=)tk\.[^&]+/, '$1' + config.ACCESS_TOKEN);
var extension = browser.supportsWebp ? 'webp' : '$1';
return httpsURL.replace(/\.((?:png|jpg)\d*)(?=$|\?)/, browser.devicePixelRatio >= 2 || tileSize === 512 ? '@2x.' + extension : '.' + extension);

var extension = browser.supportsWebp ? '.webp' : '$1';
if (browser.devicePixelRatio >= 2 || tileSize === 512) extension = '@2x' + extension;

return URL.format({
protocol: tileURLObject.protocol,
hostname: tileURLObject.hostname,
pathname: tileURLObject.pathname.replace(/(\.(?:png|jpg)\d*)/, extension),
query: replaceTempAccessToken(tileURLObject.query)
});
};

function formatQuery(query) {
return (query ? '?' + query : '');
}

function replaceTempAccessToken(query) {
if (query.access_token && query.access_token.slice(0, 3) === 'tk.') {
return util.extend({}, query, {
'access_token': config.ACCESS_TOKEN
});
} else {
return query;
}
}

0 comments on commit aa1ab07

Please sign in to comment.