From 50da78c1fd31053756484ba1f79999ae5edcbcb2 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 25 Sep 2017 15:10:47 -0400 Subject: [PATCH] Convert lodah-es and d3 to named imports for services --- modules/services/mapillary.js | 84 ++++++++++++++++++++++------------- modules/services/nominatim.js | 19 ++++---- modules/services/osm.js | 49 ++++++++++++-------- modules/services/taginfo.js | 25 ++++++----- modules/services/wikidata.js | 2 +- modules/services/wikipedia.js | 2 +- 6 files changed, 110 insertions(+), 71 deletions(-) diff --git a/modules/services/mapillary.js b/modules/services/mapillary.js index 514e9d771..695f9a1ed 100644 --- a/modules/services/mapillary.js +++ b/modules/services/mapillary.js @@ -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); diff --git a/modules/services/nominatim.js b/modules/services/nominatim.js index 4eb13eedd..22b9d76cd 100644 --- a/modules/services/nominatim.js +++ b/modules/services/nominatim.js @@ -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); }); diff --git a/modules/services/osm.js b/modules/services/osm.js index 498e5523f..94e59207b 100644 --- a/modules/services/osm.js +++ b/modules/services/osm.js @@ -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 diff --git a/modules/services/taginfo.js b/modules/services/taginfo.js index 1efa0ad13..50b4e2c34 100644 --- a/modules/services/taginfo.js +++ b/modules/services/taginfo.js @@ -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) { diff --git a/modules/services/wikidata.js b/modules/services/wikidata.js index 0cf5572db..d3b0f0f98 100644 --- a/modules/services/wikidata.js +++ b/modules/services/wikidata.js @@ -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?'; diff --git a/modules/services/wikipedia.js b/modules/services/wikipedia.js index 996650649..35bc47a1d 100644 --- a/modules/services/wikipedia.js +++ b/modules/services/wikipedia.js @@ -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?';