Convert lodah-es and d3 to named imports for services

This commit is contained in:
Bryan Housel
2017-09-25 15:10:47 -04:00
parent d906ca6b10
commit 50da78c1fd
6 changed files with 110 additions and 71 deletions

View File

@@ -1,13 +1,33 @@
/* global Mapillary:false */
import * as d3 from 'd3';
import _ from 'lodash';
import _compact from 'lodash-es/compact';
import _filter from 'lodash-es/filter';
import _find from 'lodash-es/find';
import _flatten from 'lodash-es/flatten';
import _forEach from 'lodash-es/forEach';
import _isEmpty from 'lodash-es/isEmpty';
import _map from 'lodash-es/map';
import _some from 'lodash-es/some';
import { range as d3_range } from 'd3-array';
import { dispatch as d3_dispatch } from 'd3-dispatch';
import {
request as d3_request,
json as d3_json
} from 'd3-request';
import {
select as d3_select,
selectAll as d3_selectAll
} from 'd3-selection';
import rbush from 'rbush';
import { utilRebind } from '../util/rebind';
import { d3geoTile } from '../lib/d3.geo.tile';
import { d3geoTile as d3_geoTile } from '../lib/d3.geo.tile';
import { geoExtent } from '../geo';
import { svgIcon } from '../svg';
import { utilDetect } from '../util/detect';
import { geoExtent } from '../geo/index';
import { svgIcon } from '../svg/index';
import { utilQsString } from '../util/index';
import { utilQsString, utilRebind } from '../util';
var apibase = 'https://a.mapillary.com/v3/',
@@ -16,7 +36,7 @@ var apibase = 'https://a.mapillary.com/v3/',
clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi',
maxResults = 1000,
tileZoom = 14,
dispatch = d3.dispatch('loadedImages', 'loadedSigns'),
dispatch = d3_dispatch('loadedImages', 'loadedSigns'),
mapillaryCache,
mapillaryClicks,
mapillaryImage,
@@ -60,7 +80,7 @@ function getTiles(projection) {
s / 2 - projection.translate()[0],
s / 2 - projection.translate()[1]];
return d3geoTile()
return d3_geoTile()
.scaleExtent([tileZoom, tileZoom])
.scale(s)
.size(projection.clipExtent()[1])
@@ -89,8 +109,8 @@ function loadTiles(which, url, projection) {
return !nearNullIsland(t.xyz[0], t.xyz[1], t.xyz[2]);
});
_.filter(which.inflight, function(v, k) {
var wanted = _.find(tiles, function(tile) { return k === (tile.id + ',0'); });
_filter(which.inflight, function(v, k) {
var wanted = _find(tiles, function(tile) { return k === (tile.id + ',0'); });
if (!wanted) delete which.inflight[k];
return !wanted;
}).map(abortRequest);
@@ -118,7 +138,7 @@ function loadNextTilePage(which, currZoom, url, tile) {
var id = tile.id + ',' + String(nextPage);
if (cache.loaded[id] || cache.inflight[id]) return;
cache.inflight[id] = d3.request(nextURL)
cache.inflight[id] = d3_request(nextURL)
.mimeType('application/json')
.response(function(xhr) {
var linkHeader = xhr.getResponseHeader('Link');
@@ -214,8 +234,8 @@ function parsePagination(links) {
function partitionViewport(psize, projection) {
var dimensions = projection.clipExtent()[1];
psize = psize || 16;
var cols = d3.range(0, dimensions[0], psize),
rows = d3.range(0, dimensions[1], psize),
var cols = d3_range(0, dimensions[0], psize),
rows = d3_range(0, dimensions[1], psize),
partitions = [];
rows.forEach(function(y) {
@@ -236,7 +256,7 @@ function searchLimited(psize, limit, projection, rtree) {
limit = limit || 3;
var partitions = partitionViewport(psize, projection);
return _.flatten(_.compact(_.map(partitions, function(extent) {
return _flatten(_compact(_map(partitions, function(extent) {
return rtree.search(extent.bbox())
.slice(0, limit)
.map(function(d) { return d.data; });
@@ -260,10 +280,10 @@ export default {
if (cache) {
if (cache.images && cache.images.inflight) {
_.forEach(cache.images.inflight, abortRequest);
_forEach(cache.images.inflight, abortRequest);
}
if (cache.objects && cache.objects.inflight) {
_.forEach(cache.objects.inflight, abortRequest);
_forEach(cache.objects.inflight, abortRequest);
}
}
@@ -329,7 +349,7 @@ export default {
if (!mapillarySignDefs) {
mapillarySignSprite = context.asset('img/traffic-signs/traffic-signs.png');
mapillarySignDefs = {};
d3.json(context.asset('img/traffic-signs/traffic-signs.json'), function(err, data) {
d3_json(context.asset('img/traffic-signs/traffic-signs.json'), function(err, data) {
if (err) return;
mapillarySignDefs = data;
});
@@ -339,7 +359,7 @@ export default {
loadViewer: function(context) {
var that = this;
var wrap = d3.select('#content').selectAll('.mapillary-wrap')
var wrap = d3_select('#content').selectAll('.mapillary-wrap')
.data([0]);
var enter = wrap.enter()
@@ -362,7 +382,7 @@ export default {
.classed('active', false);
// load mapillary-viewercss
d3.select('head').selectAll('#mapillary-viewercss')
d3_select('head').selectAll('#mapillary-viewercss')
.data([0])
.enter()
.append('link')
@@ -371,7 +391,7 @@ export default {
.attr('href', context.asset(viewercss));
// load mapillary-viewerjs
d3.select('head').selectAll('#mapillary-viewerjs')
d3_select('head').selectAll('#mapillary-viewerjs')
.data([0])
.enter()
.append('script')
@@ -381,7 +401,7 @@ export default {
showViewer: function() {
d3.select('#content')
d3_select('#content')
.selectAll('.mapillary-wrap')
.classed('hidden', false)
.selectAll('.mly-wrapper')
@@ -392,13 +412,13 @@ export default {
hideViewer: function() {
d3.select('#content')
d3_select('#content')
.selectAll('.mapillary-wrap')
.classed('hidden', true)
.selectAll('.mly-wrapper')
.classed('active', false);
d3.selectAll('.layer-mapillary-images .viewfield-group, .layer-mapillary-signs .icon-sign')
d3_selectAll('.layer-mapillary-images .viewfield-group, .layer-mapillary-signs .icon-sign')
.classed('selected', false);
mapillaryImage = null;
@@ -475,14 +495,14 @@ export default {
mapillaryClicks.push(imageKey);
}
d3.selectAll('.layer-mapillary-images .viewfield-group')
d3_selectAll('.layer-mapillary-images .viewfield-group')
.classed('selected', function(d) {
return d.key === imageKey;
});
d3.selectAll('.layer-mapillary-signs .icon-sign')
d3_selectAll('.layer-mapillary-signs .icon-sign')
.classed('selected', function(d) {
return _.some(d.detections, function(detection) {
return _some(d.detections, function(detection) {
return detection.image_key === imageKey;
});
});
@@ -497,12 +517,12 @@ export default {
return d.toLocaleString(undefined, { timeZone: 'UTC' });
}
var selected = d3.selectAll('.layer-mapillary-images .viewfield-group.selected');
var selected = d3_selectAll('.layer-mapillary-images .viewfield-group.selected');
if (selected.empty()) return this;
var datum = selected.datum();
var timestamp = localeTimestamp(datum.captured_at);
var attribution = d3.select('.mapillary-js-dom .Attribution');
var attribution = d3_select('.mapillary-js-dom .Attribution');
var capturedAt = attribution.selectAll('.captured-at');
if (capturedAt.empty()) {
attribution
@@ -525,8 +545,8 @@ export default {
if (!mapillaryViewer) return;
var detections = mapillaryCache.detections[mapillaryImage];
_.each(detections, function(data, k) {
if (_.isEmpty(data)) {
_forEach(detections, function(data, k) {
if (_isEmpty(data)) {
loadDetection(k);
} else {
var tag = makeTag(data);
@@ -544,7 +564,7 @@ export default {
client_id: clientId,
});
d3.request(url)
d3_request(url)
.mimeType('application/json')
.response(function(xhr) {
return JSON.parse(xhr.responseText);

View File

@@ -1,8 +1,11 @@
import * as d3 from 'd3';
import _ from 'lodash';
import _assign from 'lodash-es/assign';
import _forEach from 'lodash-es/forEach';
import { json as d3_json } from 'd3-request';
import rbush from 'rbush';
import { geoExtent } from '../geo/index';
import { utilQsString } from '../util/index';
import { geoExtent } from '../geo';
import { utilQsString } from '../util';
var apibase = 'https://nominatim.openstreetmap.org/',
@@ -18,7 +21,7 @@ export default {
},
reset: function() {
_.forEach(inflight, function(req) { req.abort(); });
_forEach(inflight, function(req) { req.abort(); });
inflight = {};
nominatimCache = rbush();
},
@@ -50,7 +53,7 @@ export default {
var url = apibase + 'reverse?' + utilQsString(params);
if (inflight[url]) return;
inflight[url] = d3.json(url, function(err, result) {
inflight[url] = d3_json(url, function(err, result) {
delete inflight[url];
if (err) {
@@ -60,7 +63,7 @@ export default {
}
var extent = geoExtent(location).padByMeters(200);
nominatimCache.insert(_.assign(extent.bbox(), {data: result}));
nominatimCache.insert(_assign(extent.bbox(), {data: result}));
callback(null, result);
});
@@ -72,7 +75,7 @@ export default {
var url = apibase + 'search/' + searchVal + '?limit=10&format=json';
if (inflight[url]) return;
inflight[url] = d3.json(url, function(err, result) {
inflight[url] = d3_json(url, function(err, result) {
delete inflight[url];
callback(err, result);
});

View File

@@ -1,8 +1,19 @@
import * as d3 from 'd3';
import _ from 'lodash';
import _chunk from 'lodash-es/chunk';
import _extend from 'lodash-es/extend';
import _forEach from 'lodash-es/forEach';
import _filter from 'lodash-es/filter';
import _find from 'lodash-es/find';
import _groupBy from 'lodash-es/groupBy';
import _isEmpty from 'lodash-es/isEmpty';
import _map from 'lodash-es/map';
import _uniq from 'lodash-es/uniq';
import { dispatch as d3_dispatch } from 'd3-dispatch';
import { xml as d3_xml } from 'd3-request';
import osmAuth from 'osm-auth';
import { JXON } from '../util/jxon';
import { d3geoTile } from '../lib/d3.geo.tile';
import { d3geoTile as d3_geoTile } from '../lib/d3.geo.tile';
import { geoExtent } from '../geo';
import {
osmEntity,
@@ -14,7 +25,7 @@ import {
import { utilRebind, utilIdleWorker } from '../util';
var dispatch = d3.dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded'),
var dispatch = d3_dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded'),
urlroot = 'https://www.openstreetmap.org',
blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'],
inflight = {},
@@ -149,7 +160,7 @@ var parsers = {
function parse(xml, callback, options) {
options = _.extend({ cache: true }, options);
options = _extend({ cache: true }, options);
if (!xml || !xml.childNodes) return;
var root = xml.childNodes[0],
@@ -181,7 +192,7 @@ export default {
userChangesets = undefined;
userDetails = undefined;
rateLimitError = undefined;
_.forEach(inflight, abortRequest);
_forEach(inflight, abortRequest);
entityCache = {};
loadedTiles = {};
inflight = {};
@@ -219,7 +230,7 @@ export default {
loadFromAPI: function(path, callback, options) {
options = _.extend({ cache: true }, options);
options = _extend({ cache: true }, options);
var that = this;
function done(err, xml) {
@@ -260,7 +271,7 @@ export default {
return oauth.xhr({ method: 'GET', path: path }, done);
} else {
var url = urlroot + path;
return d3.xml(url).get(done);
return d3_xml(url).get(done);
}
},
@@ -298,12 +309,12 @@ export default {
loadMultiple: function(ids, callback) {
var that = this;
_.each(_.groupBy(_.uniq(ids), osmEntity.id.type), function(v, k) {
_forEach(_groupBy(_uniq(ids), osmEntity.id.type), function(v, k) {
var type = k + 's',
osmIDs = _.map(v, osmEntity.id.toOSM),
osmIDs = _map(v, osmEntity.id.toOSM),
options = { cache: false };
_.each(_.chunk(osmIDs, 150), function(arr) {
_forEach(_chunk(osmIDs, 150), function(arr) {
that.loadFromAPI(
'/api/0.6/' + type + '?' + type + '=' + arr.join(),
function(err, entities) {
@@ -463,7 +474,7 @@ export default {
}
}
d3.xml(urlroot + '/api/capabilities').get()
d3_xml(urlroot + '/api/capabilities').get()
.on('load', done)
.on('error', callback);
},
@@ -493,7 +504,7 @@ export default {
s / 2 - projection.translate()[1]
];
var tiles = d3geoTile()
var tiles = d3_geoTile()
.scaleExtent([tileZoom, tileZoom])
.scale(s)
.size(dimensions)
@@ -510,8 +521,8 @@ export default {
};
});
_.filter(inflight, function(v, i) {
var wanted = _.find(tiles, function(tile) {
_filter(inflight, function(v, i) {
var wanted = _find(tiles, function(tile) {
return i === tile.id;
});
if (!wanted) delete inflight[i];
@@ -523,7 +534,7 @@ export default {
if (loadedTiles[id] || inflight[id]) return;
if (_.isEmpty(inflight)) {
if (_isEmpty(inflight)) {
dispatch.call('loading');
}
@@ -536,10 +547,10 @@ export default {
}
if (callback) {
callback(err, _.extend({ data: parsed }, tile));
callback(err, _extend({ data: parsed }, tile));
}
if (_.isEmpty(inflight)) {
if (_isEmpty(inflight)) {
dispatch.call('loaded');
}
}
@@ -551,7 +562,7 @@ export default {
switch: function(options) {
urlroot = options.urlroot;
oauth.options(_.extend({
oauth.options(_extend({
url: urlroot,
loading: authLoading,
done: authDone

View File

@@ -1,5 +1,10 @@
import * as d3 from 'd3';
import _ from 'lodash';
import _debounce from 'lodash-es/debounce';
import _extend from 'lodash-es/extend';
import _forEach from 'lodash-es/forEach';
import _omit from 'lodash-es/omit';
import { json as d3_json } from 'd3-request';
import { utilQsString } from '../util';
@@ -59,7 +64,7 @@ function setSortMembers(params) {
function clean(params) {
return _.omit(params, ['geometry', 'debounce']);
return _omit(params, ['geometry', 'debounce']);
}
@@ -131,14 +136,14 @@ function sortKeys(a, b) {
}
var debouncedRequest = _.debounce(request, 500, { leading: false });
var debouncedRequest = _debounce(request, 500, { leading: false });
function request(url, params, exactMatch, callback, loaded) {
if (inflight[url]) return;
if (checkCache(url, params, exactMatch, callback)) return;
inflight[url] = d3.json(url, function (err, data) {
inflight[url] = d3_json(url, function (err, data) {
delete inflight[url];
loaded(err, data);
});
@@ -194,7 +199,7 @@ export default {
reset: function() {
_.forEach(inflight, function(req) { req.abort(); });
_forEach(inflight, function(req) { req.abort(); });
inflight = {};
},
@@ -202,7 +207,7 @@ export default {
keys: function(params, callback) {
var doRequest = params.debounce ? debouncedRequest : request;
params = clean(setSort(params));
params = _.extend({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
params = _extend({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
var url = apibase + 'keys/all?' + utilQsString(params);
doRequest(url, params, false, callback, function(err, d) {
@@ -221,7 +226,7 @@ export default {
multikeys: function(params, callback) {
var doRequest = params.debounce ? debouncedRequest : request;
params = clean(setSort(params));
params = _.extend({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
params = _extend({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
var prefix = params.query;
var url = apibase + 'keys/all?' + utilQsString(params);
@@ -248,7 +253,7 @@ export default {
var doRequest = params.debounce ? debouncedRequest : request;
params = clean(setSort(setFilter(params)));
params = _.extend({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
params = _extend({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
var url = apibase + 'key/values?' + utilQsString(params);
doRequest(url, params, false, callback, function(err, d) {
@@ -275,7 +280,7 @@ export default {
var doRequest = params.debounce ? debouncedRequest : request;
var geometry = params.geometry;
params = clean(setSortMembers(params));
params = _.extend({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
params = _extend({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
var url = apibase + 'relation/roles?' + utilQsString(params);
doRequest(url, params, true, callback, function(err, d) {

View File

@@ -1,5 +1,5 @@
import { jsonpRequest } from '../util/jsonp_request';
import { utilQsString } from '../util/index';
import { utilQsString } from '../util';
var endpoint = 'https://www.wikidata.org/w/api.php?';

View File

@@ -1,5 +1,5 @@
import { jsonpRequest } from '../util/jsonp_request';
import { utilQsString } from '../util/index';
import { utilQsString } from '../util';
var endpoint = 'https://en.wikipedia.org/w/api.php?';