improved chart

This commit is contained in:
dave 2019-06-01 18:45:52 -07:00
parent 82b16964d0
commit f05a80b3d7
10 changed files with 379 additions and 410 deletions

6
.dockerignore Normal file
View File

@ -0,0 +1,6 @@
testenv
testdir
node_modules
testlink
dirview.egg-info
__pycache__

View File

@ -1,7 +1,19 @@
FROM ubuntu:disco
FROM ubuntu:bionic
RUN apt-get update && \
apt-get install -y python3-pip git
RUN sed -i -E 's/(archive|security).ubuntu.com/192.168.1.142/' /etc/apt/sources.list && \
sed -i -E 's/^deb-src/# deb-src/' /etc/apt/sources.list && \
apt-get update && \
DEBIAN_FRONTEND=noninteractive \
apt-get install -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
wget gpg git && \
wget -qO- http://artifact.scc.net.davepedu.com/repo/apt/extpython/dists/bionic/install | bash /dev/stdin && \
apt-get update && \
DEBIAN_FRONTEND=noninteractive \
apt-get install -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
extpython-python3.7 && \
apt-get clean autoclean && \
apt-get autoremove -y && \
rm -rf /var/lib/{apt,dpkg,cache,log}/
# RUN apt-get update && \
# apt-get install -y python3 git wget && \
@ -12,7 +24,7 @@ RUN apt-get update && \
ADD . /tmp/code
RUN cd /tmp/code && \
pip3 install -r requirements.txt && \
python3 setup.py install
/opt/extpython/3.7/bin/pip3 install -r requirements.txt && \
/opt/extpython/3.7/bin/python3 setup.py install
ENTRYPOINT ["dirviewd"]
ENTRYPOINT ["/opt/extpython/3.7/bin/dirviewd"]

View File

@ -1,161 +1,9 @@
import * as d3 from 'd3'
import * as voronoiMap from 'd3-voronoi-map'
//import {voronoiTreemap} from 'd3-voronoi-treemap'
import treemap from 'd3-hierarchy'
import randomColor from 'randomcolor'
import chroma from 'chroma-js'
import roundTo from 'round-to'
d3.voronoiTreemap = function() {
//begin: constants
var DEFAULT_CONVERGENCE_RATIO = 0.01;
var DEFAULT_MAX_ITERATION_COUNT = 50;
var DEFAULT_MIN_WEIGHT_RATIO = 0.01;
var DEFAULT_PRNG = Math.random;
//end: constants
/////// Inputs ///////
var clip = [
[0, 0],
[0, 1],
[1, 1],
[1, 0]
]; // clipping polygon
var extent = [
[0, 0],
[1, 1]
]; // extent of the clipping polygon
var size = [1, 1]; // [width, height] of the clipping polygon
var convergenceRatio = DEFAULT_CONVERGENCE_RATIO; // targeted allowed error ratio; default 0.01 stops computation when cell areas error <= 1% clipping polygon's area
var maxIterationCount = DEFAULT_MAX_ITERATION_COUNT; // maximum allowed iteration; stops computation even if convergence is not reached; use a large amount for a sole converge-based computation stop
var minWeightRatio = DEFAULT_MIN_WEIGHT_RATIO; // used to compute the minimum allowed weight; default 0.01 means 1% of max weight; handle near-zero weights, and leaves enought space for cell hovering
var prng = DEFAULT_PRNG; // pseudorandom number generator
//begin: internals
var _voronoiMap = voronoiMap.voronoiMap();
//end: internals
///////////////////////
///////// API /////////
///////////////////////
function _voronoiTreemap(rootNode) {
_voronoiMap.weight(function (d) {
return d.value;
})
.convergenceRatio(convergenceRatio)
.maxIterationCount(maxIterationCount)
.minWeightRatio(minWeightRatio)
.prng(prng);
recurse(clip, rootNode);
};
_voronoiTreemap.convergenceRatio = function (_) {
if (!arguments.length) {
return convergenceRatio;
}
convergenceRatio = _;
return _voronoiTreemap;
};
_voronoiTreemap.maxIterationCount = function (_) {
if (!arguments.length) {
return maxIterationCount;
}
maxIterationCount = _;
return _voronoiTreemap;
};
_voronoiTreemap.minWeightRatio = function (_) {
if (!arguments.length) {
return minWeightRatio;
}
minWeightRatio = _;
return _voronoiTreemap;
};
_voronoiTreemap.clip = function (_) {
if (!arguments.length) {
return clip;
}
//begin: use voronoiMap.clip() to handle clkip/extent/size computation and borderline input (non-counterclockwise, non-convex, ...)
_voronoiMap.clip(_);
//end: use voronoiMap.clip() to handle
clip = _voronoiMap.clip();
extent = _voronoiMap.extent();
size = _voronoiMap.size();
return _voronoiTreemap;
};
_voronoiTreemap.extent = function (_) {
if (!arguments.length) {
return extent;
}
//begin: use voronoiMap.extent() to handle clkip/extent/size computation
_voronoiMap.extent(_);
//end: use voronoiMap.clip() to handle
clip = _voronoiMap.clip();
extent = _voronoiMap.extent();
size = _voronoiMap.size();
return _voronoiTreemap;
};
_voronoiTreemap.size = function (_) {
if (!arguments.length) {
return size;
}
//begin: use voronoiMap.size()
_voronoiMap.size(_);
//end: use voronoiMap.clip() to handle clip/extent/size computation
clip = _voronoiMap.clip();
extent = _voronoiMap.extent();
size = _voronoiMap.size();
return _voronoiTreemap;
};
_voronoiTreemap.prng = function (_) {
if (!arguments.length) {
return prng;
}
prng = _;
return _voronoiTreemap;
};
///////////////////////
/////// Private ///////
///////////////////////
function recurse(clippingPolygon, node) {
var voronoiMapRes;
//assign polygon to node
node.polygon = clippingPolygon;
if (node.height != 0) {
//compute one-level Voronoi map of children
voronoiMapRes = _voronoiMap.clip(clippingPolygon)(node.children);
//begin: recurse on children
voronoiMapRes.polygons.forEach(function (cp) {
recurse(cp, cp.site.originalObject.data.originalData);
})
//end: recurse on children
}
};
return _voronoiTreemap;
}
import filesize from 'filesize'
// import chroma from 'chroma-js'
// import roundTo from 'round-to'
var DIR = 1
var FILE = 2
@ -163,7 +11,6 @@ var ROOT = 3
var LINK = 4
var SPECIAL = 5
var cellColors = {}
cellColors[DIR] = randomColor();
cellColors[FILE] = randomColor();
@ -171,217 +18,94 @@ cellColors[ROOT] = randomColor();
cellColors[LINK] = randomColor();
cellColors[SPECIAL] = randomColor();
function boot() {
draw_graph();
prep_graph();
}
export default {
boot: function(){boot();}
}
// function add_colors(data) {
// data.color = randomColor();
// data.children.forEach(function(child){
// add_colors(child);
// });
// }
function draw_graph() {
// d3.json("/static/sampledata.json").then(function(rootData) {
d3.json("/chart.json?n=x&depth=2").then(function(rootData) {
initData();
// add_colors(rootData);
initLayout(rootData);
hierarchy = d3.hierarchy(rootData).sum(function(d){ return d.weight; });
// console.log(hierarchy)
_voronoiTreemap
.clip(circlingPolygon)
(hierarchy);
console.log(rootData);
drawTreemap(hierarchy);
});
function prep_graph() {
d3.json("/chart.json?n=" + _node + "&depth=" + _graph_depth).then(draw_graph);
}
//begin: constants
var _2PI = 2*Math.PI;
//end: constants
//begin: layout conf.
var svgWidth = 1500,
svgHeight = 600,
margin = {top: 10, right: 10, bottom: 10, left: 10},
height = svgHeight - margin.top - margin.bottom,
width = svgWidth - margin.left - margin.right,
halfWidth = width/2,
halfHeight = height/2,
quarterWidth = width/4,
quarterHeight = height/4,
titleY = 20,
legendsMinY = height - 20,
treemapRadius = 0,
treemapCenter = [halfWidth, halfHeight+5];
//end: layout conf.
//begin: treemap conf.
var _voronoiTreemap = d3.voronoiTreemap();
var hierarchy, circlingPolygon;
//end: treemap conf.
//begin: drawing conf.
var fontScale = d3.scaleLinear();
//end: drawing conf.
//begin: reusable d3Selection
var svg, drawingArea, treemapContainer;
//end: reusable d3Selection
function initData(rootData) {
circlingPolygon = computeCirclingPolygon(treemapRadius);
fontScale.domain([3, 20]).range([8, 20]).clamp(true);
function can_click(d) {
return d.data.typ >= 0 && d.data.num_children > 0
}
function computeCirclingPolygon(radius) {
/*var points = 60,
increment = _2PI/points,
circlingPolygon = [];
function draw_graph(data) {
var chart_width = document.getElementsByTagName("body")[0].clientWidth;
var chart_height = window.innerHeight * 0.5;
for (var a=0, i=0; i<points; i++, a+=increment) {
circlingPolygon.push(
[radius + radius*Math.cos(a), radius + radius*Math.sin(a)]
)
}
var treemapLayout = d3.treemap().tile(d3.treemapBinary); // treemapBinary, treemapSquarify
return circlingPolygon;*/
treemapLayout
.size([chart_width, chart_height])
.paddingTop(25)
.paddingRight(6)
.paddingBottom(6)
.paddingLeft(6)
return [[-svgWidth/2,-svgHeight/2], [svgWidth/2,-svgHeight/2], [svgWidth/2,svgHeight/2], [-svgWidth/2,svgHeight/2]]
};
function initLayout(rootData) {
svg = d3.select("svg")
.attr("width", svgWidth)
.attr("height", svgHeight);
d3.select('svg').attr('width', chart_width).attr('height', chart_height);
drawingArea = svg.append("g")
.classed("drawingArea", true)
.attr("transform", "translate("+[margin.left,margin.top]+")");
var root = d3.hierarchy(data);
treemapContainer = drawingArea.append("g")
.classed("treemap-container", true)
.attr("transform", "translate("+treemapCenter+")");
treemapLayout(root);
treemapContainer.append("path")
.classed("world", true)
.attr("transform", "translate("+[-treemapRadius,-treemapRadius]+")")
.attr("d", "M"+circlingPolygon.join(",")+"Z");
var nodes = d3.select('svg g.chart')
.selectAll('g')
.data(root.descendants())
.enter()
.append('g')
.attr('class', function(d) {return can_click(d) ? 'can-navigate' : 'no-navigate'})
.attr('transform', function(d) {return 'translate(' + [d.x0, d.y0] + ')'})
// drawTitle();
drawLegends(rootData);
}
nodes
.attr('width', function(d) { return d.x1 - d.x0; })
.attr('height', function(d) { return d.y1 - d.y0; })
// function drawTitle() {
// drawingArea.append("text")
// .attr("id", "title")
// .attr("transform", "translate("+[halfWidth, titleY]+")")
// .attr("text-anchor", "middle")
// .text("The Global Economy by GDP (as of 01/2017)")
// }
// Create the colored rectangles
nodes
.append('rect')
// .attr('fill', function(d){return randomColor()})
.attr('width', function(d) { return d.x1 - d.x0; })
.attr('height', function(d) { return d.y1 - d.y0; })
.attr('id', function(d) {return "node-" + d.data.id;})
.on('click', function(d){if(can_click(d)) window.location = "/?n=" + d.data.id;})
function drawLegends(rootData) {
var legendHeight = 13,
interLegend = 4,
colorWidth = legendHeight*6,
continents = rootData.children.reverse();
// Create clip paths for clipping the contents of the nodes
nodes
.append('clipPath')
.attr('id', function(d) {return "clip-" + d.data.id;})
.append('use')
.attr('href', function(d) {return "#node-" + d.data.id;})
var legendContainer = drawingArea.append("g")
.classed("legend", true)
.attr("transform", "translate("+[0, legendsMinY]+")");
var legends = legendContainer.selectAll(".legend")
.data(continents)
.enter();
var legend = legends.append("g")
.classed("legend", true)
.attr("transform", function(d,i){
return "translate("+[0, -i*(legendHeight+interLegend)]+")";
})
legend.append("rect")
.classed("legend-color", true)
.attr("y", -legendHeight)
.attr("width", colorWidth)
.attr("height", legendHeight)
.style("fill", function(d){ return cellColors[d.typ]; });
legend.append("text")
.classed("tiny", true)
.attr("transform", "translate("+[colorWidth+5, -2]+")")
.text(function(d){ return d.name; });
legendContainer.append("text")
.attr("transform", "translate("+[0, -continents.length*(legendHeight+interLegend)-5]+")")
.text("Continents");
}
function format_percent(value) {
return roundTo(value * 100, 2) + "%";
}
function drawTreemap(hierarchy) {
var leaves=hierarchy.leaves();
var cells = treemapContainer.append("g")
.classed('cells', true)
.attr("transform", "translate("+[-treemapRadius,-treemapRadius]+")")
.selectAll(".cell")
.data(leaves)
.enter()
.append("path")
.classed("cell", true)
.attr("d", function(d){ return "M"+d.polygon.join(",")+"z"; })
.style("fill", function(d){
return cellColors[d.data.typ];
});
var labels = treemapContainer.append("g")
.classed('labels', true)
.attr("transform", "translate("+[-treemapRadius,-treemapRadius]+")")
.selectAll(".label")
.data(leaves)
.enter()
.append("g")
.classed("label", true)
.attr("transform", function(d){
return "translate("+[d.polygon.site.x, d.polygon.site.y]+")";
// Name labels
nodes
.append('a')
.attr('href', function(d){if(can_click(d)) return "/?n=" + d.data.id;})
.append('text')
.attr('dx', 2)
.attr('dy', "1em")
.attr('clip-path', function(d) {return "url(#clip-" + d.data.id + ")"})
.text(function(d) {
return d.data.name + (d.data.typ == DIR? "/":"")
})
.style("font-size", function(d){ return fontScale(d.data.weight*100); });
labels.append("text")
.classed("name", true)
.html(function(d){
return d.data.name; //(d.data.weight<1)? d.data.code : d.data.name;
});
labels.append("text")
.classed("value", true)
.text(function(d){ return format_percent(d.data.weight); });
// Size values
nodes
.append('text')
.attr('dx', 2)
.attr('dy', "2em")
.text(function(d) {
return filesize(d.data.value);
})
.attr('clip-path', function(d) {return "url(#clip-" + d.data.id + ")"})
var hoverers = treemapContainer.append("g")
.classed('hoverers', true)
.attr("transform", "translate("+[-treemapRadius,-treemapRadius]+")")
.selectAll(".hoverer")
.data(leaves)
.enter()
.append("path")
.classed("hoverer", true)
.attr("d", function(d){ return "M"+d.polygon.join(",")+"z"; });
hoverers.append("title")
.text(function(d) { return d.data.name + "\n" + format_percent(d.value); });
var nodecnt = 0
nodes.each(function(){nodecnt++;})
console.log("total nodes: " + nodecnt)
}

View File

@ -49,7 +49,7 @@ class AppWeb(object):
return self.tpl.get_template(template). \
render(**kwargs,
NodeType=NodeType,
NodeGroup=NodeGroup) #, **self.get_default_vars())
NodeGroup=NodeGroup) #, **self.get_default_vars())
@cherrypy.expose
def index(self, n=None):
@ -69,62 +69,79 @@ class AppWeb(object):
dur = time() - start
return page + f"\n<!-- render time: {round(dur, 4)} -->"
# yield str(self.db.root)
# yield "Ready<br />"
# from time import time
# start = time()
# num_nodes = len([i for i in self.db.root.iter()])
# dur = time() - start
# yield f"num nodes: {num_nodes} in {round(dur, 3)}"
@cherrypy.expose
def chart_json(self, n, depth=2):
# try:
# node = self.db.index[int(n)]
# except (ValueError, KeyError):
# raise cherrypy.HTTPError(404)
node = self.db.root
start = time()
try:
node = self.db.index[int(n)]
except (ValueError, KeyError):
raise cherrypy.HTTPError(404)
data = AppWeb.export_children(node, depth=int(depth))
data["render_time"] = round(time() - start, 4)
cherrypy.response.headers["Content-type"] = "application/json"
return json.dumps(data).encode("utf-8")
@staticmethod
def export_children(entry, depth, max_children=10):
def export_children(entry, depth, min_children=25, max_children=50):
"""
:param entry: node to recurse from. is included as the parent
:param depth: how many layers to add under the parent node
:param max_children: maximum number of children under a node, others are combined
:param thresh: nodes smaller than this size will be combined into a group
"""
children = []
if depth:
others = []
for child in entry.children:
child_data = AppWeb.export_children(child, depth - 1)
if child.total_size > 0:
children.append(AppWeb.export_children(child,
depth=depth - 1,
min_children=min_children,
max_children=max_children))
if entry.total_size > 0:
child_data["weight"] = child_data["size"] / entry.total_size
else:
child_data["weight"] = 0
children.sort(key=lambda c: c["value"],
reverse=True)
if len(children) < max_children:
children.append(child_data)
else:
others.append(child_data)
# scan down the children until we've covered $thresh of the parent size
thresh = 0.95 # The lower (1-$thresh) of nodes, sorted by size, will be combined into a group
min_size = 100 / max_children / 100 # 50 max children means nodes under 2% max size must be combined
child_sum = 0
last_offset = 0
for offset, child in enumerate(children):
child_sum += child["value"]
last_offset = offset
if offset > max_children:
break # max children
# continue # min children
if child["value"] / entry.total_size < min_size and offset > min_children:
break
if child_sum / entry.total_size > thresh:
break
others = children[last_offset + 1:]
children = children[0:last_offset + 1]
if others:
other_sz = sum([i["size"] for i in others])
children.append({"name": f"({len(others)} others)",
"typ": NodeType.SPECIAL.value,
"size": other_sz,
other_sz = sum([i["value"] for i in others])
other_children = sum([i["num_children"] for i in others])
children.append({"id": id(others[0]),
"name": f"({len(others)} others)",
"typ": -1,
"value": max(other_sz, 1),
"children": [],
"weight": other_sz / entry.total_size if entry.total_size > 0 else 0,
"num_children": other_children,
"total_children": child["total_children"],
})
children.sort(key=lambda c: c["size"],
reverse=True)
return {"name": entry.name,
return {"id": id(entry),
"name": entry.name,
"typ": entry.typ.value,
"size": entry.total_size,
"children": children}
"value": max(entry.total_size, 1),
"children": children,
"num_children": len(entry.children),
"total_children": entry.total_children, }
def main():
@ -141,7 +158,7 @@ def main():
logging.basicConfig(level=logging.INFO if args.debug else logging.WARNING,
format="%(asctime)-15s %(levelname)-8s %(filename)s:%(lineno)d %(message)s")
tpl_dir = os.path.join(APPROOT, "templates") if not args.debug else "templates"
tpl_dir = os.path.join(APPROOT, "templates")
db = DbUpdater(args.dir, args.cache)
db.start()

View File

@ -23,6 +23,17 @@ module.exports = function(grunt) {
dev: webpackConfig,
},
babel: {
options: {
sourceMap: true
},
dist: {
files: {
"static/scripts.js": "static/scripts.jsx"
}
}
},
/*concat: {
deps_js: {
src: [
@ -40,7 +51,7 @@ module.exports = function(grunt) {
watch: {
concat: {
files: ['assets/js/*.js'],
tasks: ['webpack:dev'],
tasks: ['webpack:dev', 'babel'],
// options: {
// spawn: false
// }
@ -53,8 +64,9 @@ module.exports = function(grunt) {
// grunt.loadNpmTasks('grunt-contrib-cssmin');
// grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-webpack');
grunt.loadNpmTasks('grunt-babel');
// grunt.registerTask('default', ['less:website', 'cssmin:website', 'concat:dist']);
grunt.registerTask('default', ['webpack:dev']);
grunt.registerTask('default', ['webpack:dev', 'babel']);
};

View File

@ -11,12 +11,14 @@
"chroma-js": "^2.0.3",
"d3": "^5.9.2",
"d3-voronoi-treemap": "^1.1.0",
"randomcolor": "^0.5.4",
"round-to": "^4.0.0"
"filesize": "^4.1.2",
"randomcolor": "^0.5.4"
},
"scripts": {},
"devDependencies": {
"@babel/core": "^7.4.5",
"grunt": "^1.0.4",
"grunt-babel": "^8.0.0",
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-watch": "^1.1.0",
"grunt-webpack": "^3.1.3",

View File

@ -16,7 +16,5 @@ setup(name='dirview',
]
},
package_data={'dirview': ['../templates/*.html',
# '../templates/fragments/*.html',
# '../styles/dist/*'
]},
'../static/scripts.js']},
zip_safe=False)

View File

@ -3,6 +3,10 @@
<head>
<meta charset="UTF-8">
<title>NAS Viewer</title>
<script type="text/javascript">
var _node = {{ node|id }};
var _graph_depth = 2;
</script>
<script src="/static/scripts.js" type="text/javascript"></script>
<style>
* {
@ -22,10 +26,30 @@
float: right;
width: 50%;
}
svg {
/*width: 1650px;*/
/*height: 600px;*/
max-width: 100%;
color: #fff;
font-size: 10px;
font-family: arial, sans-serif;
}
svg rect {
fill: cadetblue;
opacity: 0.3;
stroke: white;
}
svg g.chart>g.can-navigate:hover {
cursor: pointer;
}
svg g.chart>g.can-navigate:hover a {
text-decoration: underline;
}
svg a:hover {
svg {
}
/*
svg {
background-color: rgb(250,250,250);
}
@ -78,11 +102,11 @@
.legend-color {
stroke-width: 1px;
stroke:darkgrey;
}
}*/
</style>
</head>
<body onload="Application.boot();">
<svg></svg>
<svg><g class="chart"></g></svg>
<div class="viewer">
<h1>{{ node.path|pathjoin }}</h1>
<div>

View File

@ -4,11 +4,12 @@ module.exports = {
entry: './assets/js/main.js',
output: {
path: path.resolve('static'),
filename: 'scripts.js',
filename: 'scripts.jsx',
libraryTarget: 'var',
library: 'Application'
},
module: {
// devtool: 'source-map'
/*loaders: [
{ test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }
]*/

191
yarn.lock
View File

@ -2,6 +2,123 @@
# yarn lockfile v1
"@babel/code-frame@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8"
integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==
dependencies:
"@babel/highlight" "^7.0.0"
"@babel/core@^7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a"
integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/generator" "^7.4.4"
"@babel/helpers" "^7.4.4"
"@babel/parser" "^7.4.5"
"@babel/template" "^7.4.4"
"@babel/traverse" "^7.4.5"
"@babel/types" "^7.4.4"
convert-source-map "^1.1.0"
debug "^4.1.0"
json5 "^2.1.0"
lodash "^4.17.11"
resolve "^1.3.2"
semver "^5.4.1"
source-map "^0.5.0"
"@babel/generator@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041"
integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==
dependencies:
"@babel/types" "^7.4.4"
jsesc "^2.5.1"
lodash "^4.17.11"
source-map "^0.5.0"
trim-right "^1.0.1"
"@babel/helper-function-name@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53"
integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==
dependencies:
"@babel/helper-get-function-arity" "^7.0.0"
"@babel/template" "^7.1.0"
"@babel/types" "^7.0.0"
"@babel/helper-get-function-arity@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3"
integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==
dependencies:
"@babel/types" "^7.0.0"
"@babel/helper-split-export-declaration@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677"
integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==
dependencies:
"@babel/types" "^7.4.4"
"@babel/helpers@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5"
integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==
dependencies:
"@babel/template" "^7.4.4"
"@babel/traverse" "^7.4.4"
"@babel/types" "^7.4.4"
"@babel/highlight@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4"
integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==
dependencies:
chalk "^2.0.0"
esutils "^2.0.2"
js-tokens "^4.0.0"
"@babel/parser@^7.4.4", "@babel/parser@^7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872"
integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==
"@babel/template@^7.1.0", "@babel/template@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237"
integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/parser" "^7.4.4"
"@babel/types" "^7.4.4"
"@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216"
integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/generator" "^7.4.4"
"@babel/helper-function-name" "^7.1.0"
"@babel/helper-split-export-declaration" "^7.4.4"
"@babel/parser" "^7.4.5"
"@babel/types" "^7.4.4"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.11"
"@babel/types@^7.0.0", "@babel/types@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0"
integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==
dependencies:
esutils "^2.0.2"
lodash "^4.17.11"
to-fast-properties "^2.0.0"
"@webassemblyjs/ast@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
@ -546,7 +663,7 @@ chalk@^1.0.0:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
chalk@^2.4.1, chalk@~2.4.1:
chalk@^2.0.0, chalk@^2.4.1, chalk@~2.4.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@ -705,6 +822,13 @@ continuable-cache@^0.3.1:
resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f"
integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=
convert-source-map@^1.1.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
dependencies:
safe-buffer "~5.1.1"
copy-concurrently@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
@ -1109,6 +1233,13 @@ debug@^3.1.0, debug@^3.2.6:
dependencies:
ms "^2.1.1"
debug@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
dependencies:
ms "^2.1.1"
decamelize@^1.1.2, decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@ -1286,6 +1417,11 @@ estraverse@^4.1.0, estraverse@^4.1.1:
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
esutils@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
eventemitter2@~0.4.13:
version "0.4.14"
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
@ -1393,6 +1529,11 @@ figgy-pudding@^3.5.1:
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
filesize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.1.2.tgz#fcd570af1353cea97897be64f56183adb995994b"
integrity sha512-iSWteWtfNcrWQTkQw8ble2bnonSl7YJImsn9OZKpE2E4IHhXI78eASpDYUljXZZdYj36QsEKjOs/CsiDqmKMJw==
fill-range@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@ -1613,6 +1754,11 @@ global-prefix@^1.0.1:
is-windows "^1.0.1"
which "^1.2.14"
globals@^11.1.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globule@^1.0.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
@ -1627,6 +1773,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
grunt-babel@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/grunt-babel/-/grunt-babel-8.0.0.tgz#92ef63aafadf938c488dc2f926ac9846e0c93d1b"
integrity sha512-WuiZFvGzcyzlEoPIcY1snI234ydDWeWWV5bpnB7PZsOLHcDsxWKnrR1rMWEUsbdVPPjvIirwFNsuo4CbJmsdFQ==
grunt-cli@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8"
@ -2073,6 +2224,11 @@ isobject@^3.0.0, isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-yaml@~3.13.0:
version "3.13.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
@ -2081,6 +2237,11 @@ js-yaml@~3.13.0:
argparse "^1.0.7"
esprima "^4.0.0"
jsesc@^2.5.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
json-parse-better-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
@ -2098,6 +2259,13 @@ json5@^1.0.1:
dependencies:
minimist "^1.2.0"
json5@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850"
integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==
dependencies:
minimist "^1.2.0"
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@ -3028,7 +3196,7 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@^1.10.0:
resolve@^1.10.0, resolve@^1.3.2:
version "1.11.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232"
integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==
@ -3060,11 +3228,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
round-to@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/round-to/-/round-to-4.0.0.tgz#7576de9f721e58bd8116757fc3ba10f44d5b3886"
integrity sha512-2HD3qSm7FGv1uBQywsK43YtSeXQhh5CUscaFGsvbr38oZzfLqoPQAPw2ngvpXKruAEsn7WuPXdq1mrUSkR70MQ==
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"
@ -3113,7 +3276,7 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0"
ajv-keywords "^3.1.0"
"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0:
"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
version "5.7.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
@ -3237,7 +3400,7 @@ source-map-url@^0.4.0:
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
source-map@^0.5.3, source-map@^0.5.6:
source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@ -3503,6 +3666,11 @@ to-arraybuffer@^1.0.0:
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
to-object-path@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
@ -3533,6 +3701,11 @@ trim-newlines@^1.0.0:
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
trim-right@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
tslib@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"