-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
file_fetcher.js
104 lines (89 loc) · 3.05 KB
/
file_fetcher.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
import { json as d3_json } from 'd3-fetch';
let _mainFileFetcher = coreFileFetcher(); // singleton
export { _mainFileFetcher as fileFetcher };
//
// coreFileFetcher asynchronously fetches data from JSON files
//
export function coreFileFetcher() {
let _this = {};
let _inflight = {};
let _fileMap = {
'address_formats': 'data/address_formats.min.json',
'deprecated': 'data/deprecated.min.json',
'discarded': 'data/discarded.min.json',
'imagery': 'data/imagery.min.json',
'intro_graph': 'data/intro_graph.min.json',
'keepRight': 'data/keepRight.min.json',
'languages': 'data/languages.min.json',
'locales': 'data/locales.min.json',
'nsi_brands': 'https://cdn.jsdelivr.net/npm/name-suggestion-index@4/dist/brands.min.json',
'nsi_filters': 'https://cdn.jsdelivr.net/npm/name-suggestion-index@4/dist/filters.min.json',
'oci_features': 'https://cdn.jsdelivr.net/npm/osm-community-index@2/dist/features.min.json',
'oci_resources': 'https://cdn.jsdelivr.net/npm/osm-community-index@2/dist/resources.min.json',
'preset_categories': 'data/preset_categories.min.json',
'preset_defaults': 'data/preset_defaults.min.json',
'preset_fields': 'data/preset_fields.min.json',
'preset_presets': 'data/preset_presets.min.json',
'phone_formats': 'data/phone_formats.min.json',
'qa_data': 'data/qa_data.min.json',
'shortcuts': 'data/shortcuts.min.json',
'territory_languages': 'data/territory_languages.min.json',
'wmf_sitematrix': 'https://cdn.jsdelivr.net/npm/wmf-sitematrix@0.1/wikipedia.min.json'
};
let _cachedData = {};
// expose the cache; useful for tests
_this.cache = () => _cachedData;
// Returns a Promise to fetch data
// (resolved with the data if we have it already)
_this.get = (which) => {
if (_cachedData[which]) {
return Promise.resolve(_cachedData[which]);
}
const file = _fileMap[which];
const url = file && _this.asset(file);
if (!url) {
return Promise.reject(`Unknown data file for "${which}"`);
}
let prom = _inflight[url];
if (!prom) {
_inflight[url] = prom = d3_json(url)
.then(result => {
delete _inflight[url];
if (!result) {
throw new Error(`No data loaded for "${which}"`);
}
_cachedData[which] = result;
return result;
})
.catch(err => {
delete _inflight[url];
throw err;
});
}
return prom;
};
// Accessor for the file map
_this.fileMap = function(val) {
if (!arguments.length) return _fileMap;
_fileMap = val;
return _this;
};
let _assetPath = '';
_this.assetPath = function(val) {
if (!arguments.length) return _assetPath;
_assetPath = val;
return _this;
};
let _assetMap = {};
_this.assetMap = function(val) {
if (!arguments.length) return _assetMap;
_assetMap = val;
return _this;
};
_this.asset = (val) => {
if (/^http(s)?:\/\//i.test(val)) return val;
const filename = _assetPath + val;
return _assetMap[filename] || filename;
};
return _this;
}