From f05a80b3d796ac49d11a8572d3f85ec32e8e126b Mon Sep 17 00:00:00 2001 From: dave Date: Sat, 1 Jun 2019 18:45:52 -0700 Subject: [PATCH] improved chart --- .dockerignore | 6 + Dockerfile | 24 ++- assets/js/app.js | 412 ++++++++------------------------------------ dirview/__init__.py | 93 ++++++---- gruntfile.js | 16 +- package.json | 6 +- setup.py | 4 +- templates/page.html | 34 +++- webpack.config.js | 3 +- yarn.lock | 191 +++++++++++++++++++- 10 files changed, 379 insertions(+), 410 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6636969 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +testenv +testdir +node_modules +testlink +dirview.egg-info +__pycache__ diff --git a/Dockerfile b/Dockerfile index 7b8801a..5dcaa52 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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"] diff --git a/assets/js/app.js b/assets/js/app.js index b709db6..c735494 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -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" - # yield str(self.db.root) - # yield "Ready
" - # 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() diff --git a/gruntfile.js b/gruntfile.js index 1e2c86e..5df7639 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -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']); }; diff --git a/package.json b/package.json index 674959a..4d62486 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/setup.py b/setup.py index b59d92c..f86ff16 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,5 @@ setup(name='dirview', ] }, package_data={'dirview': ['../templates/*.html', - # '../templates/fragments/*.html', - # '../styles/dist/*' - ]}, + '../static/scripts.js']}, zip_safe=False) diff --git a/templates/page.html b/templates/page.html index fa79b70..9011122 100644 --- a/templates/page.html +++ b/templates/page.html @@ -3,6 +3,10 @@ NAS Viewer + - +

{{ node.path|pathjoin }}

diff --git a/webpack.config.js b/webpack.config.js index b260c16..40b3bcc 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -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/ } ]*/ diff --git a/yarn.lock b/yarn.lock index 0383745..202f18e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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"