From 2e2f4a2378385b5c7c53c41528d0bfd4c9cec49a Mon Sep 17 00:00:00 2001 From: Cinthia Elizabeth Villalejos Zamora Date: Tue, 6 Aug 2024 20:06:49 +0000 Subject: [PATCH] fix: Update @serialize-javascript to address @json5 vulnerability #26 (#11) - Upgrading serialize-javascript dependency to address Cross-site Scripting (XSS) and Arbitrary Code Injection affecting serialize-javascript. - Upgrading outdated code from d3 libraries. --- package.json | 3 + src/aster_plot_src.js | 145 ++++++++++---------- yarn.lock | 307 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 384 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index c125084..952242f 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,9 @@ "build": "webpack --config webpack.config.js" }, "dependencies": { + "d3": "^7.9.0", + "d3-tip": "^0.9.1", + "serialize-javascript": "^3.1.0", "uglifyjs-webpack-plugin": "^1.2.5", "webpack": "^4.39.3", "webpack-cli": "^3.3.9" diff --git a/src/aster_plot_src.js b/src/aster_plot_src.js index 1979433..b9c5b10 100644 --- a/src/aster_plot_src.js +++ b/src/aster_plot_src.js @@ -1,3 +1,6 @@ +import d3Tip from 'd3-tip'; +import {pie, arc, select } from 'd3'; + looker.plugins.visualizations.add({ //plot and series (colors) options: { @@ -107,7 +110,7 @@ looker.plugins.visualizations.add({ // Set up the initial state of the visualization create: function(element, config) { - var css = ` + let css = ` `; element.innerHTML = css; - var container = element.appendChild(document.createElement("div")); // Create a container element to let us center the text. + let container = element.appendChild(document.createElement("div")); // Create a container element to let us center the text. this.container = container container.className = "d3-aster-plot"; this._textElement = container.appendChild(document.createElement("div")); // Create an element to contain the text. @@ -202,26 +205,26 @@ looker.plugins.visualizations.add({ return; } - var dimension = queryResponse.fields.dimension_like[0].name; - var measure_1_score = queryResponse.fields.measure_like[0].name, measure_2_weight = queryResponse.fields.measure_like[1].name; + let dimension = queryResponse.fields.dimension_like[0].name; + let measure_1_score = queryResponse.fields.measure_like[0].name, measure_2_weight = queryResponse.fields.measure_like[1].name; // SVG margins to make labels visible. Otherwise they overflow visible area // src: https://www.visualcinnamon.com/2015/09/placing-text-on-arcs.html - var margin = { + let margin = { top: 30, right: 30, bottom: 30, left: 30 }; - var width = element.clientWidth - margin.left - margin.right, - height = element.clientHeight - margin.top - margin.bottom, - radius = Math.min(width, height) / 2, - innerRadius = 0.3 * radius; + let width = element.clientWidth - margin.left - margin.right; + let height = element.clientHeight - margin.top - margin.bottom; + let radius = Math.min(width, height) / 2; + let innerRadius = 0.3 * radius; // set custom chart size if (!isNaN(parseFloat(config.chart_size))) { - var ratio = parseFloat(config.chart_size) / 100.0; + let ratio = parseFloat(config.chart_size) / 100.0; if (ratio > 2) { radius = radius*2; } @@ -237,13 +240,13 @@ looker.plugins.visualizations.add({ config.color_range = ["#9E0041", "#C32F4B", "#E1514B", "#F47245", "#FB9F59", "#FEC574", "#FAE38C", "#EAF195", "#C7E89E", "#9CD6A4", "#6CC4A4", "#4D9DB4", "#4776B4", "#5E4EA1"]; } - var all_scores = [], + let all_scores = [], all_weight = [], color_length = config.color_range.length, dataset_tiny = {}; - for (var i = 0; i < data.length; i++) { + for (let i = 0; i < data.length; i++) { if (i >= color_length) { - var j = Math.floor(i/color_length) + let j = Math.floor(i/color_length) data[i].color = config.color_range[i-(j*color_length)]; // loop through color array if there are too many series } else { data[i].color = config.color_range[i]; @@ -259,16 +262,18 @@ looker.plugins.visualizations.add({ } if (!config.radius) { - console.log('Radius not set. Defaulting to max score: ' + getMaxOfArray(all_scores)) + // console.log('Radius not set. Defaulting to max score: ' + getMaxOfArray(all_scores)) config.radius = getMaxOfArray(all_scores) } else { - console.log('Radius config set to: ' + config.radius) + // console.log('Radius config set to: ' + config.radius) } - + let score; + let min; + let max; // calculate the weighted mean score (value in centre of pie) if (!config.keyword_search) { // console.log('Default weighted mean score') - var score = + score = Math.round( data.reduce(function(a, b) { //console.log('a:' + a + ', b.score: ' + b.score + ', b.weight: ' + b.weight); @@ -278,14 +283,14 @@ looker.plugins.visualizations.add({ return a + b.weight; }, 0) ); - var min = Math.round(Math.min(...all_scores)); - var max = Math.round(Math.max(...all_scores)); + min = Math.round(Math.min(...all_scores)); + max = Math.round(Math.max(...all_scores)); } else { // custom keyword option - for (var i = 0; i < data.length; i++) { + for (let i = 0; i < data.length; i++) { if (data[i].label.toLowerCase().includes(config.keyword_search.toLowerCase())) { //console.log(data[i].label + ' is used for centre score'); - var score = data[i].weight, + score = data[i].weight, min = Math.min( ...all_weight), max = Math.max( ...all_weight), scale_min = 0.2, // setting scale is 0.2 -> 0.6 of radius @@ -299,46 +304,46 @@ looker.plugins.visualizations.add({ } } - var pie = d3.layout.pie() + let _pie = pie() .sort(null) .value(function(d) { return d.width; }); - var tip = d3.tip() + let _tip = d3Tip() .attr('class', 'd3-tip') .offset([0, 0]) - .html(function(d) { - return d.data.label + ": " + d.data.rendered + ""; + .html(function(d, data) { + return data.data.label + ": " + data.data.rendered + ""; }); - var arc = d3.svg.arc() + let _arc = arc() .innerRadius(innerRadius) .outerRadius(function(d) { return (radius - innerRadius) * (d.data.score / (1.0*config.radius)) + innerRadius; }); - var outlineArc = d3.svg.arc() + let outlineArc = arc() .innerRadius(innerRadius) .outerRadius(radius); - var svg = d3.select(".d3-aster-plot").append("svg") + let _svg = select(".d3-aster-plot").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + (width / 2 + margin.left) + "," + (height / 2 + margin.top) + ")"); - svg.call(tip); + _svg.call(_tip); // inner circle color - var inner_circle = svg.append("circle") + let inner_circle = _svg.append("circle") .attr("cx", 0) .attr("cy", 0) .attr("r", innerRadius) .attr("fill",config.inner_circle_color); // affix score to centre of pie - var centerVal = svg.append("svg:text") + let centerVal = _svg.append("svg:text") .attr("class", "aster-score") .attr("dy", ".35em") .attr("text-anchor", "middle") // text-align: right @@ -356,7 +361,7 @@ looker.plugins.visualizations.add({ } }); - svg.append("text") + _svg.append("text") .attr("class", "score-sublabel") .attr("dy", "2em") .attr("text-anchor", "middle") // text-align: right @@ -374,21 +379,21 @@ looker.plugins.visualizations.add({ } }); - var path = svg.selectAll(".solidArc") - .data(pie(data)) + let path = _svg.selectAll(".solidArc") + .data(_pie(data)) .enter().append("path") - .attr("data-legend",function(d) { return d.data.label }) // for legend - .attr("fill", function(d) { return d.data.color }) + .attr("data-legend",function(d, data) { return data.label }) // for legend + .attr("fill", function(d, data) { return d.data.color }) .attr("class", "solidArc") .attr("stroke", "gray") - .attr("d", arc) - .on('mouseover', tip.show) - .on('mouseout', tip.hide); + .attr("d", _arc) + .on('mouseover', _tip.show) + .on('mouseout', _tip.hide); // Create the Ouline Arc and also the invisible arcs for labels // src: https://www.visualcinnamon.com/2015/09/placing-text-on-arcs.html - var outerPath = svg.selectAll(".outlineArc") - .data(pie(data)) + let outerPath = _svg.selectAll(".outlineArc") + .data(_pie(data)) .enter().append("path") .attr("fill", "none") .attr("stroke", "gray") @@ -397,10 +402,10 @@ looker.plugins.visualizations.add({ // Create the new invisible arcs and flip the direction for the bottom half labels .each(function(d, i) { // Search pattern for everything between the start and the first capital L - var firstArcSection = /(^.+?)L/; + let firstArcSection = /(^.+?)L/; // Grab everything up to the first Line statement - var newArc = firstArcSection.exec( d3.select(this).attr("d") )[1]; + let newArc = firstArcSection.exec( select(this).attr("d") )[1]; // Replace all the commas so that IE can handle it newArc = newArc.replace(/,/g , " "); @@ -410,23 +415,23 @@ looker.plugins.visualizations.add({ // Example: M 0 300 A 200 200 0 0 1 400 300 // Everything between the capital M and first capital A - var startLoc = /M(.*?)A/; + let startLoc = /M(.*?)A/; // Everything between the capital A and 0 0 1 - var middleLoc = /A(.*?)0 0 1/; + let middleLoc = /A(.*?)0 0 1/; // Everything between the 0 0 1 and the end of the string (denoted by $) - var endLoc = /0 0 1 (.*?)$/; + let endLoc = /0 0 1 (.*?)$/; // Flip the direction of the arc by switching the start and end point // and using a 0 (instead of 1) sweep flag - var newStart = endLoc.exec( newArc )[1]; - var newEnd = startLoc.exec( newArc )[1]; - var middleSec = middleLoc.exec( newArc )[1]; + let newStart = endLoc.exec( newArc )[1]; + let newEnd = startLoc.exec( newArc )[1]; + let middleSec = middleLoc.exec( newArc )[1]; // Build up the new arc notation, set the sweep-flag to 0 newArc = "M" + newStart + "A" + middleSec + "0 0 0 " + newEnd; } // Create a new invisible arc that the label can flow along - svg.append("path") + _svg.append("path") .attr("class", "hiddenDonutArcs") .attr("id", "sliceOutlineArc_"+i) .attr("d", newArc) @@ -438,8 +443,8 @@ looker.plugins.visualizations.add({ // src: https://www.visualcinnamon.com/2015/09/placing-text-on-arcs.html // Line 1 - svg.selectAll(".label-line-1") - .data(pie(data)) + _svg.selectAll(".label-line-1") + .data(_pie(data)) .enter() .append("text") .attr("class", "label-line-1") @@ -461,8 +466,8 @@ looker.plugins.visualizations.add({ }); // Line 2 - svg.selectAll(".label-line-2") - .data(pie(data)) + _svg.selectAll(".label-line-2") + .data(_pie(data)) .enter() .append("text") .attr("class", "label-line-2") @@ -485,14 +490,15 @@ looker.plugins.visualizations.add({ } // legend + let legend; if (config.legend == "left") { - var legend = svg.append("g") + legend = _svg.append("g") .attr("class","legend") .attr("transform","translate(-" + width/2.2 + " ,-" + height/2.5 + ")") .style("font-size","12px") .call(d3legend) } else if (config.legend == "right") { - var legend = svg.append("g") + legend = _svg.append("g") .attr("class","legend") .attr("transform","translate(" + width/3.0 + " ,-" + height/2.5 + ")") .style("font-size","12px") @@ -527,7 +533,7 @@ looker.plugins.visualizations.add({ function handleErrors(vis, res, options) { - var check = function (group, noun, count, min, max) { + let check = function (group, noun, count, min, max) { if (!vis.addError || !vis.clearErrors) { return false; } @@ -550,7 +556,7 @@ looker.plugins.visualizations.add({ vis.clearErrors(group); return true; }; - var _a = res.fields, pivots = _a.pivots, dimensions = _a.dimension_like, measures = _a.measure_like; + let _a = res.fields, pivots = _a.pivots, dimensions = _a.dimension_like, measures = _a.measure_like; return (check('pivot-req', 'Pivot', pivots.length, options.min_pivots, options.max_pivots) && check('dim-req', 'Dimension', dimensions.length, options.min_dimensions, options.max_dimensions) && check('mes-req', 'Measure', measures.length, options.min_measures, options.max_measures)); @@ -562,18 +568,20 @@ looker.plugins.visualizations.add({ // MIT licence function d3legend(g) { g.each(function() { - var g= d3.select(this), + let lbbox; + let g= select(this), items = {}, - svg = d3.select(g.property("nearestViewportElement")), + svg_prop = select(g.property("nearestViewportElement")), legendPadding = g.attr("data-style-padding") || 5, lb = g.selectAll(".legend-box").data([true]), li = g.selectAll(".legend-items").data([true]) lb.enter().append("rect").classed("legend-box",true) - li.enter().append("g").classed("legend-items",true) + li.enter().append("g").classed("legend-items",true).each(function (d) { + lbbox = this.getBBox()}) - svg.selectAll("[data-legend]").each(function() { - var self = d3.select(this) + svg_prop.selectAll("[data-legend]").each(function() { + let self = select(this) items[self.attr("data-legend")] = { pos : self.attr("data-legend-pos") || this.getBBox().y, color : self.attr("data-legend-color") != undefined ? self.attr("data-legend-color") : self.style("fill") != 'none' ? self.style("fill") : self.style("stroke"), @@ -582,13 +590,11 @@ looker.plugins.visualizations.add({ }) // sort alphanumerically - items = d3.entries(items).sort(function(a,b) { return (a.key < b.key) ? -1 : (a.key > b.key) ? 1 : 0}) + items = Object.entries(items).sort(function(a,b) { return (a.key < b.key) ? -1 : (a.key > b.key) ? 1 : 0}) // adding rendered values to legend - for (var i = 0; i < items.length; i++) { - console.log(items[i]) - console.log(dataset_tiny[items[i].key]) - items[i].value.rendered = dataset_tiny[items[i].key] + for (let i = 0; i < items.length; i++) { + items[i].rendered = Object.keys(dataset_tiny)[i] } li.selectAll("text") @@ -609,7 +615,8 @@ looker.plugins.visualizations.add({ .style("fill",function(d) { return d.value.color}); // Reposition and resize the box - var lbbox = li[0][0].getBBox() + // console.log({li}) + //let lbbox = li.getBBox() lb.attr("x",(lbbox.x-legendPadding)) .attr("y",(lbbox.y-legendPadding)) .attr("height",(lbbox.height+2*legendPadding)) diff --git a/yarn.lock b/yarn.lock index 7ac259a..2d5db60 100644 --- a/yarn.lock +++ b/yarn.lock @@ -598,6 +598,11 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +commander@7: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -729,6 +734,268 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +d3-collection@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-scale-chromatic@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +"d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-selection@^1.3.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" + integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== + +d3-shape@3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +d3-tip@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/d3-tip/-/d3-tip-0.9.1.tgz#84e6d331c4e6650d80c5228a07e41820609ab64b" + integrity sha512-EVBfG9d+HnjIoyVXfhpytWxlF59JaobwizqMX9EBXtsFmJytjwHeYiUs74ldHQjE7S9vzfKTx2LCtvUrIbuFYg== + dependencies: + d3-collection "^1.0.4" + d3-selection "^1.3.0" + +"d3-transition@2 - 3", d3-transition@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^7.9.0: + version "7.9.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" + integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -768,6 +1035,13 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +delaunator@5: + version "5.0.1" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" + integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw== + dependencies: + robust-predicates "^3.0.2" + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -1252,6 +1526,13 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -1308,6 +1589,11 @@ ini@^1.3.4, ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + interpret@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" @@ -2132,7 +2418,7 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -2256,6 +2542,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +robust-predicates@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -2263,6 +2554,11 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" @@ -2285,7 +2581,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -2322,6 +2618,13 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serialize-javascript@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" + integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== + dependencies: + randombytes "^2.1.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"