From f4ec11609db5ab11130caa12f9d12514b54b170e Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Wed, 7 Aug 2019 20:10:01 +0200
Subject: [PATCH 01/11] add codechecks badge
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 7e427f3..c5f1c2f 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,7 @@
+
From 768b6a5c68c465b06663e2d24e14b1948b15b37e Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Wed, 7 Aug 2019 20:46:00 +0200
Subject: [PATCH 02/11] add codechecks
---
.circleci/config.yml | 6 +++++-
codechecks.yml | 5 +++++
package.json | 3 ++-
yarn.lock | 43 ++++++++++++++++++++++++++-----------------
4 files changed, 38 insertions(+), 19 deletions(-)
create mode 100644 codechecks.yml
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 9fee364..0f502a0 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -22,4 +22,8 @@ jobs:
- run:
name: Run tests
- command: yarn test
\ No newline at end of file
+ command: yarn test
+
+ - run:
+ name: Run codechecks
+ command: yarn codechecks
\ No newline at end of file
diff --git a/codechecks.yml b/codechecks.yml
new file mode 100644
index 0000000..04980a5
--- /dev/null
+++ b/codechecks.yml
@@ -0,0 +1,5 @@
+checks:
+ - name: ban-deps-codecheck
+ options:
+ - name: node-gyp
+ reason: "No native modules please! They make installation much harder"
\ No newline at end of file
diff --git a/package.json b/package.json
index 774c8d3..954b193 100644
--- a/package.json
+++ b/package.json
@@ -39,7 +39,8 @@
"lib/**/*"
],
"devDependencies": {
- "@codechecks/client": "^0.1.0",
+ "@codechecks/ban-deps-codecheck": "^0.1.1",
+ "@codechecks/client": "^0.1.5",
"@types/bluebird": "^3.5.25",
"@types/bytes": "^3.0.0",
"@types/glob": "^7.1.1",
diff --git a/yarn.lock b/yarn.lock
index 89db192..cf1176a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -18,12 +18,20 @@
esutils "^2.0.2"
js-tokens "^4.0.0"
-"@codechecks/client@^0.1.0":
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/@codechecks/client/-/client-0.1.0.tgz#148909a05832ebc4000b0c2eab48d266f486ce79"
- integrity sha512-zzYroWMmJKAEPldCQRLJnK7BXT6D8KM94+NyTy4piCwHXySSBZbn0f4OrXWi3wMBTk9mzJeOw4voMbMxTYb8Ug==
+"@codechecks/ban-deps-codecheck@^0.1.1":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@codechecks/ban-deps-codecheck/-/ban-deps-codecheck-0.1.1.tgz#978e3adcc169912c35246367de26e64baf29c404"
+ integrity sha512-A1pyynckpS8BfmORO2p+bmpWLx9913uWo2ri2kAkGq/pVC7wWeuInLu2hKd2MFcOfIr9X2PhbrO06g8LNAdjig==
+ dependencies:
+ execa "1"
+
+"@codechecks/client@^0.1.5":
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@codechecks/client/-/client-0.1.5.tgz#635d905ea2db6e2502a7510dabdba24ddef44d56"
+ integrity sha512-/IcKf0j8dDXjlC3D1RgRNGGk0oo1733v+QH9rnp9urZe/+9fAi0M0aTqYl060ZTnyJgwh9Fek+/5zkOswVFJQA==
dependencies:
bluebird "^3.5.3"
+ chalk "^2.4.2"
commander "^2.19.0"
debug "^4.1.1"
execa "^1.0.0"
@@ -31,6 +39,7 @@
graceful-fs "^4.1.15"
js-yaml "^3.13.1"
json5 "^2.1.0"
+ lodash "^4.17.11"
marked "^0.6.2"
marked-terminal "^3.2.0"
mkdirp "^0.5.1"
@@ -659,7 +668,7 @@ chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
-chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1:
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1049,26 +1058,26 @@ exec-sh@^0.2.0:
dependencies:
merge "^1.2.0"
-execa@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
- integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
+execa@1, execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
dependencies:
- cross-spawn "^5.0.1"
- get-stream "^3.0.0"
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
signal-exit "^3.0.0"
strip-eof "^1.0.0"
-execa@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
- integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
dependencies:
- cross-spawn "^6.0.0"
- get-stream "^4.0.0"
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
From df85549ec080ec74a2fac84a2a87715988f31792 Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Wed, 7 Aug 2019 20:48:16 +0200
Subject: [PATCH 03/11] add type-coverage-watcher
---
codechecks.yml | 2 ++
package.json | 1 +
yarn.lock | 52 +++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/codechecks.yml b/codechecks.yml
index 04980a5..1b2344f 100644
--- a/codechecks.yml
+++ b/codechecks.yml
@@ -1,4 +1,6 @@
checks:
+ - name: type-coverage-watcher
+
- name: ban-deps-codecheck
options:
- name: node-gyp
diff --git a/package.json b/package.json
index 954b193..791027c 100644
--- a/package.json
+++ b/package.json
@@ -41,6 +41,7 @@
"devDependencies": {
"@codechecks/ban-deps-codecheck": "^0.1.1",
"@codechecks/client": "^0.1.5",
+ "@codechecks/type-coverage-watcher": "^0.1.3",
"@types/bluebird": "^3.5.25",
"@types/bytes": "^3.0.0",
"@types/glob": "^7.1.1",
diff --git a/yarn.lock b/yarn.lock
index cf1176a..b1fdd74 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -51,6 +51,14 @@
ts-node "^8.0.2"
url-join "^4.0.0"
+"@codechecks/type-coverage-watcher@^0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@codechecks/type-coverage-watcher/-/type-coverage-watcher-0.1.3.tgz#5ce5d7599762d4c2c31e384eee16db1b70fdd0b2"
+ integrity sha512-1eeimISnvcTS1bV+OQI1Zt9ruj3+Ix5GGEMbs54S1flyIU1tKGGRNVBNqTmETCkQMfjcNb6T/T7S6o+L7O0pnQ==
+ dependencies:
+ lodash "^4.17.11"
+ type-coverage-core "^2.2.0"
+
"@types/bluebird@^3.5.25":
version "3.5.25"
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.25.tgz#59188b871208092e37767e4b3d80c3b3eaae43bd"
@@ -1379,6 +1387,18 @@ glob-parent@^2.0.0:
dependencies:
is-glob "^2.0.0"
+glob@7:
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
+ integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3:
version "7.1.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
@@ -2556,7 +2576,7 @@ mimic-fn@^1.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
-minimatch@^3.0.3, minimatch@^3.0.4:
+minimatch@3, minimatch@^3.0.3, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -3792,6 +3812,14 @@ ts-jest@^23.10.5:
semver "^5.5"
yargs-parser "10.x"
+ts-lib-utils@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/ts-lib-utils/-/ts-lib-utils-2.2.0.tgz#dbf198ba67e2fee027f36bd2f9c0cbd638ed1731"
+ integrity sha512-yfZWuQs5bfQA2RLJdHUOSL2+Iw4NcZ8eKglVVW25aXi3sdLEoJxHB3tC2CN+x4MY4X39tcFCGlE5V7IF8O3m8w==
+ dependencies:
+ glob "7"
+ tslib "1"
+
ts-node@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf"
@@ -3817,6 +3845,11 @@ ts-node@^8.0.2:
source-map-support "^0.5.6"
yn "^3.0.0"
+tslib@1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
+ integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+
tslib@^1.8.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
@@ -3866,6 +3899,13 @@ tslint@^5.12.1:
tslib "^1.8.0"
tsutils "^2.27.2"
+tsutils@3:
+ version "3.17.1"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
+ integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
+ dependencies:
+ tslib "^1.8.1"
+
tsutils@^2.27.2:
version "2.29.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
@@ -3899,6 +3939,16 @@ type-check@~0.3.2:
dependencies:
prelude-ls "~1.1.2"
+type-coverage-core@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/type-coverage-core/-/type-coverage-core-2.2.0.tgz#436ebe4f1b7bfd36ab019c840147fbcbb4bd4f1f"
+ integrity sha512-b7NTFy8HSo57C0zvJK5Vy8K+KWmQEyCFvXE7E8I6VXtt6clHuDg8z4L+CfnSGtt1ZovDu2C6+qjmBgdTZHeJyw==
+ dependencies:
+ minimatch "3"
+ ts-lib-utils "^2.2.0"
+ tslib "1"
+ tsutils "3"
+
typescript@^3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.2.tgz#fe8101c46aa123f8353523ebdcf5730c2ae493e5"
From 3883186694ff8eb382de2ad7fe27a24da4837c84 Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Wed, 7 Aug 2019 21:38:36 +0200
Subject: [PATCH 04/11] add charting library basics
---
package.json | 4 +-
src/charts/generateChart.ts | 25 ++
src/charts/vega-spec.json | 88 +++++++
tsconfig.json | 3 +-
yarn.lock | 473 +++++++++++++++++++++++++++++++++++-
5 files changed, 590 insertions(+), 3 deletions(-)
create mode 100644 src/charts/generateChart.ts
create mode 100644 src/charts/vega-spec.json
diff --git a/package.json b/package.json
index 791027c..753fb88 100644
--- a/package.json
+++ b/package.json
@@ -68,10 +68,12 @@
},
"dependencies": {
"bytes": "^3.0.0",
+ "canvas": "^2.5.0",
"get-folder-size": "^2.0.0",
"glob": "^7.1.3",
"gzip-size": "^5.0.0",
- "lodash": "^4.17.11"
+ "lodash": "^4.17.11",
+ "vega": "^5.4.0"
},
"publishConfig": {
"access": "public"
diff --git a/src/charts/generateChart.ts b/src/charts/generateChart.ts
new file mode 100644
index 0000000..1cfc20a
--- /dev/null
+++ b/src/charts/generateChart.ts
@@ -0,0 +1,25 @@
+import * as vega from "vega";
+import * as fs from "fs";
+
+const chartDefinition = require("./vega-spec.json");
+
+interface DataPoint {
+ x: string;
+ y: number;
+}
+
+export async function generateChart(path: string, dataPoints: DataPoint[]): Promise {
+ const wrappedDataPoints = [
+ {
+ name: "main",
+ values: dataPoints.map(dp => ({ ...dp, c: 0 })),
+ },
+ ];
+ chartDefinition.data = wrappedDataPoints;
+
+ const view = new vega.View(vega.parse(chartDefinition), { renderer: "none" }).initialize();
+
+ const canvas = await view.toCanvas();
+
+ fs.writeFileSync(path, canvas.toBuffer());
+}
diff --git a/src/charts/vega-spec.json b/src/charts/vega-spec.json
new file mode 100644
index 0000000..63b920f
--- /dev/null
+++ b/src/charts/vega-spec.json
@@ -0,0 +1,88 @@
+{
+ "$schema": "https://vega.github.io/schema/vega/v5.json",
+ "width": 500,
+ "height": 200,
+ "padding": 5,
+
+ "signals": [
+ {
+ "name": "interpolate",
+ "value": "linear",
+ "bind": {
+ "input": "select",
+ "options": [
+ "basis",
+ "cardinal",
+ "catmull-rom",
+ "linear",
+ "monotone",
+ "natural",
+ "step",
+ "step-after",
+ "step-before"
+ ]
+ }
+ }
+ ],
+
+ "data": [],
+
+ "scales": [
+ {
+ "name": "x",
+ "type": "point",
+ "range": "width",
+ "domain": { "data": "main", "field": "x" }
+ },
+ {
+ "name": "y",
+ "type": "linear",
+ "range": "height",
+ "nice": true,
+ "zero": true,
+ "domain": { "data": "main", "field": "y" }
+ },
+ {
+ "name": "color",
+ "type": "ordinal",
+ "range": "category",
+ "domain": { "data": "main", "field": "c" }
+ }
+ ],
+
+ "axes": [{ "orient": "bottom", "scale": "x" }, { "orient": "left", "scale": "y" }],
+
+ "marks": [
+ {
+ "type": "group",
+ "from": {
+ "facet": {
+ "name": "series",
+ "data": "main",
+ "groupby": "c"
+ }
+ },
+ "marks": [
+ {
+ "type": "line",
+ "from": { "data": "series" },
+ "encode": {
+ "enter": {
+ "x": { "scale": "x", "field": "x" },
+ "y": { "scale": "y", "field": "y" },
+ "stroke": { "scale": "color", "field": "c" },
+ "strokeWidth": { "value": 2 }
+ },
+ "update": {
+ "interpolate": { "signal": "interpolate" },
+ "fillOpacity": { "value": 1 }
+ },
+ "hover": {
+ "fillOpacity": { "value": 0.5 }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tsconfig.json b/tsconfig.json
index 8330342..9c04187 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -16,7 +16,8 @@
"lib": ["es2015", "esnext.asynciterable"],
"sourceMap": true,
"declaration": true,
- "outDir": "lib"
+ "outDir": "lib",
+ "skipLibCheck": true
},
"include": ["src/**/*.ts"],
"exclude": ["node_modules"]
diff --git a/yarn.lock b/yarn.lock
index b1fdd74..1ac5723 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -645,6 +645,15 @@ camelcase@^4.1.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
+canvas@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.5.0.tgz#cf0ef59d4790575689c0d50e59c7b8023a11f38a"
+ integrity sha512-wwRz2cLMgb9d+rnotOJCoc04Bzj3aJMpWc6JxAD6lP7bYz0ldcn0sKddoZ0vhD5T8HBxrK+XmRDJb68/2VqARw==
+ dependencies:
+ nan "^2.13.2"
+ node-pre-gyp "^0.11.0"
+ simple-get "^3.0.3"
+
capture-exit@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f"
@@ -763,6 +772,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
dependencies:
delayed-stream "~1.0.0"
+commander@2:
+ version "2.20.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
+ integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
+
commander@^2.12.1, commander@^2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@@ -842,6 +856,125 @@ cssstyle@^1.0.0:
dependencies:
cssom "0.3.x"
+d3-array@1, d3-array@^1.1.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
+ integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
+
+"d3-array@1.2.0 - 2", d3-array@^2.0.3:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.2.0.tgz#a9e966b8f8d78f0888d98db1fb840fc8da8ac5c7"
+ integrity sha512-eE0QmSh6xToqM3sxHiJYg/QFdNn52ZEgmFE8A8abU8GsHvsIOolqH8B70/8+VGAKm5MlwaExhqR3DLIjOJMLPA==
+
+d3-color@1, d3-color@^1.2.3:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.3.0.tgz#675818359074215b020dc1d41d518136dcb18fa9"
+ integrity sha512-NHODMBlj59xPAwl2BDiO2Mog6V+PrGRtBfWKqKRrs9MCqlSkIEb0Z/SfY7jW29ReHTDC/j+vwXhnZcXI3+3fbg==
+
+d3-contour@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3"
+ integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==
+ dependencies:
+ d3-array "^1.1.1"
+
+d3-dispatch@1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.5.tgz#e25c10a186517cd6c82dd19ea018f07e01e39015"
+ integrity sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==
+
+d3-dsv@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.1.1.tgz#aaa830ecb76c4b5015572c647cc6441e3c7bb701"
+ integrity sha512-1EH1oRGSkeDUlDRbhsFytAXU6cAmXFzc52YUe6MRlPClmWb85MP1J5x+YJRzya4ynZWnbELdSAvATFW/MbxaXw==
+ dependencies:
+ commander "2"
+ iconv-lite "0.4"
+ rw "1"
+
+d3-force@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-2.0.1.tgz#31750eee8c43535301d571195bf9683beda534e2"
+ integrity sha512-zh73/N6+MElRojiUG7vmn+3vltaKon7iD5vB/7r9nUaBeftXMzRo5IWEG63DLBCto4/8vr9i3m9lwr1OTJNiCg==
+ dependencies:
+ d3-dispatch "1"
+ d3-quadtree "1"
+ d3-timer "1"
+
+d3-format@1, d3-format@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.3.2.tgz#6a96b5e31bcb98122a30863f7d92365c00603562"
+ integrity sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==
+
+d3-geo@^1.11.3:
+ version "1.11.6"
+ resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.11.6.tgz#134f2ef035ff75a448075fafdea92702a2e0e0cf"
+ integrity sha512-z0J8InXR9e9wcgNtmVnPTj0TU8nhYT6lD/ak9may2PdKqXIeHUr8UbFLoCtrPYNsjv6YaLvSDQVl578k6nm7GA==
+ dependencies:
+ d3-array "1"
+
+d3-hierarchy@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz#7a6317bd3ed24e324641b6f1e76e978836b008cc"
+ integrity sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==
+
+d3-interpolate@1, d3-interpolate@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.3.2.tgz#417d3ebdeb4bc4efcc8fd4361c55e4040211fd68"
+ integrity sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==
+ dependencies:
+ d3-color "1"
+
+d3-path@1, d3-path@^1.0.7:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.8.tgz#4a0606a794d104513ec4a8af43525f374b278719"
+ integrity sha512-J6EfUNwcMQ+aM5YPOB8ZbgAZu6wc82f/0WFxrxwV6Ll8wBwLaHLKCqQ5Imub02JriCVVdPjgI+6P3a4EWJCxAg==
+
+d3-quadtree@1:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.6.tgz#d1ab2a95a7f27bbde88582c94166f6ae35f32056"
+ integrity sha512-NUgeo9G+ENQCQ1LsRr2qJg3MQ4DJvxcDNCiohdJGHt5gRhBW6orIB5m5FJ9kK3HNL8g9F4ERVoBzcEwQBfXWVA==
+
+d3-scale@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.0.1.tgz#f7b5e7046ad83b35399639455bf5218a3cc1d1bc"
+ integrity sha512-f+OsXyd0claf6ufjI52zBHyOnm6mmfFvYiGUU8UB2VumZpqCcxds5iWN1rcOACIHgw9MntTFLXmi4LBRmY4DwQ==
+ dependencies:
+ d3-array "1.2.0 - 2"
+ d3-format "1"
+ d3-interpolate "1"
+ d3-time "1"
+ d3-time-format "2"
+
+d3-shape@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.5.tgz#e81aea5940f59f0a79cfccac012232a8987c6033"
+ integrity sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==
+ dependencies:
+ d3-path "1"
+
+d3-time-format@2, d3-time-format@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.3.tgz#ae06f8e0126a9d60d6364eac5b1533ae1bac826b"
+ integrity sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==
+ dependencies:
+ d3-time "1"
+
+d3-time@1, d3-time@^1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.11.tgz#1d831a3e25cd189eb256c17770a666368762bbce"
+ integrity sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw==
+
+d3-timer@1, d3-timer@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.9.tgz#f7bb8c0d597d792ff7131e1c24a36dd471a471ba"
+ integrity sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==
+
+d3-voronoi@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297"
+ integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==
+
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -889,6 +1022,13 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
@@ -1557,7 +1697,7 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
-iconv-lite@0.4.24, iconv-lite@^0.4.4:
+iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.4:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -2576,6 +2716,11 @@ mimic-fn@^1.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+mimic-response@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
minimatch@3, minimatch@^3.0.3, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
@@ -2650,6 +2795,11 @@ ms@^2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+nan@^2.13.2:
+ version "2.14.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
+ integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
+
nan@^2.9.2:
version "2.12.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552"
@@ -2698,6 +2848,11 @@ node-emoji@^1.4.1:
dependencies:
lodash.toarray "^4.4.0"
+node-fetch@^2.5.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
+ integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
+
node-int64@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
@@ -2729,6 +2884,22 @@ node-pre-gyp@^0.10.0:
semver "^5.3.0"
tar "^4"
+node-pre-gyp@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054"
+ integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
nopt@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
@@ -3334,6 +3505,11 @@ rsvp@^3.3.3:
resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==
+rw@1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
+ integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=
+
safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -3424,6 +3600,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
+simple-concat@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
+ integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
+
+simple-get@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.0.3.tgz#924528ac3f9d7718ce5e9ec1b1a69c0be4d62efa"
+ integrity sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw==
+ dependencies:
+ decompress-response "^3.3.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
sisteransi@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce"
@@ -3750,6 +3940,13 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
+topojson-client@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.0.0.tgz#1f99293a77ef42a448d032a81aa982b73f360d2f"
+ integrity sha1-H5kpOnfvQqRI0DKoGqmCtz82DS8=
+ dependencies:
+ commander "2"
+
tough-cookie@>=2.3.3:
version "3.0.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.0.tgz#d2bceddebde633153ff20a52fa844a0dc71dacef"
@@ -4036,6 +4233,280 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
+vega-canvas@^1.2.0, vega-canvas@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/vega-canvas/-/vega-canvas-1.2.1.tgz#ee0586e2a1f096f6a5d1710df61ef501562c2bd4"
+ integrity sha512-k/S3EPeJ37D7fYDhv4sEg7fNWVpLheQY7flfLyAmJU7aSwCMgw8cZJi0CKHchJeculssfH+41NCqvRB1QtaJnw==
+
+vega-crossfilter@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/vega-crossfilter/-/vega-crossfilter-4.0.1.tgz#9fab0dc5445e846d732c83ac2b5a72225bc6fdf1"
+ integrity sha512-wLNS4JzKaOLj8EAzI/v8XBJjUWMRWYSu6EeQF4o9Opq/78u87Ol9Lc5I27UHsww5dNNH/tHubAV4QPIXnGOp5Q==
+ dependencies:
+ d3-array "^2.0.3"
+ vega-dataflow "^5.1.0"
+ vega-util "^1.8.0"
+
+vega-dataflow@^5.1.0, vega-dataflow@^5.1.1, vega-dataflow@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/vega-dataflow/-/vega-dataflow-5.2.1.tgz#82aa6a2aca5c61a6924b4561b6e3ab51bd473f8f"
+ integrity sha512-Yer0BlKVemxrlPwDF1p1z/dcMQZdzJNPAoVmp58GQsp4EyS4zW6yFOnMrLAxvU2SU6hywNbtL+7PBDVzzffgNw==
+ dependencies:
+ vega-loader "^4.0.0"
+ vega-util "^1.10.0"
+
+vega-encode@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/vega-encode/-/vega-encode-4.3.0.tgz#cf719c052e6dc63ee260941bdb7c4c1ee71cd0fb"
+ integrity sha512-Ha8NsjAL6ZOhYTxGLXtwGQE+SdtImMXU+IX/zJswTGOJspXgeLw/HTRFKlsIxuI+jRv+paDEIvhGTedROnLQ+Q==
+ dependencies:
+ d3-array "^2.0.3"
+ d3-format "^1.3.2"
+ d3-interpolate "^1.3.2"
+ d3-time-format "^2.1.3"
+ vega-dataflow "^5.1.1"
+ vega-scale "^4.1.1"
+ vega-util "^1.8.0"
+
+vega-event-selector@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/vega-event-selector/-/vega-event-selector-2.0.0.tgz#6af8dc7345217017ceed74e9155b8d33bad05d42"
+ integrity sha512-EZeStM/7LNfJiRuop0lvhOR52Q1l9i/EIYUnm/XddhjR+UqhPkeCmZcffMTr41z3aGm/zciVLlKanUWNT+jQ1A==
+
+vega-expression@^2.5.0, vega-expression@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/vega-expression/-/vega-expression-2.6.0.tgz#9955887b53b05da8e1d101c41a7ddce414edfb6d"
+ integrity sha512-c2FFrIfKtlTtLCR3BnZDm6O2ey7u+5YRukLnNobRe+hoiqeH86C2+FkjXotE63cYGj39R5OS+SK+VBSDz3bmVw==
+ dependencies:
+ vega-util "^1.8.0"
+
+vega-force@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/vega-force/-/vega-force-4.0.1.tgz#8b4f25701db132b75c2388a62665b1dc761181c9"
+ integrity sha512-b+gOZCon0Odg7RQg5q9NHFHPrB9/pLiZrNqlEaFHXXXmqlMBCz0BjrFxaP7FkXwIxG2Z4bef70Ly6aLyzm/m3A==
+ dependencies:
+ d3-force "^2.0.0"
+ vega-dataflow "^5.1.0"
+ vega-util "^1.8.0"
+
+vega-functions@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/vega-functions/-/vega-functions-5.3.0.tgz#b80b61e6fe6e6a5d07be42dd0dc966cc14039420"
+ integrity sha512-zutwlCVU9+HZgUnUfwzOuWksdZFpSM4gPijeSrNDM51KnE7LZivcRCgOjQA9vN0lV0GPhoF/7mcBPIrS2YqENw==
+ dependencies:
+ d3-array "^2.0.3"
+ d3-color "^1.2.3"
+ d3-format "^1.3.2"
+ d3-geo "^1.11.3"
+ d3-time-format "^2.1.3"
+ vega-dataflow "^5.2.1"
+ vega-expression "^2.6.0"
+ vega-scale "^4.0.0"
+ vega-scenegraph "^4.0.0"
+ vega-selections "^5.0.0"
+ vega-statistics "^1.3.0"
+ vega-util "^1.9.0"
+
+vega-geo@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/vega-geo/-/vega-geo-4.0.3.tgz#5fe940a70c8e64e456ef453acd27ea368900aa63"
+ integrity sha512-ZlOJ607JF/qp/Zx2nSCvJXpfbmOsf+BN1+JzQneUan1yhdAQvbtcJ8mInTQo8QRElRHVw8kBot15SUYf8gQHAA==
+ dependencies:
+ d3-array "^2.0.3"
+ d3-contour "^1.3.2"
+ d3-geo "^1.11.3"
+ vega-dataflow "^5.1.1"
+ vega-projection "^1.2.1"
+ vega-util "^1.8.0"
+
+vega-hierarchy@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/vega-hierarchy/-/vega-hierarchy-4.0.1.tgz#7abcd4725a77b573bc0f2e3700ce1f55f3e0fb99"
+ integrity sha512-LBkgnltUIkQJZ4s9P6geQe+zVRtdDTZ6dDr0RoR+NVMPIxuyCrGgWiuGLEPq0HDMdR8Oc+UAfl3x1nsHe8Zdkw==
+ dependencies:
+ d3-hierarchy "^1.1.8"
+ vega-dataflow "^5.1.0"
+ vega-util "^1.8.0"
+
+vega-loader@^4.0.0, vega-loader@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.1.0.tgz#27d6f8256aa0dfc991721083e0cc60d7fe866eef"
+ integrity sha512-YpscMiGGvhnEp811zM8y4TH39VAhWVU1gOUCeovheMLDHzMK31uydYqfyGHPVjWTbfFDmLzcMceJ6hsUMiZmNA==
+ dependencies:
+ d3-dsv "^1.1.1"
+ d3-time-format "^2.1.3"
+ node-fetch "^2.5.0"
+ topojson-client "^3.0.0"
+ vega-util "^1.8.0"
+
+vega-parser@^5.7.0:
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/vega-parser/-/vega-parser-5.7.0.tgz#905389ce2f9a1400860f4f948b0a1bff66a501b9"
+ integrity sha512-CIfyLkTEnWm5J3MZMovKhyMlX6LWkXF3kJQ7ENkGWtdaZ/c+2OBjtMFhwPsRW28Cci9VO5g+yboRfmxLV2rd6A==
+ dependencies:
+ vega-dataflow "^5.2.1"
+ vega-event-selector "^2.0.0"
+ vega-expression "^2.6.0"
+ vega-functions "^5.3.0"
+ vega-scale "^4.1.1"
+ vega-util "^1.10.0"
+
+vega-projection@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/vega-projection/-/vega-projection-1.2.1.tgz#f3425238fadab0b875f2ce92e5bba9dfc983f367"
+ integrity sha512-7ouWSDdBV8kBQFA26RHUtp39DDO7g3NcEJlhhBywvCQ0nEtqZinERW3bIOxVxZ5H1OKkmhBrxQUPHok2AC06aA==
+ dependencies:
+ d3-geo "^1.11.3"
+
+vega-regression@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/vega-regression/-/vega-regression-1.0.0.tgz#4c029862edb192be8c0bbd5d19267271877524aa"
+ integrity sha512-jNK3aDfM4cHImNvcR5jZHkIpWNr0/HUpxq71xhtjQ98qgmGBoSeUptuRXC4emJd9pRGuyj3vwrkUP4NcbIIIQw==
+ dependencies:
+ d3-array "^2.0.3"
+ vega-dataflow "^5.2.1"
+ vega-statistics "^1.4.0"
+ vega-util "^1.10.0"
+
+vega-runtime@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/vega-runtime/-/vega-runtime-5.0.1.tgz#27660ab48fc94e41790a9545b869adae197ffe5c"
+ integrity sha512-Aopn4CSMMKOO0pGrvtFShSiW5OJ6I7caumx3wWARAn8E6WISZTp4ORorTMwGOav4GQcg+aG/FREORHjkKCpyFA==
+ dependencies:
+ vega-dataflow "^5.1.0"
+ vega-util "^1.8.0"
+
+vega-scale@^4.0.0, vega-scale@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/vega-scale/-/vega-scale-4.1.1.tgz#32c93a1d4ec430c415d70ef6ce2af01c7de85384"
+ integrity sha512-mFGsSUuDrGT9MYRyWinwqla9u06w3/DAEJQrBqFFaL6g7BSggW/y2SiA+RyDdGQf2gU7VfunkaCK9Jt7I768rw==
+ dependencies:
+ d3-array "^2.0.3"
+ d3-interpolate "^1.3.2"
+ d3-scale "^3.0.0"
+ d3-time "^1.0.11"
+ vega-util "^1.10.0"
+
+vega-scenegraph@^4.0.0, vega-scenegraph@^4.1.0, vega-scenegraph@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/vega-scenegraph/-/vega-scenegraph-4.2.0.tgz#b143fcce8a2acc40adcba953c2cf0706c701f75d"
+ integrity sha512-q1T6PWM9gKjP3/kWy3VSuXiHV0tUz1oMKSwIWl2u36ZscEpL6EzLTHSOWbKx3gyqJNoYr1dAKNdj2nxj10uWWQ==
+ dependencies:
+ d3-path "^1.0.7"
+ d3-shape "^1.3.5"
+ vega-canvas "^1.2.1"
+ vega-loader "^4.0.0"
+ vega-util "^1.8.0"
+
+vega-selections@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/vega-selections/-/vega-selections-5.0.0.tgz#26c915103c1359b61dfcff6743e16087d6985c99"
+ integrity sha512-x5QVF6sBLmvpEWUUIzUqxvvQZTdaj/SzIUtO4SGhvKylBpAWpb0Qyt/GKZ6FZc8FVcH55CQj5uvpre828tjO2Q==
+ dependencies:
+ vega-expression "^2.5.0"
+ vega-util "^1.8.0"
+
+vega-statistics@^1.2.5, vega-statistics@^1.3.0, vega-statistics@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.4.0.tgz#e96b4d3c87f0b72ad88ef62ed4c6f4a610c62f92"
+ integrity sha512-FdkM8fGJf1zFgpmAD3wE4eWrGgDphE0uZze20Lv5x3s2pAamtYhQV3m36Hd7R+5UFFljiAkspNrGjG9HlFPNVQ==
+ dependencies:
+ d3-array "^2.0.3"
+
+vega-transforms@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/vega-transforms/-/vega-transforms-4.1.0.tgz#6d06fd51441ac0985ac893edc5a74f48ab969f7c"
+ integrity sha512-U9rWIZifFbn0AwENyYh/A2JVv9a7KUdovvatu/AfEAe5rEos2UKSVx0n2KRf+N1dmNgyN0Hc/SNfF8/RijmbLQ==
+ dependencies:
+ d3-array "^2.0.3"
+ vega-dataflow "^5.2.1"
+ vega-statistics "^1.4.0"
+ vega-util "^1.10.0"
+
+vega-typings@^0.7.0:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-0.7.2.tgz#cb02da5bdd0237971ba2bea6d47d1cbdbc45c52a"
+ integrity sha512-BReB2qRERA/Ke+QoxKDQ7fES25A9Q3qKRm1CJxwvpLGhAl4k5cGDORx6yW+J3rFHMzpJlmdRM+kb489EuphxZQ==
+ dependencies:
+ vega-util "^1.10.0"
+
+vega-util@^1.10.0, vega-util@^1.8.0, vega-util@^1.9.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.10.0.tgz#edfd8c04f1d269f903976c228820153902c270d4"
+ integrity sha512-fTGnTG7FhtTG9tiYDL3k5s8YHqB71Ml5+aC9B7eaBygeB8GKXBrcbTXLOzoCRxT3Jr5cRhr99PMBu0AkqmhBog==
+
+vega-view-transforms@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/vega-view-transforms/-/vega-view-transforms-4.3.1.tgz#2c9529b9c5efc15221fea43d6440e28031149353"
+ integrity sha512-myhG7Y3oCvAKpu9hjdlFoiJmAZAQ0SChDZ0fmR01eBjP9XMw2D9E3+VJKpdWzfJfyfKW0c+505FZBQ9QW4YQgg==
+ dependencies:
+ vega-dataflow "^5.1.1"
+ vega-scenegraph "^4.1.0"
+ vega-util "^1.8.0"
+
+vega-view@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/vega-view/-/vega-view-5.2.2.tgz#8a29f53382b55ea2ff02fb58ea02f919aedba046"
+ integrity sha512-9YWepeLgr+15MQPCV3B5JsRWiOTieUL8/p227cmHpBlm7Lt8HEnqihsIhskAEPGDx6/zENSn01arv+54k3qIiQ==
+ dependencies:
+ d3-array "^2.0.3"
+ d3-timer "^1.0.9"
+ vega-dataflow "^5.2.1"
+ vega-functions "^5.3.0"
+ vega-runtime "^5.0.1"
+ vega-scenegraph "^4.2.0"
+ vega-util "^1.10.0"
+
+vega-voronoi@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/vega-voronoi/-/vega-voronoi-4.0.1.tgz#876e24c869d2f4902bc634b445efbb8a41850495"
+ integrity sha512-z1iALPb4w5ftM0TaCuRJL1ihkjxWE3RNo/KgkZel/KLrOUn+M8Gt6YghkLrtbNwA/2/khy2rqkarf0KGCZpl/Q==
+ dependencies:
+ d3-voronoi "^1.1.4"
+ vega-dataflow "^5.1.0"
+ vega-util "^1.8.0"
+
+vega-wordcloud@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/vega-wordcloud/-/vega-wordcloud-4.0.2.tgz#6e6f711e83195f764e1b0ace80f98091af94a3a6"
+ integrity sha512-nV9bRKjRGcmcQV5wXvOvWes4T5937t3RF+Rm1d03YVAzZpOcVKk9uBuVSeFYBLX2XcDBVe4HK54qDoOTFftHMw==
+ dependencies:
+ vega-canvas "^1.2.0"
+ vega-dataflow "^5.1.1"
+ vega-scale "^4.0.0"
+ vega-statistics "^1.2.5"
+ vega-util "^1.8.0"
+
+vega@^5.4.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/vega/-/vega-5.4.0.tgz#62fb18de7cb3477a3914aa2f7b98197958c0fd2e"
+ integrity sha512-1c77yse5ZOYXgVig5RjJCWwM8yHvY1Ds7ncusiT1Hu3wXVhOw8TKe2CLCbcOpWSmPRJ48BRw/6qF70iS4zWYAQ==
+ dependencies:
+ vega-crossfilter "^4.0.1"
+ vega-dataflow "^5.2.1"
+ vega-encode "^4.3.0"
+ vega-event-selector "^2.0.0"
+ vega-expression "^2.6.0"
+ vega-force "^4.0.1"
+ vega-functions "^5.3.0"
+ vega-geo "^4.0.3"
+ vega-hierarchy "^4.0.1"
+ vega-loader "^4.1.0"
+ vega-parser "^5.7.0"
+ vega-projection "^1.2.1"
+ vega-regression "^1.0.0"
+ vega-runtime "^5.0.1"
+ vega-scale "^4.1.1"
+ vega-scenegraph "^4.2.0"
+ vega-statistics "^1.4.0"
+ vega-transforms "^4.1.0"
+ vega-typings "^0.7.0"
+ vega-util "^1.10.0"
+ vega-view "^5.2.2"
+ vega-view-transforms "^4.3.1"
+ vega-voronoi "^4.0.1"
+ vega-wordcloud "^4.0.2"
+
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
From 36930f7350aa27bd81de5fa5d59a5f6f6701f9a6 Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Wed, 7 Aug 2019 22:26:01 +0200
Subject: [PATCH 05/11] refactor getting artifacts
---
src/getArtifact.ts | 29 +++++++++++++++++++++++++++++
src/index.ts | 23 +++--------------------
2 files changed, 32 insertions(+), 20 deletions(-)
create mode 100644 src/getArtifact.ts
diff --git a/src/getArtifact.ts b/src/getArtifact.ts
new file mode 100644
index 0000000..a5d566c
--- /dev/null
+++ b/src/getArtifact.ts
@@ -0,0 +1,29 @@
+import * as glob from "glob";
+import { join } from "path";
+
+import { getSize } from "./getSize";
+import { FullArtifact, NormalizedBuildSizeOptions, FileArtifact } from "./types";
+
+export async function getArtifact(
+ options: NormalizedBuildSizeOptions,
+ cwd: string,
+): Promise {
+ const fullArtifact: FullArtifact = {};
+
+ for (const file of options.files) {
+ const matches = glob.sync(file.path, { cwd });
+
+ const sizes = await Promise.all(matches.map(match => getSize(join(cwd, match), options.gzip)));
+ const overallSize = sizes.reduce((a, b) => a + b, 0);
+
+ const artifact: FileArtifact = {
+ path: file.path,
+ files: matches.length,
+ overallSize,
+ };
+
+ fullArtifact[file.path] = artifact;
+ }
+
+ return fullArtifact;
+}
diff --git a/src/index.ts b/src/index.ts
index e40cb08..810887b 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,33 +1,16 @@
import { codechecks } from "@codechecks/client";
-import * as glob from "glob";
-import { BuildSizeWatcherOptions, FileArtifact, FullArtifact } from "./types";
-import { getSize } from "./getSize";
-import { join } from "path";
+import { BuildSizeWatcherOptions, FullArtifact } from "./types";
import { getArtifactDiff } from "./getArtifactDiff";
import { getReportFromDiff } from "./getReportFromDiff";
import { normalizeOptions } from "./normalization";
+import { getArtifact } from "./getArtifact";
export async function buildSizeWatcher(_options: BuildSizeWatcherOptions): Promise {
const options = normalizeOptions(_options);
const cwd = codechecks.context.workspaceRoot;
- const fullArtifact: FullArtifact = {};
-
- for (const file of options.files) {
- const matches = glob.sync(file.path, { cwd });
-
- const sizes = await Promise.all(matches.map(match => getSize(join(cwd, match), options.gzip)));
- const overallSize = sizes.reduce((a, b) => a + b, 0);
-
- const artifact: FileArtifact = {
- path: file.path,
- files: matches.length,
- overallSize,
- };
-
- fullArtifact[file.path] = artifact;
- }
+ const fullArtifact = await getArtifact(options, cwd);
await codechecks.saveValue(options.artifactName, fullArtifact);
From eeb6f98b8d0a93de251ea3e4a9d02e61ec850286 Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Thu, 8 Aug 2019 21:23:56 +0200
Subject: [PATCH 06/11] add new artifact per branch, generate basic chart
---
package.json | 2 +-
src/getReportFromDiff.ts | 11 +++++++++++
src/index.ts | 24 ++++++++++++++++++++++--
src/types.ts | 3 +++
yarn.lock | 8 ++++----
5 files changed, 41 insertions(+), 7 deletions(-)
diff --git a/package.json b/package.json
index 753fb88..830fa74 100644
--- a/package.json
+++ b/package.json
@@ -40,7 +40,7 @@
],
"devDependencies": {
"@codechecks/ban-deps-codecheck": "^0.1.1",
- "@codechecks/client": "^0.1.5",
+ "@codechecks/client": "0.1.6-beta.4",
"@codechecks/type-coverage-watcher": "^0.1.3",
"@types/bluebird": "^3.5.25",
"@types/bytes": "^3.0.0",
diff --git a/src/getReportFromDiff.ts b/src/getReportFromDiff.ts
index 828f824..49aa508 100644
--- a/src/getReportFromDiff.ts
+++ b/src/getReportFromDiff.ts
@@ -4,6 +4,8 @@ import {
ArtifactDiffType,
NormalizedFileDescription,
NormalizedBuildSizeOptions,
+ FullArtifact,
+ HistoryArtifact,
} from "./types";
import bytes = require("bytes");
import { sortBy, groupBy } from "lodash";
@@ -80,3 +82,12 @@ function renderFraction(value: number): string {
function renderSize(size: number, fraction: number): string {
return `${renderSign(size) + bytes(size)} (${renderSign(fraction) + renderFraction(fraction)})`;
}
+
+export function getChartData(history: HistoryArtifact): any {
+ return history.map(art => {
+ const mainKey = Object.keys(art.artifact)[0];
+ const mainMetric = art.artifact[mainKey];
+
+ return { x: art.hash.substring(0, 5), y: mainMetric.overallSize };
+ });
+}
diff --git a/src/index.ts b/src/index.ts
index 810887b..478a838 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,10 +1,11 @@
import { codechecks } from "@codechecks/client";
-import { BuildSizeWatcherOptions, FullArtifact } from "./types";
+import { BuildSizeWatcherOptions, FullArtifact, HistoryArtifact } from "./types";
import { getArtifactDiff } from "./getArtifactDiff";
-import { getReportFromDiff } from "./getReportFromDiff";
+import { getReportFromDiff, getChartData } from "./getReportFromDiff";
import { normalizeOptions } from "./normalization";
import { getArtifact } from "./getArtifact";
+import { generateChart } from "./charts/generateChart";
export async function buildSizeWatcher(_options: BuildSizeWatcherOptions): Promise {
const options = normalizeOptions(_options);
@@ -15,13 +16,32 @@ export async function buildSizeWatcher(_options: BuildSizeWatcherOptions): Promi
await codechecks.saveValue(options.artifactName, fullArtifact);
if (!codechecks.isPr()) {
+ const historyArtifact =
+ (await codechecks.getValue(
+ options.historyArtifactName,
+ codechecks.context.currentBranchName,
+ )) || [];
+
+ await codechecks.saveValue(
+ options.historyArtifactName,
+ [{ hash: codechecks.context.currentSha, artifact: fullArtifact }, ...historyArtifact],
+ codechecks.context.currentBranchName,
+ );
+ //we could report here current size as well
return;
}
const baseArtifact = await codechecks.getValue(options.artifactName);
+ const baseHistoryArtifact =
+ (await codechecks.getValue(
+ options.artifactName,
+ codechecks.context.pr!.base.sha,
+ )) || [];
const diff = getArtifactDiff(fullArtifact, baseArtifact);
+ await generateChart("./charts/chart1.png", getChartData(baseHistoryArtifact));
+
const report = getReportFromDiff(diff, options.files, options);
await codechecks.report(report);
}
diff --git a/src/types.ts b/src/types.ts
index ad64d3a..c3b9020 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -21,6 +21,7 @@ export interface NormalizedBuildSizeOptions {
files: NormalizedFileDescription[];
name: string;
artifactName: string;
+ historyArtifactName: string;
}
export interface FileArtifact {
@@ -31,6 +32,8 @@ export interface FileArtifact {
export type FullArtifact = Dictionary;
+export type HistoryArtifact = { hash: string; artifact: FullArtifact }[];
+
export type ArtifactDiffType = "changed" | "new" | "deleted";
export type ArtifactDiff = {
diff --git a/yarn.lock b/yarn.lock
index 1ac5723..7942d86 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -25,10 +25,10 @@
dependencies:
execa "1"
-"@codechecks/client@^0.1.5":
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/@codechecks/client/-/client-0.1.5.tgz#635d905ea2db6e2502a7510dabdba24ddef44d56"
- integrity sha512-/IcKf0j8dDXjlC3D1RgRNGGk0oo1733v+QH9rnp9urZe/+9fAi0M0aTqYl060ZTnyJgwh9Fek+/5zkOswVFJQA==
+"@codechecks/client@0.1.6-beta.4":
+ version "0.1.6-beta.4"
+ resolved "https://registry.yarnpkg.com/@codechecks/client/-/client-0.1.6-beta.4.tgz#4140d1cfd72a1d0d33c3a254903335f042a8f90b"
+ integrity sha512-v7z7AcSrtlzqBZjXLoEj/vyu4+qvHAiEeRzm6DoQiVeJAut+oA5r+vVqHgXtJNN6A4lT7oLwocNhxUYoWPxeWQ==
dependencies:
bluebird "^3.5.3"
chalk "^2.4.2"
From 8509a8b470c88bc0530c36faabf68ed51e33d87c Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Thu, 8 Aug 2019 21:55:30 +0200
Subject: [PATCH 07/11] make first test pass
---
src/__mocks__/@codechecks/client.ts | 2 ++
src/__tests__/index.spec.ts | 24 ++++++++++++++++++++++++
src/charts/__mocks__/generateChart.ts | 1 +
src/getReportFromDiff.ts | 1 -
src/normalization.ts | 1 +
tslint.json | 3 ++-
6 files changed, 30 insertions(+), 2 deletions(-)
create mode 100644 src/charts/__mocks__/generateChart.ts
diff --git a/src/__mocks__/@codechecks/client.ts b/src/__mocks__/@codechecks/client.ts
index 57f7347..60c1d07 100644
--- a/src/__mocks__/@codechecks/client.ts
+++ b/src/__mocks__/@codechecks/client.ts
@@ -9,6 +9,8 @@ export const codechecks: Partial = {
saveDirectory: jest.fn(),
isPr: jest.fn(),
context: {
+ currentSha: "eeb6f98b8d0a93de251ea3e4a9d02e61ec850286",
+ currentBranchName: "master",
workspaceRoot: join(__dirname, "..", ".."),
} as any,
};
diff --git a/src/__tests__/index.spec.ts b/src/__tests__/index.spec.ts
index f9a498b..10457d2 100644
--- a/src/__tests__/index.spec.ts
+++ b/src/__tests__/index.spec.ts
@@ -2,10 +2,13 @@ import { buildSizeWatcher } from "../index";
import * as mockFS from "mock-fs";
import { join } from "path";
import { codechecks } from "@codechecks/client";
+import { generateChart } from "../charts/generateChart";
import { FullArtifact } from "../types";
type Mocked = { [k in keyof T]: jest.Mock };
+jest.mock("../charts/generateChart");
+
describe("build-size", () => {
const codeChecksMock = require("../__mocks__/@codechecks/client").codechecks as Mocked<
typeof codechecks
@@ -45,15 +48,36 @@ describe("build-size", () => {
},
},
],
+ Array [
+ "build-size-history:Build Size",
+ Array [
+ Object {
+ "artifact": Object {
+ "build/main.*.js": Object {
+ "files": 1,
+ "overallSize": 26,
+ "path": "build/main.*.js",
+ },
+ },
+ "hash": "eeb6f98b8d0a93de251ea3e4a9d02e61ec850286",
+ },
+ ],
+ "master",
+ ],
],
"results": Array [
Object {
"isThrow": false,
"value": undefined,
},
+ Object {
+ "isThrow": false,
+ "value": undefined,
+ },
],
}
`);
+ expect(generateChart).toMatchInlineSnapshot(`[MockFunction]`);
});
it("should work in PR context", async () => {
diff --git a/src/charts/__mocks__/generateChart.ts b/src/charts/__mocks__/generateChart.ts
new file mode 100644
index 0000000..1efa315
--- /dev/null
+++ b/src/charts/__mocks__/generateChart.ts
@@ -0,0 +1 @@
+export const generateChart = jest.fn();
diff --git a/src/getReportFromDiff.ts b/src/getReportFromDiff.ts
index 49aa508..b80351d 100644
--- a/src/getReportFromDiff.ts
+++ b/src/getReportFromDiff.ts
@@ -4,7 +4,6 @@ import {
ArtifactDiffType,
NormalizedFileDescription,
NormalizedBuildSizeOptions,
- FullArtifact,
HistoryArtifact,
} from "./types";
import bytes = require("bytes");
diff --git a/src/normalization.ts b/src/normalization.ts
index 7407617..feedf9a 100644
--- a/src/normalization.ts
+++ b/src/normalization.ts
@@ -14,6 +14,7 @@ export function normalizeOptions(options: BuildSizeWatcherOptions): NormalizedBu
files: options.files.map(normalizeFileDescription),
name,
artifactName: `build-size:${name}`,
+ historyArtifactName: `build-size-history:${name}`,
};
}
diff --git a/tslint.json b/tslint.json
index 7ec998b..c755467 100644
--- a/tslint.json
+++ b/tslint.json
@@ -8,6 +8,7 @@
"interface-name": [true, "never-prefix"],
"no-commented-code": true,
"no-use-before-declare": false,
- "restrict-plus-operands": false
+ "restrict-plus-operands": false,
+ "no-useless-cast": false
}
}
From 4d4222e7aced1a0d72f3d8fe7b69fbc18b98eed6 Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Thu, 8 Aug 2019 23:00:17 +0200
Subject: [PATCH 08/11] migrate next test
---
src/__mocks__/@codechecks/client.ts | 12 +++++++-
src/__tests__/index.spec.ts | 43 ++++++++++++++++++++++++++---
src/index.ts | 16 +++++++++--
3 files changed, 63 insertions(+), 8 deletions(-)
diff --git a/src/__mocks__/@codechecks/client.ts b/src/__mocks__/@codechecks/client.ts
index 60c1d07..1027e4d 100644
--- a/src/__mocks__/@codechecks/client.ts
+++ b/src/__mocks__/@codechecks/client.ts
@@ -9,8 +9,18 @@ export const codechecks: Partial = {
saveDirectory: jest.fn(),
isPr: jest.fn(),
context: {
+ pr: {
+ base: {
+ sha: "0ac17a3da88d14445a92128393d13c39e9a5b3ec",
+ currentBranchName: "master",
+ },
+ head: {
+ currentSha: "eeb6f98b8d0a93de251ea3e4a9d02e61ec850286",
+ currentBranchName: "kk/feature-brach-1",
+ },
+ },
currentSha: "eeb6f98b8d0a93de251ea3e4a9d02e61ec850286",
- currentBranchName: "master",
+ currentBranchName: "kk/feature-brach-1",
workspaceRoot: join(__dirname, "..", ".."),
} as any,
};
diff --git a/src/__tests__/index.spec.ts b/src/__tests__/index.spec.ts
index 10457d2..9184baa 100644
--- a/src/__tests__/index.spec.ts
+++ b/src/__tests__/index.spec.ts
@@ -3,7 +3,7 @@ import * as mockFS from "mock-fs";
import { join } from "path";
import { codechecks } from "@codechecks/client";
import { generateChart } from "../charts/generateChart";
-import { FullArtifact } from "../types";
+import { FullArtifact, HistoryArtifact } from "../types";
type Mocked = { [k in keyof T]: jest.Mock };
@@ -82,14 +82,21 @@ describe("build-size", () => {
it("should work in PR context", async () => {
codeChecksMock.isPr.mockReturnValue(true);
- codeChecksMock.getValue.mockReturnValue({
+ const responseArtifact: FullArtifact = {
"build/main.*.js": {
- name: "app",
files: 1,
overallSize: 10,
path: "build/main.*.js",
},
- } as FullArtifact);
+ };
+ const responseHistoryArtifact: HistoryArtifact = [
+ {
+ hash: "0ac17a3da88d14445a92128393d13c39e9a5b3ec",
+ artifact: responseArtifact,
+ },
+ ];
+ codeChecksMock.getValue.mockReturnValueOnce(responseArtifact);
+ codeChecksMock.getValue.mockReturnValueOnce(responseHistoryArtifact);
mockFS({
[join(__dirname, "../build")]: {
"main.12315123.js": "APP JS",
@@ -105,6 +112,9 @@ describe("build-size", () => {
path: "build/main.*.js",
},
],
+ }).catch(e => {
+ mockFS.restore();
+ throw e;
});
mockFS.restore();
@@ -153,6 +163,31 @@ describe("build-size", () => {
},
],
}
+`);
+ expect(generateChart).toMatchInlineSnapshot(`
+[MockFunction] {
+ "calls": Array [
+ Array [
+ "./charts/chart1.png",
+ Array [
+ Object {
+ "x": "eeb6f",
+ "y": 6,
+ },
+ Object {
+ "x": "0ac17",
+ "y": 10,
+ },
+ ],
+ ],
+ ],
+ "results": Array [
+ Object {
+ "isThrow": false,
+ "value": undefined,
+ },
+ ],
+}
`);
});
diff --git a/src/index.ts b/src/index.ts
index 478a838..e08d573 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -24,7 +24,7 @@ export async function buildSizeWatcher(_options: BuildSizeWatcherOptions): Promi
await codechecks.saveValue(
options.historyArtifactName,
- [{ hash: codechecks.context.currentSha, artifact: fullArtifact }, ...historyArtifact],
+ currentHistoryArtifact(historyArtifact, fullArtifact),
codechecks.context.currentBranchName,
);
//we could report here current size as well
@@ -34,16 +34,26 @@ export async function buildSizeWatcher(_options: BuildSizeWatcherOptions): Promi
const baseArtifact = await codechecks.getValue(options.artifactName);
const baseHistoryArtifact =
(await codechecks.getValue(
- options.artifactName,
+ options.historyArtifactName,
codechecks.context.pr!.base.sha,
)) || [];
const diff = getArtifactDiff(fullArtifact, baseArtifact);
- await generateChart("./charts/chart1.png", getChartData(baseHistoryArtifact));
+ await generateChart(
+ "./charts/chart1.png",
+ getChartData(currentHistoryArtifact(baseHistoryArtifact, fullArtifact)),
+ );
const report = getReportFromDiff(diff, options.files, options);
await codechecks.report(report);
}
export default buildSizeWatcher;
+
+export function currentHistoryArtifact(
+ historyArtifact: HistoryArtifact,
+ artifact: FullArtifact,
+): HistoryArtifact {
+ return [{ hash: codechecks.context.currentSha, artifact }, ...historyArtifact];
+}
From 20064d20e21cbfd029638cb9ff7f4ed80d685c11 Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Thu, 8 Aug 2019 23:00:38 +0200
Subject: [PATCH 09/11] fix previous test
---
src/__tests__/index.spec.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/__tests__/index.spec.ts b/src/__tests__/index.spec.ts
index 9184baa..340af2f 100644
--- a/src/__tests__/index.spec.ts
+++ b/src/__tests__/index.spec.ts
@@ -62,7 +62,7 @@ describe("build-size", () => {
"hash": "eeb6f98b8d0a93de251ea3e4a9d02e61ec850286",
},
],
- "master",
+ "kk/feature-brach-1",
],
],
"results": Array [
From 711656681ecd2b60e83a973219e0ee120b61d968 Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Thu, 8 Aug 2019 23:04:13 +0200
Subject: [PATCH 10/11] fix all tests
---
src/__tests__/index.spec.ts | 59 +++++++++++++++++++++++++++++++++++--
1 file changed, 56 insertions(+), 3 deletions(-)
diff --git a/src/__tests__/index.spec.ts b/src/__tests__/index.spec.ts
index 340af2f..4d3b88e 100644
--- a/src/__tests__/index.spec.ts
+++ b/src/__tests__/index.spec.ts
@@ -253,19 +253,47 @@ describe("build-size", () => {
},
],
}
+`);
+ expect(generateChart).toMatchInlineSnapshot(`
+[MockFunction] {
+ "calls": Array [
+ Array [
+ "./charts/chart1.png",
+ Array [
+ Object {
+ "x": "eeb6f",
+ "y": 26,
+ },
+ ],
+ ],
+ ],
+ "results": Array [
+ Object {
+ "isThrow": false,
+ "value": undefined,
+ },
+ ],
+}
`);
});
it("should work with custom name in PR context", async () => {
codeChecksMock.isPr.mockReturnValue(true);
- codeChecksMock.getValue.mockReturnValue({
+ const responseArtifact: FullArtifact = {
"build/main.*.js": {
- name: "app",
files: 1,
overallSize: 10,
path: "build/main.*.js",
},
- } as FullArtifact);
+ };
+ const responseHistoryArtifact: HistoryArtifact = [
+ {
+ hash: "0ac17a3da88d14445a92128393d13c39e9a5b3ec",
+ artifact: responseArtifact,
+ },
+ ];
+ codeChecksMock.getValue.mockReturnValueOnce(responseArtifact);
+ codeChecksMock.getValue.mockReturnValueOnce(responseHistoryArtifact);
mockFS({
[join(__dirname, "../build")]: {
"main.12315123.js": "APP JS",
@@ -330,6 +358,31 @@ describe("build-size", () => {
},
],
}
+`);
+ expect(generateChart).toMatchInlineSnapshot(`
+[MockFunction] {
+ "calls": Array [
+ Array [
+ "./charts/chart1.png",
+ Array [
+ Object {
+ "x": "eeb6f",
+ "y": 6,
+ },
+ Object {
+ "x": "0ac17",
+ "y": 10,
+ },
+ ],
+ ],
+ ],
+ "results": Array [
+ Object {
+ "isThrow": false,
+ "value": undefined,
+ },
+ ],
+}
`);
});
});
From a9e5d1afc995958aee128195fdffd883765b51fa Mon Sep 17 00:00:00 2001
From: Krzysztof Kaczor
Date: Fri, 9 Aug 2019 00:29:50 +0200
Subject: [PATCH 11/11] first release that is actually working
---
package.json | 1 +
src/__tests__/index.spec.ts | 1 +
src/charts/generateChart.ts | 9 ++++++---
src/getReportFromDiff.ts | 12 +++++++-----
src/index.ts | 14 ++++++++++++--
tsconfig.json | 3 ++-
yarn.lock | 16 +++++++++++++++-
7 files changed, 44 insertions(+), 12 deletions(-)
diff --git a/package.json b/package.json
index 830fa74..de5899a 100644
--- a/package.json
+++ b/package.json
@@ -73,6 +73,7 @@
"glob": "^7.1.3",
"gzip-size": "^5.0.0",
"lodash": "^4.17.11",
+ "tmp-promise": "^2.0.2",
"vega": "^5.4.0"
},
"publishConfig": {
diff --git a/src/__tests__/index.spec.ts b/src/__tests__/index.spec.ts
index 4d3b88e..561b0c2 100644
--- a/src/__tests__/index.spec.ts
+++ b/src/__tests__/index.spec.ts
@@ -142,6 +142,7 @@ describe("build-size", () => {
],
}
`);
+ expect(codechecks.getValue).toMatchInlineSnapshot();
expect(codechecks.saveValue).toMatchInlineSnapshot(`
[MockFunction] {
"calls": Array [
diff --git a/src/charts/generateChart.ts b/src/charts/generateChart.ts
index 1cfc20a..2ea8653 100644
--- a/src/charts/generateChart.ts
+++ b/src/charts/generateChart.ts
@@ -1,7 +1,7 @@
import * as vega from "vega";
import * as fs from "fs";
-const chartDefinition = require("./vega-spec.json");
+import * as chartDefinition from "./vega-spec.json";
interface DataPoint {
x: string;
@@ -15,9 +15,12 @@ export async function generateChart(path: string, dataPoints: DataPoint[]): Prom
values: dataPoints.map(dp => ({ ...dp, c: 0 })),
},
];
- chartDefinition.data = wrappedDataPoints;
+ const finalChartDef: any = {
+ ...chartDefinition,
+ data: wrappedDataPoints,
+ };
- const view = new vega.View(vega.parse(chartDefinition), { renderer: "none" }).initialize();
+ const view = new vega.View(vega.parse(finalChartDef), { renderer: "none" }).initialize();
const canvas = await view.toCanvas();
diff --git a/src/getReportFromDiff.ts b/src/getReportFromDiff.ts
index b80351d..ffbfa8b 100644
--- a/src/getReportFromDiff.ts
+++ b/src/getReportFromDiff.ts
@@ -83,10 +83,12 @@ function renderSize(size: number, fraction: number): string {
}
export function getChartData(history: HistoryArtifact): any {
- return history.map(art => {
- const mainKey = Object.keys(art.artifact)[0];
- const mainMetric = art.artifact[mainKey];
+ return history
+ .map(art => {
+ const mainKey = Object.keys(art.artifact)[0];
+ const mainMetric = art.artifact[mainKey];
- return { x: art.hash.substring(0, 5), y: mainMetric.overallSize };
- });
+ return { x: art.hash.substring(0, 5), y: mainMetric.overallSize };
+ })
+ .reverse();
}
diff --git a/src/index.ts b/src/index.ts
index e08d573..dda25fa 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -6,6 +6,8 @@ import { getReportFromDiff, getChartData } from "./getReportFromDiff";
import { normalizeOptions } from "./normalization";
import { getArtifact } from "./getArtifact";
import { generateChart } from "./charts/generateChart";
+import { dir } from "tmp-promise";
+import { join } from "path";
export async function buildSizeWatcher(_options: BuildSizeWatcherOptions): Promise {
const options = normalizeOptions(_options);
@@ -35,17 +37,25 @@ export async function buildSizeWatcher(_options: BuildSizeWatcherOptions): Promi
const baseHistoryArtifact =
(await codechecks.getValue(
options.historyArtifactName,
- codechecks.context.pr!.base.sha,
+ codechecks.context.pr!.base.branchName,
)) || [];
const diff = getArtifactDiff(fullArtifact, baseArtifact);
+ const { path: chartDir } = await dir();
+ const chart1Path = join(chartDir, "/chart1.png");
await generateChart(
- "./charts/chart1.png",
+ chart1Path,
getChartData(currentHistoryArtifact(baseHistoryArtifact, fullArtifact)),
);
+ await codechecks.saveFile("chart1", chart1Path);
+ const link = codechecks.getArtifactLink("chart1");
const report = getReportFromDiff(diff, options.files, options);
+ report.longDescription += `
+ ## Charts
+ 
+ `;
await codechecks.report(report);
}
diff --git a/tsconfig.json b/tsconfig.json
index 9c04187..1ab7a9c 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -17,7 +17,8 @@
"sourceMap": true,
"declaration": true,
"outDir": "lib",
- "skipLibCheck": true
+ "skipLibCheck": true,
+ "resolveJsonModule": true
},
"include": ["src/**/*.ts"],
"exclude": ["node_modules"]
diff --git a/yarn.lock b/yarn.lock
index 7942d86..408bb83 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3493,7 +3493,7 @@ ret@~0.1.10:
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
-rimraf@^2.5.4, rimraf@^2.6.1:
+rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@@ -3905,6 +3905,20 @@ tiny-each-async@2.0.3:
resolved "https://registry.yarnpkg.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1"
integrity sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=
+tmp-promise@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-2.0.2.tgz#ee605edb10f100954be5dd8b9dbe1bfd56194202"
+ integrity sha512-zl71nFWjPKW2KXs+73gEk8RmqvtAeXPxhWDkTUoa3MSMkjq3I+9OeknjF178MQoMYsdqL730hfzvNfEkePxq9Q==
+ dependencies:
+ tmp "0.1.0"
+
+tmp@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
+ integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
+ dependencies:
+ rimraf "^2.6.3"
+
tmpl@1.0.x:
version "1.0.4"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"