@d3plus/data 3.0.12 → 3.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /*
2
- @d3plus/data v3.0.12
2
+ @d3plus/data v3.0.13
3
3
  JavaScript data loading, manipulation, and analysis functions.
4
4
  Copyright (c) 2025 D3plus - https://d3plus.org
5
5
  @license MIT
@@ -109,16 +109,16 @@
109
109
  }));
110
110
 
111
111
  (function (global, factory) {
112
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-request'), require('@d3plus/dom'), require('d3-array'), require('d3-collection')) :
113
- typeof define === 'function' && define.amd ? define('@d3plus/data', ['exports', 'd3-request', '@d3plus/dom', 'd3-array', 'd3-collection'], factory) :
114
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3plus = {}, global.d3Request, global.dom, global.d3Array, global.d3Collection));
115
- })(this, (function (exports, d3Request, dom, d3Array, d3Collection) { 'use strict';
112
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-fetch'), require('@d3plus/dom'), require('d3-array'), require('d3-collection')) :
113
+ typeof define === 'function' && define.amd ? define('@d3plus/data', ['exports', 'd3-fetch', '@d3plus/dom', 'd3-array', 'd3-collection'], factory) :
114
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.d3plus = {}, global.d3Fetch, global.dom, global.d3Array, global.d3Collection));
115
+ })(this, (function (exports, d3Fetch, dom, d3Array, d3Collection) { 'use strict';
116
116
 
117
117
  /**
118
118
  @function isData
119
119
  @desc Returns true/false whether the argument provided to the function should be loaded using an internal XHR request. Valid data can either be a string URL or an Object with "url" and "headers" keys.
120
120
  @param {*} dataItem The value to be tested
121
- */ var isData = ((dataItem)=>typeof dataItem === "string" || typeof dataItem === "object" && dataItem.url && dataItem.headers);
121
+ */ var isData = ((dataItem)=>typeof dataItem === "string" || typeof dataItem === "object" && dataItem.url);
122
122
 
123
123
  /**
124
124
  @function dataFold
@@ -156,22 +156,21 @@
156
156
  @param {String} [key] The key in the `this` context to save the resulting data to.
157
157
  @param {Function} [callback] A function that is called when the final data is loaded. It is passed 2 variables, any error present and the data loaded.
158
158
  */ function load(path, formatter, key, callback) {
159
- let parser;
160
- const getParser = (path)=>{
159
+ const fetchData = (path, init = {})=>{
161
160
  const ext = path.slice(path.length - 4);
162
161
  switch(ext){
163
162
  case ".csv":
164
- return d3Request.csv;
163
+ return d3Fetch.csv(path, init);
165
164
  case ".tsv":
166
- return d3Request.tsv;
165
+ return d3Fetch.tsv(path, init);
167
166
  case ".txt":
168
- return d3Request.text;
167
+ return d3Fetch.text(path, init);
169
168
  default:
170
- return d3Request.json;
169
+ return d3Fetch.json(path, init);
171
170
  }
172
171
  };
173
- const validateData = (err, parser, data)=>{
174
- if (parser !== d3Request.json && !err && data && data instanceof Array) {
172
+ const validateData = (data)=>{
173
+ if (data && data instanceof Array) {
175
174
  data.forEach((d)=>{
176
175
  for(const k in d){
177
176
  if (!isNaN(d[k])) d[k] = parseFloat(d[k]);
@@ -185,7 +184,6 @@
185
184
  return data;
186
185
  };
187
186
  const loadedLength = (loadedArray)=>loadedArray.reduce((prev, current)=>current ? prev + 1 : prev, 0);
188
- const getPathIndex = (url, array)=>array.indexOf(url);
189
187
  // If path param is a not an Array then convert path to a 1 element Array to re-use logic
190
188
  if (!(path instanceof Array)) path = [
191
189
  path
@@ -205,23 +203,16 @@
205
203
  // Load all urls an combine them with data arrays
206
204
  const alreadyLoaded = loadedLength(loaded);
207
205
  toLoad.forEach((dataItem)=>{
208
- let headers = {}, url = dataItem;
209
- if (typeof dataItem === "object") {
206
+ let url = dataItem, init = {};
207
+ if (typeof dataItem === "object" && dataItem.url) {
210
208
  url = dataItem.url;
211
- headers = dataItem.headers;
209
+ init = dataItem;
212
210
  }
213
- parser = getParser(url);
214
- const request = parser(url);
215
- for(const key in headers){
216
- if (({}).hasOwnProperty.call(headers, key)) {
217
- request.header(key, headers[key]);
218
- }
219
- }
220
- request.get((err, data)=>{
221
- data = err ? [] : data;
222
- if (data && !(data instanceof Array) && data.data && data.headers) data = fold(data);
223
- data = validateData(err, parser, data);
224
- loaded[getPathIndex(url, path)] = data;
211
+ fetchData(url, init).then((data)=>{
212
+ if (!(data instanceof Array) && data.data && data.headers) data = fold(data);
213
+ data = validateData(data);
214
+ loaded[path.findIndex((d)=>JSON.stringify(d) == JSON.stringify(dataItem))] = data;
215
+ // All urls loaded
225
216
  if (loadedLength(loaded) - alreadyLoaded === toLoad.length) {
226
217
  // Format data
227
218
  data = loadedLength(loaded) === 1 ? loaded[0] : loaded;
@@ -237,8 +228,11 @@
237
228
  data = concat(loaded, "data");
238
229
  }
239
230
  if (key && `_${key}` in this) this[`_${key}`] = data;
240
- if (callback) callback(err, data);
231
+ if (callback) callback(undefined, data);
241
232
  }
233
+ }).catch((err)=>{
234
+ console.log(err);
235
+ if (callback) callback(err, undefined);
242
236
  });
243
237
  });
244
238
  // If there is no data to Load response is immediately
@@ -271,15 +265,15 @@
271
265
  @param {Function} [data] An optional data formatter/callback
272
266
  @param {String} data The internal Viz method to be modified
273
267
  */ function addToQueue(_, f, key) {
274
- if (!(_ instanceof Array)) _ = [
268
+ const paths = _ instanceof Array ? _ : [
275
269
  _
276
270
  ];
277
- const needToLoad = _.find(isData);
271
+ const needToLoad = paths.find(isData);
278
272
  if (needToLoad) {
279
273
  const prev = this._queue.find((q)=>q[3] === key);
280
274
  const d = [
281
275
  load.bind(this),
282
- _,
276
+ paths,
283
277
  f,
284
278
  key
285
279
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"d3plus-data.js","sources":["../src/isData.js","../src/fold.js","../src/concat.js","../src/load.js","../src/addToQueue.js","../src/unique.js","../src/merge.js","../src/nest.js"],"sourcesContent":["/**\n @function isData\n @desc Returns true/false whether the argument provided to the function should be loaded using an internal XHR request. Valid data can either be a string URL or an Object with \"url\" and \"headers\" keys.\n @param {*} dataItem The value to be tested\n*/\nexport default dataItem =>\n typeof dataItem === \"string\" ||\n typeof dataItem === \"object\" && dataItem.url && dataItem.headers;\n","/**\n @function dataFold\n @desc Given a JSON object where the data values and headers have been split into separate key lookups, this function will combine the data values with the headers and returns one large array of objects.\n @param {Object} json A JSON data Object with `data` and `headers` keys.\n @param {String} [data = \"data\"] The key used for the flat data array inside of the JSON object.\n @param {String} [headers = \"headers\"] The key used for the flat headers array inside of the JSON object.\n*/\nexport default (json, data = \"data\", headers = \"headers\") =>\n json[data].map(data =>\n json[headers].reduce((obj, header, i) =>\n (obj[header] = data[i], obj), {}));\n","/**\n @function dataConcat\n @desc Reduce and concat all the elements included in arrayOfArrays if they are arrays. If it is a JSON object try to concat the array under given key data. If the key doesn't exists in object item, a warning message is lauched to the console. You need to implement DataFormat callback to concat the arrays manually.\n @param {Array} arrayOfArray Array of elements\n @param {String} [data = \"data\"] The key used for the flat data array if exists inside of the JSON object.\n*/\nexport default (arrayOfArrays, data = \"data\") =>\n arrayOfArrays.reduce((acc, item) => {\n let dataArray = [];\n if (Array.isArray(item)) {\n dataArray = item;\n }\n else {\n if (item[data]) {\n dataArray = item[data];\n }\n // else {\n // console.warn(`d3plus-viz: Please implement a \"dataFormat\" callback to concat the arrays manually (consider using the d3plus.dataConcat method in your callback). Currently unable to concatenate (using key: \"${data}\") the following response:`, item);\n // }\n }\n return acc.concat(dataArray);\n }, []);\n\n","import {csv, json, text, tsv} from \"d3-request\";\nimport {isObject} from \"@d3plus/dom\";\n\nimport fold from \"./fold.js\";\nimport concat from \"./concat.js\";\nimport isData from \"./isData.js\";\n\n/**\n @function dataLoad\n @desc Loads data from a filepath or URL, converts it to a valid JSON object, and returns it to a callback function.\n @param {Array|String} path The path to the file or url to be loaded. Also support array of paths strings. If an Array of objects is passed, the xhr request logic is skipped.\n @param {Function} [formatter] An optional formatter function that is run on the loaded data.\n @param {String} [key] The key in the `this` context to save the resulting data to.\n @param {Function} [callback] A function that is called when the final data is loaded. It is passed 2 variables, any error present and the data loaded.\n*/\nexport default function(path, formatter, key, callback) {\n\n let parser;\n\n const getParser = path => {\n const ext = path.slice(path.length - 4);\n switch (ext) {\n case \".csv\":\n return csv;\n case \".tsv\":\n return tsv;\n case \".txt\":\n return text;\n default:\n return json;\n }\n };\n\n const validateData = (err, parser, data) => {\n if (parser !== json && !err && data && data instanceof Array) {\n data.forEach(d => {\n for (const k in d) {\n if (!isNaN(d[k])) d[k] = parseFloat(d[k]);\n else if (d[k].toLowerCase() === \"false\") d[k] = false;\n else if (d[k].toLowerCase() === \"true\") d[k] = true;\n else if (d[k].toLowerCase() === \"null\") d[k] = null;\n else if (d[k].toLowerCase() === \"undefined\") d[k] = undefined;\n }\n });\n }\n return data;\n };\n\n const loadedLength = loadedArray => loadedArray.reduce((prev, current) => current ? prev + 1 : prev, 0);\n\n const getPathIndex = (url, array) => array.indexOf(url);\n\n // If path param is a not an Array then convert path to a 1 element Array to re-use logic\n if (!(path instanceof Array)) path = [path];\n\n const needToLoad = path.find(isData);\n\n let loaded = new Array(path.length);\n const toLoad = [];\n\n // If there is a string I'm assuming is a Array to merge, urls or data\n if (needToLoad) {\n path.forEach((dataItem, ix) => {\n if (isData(dataItem)) toLoad.push(dataItem);\n else loaded[ix] = dataItem;\n });\n }\n // Data array itself\n else {\n loaded[0] = path;\n }\n\n // Load all urls an combine them with data arrays\n const alreadyLoaded = loadedLength(loaded);\n toLoad.forEach(dataItem => {\n let headers = {}, url = dataItem;\n if (typeof dataItem === \"object\") {\n url = dataItem.url;\n headers = dataItem.headers;\n }\n parser = getParser(url);\n const request = parser(url);\n for (const key in headers) {\n if ({}.hasOwnProperty.call(headers, key)) {\n request.header(key, headers[key]);\n }\n }\n request.get((err, data) => {\n data = err ? [] : data;\n if (data && !(data instanceof Array) && data.data && data.headers) data = fold(data);\n data = validateData(err, parser, data);\n loaded[getPathIndex(url, path)] = data;\n if (loadedLength(loaded) - alreadyLoaded === toLoad.length) { // All urls loaded\n\n // Format data\n data = loadedLength(loaded) === 1 ? loaded[0] : loaded;\n if (this._cache) this._lrucache.set(`${key}_${url}`, data);\n\n if (formatter) {\n const formatterResponse = formatter(loadedLength(loaded) === 1 ? loaded[0] : loaded);\n if (key === \"data\" && isObject(formatterResponse)) {\n data = formatterResponse.data || [];\n delete formatterResponse.data;\n this.config(formatterResponse);\n }\n else data = formatterResponse || [];\n }\n else if (key === \"data\") {\n data = concat(loaded, \"data\");\n }\n\n if (key && `_${key}` in this) this[`_${key}`] = data;\n if (callback) callback(err, data);\n }\n });\n });\n\n // If there is no data to Load response is immediately\n if (toLoad.length === 0) {\n loaded = loaded.map(data => {\n if (data && !(data instanceof Array) && data.data && data.headers) data = fold(data);\n return data;\n });\n\n // Format data\n let data = loadedLength(loaded) === 1 ? loaded[0] : loaded;\n if (formatter) {\n const formatterResponse = formatter(loadedLength(loaded) === 1 ? loaded[0] : loaded);\n if (key === \"data\" && isObject(formatterResponse)) {\n data = formatterResponse.data || [];\n delete formatterResponse.data;\n this.config(formatterResponse);\n }\n else data = formatterResponse || [];\n }\n else if (key === \"data\") {\n data = concat(loaded, \"data\");\n }\n\n if (key && `_${key}` in this) this[`_${key}`] = data;\n if (callback) callback(null, data);\n }\n\n}\n","import isData from \"./isData.js\";\nimport load from \"./load.js\";\n\n/**\n @function isData\n @desc Adds the provided value to the internal queue to be loaded, if necessary. This is used internally in new d3plus visualizations that fold in additional data sources, like the nodes and links of Network or the topojson of Geomap.\n @param {Array|String|Object} data The data to be loaded\n @param {Function} [data] An optional data formatter/callback\n @param {String} data The internal Viz method to be modified\n*/\nexport default function(_, f, key) {\n if (!(_ instanceof Array)) _ = [_];\n const needToLoad = _.find(isData);\n if (needToLoad) {\n const prev = this._queue.find(q => q[3] === key);\n const d = [load.bind(this), _, f, key];\n if (prev) this._queue[this._queue.indexOf(prev)] = d;\n else this._queue.push(d);\n }\n else {\n this[`_${key}`] = _;\n }\n}\n","/**\n @function unique\n @desc ES5 implementation to reduce an Array of values to unique instances.\n @param {Array} arr The Array of objects to be filtered.\n @param {Function} [accessor] An optional accessor function used to extract data points from an Array of Objects.\n @example <caption>this</caption>\nunique([\"apple\", \"banana\", \"apple\"]);\n @example <caption>returns this</caption>\n[\"apple\", \"banana\"]\n*/\nexport default function(arr, accessor = d => d) {\n\n const values = arr\n .map(accessor)\n .map(d => d instanceof Date ? +d : d);\n\n return arr.filter((obj, i) => {\n const d = accessor(obj);\n return values.indexOf(d instanceof Date ? +d : d) === i;\n });\n\n}\n","import {merge, sum} from \"d3-array\";\nimport unique from \"./unique.js\";\n\n/**\n @function merge\n @desc Combines an Array of Objects together and returns a new Object.\n @param {Array} objects The Array of objects to be merged together.\n @param {Object} aggs An object containing specific aggregation methods (functions) for each key type. By default, numbers are summed and strings are returned as an array of unique values.\n @example <caption>this</caption>\nmerge([\n {id: \"foo\", group: \"A\", value: 10, links: [1, 2]},\n {id: \"bar\", group: \"A\", value: 20, links: [1, 3]}\n]);\n @example <caption>returns this</caption>\n{id: [\"bar\", \"foo\"], group: \"A\", value: 30, links: [1, 2, 3]}\n*/\nfunction objectMerge(objects, aggs = {}) {\n\n const availableKeys = unique(merge(objects.map(o => Object.keys(o)))),\n newObject = {};\n\n availableKeys.forEach(k => {\n let value;\n if (aggs[k]) value = aggs[k](objects, o => o[k]);\n else {\n const values = objects.map(o => o[k]);\n const types = values.map(v => v || v === false ? v.constructor : v).filter(v => v !== void 0);\n if (!types.length) value = undefined;\n else if (types.indexOf(Array) >= 0) {\n value = merge(values.map(v => v instanceof Array ? v : [v]));\n value = unique(value);\n if (value.length === 1) value = value[0];\n }\n else if (types.indexOf(String) >= 0) {\n value = unique(values);\n if (value.length === 1) value = value[0];\n }\n else if (types.indexOf(Number) >= 0) value = sum(values);\n else if (types.indexOf(Object) >= 0) {\n value = unique(values.filter(v => v));\n if (value.length === 1) value = value[0];\n else value = objectMerge(value);\n\n }\n else {\n value = unique(values.filter(v => v !== void 0));\n if (value.length === 1) value = value[0];\n }\n }\n newObject[k] = value;\n });\n\n return newObject;\n\n}\n\nexport default objectMerge;\n","import {nest} from \"d3-collection\";\n\n/**\n @function nest\n @summary Extends the base behavior of d3.nest to allow for multiple depth levels.\n @param {Array} *data* The data array to be nested.\n @param {Array} *keys* An array of key accessors that signify each nest level.\n @private\n*/\nexport default function(data, keys) {\n\n if (!(keys instanceof Array)) keys = [keys];\n\n const dataNest = nest();\n for (let i = 0; i < keys.length; i++) dataNest.key(keys[i]);\n const nestedData = dataNest.entries(data);\n\n return bubble(nestedData);\n\n}\n\n/**\n Bubbles up values that do not nest to the furthest key.\n @param {Array} *values* The \"values\" of a nest object.\n @private\n*/\nfunction bubble(values) {\n\n return values.map(d => {\n\n if (d.key && d.values) {\n if (d.values[0].key === \"undefined\") return d.values[0].values[0];\n else d.values = bubble(d.values);\n }\n\n return d;\n\n });\n\n}\n"],"names":["dataItem","url","headers","json","data","map","reduce","obj","header","i","arrayOfArrays","acc","item","dataArray","Array","isArray","concat","path","formatter","key","callback","parser","getParser","ext","slice","length","csv","tsv","text","validateData","err","forEach","d","k","isNaN","parseFloat","toLowerCase","undefined","loadedLength","loadedArray","prev","current","getPathIndex","array","indexOf","needToLoad","find","isData","loaded","toLoad","ix","push","alreadyLoaded","request","hasOwnProperty","call","get","fold","_cache","_lrucache","set","formatterResponse","isObject","config","_","f","_queue","q","load","bind","arr","accessor","values","Date","filter","objectMerge","objects","aggs","availableKeys","unique","merge","o","Object","keys","newObject","value","types","v","constructor","String","Number","sum","dataNest","nest","nestedData","entries","bubble"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA;;;;EAIA,GACA,aAAeA,CAAAA,CAAAA,QACb,GAAA,OAAOA,aAAa,QACpB,IAAA,OAAOA,QAAa,KAAA,QAAA,IAAYA,SAASC,GAAG,IAAID,QAASE,CAAAA,OAAO;;ECPlE;;;;;;EAMA,GACA,WAAe,CAAA,CAACC,MAAMC,IAAO,GAAA,MAAM,EAAEF,OAAU,GAAA,SAAS,GACtDC,IAAI,CAACC,IAAK,CAAA,CAACC,GAAG,CAACD,CAAAA,OACbD,IAAI,CAACD,OAAQ,CAAA,CAACI,MAAM,CAAC,CAACC,KAAKC,MAAQC,EAAAA,CAAAA,IAChCF,GAAG,CAACC,OAAO,GAAGJ,IAAI,CAACK,CAAE,CAAA,EAAEF,GAAE,CAAI,EAAA,IAAG;;ECVvC;;;;;EAKA,GACA,aAAe,CAAA,CAACG,aAAeN,EAAAA,IAAAA,GAAO,MAAM,GAC1CM,aAAcJ,CAAAA,MAAM,CAAC,CAACK,GAAKC,EAAAA,IAAAA,GAAAA;EACzB,QAAA,IAAIC,YAAY,EAAE;UAClB,IAAIC,KAAAA,CAAMC,OAAO,CAACH,IAAO,CAAA,EAAA;cACvBC,SAAYD,GAAAA,IAAAA;WAET,MAAA;cACH,IAAIA,IAAI,CAACR,IAAAA,CAAK,EAAE;kBACdS,SAAYD,GAAAA,IAAI,CAACR,IAAK,CAAA;EACxB;;;;EAIF;UACA,OAAOO,GAAAA,CAAIK,MAAM,CAACH,SAAAA,CAAAA;OACjB,EAAA,EAAE,CAAA;;ECdP;;;;;;;EAOA,GACe,cAASI,IAAI,EAAEC,SAAS,EAAEC,GAAG,EAAEC,QAAQ,EAAA;MAEpD,IAAIC,MAAAA;EAEJ,IAAA,MAAMC,YAAYL,CAAAA,IAAAA,GAAAA;EAChB,QAAA,MAAMM,MAAMN,IAAKO,CAAAA,KAAK,CAACP,IAAAA,CAAKQ,MAAM,GAAG,CAAA,CAAA;UACrC,OAAQF,GAAAA;cACN,KAAK,MAAA;kBACH,OAAOG,aAAAA;cACT,KAAK,MAAA;kBACH,OAAOC,aAAAA;cACT,KAAK,MAAA;kBACH,OAAOC,cAAAA;EACT,YAAA;kBACE,OAAOzB,cAAAA;EACX;EACF,KAAA;MAEA,MAAM0B,YAAAA,GAAe,CAACC,GAAAA,EAAKT,MAAQjB,EAAAA,IAAAA,GAAAA;EACjC,QAAA,IAAIiB,WAAWlB,cAAQ,IAAA,CAAC2B,GAAO1B,IAAAA,IAAAA,IAAQA,gBAAgBU,KAAO,EAAA;cAC5DV,IAAK2B,CAAAA,OAAO,CAACC,CAAAA,CAAAA,GAAAA;kBACX,IAAK,MAAMC,KAAKD,CAAG,CAAA;EACjB,oBAAA,IAAI,CAACE,KAAAA,CAAMF,CAAC,CAACC,CAAE,CAAA,CAAA,EAAGD,CAAC,CAACC,CAAE,CAAA,GAAGE,UAAWH,CAAAA,CAAC,CAACC,CAAE,CAAA,CAAA;2BACnC,IAAID,CAAC,CAACC,CAAAA,CAAE,CAACG,WAAW,OAAO,OAASJ,EAAAA,CAAC,CAACC,CAAAA,CAAE,GAAG,KAAA;2BAC3C,IAAID,CAAC,CAACC,CAAAA,CAAE,CAACG,WAAW,OAAO,MAAQJ,EAAAA,CAAC,CAACC,CAAAA,CAAE,GAAG,IAAA;2BAC1C,IAAID,CAAC,CAACC,CAAAA,CAAE,CAACG,WAAW,OAAO,MAAQJ,EAAAA,CAAC,CAACC,CAAAA,CAAE,GAAG,IAAA;2BAC1C,IAAID,CAAC,CAACC,CAAAA,CAAE,CAACG,WAAW,OAAO,WAAaJ,EAAAA,CAAC,CAACC,CAAAA,CAAE,GAAGI,SAAAA;EACtD;EACF,aAAA,CAAA;EACF;UACA,OAAOjC,IAAAA;EACT,KAAA;EAEA,IAAA,MAAMkC,YAAeC,GAAAA,CAAAA,WAAeA,GAAAA,WAAAA,CAAYjC,MAAM,CAAC,CAACkC,IAAAA,EAAMC,OAAYA,GAAAA,OAAAA,GAAUD,IAAO,GAAA,CAAA,GAAIA,IAAM,EAAA,CAAA,CAAA;EAErG,IAAA,MAAME,eAAe,CAACzC,GAAAA,EAAK0C,KAAUA,GAAAA,KAAAA,CAAMC,OAAO,CAAC3C,GAAAA,CAAAA;;EAGnD,IAAA,IAAI,EAAEgB,IAAgBH,YAAAA,KAAI,GAAIG,IAAO,GAAA;EAACA,QAAAA;EAAK,KAAA;MAE3C,MAAM4B,UAAAA,GAAa5B,IAAK6B,CAAAA,IAAI,CAACC,MAAAA,CAAAA;EAE7B,IAAA,IAAIC,MAAS,GAAA,IAAIlC,KAAMG,CAAAA,IAAAA,CAAKQ,MAAM,CAAA;EAClC,IAAA,MAAMwB,SAAS,EAAE;;EAGjB,IAAA,IAAIJ,UAAY,EAAA;UACd5B,IAAKc,CAAAA,OAAO,CAAC,CAAC/B,QAAUkD,EAAAA,EAAAA,GAAAA;EACtB,YAAA,IAAIH,MAAO/C,CAAAA,QAAAA,CAAAA,EAAWiD,MAAOE,CAAAA,IAAI,CAACnD,QAAAA,CAAAA;mBAC7BgD,MAAM,CAACE,GAAG,GAAGlD,QAAAA;EACpB,SAAA,CAAA;OAGG,MAAA;UACHgD,MAAM,CAAC,EAAE,GAAG/B,IAAAA;EACd;;EAGA,IAAA,MAAMmC,gBAAgBd,YAAaU,CAAAA,MAAAA,CAAAA;MACnCC,MAAOlB,CAAAA,OAAO,CAAC/B,CAAAA,QAAAA,GAAAA;UACb,IAAIE,OAAAA,GAAU,EAAC,EAAGD,GAAMD,GAAAA,QAAAA;UACxB,IAAI,OAAOA,aAAa,QAAU,EAAA;EAChCC,YAAAA,GAAAA,GAAMD,SAASC,GAAG;EAClBC,YAAAA,OAAAA,GAAUF,SAASE,OAAO;EAC5B;EACAmB,QAAAA,MAAAA,GAASC,SAAUrB,CAAAA,GAAAA,CAAAA;EACnB,QAAA,MAAMoD,UAAUhC,MAAOpB,CAAAA,GAAAA,CAAAA;UACvB,IAAK,MAAMkB,OAAOjB,OAAS,CAAA;cACzB,IAAI,CAAA,EAAC,EAAEoD,cAAc,CAACC,IAAI,CAACrD,OAAAA,EAASiB,GAAM,CAAA,EAAA;EACxCkC,gBAAAA,OAAAA,CAAQ7C,MAAM,CAACW,GAAKjB,EAAAA,OAAO,CAACiB,GAAI,CAAA,CAAA;EAClC;EACF;UACAkC,OAAQG,CAAAA,GAAG,CAAC,CAAC1B,GAAK1B,EAAAA,IAAAA,GAAAA;cAChBA,IAAO0B,GAAAA,GAAAA,GAAM,EAAE,GAAG1B,IAAAA;EAClB,YAAA,IAAIA,IAAQ,IAAA,EAAEA,IAAAA,YAAgBU,KAAI,CAAA,IAAMV,IAAKA,CAAAA,IAAI,IAAIA,IAAAA,CAAKF,OAAO,EAAEE,OAAOqD,IAAKrD,CAAAA,IAAAA,CAAAA;cAC/EA,IAAOyB,GAAAA,YAAAA,CAAaC,KAAKT,MAAQjB,EAAAA,IAAAA,CAAAA;EACjC4C,YAAAA,MAAM,CAACN,YAAAA,CAAazC,GAAKgB,EAAAA,IAAAA,CAAAA,CAAM,GAAGb,IAAAA;EAClC,YAAA,IAAIkC,YAAaU,CAAAA,MAAAA,CAAAA,GAAUI,aAAkBH,KAAAA,MAAAA,CAAOxB,MAAM,EAAE;;EAG1DrB,gBAAAA,IAAAA,GAAOkC,aAAaU,MAAY,CAAA,KAAA,CAAA,GAAIA,MAAM,CAAC,EAAE,GAAGA,MAAAA;EAChD,gBAAA,IAAI,IAAI,CAACU,MAAM,EAAE,IAAI,CAACC,SAAS,CAACC,GAAG,CAAC,CAAGzC,EAAAA,GAAAA,CAAI,CAAC,EAAElB,KAAK,EAAEG,IAAAA,CAAAA;EAErD,gBAAA,IAAIc,SAAW,EAAA;sBACb,MAAM2C,iBAAAA,GAAoB3C,UAAUoB,YAAaU,CAAAA,MAAAA,CAAAA,KAAY,IAAIA,MAAM,CAAC,EAAE,GAAGA,MAAAA,CAAAA;sBAC7E,IAAI7B,GAAAA,KAAQ,MAAU2C,IAAAA,YAAAA,CAASD,iBAAoB,CAAA,EAAA;0BACjDzD,IAAOyD,GAAAA,iBAAAA,CAAkBzD,IAAI,IAAI,EAAE;EACnC,wBAAA,OAAOyD,kBAAkBzD,IAAI;0BAC7B,IAAI,CAAC2D,MAAM,CAACF,iBAAAA,CAAAA;uBAETzD,MAAAA,IAAAA,GAAOyD,qBAAqB,EAAE;mBAEhC,MAAA,IAAI1C,QAAQ,MAAQ,EAAA;EACvBf,oBAAAA,IAAAA,GAAOY,OAAOgC,MAAQ,EAAA,MAAA,CAAA;EACxB;EAEA,gBAAA,IAAI7B,GAAO,IAAA,CAAC,CAAC,EAAEA,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAEA,GAAAA,CAAAA,CAAK,CAAC,GAAGf,IAAAA;kBAChD,IAAIgB,QAAAA,EAAUA,SAASU,GAAK1B,EAAAA,IAAAA,CAAAA;EAC9B;EACF,SAAA,CAAA;EACF,KAAA,CAAA;;MAGA,IAAI6C,MAAAA,CAAOxB,MAAM,KAAK,CAAG,EAAA;UACvBuB,MAASA,GAAAA,MAAAA,CAAO3C,GAAG,CAACD,CAAAA,IAAAA,GAAAA;EAClB,YAAA,IAAIA,IAAQ,IAAA,EAAEA,IAAAA,YAAgBU,KAAI,CAAA,IAAMV,IAAKA,CAAAA,IAAI,IAAIA,IAAAA,CAAKF,OAAO,EAAEE,OAAOqD,IAAKrD,CAAAA,IAAAA,CAAAA;cAC/E,OAAOA,IAAAA;EACT,SAAA,CAAA;;EAGA,QAAA,IAAIA,OAAOkC,YAAaU,CAAAA,MAAAA,CAAAA,KAAY,IAAIA,MAAM,CAAC,EAAE,GAAGA,MAAAA;EACpD,QAAA,IAAI9B,SAAW,EAAA;cACb,MAAM2C,iBAAAA,GAAoB3C,UAAUoB,YAAaU,CAAAA,MAAAA,CAAAA,KAAY,IAAIA,MAAM,CAAC,EAAE,GAAGA,MAAAA,CAAAA;cAC7E,IAAI7B,GAAAA,KAAQ,MAAU2C,IAAAA,YAAAA,CAASD,iBAAoB,CAAA,EAAA;kBACjDzD,IAAOyD,GAAAA,iBAAAA,CAAkBzD,IAAI,IAAI,EAAE;EACnC,gBAAA,OAAOyD,kBAAkBzD,IAAI;kBAC7B,IAAI,CAAC2D,MAAM,CAACF,iBAAAA,CAAAA;eAETzD,MAAAA,IAAAA,GAAOyD,qBAAqB,EAAE;WAEhC,MAAA,IAAI1C,QAAQ,MAAQ,EAAA;EACvBf,YAAAA,IAAAA,GAAOY,OAAOgC,MAAQ,EAAA,MAAA,CAAA;EACxB;EAEA,QAAA,IAAI7B,GAAO,IAAA,CAAC,CAAC,EAAEA,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAEA,GAAAA,CAAAA,CAAK,CAAC,GAAGf,IAAAA;UAChD,IAAIgB,QAAAA,EAAUA,SAAS,IAAMhB,EAAAA,IAAAA,CAAAA;EAC/B;EAEF;;EC5IA;;;;;;EAMA,GACe,mBAAS4D,CAAAA,CAAC,EAAEC,CAAC,EAAE9C,GAAG,EAAA;EAC/B,IAAA,IAAI,EAAE6C,CAAalD,YAAAA,KAAI,GAAIkD,CAAI,GAAA;EAACA,QAAAA;EAAE,KAAA;MAClC,MAAMnB,UAAAA,GAAamB,CAAElB,CAAAA,IAAI,CAACC,MAAAA,CAAAA;EAC1B,IAAA,IAAIF,UAAY,EAAA;EACd,QAAA,MAAML,IAAO,GAAA,IAAI,CAAC0B,MAAM,CAACpB,IAAI,CAACqB,CAAAA,CAAKA,GAAAA,CAAC,CAAC,CAAA,CAAE,KAAKhD,GAAAA,CAAAA;EAC5C,QAAA,MAAMa,CAAI,GAAA;cAACoC,IAAKC,CAAAA,IAAI,CAAC,IAAI,CAAA;EAAGL,YAAAA,CAAAA;EAAGC,YAAAA,CAAAA;EAAG9C,YAAAA;EAAI,SAAA;EACtC,QAAA,IAAIqB,IAAM,EAAA,IAAI,CAAC0B,MAAM,CAAC,IAAI,CAACA,MAAM,CAACtB,OAAO,CAACJ,IAAAA,CAAAA,CAAM,GAAGR,CAAAA;EAC9C,aAAA,IAAI,CAACkC,MAAM,CAACf,IAAI,CAACnB,CAAAA,CAAAA;OAEnB,MAAA;EACH,QAAA,IAAI,CAAC,CAAC,CAAC,EAAEb,GAAAA,CAAAA,CAAK,CAAC,GAAG6C,CAAAA;EACpB;EACF;;ECtBA;;;;;;;;;EASA,GACe,eAASM,CAAAA,GAAG,EAAEC,QAAWvC,GAAAA,CAAAA,IAAKA,CAAC,EAAA;EAE5C,IAAA,MAAMwC,MAASF,GAAAA,GAAAA,CACZjE,GAAG,CAACkE,QACJlE,CAAAA,CAAAA,GAAG,CAAC2B,CAAAA,CAAKA,GAAAA,CAAAA,YAAayC,IAAO,GAAA,CAACzC,CAAIA,GAAAA,CAAAA,CAAAA;EAErC,IAAA,OAAOsC,GAAII,CAAAA,MAAM,CAAC,CAACnE,GAAKE,EAAAA,CAAAA,GAAAA;EACtB,QAAA,MAAMuB,IAAIuC,QAAShE,CAAAA,GAAAA,CAAAA;EACnB,QAAA,OAAOiE,OAAO5B,OAAO,CAACZ,aAAayC,IAAO,GAAA,CAACzC,IAAIA,CAAOvB,CAAAA,KAAAA,CAAAA;EACxD,KAAA,CAAA;EAEF;;EClBA;;;;;;;;;;;;EAYA,GACA,SAASkE,WAAYC,CAAAA,OAAO,EAAEC,IAAAA,GAAO,EAAE,EAAA;EAErC,IAAA,MAAMC,aAAgBC,GAAAA,MAAAA,CAAOC,aAAMJ,CAAAA,OAAAA,CAAQvE,GAAG,CAAC4E,CAAAA,CAAAA,GAAKC,MAAOC,CAAAA,IAAI,CAACF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAC1DG,YAAY,EAAC;MAEnBN,aAAc/C,CAAAA,OAAO,CAACE,CAAAA,CAAAA,GAAAA;UACpB,IAAIoD,KAAAA;EACJ,QAAA,IAAIR,IAAI,CAAC5C,CAAE,CAAA,EAAEoD,QAAQR,IAAI,CAAC5C,CAAE,CAAA,CAAC2C,OAASK,EAAAA,CAAAA,CAAKA,GAAAA,CAAC,CAAChD,CAAE,CAAA,CAAA;EAC1C,aAAA;cACH,MAAMuC,MAAAA,GAASI,QAAQvE,GAAG,CAAC4E,CAAAA,CAAKA,GAAAA,CAAC,CAAChD,CAAE,CAAA,CAAA;EACpC,YAAA,MAAMqD,QAAQd,MAAOnE,CAAAA,GAAG,CAACkF,CAAAA,CAAAA,GAAKA,KAAKA,CAAM,KAAA,KAAA,GAAQA,CAAEC,CAAAA,WAAW,GAAGD,CAAGb,CAAAA,CAAAA,MAAM,CAACa,CAAAA,CAAAA,GAAKA,MAAM,MAAK,CAAA;EAC3F,YAAA,IAAI,CAACD,KAAAA,CAAM7D,MAAM,EAAE4D,KAAQhD,GAAAA,SAAAA;EACtB,iBAAA,IAAIiD,KAAM1C,CAAAA,OAAO,CAAC9B,KAAAA,CAAAA,IAAU,CAAG,EAAA;kBAClCuE,KAAQL,GAAAA,aAAAA,CAAMR,OAAOnE,GAAG,CAACkF,CAAAA,CAAKA,GAAAA,CAAAA,YAAazE,QAAQyE,CAAI,GAAA;EAACA,wBAAAA;EAAE,qBAAA,CAAA,CAAA;EAC1DF,gBAAAA,KAAAA,GAAQN,MAAOM,CAAAA,KAAAA,CAAAA;EACf,gBAAA,IAAIA,MAAM5D,MAAM,KAAK,GAAG4D,KAAQA,GAAAA,KAAK,CAAC,CAAE,CAAA;EAC1C,aAAA,MACK,IAAIC,KAAAA,CAAM1C,OAAO,CAAC6C,WAAW,CAAG,EAAA;EACnCJ,gBAAAA,KAAAA,GAAQN,MAAOP,CAAAA,MAAAA,CAAAA;EACf,gBAAA,IAAIa,MAAM5D,MAAM,KAAK,GAAG4D,KAAQA,GAAAA,KAAK,CAAC,CAAE,CAAA;EAC1C,aAAA,MACK,IAAIC,KAAM1C,CAAAA,OAAO,CAAC8C,MAAW,CAAA,IAAA,CAAA,EAAGL,QAAQM,WAAInB,CAAAA,MAAAA,CAAAA;EAC5C,iBAAA,IAAIc,KAAM1C,CAAAA,OAAO,CAACsC,MAAAA,CAAAA,IAAW,CAAG,EAAA;EACnCG,gBAAAA,KAAAA,GAAQN,MAAOP,CAAAA,MAAAA,CAAOE,MAAM,CAACa,CAAAA,CAAKA,GAAAA,CAAAA,CAAAA,CAAAA;EAClC,gBAAA,IAAIF,MAAM5D,MAAM,KAAK,GAAG4D,KAAQA,GAAAA,KAAK,CAAC,CAAE,CAAA;EACnCA,qBAAAA,KAAAA,GAAQV,WAAYU,CAAAA,KAAAA,CAAAA;eAGtB,MAAA;EACHA,gBAAAA,KAAAA,GAAQN,OAAOP,MAAOE,CAAAA,MAAM,CAACa,CAAAA,CAAAA,GAAKA,MAAM,MAAK,CAAA,CAAA;EAC7C,gBAAA,IAAIF,MAAM5D,MAAM,KAAK,GAAG4D,KAAQA,GAAAA,KAAK,CAAC,CAAE,CAAA;EAC1C;EACF;UACAD,SAAS,CAACnD,EAAE,GAAGoD,KAAAA;EACjB,KAAA,CAAA;MAEA,OAAOD,SAAAA;EAET;;ECpDA;;;;;;EAMA,GACe,aAAA,CAAShF,IAAI,EAAE+E,IAAI,EAAA;EAEhC,IAAA,IAAI,EAAEA,IAAgBrE,YAAAA,KAAI,GAAIqE,IAAO,GAAA;EAACA,QAAAA;EAAK,KAAA;EAE3C,IAAA,MAAMS,QAAWC,GAAAA,iBAAAA,EAAAA;EACjB,IAAA,IAAK,IAAIpF,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI0E,IAAK1D,CAAAA,MAAM,EAAEhB,CAAAA,EAAAA,CAAKmF,QAASzE,CAAAA,GAAG,CAACgE,IAAI,CAAC1E,CAAE,CAAA,CAAA;MAC1D,MAAMqF,UAAAA,GAAaF,QAASG,CAAAA,OAAO,CAAC3F,IAAAA,CAAAA;EAEpC,IAAA,OAAO4F,MAAOF,CAAAA,UAAAA,CAAAA;EAEhB;EAEA;;;;EAIA,GACA,SAASE,OAAOxB,MAAM,EAAA;MAEpB,OAAOA,MAAAA,CAAOnE,GAAG,CAAC2B,CAAAA,CAAAA,GAAAA;EAEhB,QAAA,IAAIA,CAAEb,CAAAA,GAAG,IAAIa,CAAAA,CAAEwC,MAAM,EAAE;EACrB,YAAA,IAAIxC,EAAEwC,MAAM,CAAC,CAAE,CAAA,CAACrD,GAAG,KAAK,WAAA,EAAa,OAAOa,CAAAA,CAAEwC,MAAM,CAAC,CAAA,CAAE,CAACA,MAAM,CAAC,CAAE,CAAA;EAC5DxC,iBAAAA,CAAAA,CAAEwC,MAAM,GAAGwB,MAAOhE,CAAAA,CAAAA,CAAEwC,MAAM,CAAA;EACjC;UAEA,OAAOxC,CAAAA;EAET,KAAA,CAAA;EAEF;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"d3plus-data.js","sources":["../src/isData.js","../src/fold.js","../src/concat.js","../src/load.js","../src/addToQueue.js","../src/unique.js","../src/merge.js","../src/nest.js"],"sourcesContent":["/**\n @function isData\n @desc Returns true/false whether the argument provided to the function should be loaded using an internal XHR request. Valid data can either be a string URL or an Object with \"url\" and \"headers\" keys.\n @param {*} dataItem The value to be tested\n*/\nexport default dataItem =>\n typeof dataItem === \"string\" ||\n (typeof dataItem === \"object\" && dataItem.url);\n","/**\n @function dataFold\n @desc Given a JSON object where the data values and headers have been split into separate key lookups, this function will combine the data values with the headers and returns one large array of objects.\n @param {Object} json A JSON data Object with `data` and `headers` keys.\n @param {String} [data = \"data\"] The key used for the flat data array inside of the JSON object.\n @param {String} [headers = \"headers\"] The key used for the flat headers array inside of the JSON object.\n*/\nexport default (json, data = \"data\", headers = \"headers\") =>\n json[data].map(data =>\n json[headers].reduce((obj, header, i) =>\n (obj[header] = data[i], obj), {}));\n","/**\n @function dataConcat\n @desc Reduce and concat all the elements included in arrayOfArrays if they are arrays. If it is a JSON object try to concat the array under given key data. If the key doesn't exists in object item, a warning message is lauched to the console. You need to implement DataFormat callback to concat the arrays manually.\n @param {Array} arrayOfArray Array of elements\n @param {String} [data = \"data\"] The key used for the flat data array if exists inside of the JSON object.\n*/\nexport default (arrayOfArrays, data = \"data\") =>\n arrayOfArrays.reduce((acc, item) => {\n let dataArray = [];\n if (Array.isArray(item)) {\n dataArray = item;\n }\n else {\n if (item[data]) {\n dataArray = item[data];\n }\n // else {\n // console.warn(`d3plus-viz: Please implement a \"dataFormat\" callback to concat the arrays manually (consider using the d3plus.dataConcat method in your callback). Currently unable to concatenate (using key: \"${data}\") the following response:`, item);\n // }\n }\n return acc.concat(dataArray);\n }, []);\n\n","import {csv, json, text, tsv} from \"d3-fetch\";\nimport {isObject} from \"@d3plus/dom\";\n\nimport fold from \"./fold.js\";\nimport concat from \"./concat.js\";\nimport isData from \"./isData.js\";\n\n/**\n @function dataLoad\n @desc Loads data from a filepath or URL, converts it to a valid JSON object, and returns it to a callback function.\n @param {Array|String} path The path to the file or url to be loaded. Also support array of paths strings. If an Array of objects is passed, the xhr request logic is skipped.\n @param {Function} [formatter] An optional formatter function that is run on the loaded data.\n @param {String} [key] The key in the `this` context to save the resulting data to.\n @param {Function} [callback] A function that is called when the final data is loaded. It is passed 2 variables, any error present and the data loaded.\n*/\nexport default function (path, formatter, key, callback) {\n const fetchData = (path, init = {}) => {\n const ext = path.slice(path.length - 4);\n switch (ext) {\n case \".csv\":\n return csv(path, init);\n case \".tsv\":\n return tsv(path, init);\n case \".txt\":\n return text(path, init);\n default:\n return json(path, init);\n }\n };\n\n const validateData = data => {\n if (data && data instanceof Array) {\n data.forEach(d => {\n for (const k in d) {\n if (!isNaN(d[k])) d[k] = parseFloat(d[k]);\n else if (d[k].toLowerCase() === \"false\") d[k] = false;\n else if (d[k].toLowerCase() === \"true\") d[k] = true;\n else if (d[k].toLowerCase() === \"null\") d[k] = null;\n else if (d[k].toLowerCase() === \"undefined\") d[k] = undefined;\n }\n });\n }\n return data;\n };\n\n const loadedLength = loadedArray =>\n loadedArray.reduce((prev, current) => (current ? prev + 1 : prev), 0);\n\n // If path param is a not an Array then convert path to a 1 element Array to re-use logic\n if (!(path instanceof Array)) path = [path];\n\n const needToLoad = path.find(isData);\n\n let loaded = new Array(path.length);\n const toLoad = [];\n\n // If there is a string I'm assuming is a Array to merge, urls or data\n if (needToLoad) {\n path.forEach((dataItem, ix) => {\n if (isData(dataItem)) toLoad.push(dataItem);\n else loaded[ix] = dataItem;\n });\n }\n // Data array itself\n else {\n loaded[0] = path;\n }\n\n // Load all urls an combine them with data arrays\n const alreadyLoaded = loadedLength(loaded);\n toLoad.forEach(dataItem => {\n let url = dataItem,\n init = {};\n if (typeof dataItem === \"object\" && dataItem.url) {\n url = dataItem.url;\n init = dataItem;\n }\n fetchData(url, init)\n .then(data => {\n if (!(data instanceof Array) && data.data && data.headers)\n data = fold(data);\n data = validateData(data);\n loaded[\n path.findIndex(d => JSON.stringify(d) == JSON.stringify(dataItem))\n ] = data;\n // All urls loaded\n if (loadedLength(loaded) - alreadyLoaded === toLoad.length) {\n // Format data\n data = loadedLength(loaded) === 1 ? loaded[0] : loaded;\n if (this._cache) this._lrucache.set(`${key}_${url}`, data);\n\n if (formatter) {\n const formatterResponse = formatter(\n loadedLength(loaded) === 1 ? loaded[0] : loaded\n );\n if (key === \"data\" && isObject(formatterResponse)) {\n data = formatterResponse.data || [];\n delete formatterResponse.data;\n this.config(formatterResponse);\n } else data = formatterResponse || [];\n } else if (key === \"data\") {\n data = concat(loaded, \"data\");\n }\n\n if (key && `_${key}` in this) this[`_${key}`] = data;\n if (callback) callback(undefined, data);\n }\n })\n .catch(err => {\n console.log(err);\n if (callback) callback(err, undefined);\n });\n });\n\n // If there is no data to Load response is immediately\n if (toLoad.length === 0) {\n loaded = loaded.map(data => {\n if (data && !(data instanceof Array) && data.data && data.headers)\n data = fold(data);\n return data;\n });\n\n // Format data\n let data = loadedLength(loaded) === 1 ? loaded[0] : loaded;\n if (formatter) {\n const formatterResponse = formatter(\n loadedLength(loaded) === 1 ? loaded[0] : loaded\n );\n if (key === \"data\" && isObject(formatterResponse)) {\n data = formatterResponse.data || [];\n delete formatterResponse.data;\n this.config(formatterResponse);\n } else data = formatterResponse || [];\n } else if (key === \"data\") {\n data = concat(loaded, \"data\");\n }\n\n if (key && `_${key}` in this) this[`_${key}`] = data;\n if (callback) callback(null, data);\n }\n}\n","import isData from \"./isData.js\";\nimport load from \"./load.js\";\n\n/**\n @function isData\n @desc Adds the provided value to the internal queue to be loaded, if necessary. This is used internally in new d3plus visualizations that fold in additional data sources, like the nodes and links of Network or the topojson of Geomap.\n @param {Array|String|Object} data The data to be loaded\n @param {Function} [data] An optional data formatter/callback\n @param {String} data The internal Viz method to be modified\n*/\nexport default function (_, f, key) {\n const paths = _ instanceof Array ? _ : [_];\n const needToLoad = paths.find(isData);\n if (needToLoad) {\n const prev = this._queue.find(q => q[3] === key);\n const d = [load.bind(this), paths, f, key];\n if (prev) this._queue[this._queue.indexOf(prev)] = d;\n else this._queue.push(d);\n } else {\n this[`_${key}`] = _;\n }\n}\n","/**\n @function unique\n @desc ES5 implementation to reduce an Array of values to unique instances.\n @param {Array} arr The Array of objects to be filtered.\n @param {Function} [accessor] An optional accessor function used to extract data points from an Array of Objects.\n @example <caption>this</caption>\nunique([\"apple\", \"banana\", \"apple\"]);\n @example <caption>returns this</caption>\n[\"apple\", \"banana\"]\n*/\nexport default function(arr, accessor = d => d) {\n\n const values = arr\n .map(accessor)\n .map(d => d instanceof Date ? +d : d);\n\n return arr.filter((obj, i) => {\n const d = accessor(obj);\n return values.indexOf(d instanceof Date ? +d : d) === i;\n });\n\n}\n","import {merge, sum} from \"d3-array\";\nimport unique from \"./unique.js\";\n\n/**\n @function merge\n @desc Combines an Array of Objects together and returns a new Object.\n @param {Array} objects The Array of objects to be merged together.\n @param {Object} aggs An object containing specific aggregation methods (functions) for each key type. By default, numbers are summed and strings are returned as an array of unique values.\n @example <caption>this</caption>\nmerge([\n {id: \"foo\", group: \"A\", value: 10, links: [1, 2]},\n {id: \"bar\", group: \"A\", value: 20, links: [1, 3]}\n]);\n @example <caption>returns this</caption>\n{id: [\"bar\", \"foo\"], group: \"A\", value: 30, links: [1, 2, 3]}\n*/\nfunction objectMerge(objects, aggs = {}) {\n\n const availableKeys = unique(merge(objects.map(o => Object.keys(o)))),\n newObject = {};\n\n availableKeys.forEach(k => {\n let value;\n if (aggs[k]) value = aggs[k](objects, o => o[k]);\n else {\n const values = objects.map(o => o[k]);\n const types = values.map(v => v || v === false ? v.constructor : v).filter(v => v !== void 0);\n if (!types.length) value = undefined;\n else if (types.indexOf(Array) >= 0) {\n value = merge(values.map(v => v instanceof Array ? v : [v]));\n value = unique(value);\n if (value.length === 1) value = value[0];\n }\n else if (types.indexOf(String) >= 0) {\n value = unique(values);\n if (value.length === 1) value = value[0];\n }\n else if (types.indexOf(Number) >= 0) value = sum(values);\n else if (types.indexOf(Object) >= 0) {\n value = unique(values.filter(v => v));\n if (value.length === 1) value = value[0];\n else value = objectMerge(value);\n\n }\n else {\n value = unique(values.filter(v => v !== void 0));\n if (value.length === 1) value = value[0];\n }\n }\n newObject[k] = value;\n });\n\n return newObject;\n\n}\n\nexport default objectMerge;\n","import {nest} from \"d3-collection\";\n\n/**\n @function nest\n @summary Extends the base behavior of d3.nest to allow for multiple depth levels.\n @param {Array} *data* The data array to be nested.\n @param {Array} *keys* An array of key accessors that signify each nest level.\n @private\n*/\nexport default function(data, keys) {\n\n if (!(keys instanceof Array)) keys = [keys];\n\n const dataNest = nest();\n for (let i = 0; i < keys.length; i++) dataNest.key(keys[i]);\n const nestedData = dataNest.entries(data);\n\n return bubble(nestedData);\n\n}\n\n/**\n Bubbles up values that do not nest to the furthest key.\n @param {Array} *values* The \"values\" of a nest object.\n @private\n*/\nfunction bubble(values) {\n\n return values.map(d => {\n\n if (d.key && d.values) {\n if (d.values[0].key === \"undefined\") return d.values[0].values[0];\n else d.values = bubble(d.values);\n }\n\n return d;\n\n });\n\n}\n"],"names":["dataItem","url","json","data","headers","map","reduce","obj","header","i","arrayOfArrays","acc","item","dataArray","Array","isArray","concat","path","formatter","key","callback","fetchData","init","ext","slice","length","csv","tsv","text","validateData","forEach","d","k","isNaN","parseFloat","toLowerCase","undefined","loadedLength","loadedArray","prev","current","needToLoad","find","isData","loaded","toLoad","ix","push","alreadyLoaded","then","fold","findIndex","JSON","stringify","_cache","_lrucache","set","formatterResponse","isObject","config","catch","err","console","log","_","f","paths","_queue","q","load","bind","indexOf","arr","accessor","values","Date","filter","objectMerge","objects","aggs","availableKeys","unique","merge","o","Object","keys","newObject","value","types","v","constructor","String","Number","sum","dataNest","nest","nestedData","entries","bubble"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  /*
2
- @d3plus/data v3.0.12
2
+ @d3plus/data v3.0.13
3
3
  JavaScript data loading, manipulation, and analysis functions.
4
4
  Copyright (c) 2025 D3plus - https://d3plus.org
5
5
  @license MIT
6
6
  */
7
- (e=>{"function"==typeof define&&define.amd?define(e):e()})(function(){if("undefined"!=typeof window){try{if("undefined"==typeof SVGElement||Boolean(SVGElement.prototype.innerHTML))return}catch(e){return}function r(e){switch(e.nodeType){case 1:var t=e,n="";return n+="<"+t.tagName,t.hasAttributes()&&[].forEach.call(t.attributes,function(e){n+=" "+e.name+'="'+e.value+'"'}),n+=">",t.hasChildNodes()&&[].forEach.call(t.childNodes,function(e){n+=r(e)}),n+="</"+t.tagName+">";case 3:return e.textContent.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");case 8:return"\x3c!--"+e.nodeValue+"--\x3e"}}Object.defineProperty(SVGElement.prototype,"innerHTML",{get:function(){var t="";return[].forEach.call(this.childNodes,function(e){t+=r(e)}),t},set:function(e){for(;this.firstChild;)this.removeChild(this.firstChild);try{var t=new DOMParser,n=(t.async=!1,"<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>"+e+"</svg>"),r=t.parseFromString(n,"text/xml").documentElement;[].forEach.call(r.childNodes,function(e){this.appendChild(this.ownerDocument.importNode(e,!0))}.bind(this))}catch(e){throw new Error("Error parsing markup string")}}}),Object.defineProperty(SVGElement.prototype,"innerSVG",{get:function(){return this.innerHTML},set:function(e){this.innerHTML=e}})}}),((e,t)=>{"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-request"),require("@d3plus/dom"),require("d3-array"),require("d3-collection")):"function"==typeof define&&define.amd?define("@d3plus/data",["exports","d3-request","@d3plus/dom","d3-array","d3-collection"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).d3plus={},e.d3Request,e.dom,e.d3Array,e.d3Collection)})(this,function(e,m,y,d,r){
7
+ (e=>{"function"==typeof define&&define.amd?define(e):e()})(function(){if("undefined"!=typeof window){try{if("undefined"==typeof SVGElement||Boolean(SVGElement.prototype.innerHTML))return}catch(e){return}function r(e){switch(e.nodeType){case 1:var t=e,n="";return n+="<"+t.tagName,t.hasAttributes()&&[].forEach.call(t.attributes,function(e){n+=" "+e.name+'="'+e.value+'"'}),n+=">",t.hasChildNodes()&&[].forEach.call(t.childNodes,function(e){n+=r(e)}),n+="</"+t.tagName+">";case 3:return e.textContent.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");case 8:return"\x3c!--"+e.nodeValue+"--\x3e"}}Object.defineProperty(SVGElement.prototype,"innerHTML",{get:function(){var t="";return[].forEach.call(this.childNodes,function(e){t+=r(e)}),t},set:function(e){for(;this.firstChild;)this.removeChild(this.firstChild);try{var t=new DOMParser,n=(t.async=!1,"<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>"+e+"</svg>"),r=t.parseFromString(n,"text/xml").documentElement;[].forEach.call(r.childNodes,function(e){this.appendChild(this.ownerDocument.importNode(e,!0))}.bind(this))}catch(e){throw new Error("Error parsing markup string")}}}),Object.defineProperty(SVGElement.prototype,"innerSVG",{get:function(){return this.innerHTML},set:function(e){this.innerHTML=e}})}}),((e,t)=>{"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3-fetch"),require("@d3plus/dom"),require("d3-array"),require("d3-collection")):"function"==typeof define&&define.amd?define("@d3plus/data",["exports","d3-fetch","@d3plus/dom","d3-array","d3-collection"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).d3plus={},e.d3Fetch,e.dom,e.d3Array,e.d3Collection)})(this,function(e,f,h,d,r){
8
8
  /**
9
9
  @function isData
10
10
  @desc Returns true/false whether the argument provided to the function should be loaded using an internal XHR request. Valid data can either be a string URL or an Object with "url" and "headers" keys.
11
11
  @param {*} dataItem The value to be tested
12
- */var a=e=>"string"==typeof e||"object"==typeof e&&e.url&&e.headers,g=(e,t="data",n="headers")=>e[t].map(r=>e[n].reduce((e,t,n)=>(e[t]=r[n],e),{})),v=(e,r="data")=>e.reduce((e,t)=>{let n=[];return Array.isArray(t)?n=t:t[r]&&(n=t[r]),e.concat(n)},[]);
12
+ */var p=e=>"string"==typeof e||"object"==typeof e&&e.url,y=(e,t="data",n="headers")=>e[t].map(r=>e[n].reduce((e,t,n)=>(e[t]=r[n],e),{})),g=(e,r="data")=>e.reduce((e,t)=>{let n=[];return Array.isArray(t)?n=t:t[r]&&(n=t[r]),e.concat(n)},[]);
13
13
  /**
14
14
  @function dataFold
15
15
  @desc Given a JSON object where the data values and headers have been split into separate key lookups, this function will combine the data values with the headers and returns one large array of objects.
@@ -24,17 +24,19 @@
24
24
  @param {Function} [formatter] An optional formatter function that is run on the loaded data.
25
25
  @param {String} [key] The key in the `this` context to save the resulting data to.
26
26
  @param {Function} [callback] A function that is called when the final data is loaded. It is passed 2 variables, any error present and the data loaded.
27
- */function i(o,s,d,l){let u,c=e=>e.reduce((e,t)=>t?e+1:e,0);var t=(
27
+ */function i(a,i,o,s){let d=e=>e.reduce((e,t)=>t?e+1:e,0);var t=(
28
28
  // If path param is a not an Array then convert path to a 1 element Array to re-use logic
29
- o=o instanceof Array?o:[o]).find(a);let f=new Array(o.length),h=[],p=(
29
+ a=a instanceof Array?a:[a]).find(p);let c=new Array(a.length),l=[],u=(
30
30
  // If there is a string I'm assuming is a Array to merge, urls or data
31
- t?o.forEach((e,t)=>{a(e)?h.push(e):f[t]=e}):f[0]=o,c(f));
31
+ t?a.forEach((e,t)=>{p(e)?l.push(e):c[t]=e}):c[0]=a,d(c));
32
32
  // If there is no data to Load response is immediately
33
- if(h.forEach(e=>{let t={},i=e;"object"==typeof e&&(i=e.url,t=e.headers);var n=(u=(e=>{switch(e.slice(e.length-4)){case".csv":return m.csv;case".tsv":return m.tsv;case".txt":return m.text;default:return m.json}})(i))(i);for(let e in t)!{}.hasOwnProperty.call(t,e)||n.header(e,t[e]);n.get((e,t)=>{var n,r,a;(t=e?[]:t)&&!(t instanceof Array)&&t.data&&t.headers&&(t=g(t)),a=e,r=u,n=t,r!==m.json&&!a&&n&&n instanceof Array&&n.forEach(e=>{for(var t in e)isNaN(e[t])?"false"===e[t].toLowerCase()?e[t]=!1:"true"===e[t].toLowerCase()?e[t]=!0:"null"===e[t].toLowerCase()?e[t]=null:"undefined"===e[t].toLowerCase()&&(e[t]=void 0):e[t]=parseFloat(e[t])}),t=n,f[r=i,o.indexOf(r)]=t,c(f)-p===h.length&&(
33
+ if(l.forEach(n=>{let r=n,e={};"object"==typeof n&&n.url&&(r=n.url,e=n),((e,t={})=>{switch(e.slice(e.length-4)){case".csv":return f.csv(e,t);case".tsv":return f.tsv(e,t);case".txt":return f.text(e,t);default:return f.json(e,t)}})(r,e).then(e=>{var t;e instanceof Array||!e.data||!e.headers||(e=y(e)),(t=e)&&t instanceof Array&&t.forEach(e=>{for(var t in e)isNaN(e[t])?"false"===e[t].toLowerCase()?e[t]=!1:"true"===e[t].toLowerCase()?e[t]=!0:"null"===e[t].toLowerCase()?e[t]=null:"undefined"===e[t].toLowerCase()&&(e[t]=void 0):e[t]=parseFloat(e[t])}),e=t,c[a.findIndex(e=>JSON.stringify(e)==JSON.stringify(n))]=e,
34
+ // All urls loaded
35
+ d(c)-u===l.length&&(
34
36
  // Format data
35
- t=1===c(f)?f[0]:f,this._cache&&this._lrucache.set(d+"_"+i,t),s?(a=s(1===c(f)?f[0]:f),"data"===d&&y.isObject(a)?(t=a.data||[],delete a.data,this.config(a)):t=a||[]):"data"===d&&(t=v(f,"data")),d&&"_"+d in this&&(this["_"+d]=t),l)&&l(e,t)})}),0===h.length){f=f.map(e=>e=e&&!(e instanceof Array)&&e.data&&e.headers?g(e):e);
37
+ e=1===d(c)?c[0]:c,this._cache&&this._lrucache.set(o+"_"+r,e),i?(t=i(1===d(c)?c[0]:c),"data"===o&&h.isObject(t)?(e=t.data||[],delete t.data,this.config(t)):e=t||[]):"data"===o&&(e=g(c,"data")),o&&"_"+o in this&&(this["_"+o]=e),s)&&s(void 0,e)}).catch(e=>{console.log(e),s&&s(e,void 0)})}),0===l.length){c=c.map(e=>e=e&&!(e instanceof Array)&&e.data&&e.headers?y(e):e);
36
38
  // Format data
37
- let e=1===c(f)?f[0]:f;s?(t=s(1===c(f)?f[0]:f),"data"===d&&y.isObject(t)?(e=t.data||[],delete t.data,this.config(t)):e=t||[]):"data"===d&&(e=v(f,"data")),d&&"_"+d in this&&(this["_"+d]=e),l&&l(null,e)}}
39
+ let e=1===d(c)?c[0]:c;i?(t=i(1===d(c)?c[0]:c),"data"===o&&h.isObject(t)?(e=t.data||[],delete t.data,this.config(t)):e=t||[]):"data"===o&&(e=g(c,"data")),o&&"_"+o in this&&(this["_"+o]=e),s&&s(null,e)}}
38
40
  /**
39
41
  @function isData
40
42
  @desc Adds the provided value to the internal queue to be loaded, if necessary. This is used internally in new d3plus visualizations that fold in additional data sources, like the nodes and links of Network or the topojson of Geomap.
@@ -51,7 +53,7 @@ let e=1===c(f)?f[0]:f;s?(t=s(1===c(f)?f[0]:f),"data"===d&&y.isObject(t)?(e=t.dat
51
53
  unique(["apple", "banana", "apple"]);
52
54
  @example <caption>returns this</caption>
53
55
  ["apple", "banana"]
54
- */function l(e,n=e=>e){let r=e.map(n).map(e=>e instanceof Date?+e:e);return e.filter((e,t)=>{e=n(e);return r.indexOf(e instanceof Date?+e:e)===t})}
56
+ */function c(e,n=e=>e){let r=e.map(n).map(e=>e instanceof Date?+e:e);return e.filter((e,t)=>{e=n(e);return r.indexOf(e instanceof Date?+e:e)===t})}
55
57
  /**
56
58
  @function merge
57
59
  @desc Combines an Array of Objects together and returns a new Object.
@@ -64,7 +66,7 @@ let e=1===c(f)?f[0]:f;s?(t=s(1===c(f)?f[0]:f),"data"===d&&y.isObject(t)?(e=t.dat
64
66
  ]);
65
67
  @example <caption>returns this</caption>
66
68
  {id: ["bar", "foo"], group: "A", value: 30, links: [1, 2, 3]}
67
- */e.addToQueue=function(e,t,n){var r;(e=e instanceof Array?e:[e]).find(a)?(r=this._queue.find(e=>e[3]===n),t=[i.bind(this),e,t,n],r?this._queue[this._queue.indexOf(r)]=t:this._queue.push(t)):this["_"+n]=e},e.concat=v,e.fold=g,e.isData=a,e.load=i,e.merge=function a(i,o={}){let e=l(d.merge(i.map(e=>Object.keys(e)))),s={};return e.forEach(t=>{let e;var n,r;o[t]?e=o[t](i,e=>e[t]):(r=(n=i.map(e=>e[t])).map(e=>e||!1===e?e.constructor:e).filter(e=>void 0!==e)).length?0<=r.indexOf(Array)?1===(e=l(e=d.merge(n.map(e=>e instanceof Array?e:[e])))).length&&(e=e[0]):0<=r.indexOf(String)?1===(e=l(n)).length&&(e=e[0]):0<=r.indexOf(Number)?e=d.sum(n):0<=r.indexOf(Object)?e=1===(e=l(n.filter(e=>e))).length?e[0]:a(e):1===(e=l(n.filter(e=>void 0!==e))).length&&(e=e[0]):e=void 0,s[t]=e}),s}
69
+ */e.addToQueue=function(e,t,n){var r,a=e instanceof Array?e:[e];a.find(p)?(r=this._queue.find(e=>e[3]===n),a=[i.bind(this),a,t,n],r?this._queue[this._queue.indexOf(r)]=a:this._queue.push(a)):this["_"+n]=e},e.concat=g,e.fold=y,e.isData=p,e.load=i,e.merge=function a(i,o={}){let e=c(d.merge(i.map(e=>Object.keys(e)))),s={};return e.forEach(t=>{let e;var n,r;o[t]?e=o[t](i,e=>e[t]):(r=(n=i.map(e=>e[t])).map(e=>e||!1===e?e.constructor:e).filter(e=>void 0!==e)).length?0<=r.indexOf(Array)?1===(e=c(e=d.merge(n.map(e=>e instanceof Array?e:[e])))).length&&(e=e[0]):0<=r.indexOf(String)?1===(e=c(n)).length&&(e=e[0]):0<=r.indexOf(Number)?e=d.sum(n):0<=r.indexOf(Object)?e=1===(e=c(n.filter(e=>e))).length?e[0]:a(e):1===(e=c(n.filter(e=>void 0!==e))).length&&(e=e[0]):e=void 0,s[t]=e}),s}
68
70
  /**
69
71
  @function nest
70
72
  @summary Extends the base behavior of d3.nest to allow for multiple depth levels.
@@ -77,5 +79,5 @@ let e=1===c(f)?f[0]:f;s?(t=s(1===c(f)?f[0]:f),"data"===d&&y.isObject(t)?(e=t.dat
77
79
  @param {Array} *values* The "values" of a nest object.
78
80
  @private
79
81
  */
80
- return function t(e){return e.map(e=>{if(e.key&&e.values){if("undefined"===e.values[0].key)return e.values[0].values[0];e.values=t(e.values)}return e})}(n.entries(e))},e.unique=l});
82
+ return function t(e){return e.map(e=>{if(e.key&&e.values){if("undefined"===e.values[0].key)return e.values[0].values[0];e.values=t(e.values)}return e})}(n.entries(e))},e.unique=c});
81
83
  //# sourceMappingURL=d3plus-data.js.map