Compare commits

...

86 Commits

Author SHA1 Message Date
Amir Raminfar 0a9aa6b94f Release 3.0.1 2020-09-07 13:53:41 -07:00
Amir Raminfar 0ff21d6c57 Fixes int tests for z order 2020-09-07 13:53:21 -07:00
Amir Raminfar 73a0feb1d6 Fixes minor bugs 2020-09-07 13:49:19 -07:00
Amir Raminfar c252991d24 Release 3.0.0 2020-09-06 21:06:35 -07:00
Amir Raminfar 2231551c60 Fixes tests 2020-09-06 20:16:29 -07:00
Amir Raminfar 4c00ffe18f Fixes int test for menu 2020-09-06 20:10:22 -07:00
Amir Raminfar c86e770c92 Cleans up mobile and resized pinned tabs 2020-09-06 19:57:19 -07:00
Amir Raminfar 481ff22efe Fixes int tests 2020-09-06 16:06:59 -07:00
Amir Raminfar dcfd6ec476 Mobile view and clean up 2020-09-06 16:01:46 -07:00
Amir Raminfar f13297a7dc Updates yarn 2020-09-06 15:33:40 -07:00
Amir Raminfar 220722deaa Work in progress to show live stats (#671)
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-09-06 15:32:27 -07:00
dependabot-preview[bot] b7af2b7826 Merge pull request #686 from amir20/dependabot/npm_and_yarn/release-it-14.0.2 2020-09-05 11:57:26 +00:00
dependabot-preview[bot] edc200cd9e Bump release-it from 14.0.1 to 14.0.2
Bumps [release-it](https://github.com/release-it/release-it) from 14.0.1 to 14.0.2.
- [Release notes](https://github.com/release-it/release-it/releases)
- [Changelog](https://github.com/release-it/release-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/release-it/release-it/compare/14.0.1...14.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-05 11:51:45 +00:00
dependabot-preview[bot] dcc661c761 Merge pull request #685 from amir20/dependabot/npm_and_yarn/babel/core-7.11.6 2020-09-04 12:23:07 +00:00
dependabot-preview[bot] bbb20b5d39 Merge pull request #684 from amir20/dependabot/npm_and_yarn/buefy-0.9.3 2020-09-04 12:22:26 +00:00
dependabot-preview[bot] 214c9de4f8 Bump @babel/core from 7.11.5 to 7.11.6
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.11.5 to 7.11.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.11.6/packages/babel-core)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-04 12:16:59 +00:00
dependabot-preview[bot] 91a29165c7 Bump buefy from 0.9.2 to 0.9.3
Bumps [buefy](https://github.com/buefy/buefy) from 0.9.2 to 0.9.3.
- [Release notes](https://github.com/buefy/buefy/releases)
- [Changelog](https://github.com/buefy/buefy/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/buefy/buefy/compare/v0.9.2...v0.9.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-04 12:16:28 +00:00
dependabot-preview[bot] 4d331742e5 Merge pull request #683 from amir20/dependabot/npm_and_yarn/sass-loader-10.0.2 2020-09-04 12:01:03 +00:00
dependabot-preview[bot] 0f8639abad Bump sass-loader from 10.0.1 to 10.0.2
Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 10.0.1 to 10.0.2.
- [Release notes](https://github.com/webpack-contrib/sass-loader/releases)
- [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/sass-loader/compare/v10.0.1...v10.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-04 11:55:26 +00:00
dependabot-preview[bot] 36585a4622 Merge pull request #682 from amir20/dependabot/npm_and_yarn/caniuse-lite-1.0.30001124 2020-09-04 06:11:14 +00:00
dependabot-preview[bot] 1190d31ef0 Bump caniuse-lite from 1.0.30001123 to 1.0.30001124
Bumps [caniuse-lite](https://github.com/ben-eb/caniuse-lite) from 1.0.30001123 to 1.0.30001124.
- [Release notes](https://github.com/ben-eb/caniuse-lite/releases)
- [Changelog](https://github.com/ben-eb/caniuse-lite/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ben-eb/caniuse-lite/compare/v1.0.30001123...v1.0.30001124)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-04 06:04:55 +00:00
dependabot-preview[bot] 68724639b5 Merge pull request #681 from amir20/dependabot/npm_and_yarn/release-it-14.0.1 2020-09-04 06:01:35 +00:00
dependabot-preview[bot] 5bf3bf8676 Bump release-it from 13.7.1 to 14.0.1
Bumps [release-it](https://github.com/release-it/release-it) from 13.7.1 to 14.0.1.
- [Release notes](https://github.com/release-it/release-it/releases)
- [Changelog](https://github.com/release-it/release-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/release-it/release-it/compare/13.7.1...14.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-04 05:56:18 +00:00
dependabot-preview[bot] 8f719278aa Merge pull request #679 from amir20/dependabot/npm_and_yarn/caniuse-lite-1.0.30001123 2020-09-04 01:32:53 +00:00
dependabot-preview[bot] 7bc775eb7c Merge pull request #680 from amir20/dependabot/npm_and_yarn/lint-staged-10.3.0 2020-09-03 12:10:13 +00:00
dependabot-preview[bot] 6abdb276e8 Merge pull request #678 from amir20/dependabot/npm_and_yarn/release-it-13.7.1 2020-09-03 12:08:56 +00:00
dependabot-preview[bot] bc14f23b37 Merge pull request #677 from amir20/dependabot/npm_and_yarn/dompurify-2.0.15 2020-09-03 12:08:17 +00:00
dependabot-preview[bot] 005336cf56 Bump lint-staged from 10.2.13 to 10.3.0
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.13 to 10.3.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.13...v10.3.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-03 12:04:09 +00:00
dependabot-preview[bot] 649d97739e Bump caniuse-lite from 1.0.30001122 to 1.0.30001123
Bumps [caniuse-lite](https://github.com/ben-eb/caniuse-lite) from 1.0.30001122 to 1.0.30001123.
- [Release notes](https://github.com/ben-eb/caniuse-lite/releases)
- [Changelog](https://github.com/ben-eb/caniuse-lite/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ben-eb/caniuse-lite/compare/v1.0.30001122...v1.0.30001123)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-03 12:03:39 +00:00
dependabot-preview[bot] 3f38e05e4b Bump release-it from 13.7.0 to 13.7.1
Bumps [release-it](https://github.com/release-it/release-it) from 13.7.0 to 13.7.1.
- [Release notes](https://github.com/release-it/release-it/releases)
- [Changelog](https://github.com/release-it/release-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/release-it/release-it/compare/13.7.0...13.7.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-03 12:03:15 +00:00
dependabot-preview[bot] 877dd9be14 Bump dompurify from 2.0.14 to 2.0.15
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.0.14 to 2.0.15.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/2.0.14...2.0.15)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-03 12:02:39 +00:00
dependabot[bot] 73a8707f54 Bump bl from 4.0.2 to 4.0.3 in /integration (#676)
Bumps [bl](https://github.com/rvagg/bl) from 4.0.2 to 4.0.3.
- [Release notes](https://github.com/rvagg/bl/releases)
- [Commits](https://github.com/rvagg/bl/compare/v4.0.2...v4.0.3)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-09-02 20:03:27 -07:00
dependabot-preview[bot] efd7f2fe85 Merge pull request #672 from amir20/dependabot/npm_and_yarn/caniuse-lite-1.0.30001122 2020-09-02 01:34:51 +00:00
dependabot-preview[bot] 66bc08cbe3 Merge pull request #674 from amir20/dependabot/npm_and_yarn/babel/plugin-transform-runtime-7.11.5 2020-09-01 06:50:07 +00:00
dependabot-preview[bot] 95732c0149 Bump @babel/plugin-transform-runtime from 7.11.0 to 7.11.5
Bumps [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) from 7.11.0 to 7.11.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.11.5/packages/babel-plugin-transform-runtime)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-01 06:44:08 +00:00
dependabot-preview[bot] 8af1b3a463 Merge pull request #675 from amir20/dependabot/npm_and_yarn/date-fns-2.16.1 2020-09-01 06:42:28 +00:00
dependabot-preview[bot] 7bfe7adb73 Merge pull request #673 from amir20/dependabot/npm_and_yarn/babel/core-7.11.5 2020-09-01 06:42:12 +00:00
dependabot-preview[bot] 2a5286764e Bump date-fns from 2.16.0 to 2.16.1
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.16.0 to 2.16.1.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/master/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.16.0...v2.16.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-01 06:37:18 +00:00
dependabot-preview[bot] a604d309a4 Bump @babel/core from 7.11.4 to 7.11.5
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.11.4 to 7.11.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.11.5/packages/babel-core)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-01 06:36:23 +00:00
dependabot-preview[bot] 3b3d98e763 Bump caniuse-lite from 1.0.30001120 to 1.0.30001122
Bumps [caniuse-lite](https://github.com/ben-eb/caniuse-lite) from 1.0.30001120 to 1.0.30001122.
- [Release notes](https://github.com/ben-eb/caniuse-lite/releases)
- [Changelog](https://github.com/ben-eb/caniuse-lite/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ben-eb/caniuse-lite/compare/v1.0.30001120...v1.0.30001122)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-01 06:35:49 +00:00
dependabot-preview[bot] a65aea0680 Merge pull request #670 from amir20/dependabot/npm_and_yarn/html-webpack-plugin-4.4.1 2020-08-30 16:14:54 +00:00
dependabot-preview[bot] 3c23631df7 Bump html-webpack-plugin from 4.4.0 to 4.4.1
Bumps [html-webpack-plugin](https://github.com/jantimon/html-webpack-plugin) from 4.4.0 to 4.4.1.
- [Release notes](https://github.com/jantimon/html-webpack-plugin/releases)
- [Changelog](https://github.com/jantimon/html-webpack-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jantimon/html-webpack-plugin/compare/v4.4.0...v4.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-30 16:08:55 +00:00
dependabot-preview[bot] 07b2f7bd0e Merge pull request #669 from amir20/dependabot/npm_and_yarn/html-webpack-plugin-4.4.0 2020-08-30 12:45:05 +00:00
dependabot-preview[bot] efd29ef7ae Bump html-webpack-plugin from 4.3.0 to 4.4.0
Bumps [html-webpack-plugin](https://github.com/jantimon/html-webpack-plugin) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/jantimon/html-webpack-plugin/releases)
- [Changelog](https://github.com/jantimon/html-webpack-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jantimon/html-webpack-plugin/compare/v4.3.0...v4.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-30 12:39:04 +00:00
dependabot-preview[bot] cd6564ce93 Merge pull request #668 from amir20/dependabot/npm_and_yarn/caniuse-lite-1.0.30001120 2020-08-30 04:43:30 +00:00
dependabot-preview[bot] 5205790b3e Bump caniuse-lite from 1.0.30001119 to 1.0.30001120
Bumps [caniuse-lite](https://github.com/ben-eb/caniuse-lite) from 1.0.30001119 to 1.0.30001120.
- [Release notes](https://github.com/ben-eb/caniuse-lite/releases)
- [Changelog](https://github.com/ben-eb/caniuse-lite/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ben-eb/caniuse-lite/compare/v1.0.30001119...v1.0.30001120)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-30 04:37:48 +00:00
dependabot-preview[bot] aaf2f2fc20 Merge pull request #667 from amir20/dependabot/npm_and_yarn/integration/jest-image-snapshot-4.2.0 2020-08-29 12:51:36 +00:00
dependabot-preview[bot] b3e7bcae79 Bump jest-image-snapshot from 4.1.0 to 4.2.0 in /integration
Bumps [jest-image-snapshot](https://github.com/americanexpress/jest-image-snapshot) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/americanexpress/jest-image-snapshot/releases)
- [Changelog](https://github.com/americanexpress/jest-image-snapshot/blob/master/CHANGELOG.md)
- [Commits](https://github.com/americanexpress/jest-image-snapshot/compare/v4.1.0...v4.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-29 12:45:21 +00:00
dependabot-preview[bot] 826efa2728 Merge pull request #666 from amir20/dependabot/npm_and_yarn/vue/test-utils-1.0.5 2020-08-29 12:07:51 +00:00
dependabot-preview[bot] 6aacc7b3c5 Bump @vue/test-utils from 1.0.4 to 1.0.5
Bumps [@vue/test-utils](https://github.com/vuejs/vue-test-utils/tree/HEAD/packages/test-utils) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/vuejs/vue-test-utils/releases)
- [Changelog](https://github.com/vuejs/vue-test-utils/blob/dev/packages/test-utils/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-test-utils/commits/v1.0.5/packages/test-utils)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-29 12:02:31 +00:00
dependabot-preview[bot] 834317720b Merge pull request #665 from amir20/dependabot/npm_and_yarn/date-fns-2.16.0 2020-08-28 12:30:13 +00:00
dependabot-preview[bot] 7e2af57aa6 Bump date-fns from 2.15.0 to 2.16.0
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.15.0 to 2.16.0.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/master/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.15.0...v2.16.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-28 12:24:12 +00:00
dependabot-preview[bot] cb6d94dee5 Merge pull request #664 from amir20/dependabot/npm_and_yarn/mini-css-extract-plugin-0.11.0 2020-08-28 12:23:18 +00:00
dependabot-preview[bot] 366c15d1b7 Merge pull request #663 from amir20/dependabot/npm_and_yarn/caniuse-lite-1.0.30001119 2020-08-28 12:22:33 +00:00
dependabot-preview[bot] 2cfd5879cd Merge pull request #662 from amir20/dependabot/npm_and_yarn/dompurify-2.0.14 2020-08-28 12:22:08 +00:00
dependabot-preview[bot] 541394d310 Bump mini-css-extract-plugin from 0.10.0 to 0.11.0
Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 0.10.0 to 0.11.0.
- [Release notes](https://github.com/webpack-contrib/mini-css-extract-plugin/releases)
- [Changelog](https://github.com/webpack-contrib/mini-css-extract-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/mini-css-extract-plugin/compare/v0.10.0...v0.11.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-28 12:16:55 +00:00
dependabot-preview[bot] 1057f45887 Bump caniuse-lite from 1.0.30001118 to 1.0.30001119
Bumps [caniuse-lite](https://github.com/ben-eb/caniuse-lite) from 1.0.30001118 to 1.0.30001119.
- [Release notes](https://github.com/ben-eb/caniuse-lite/releases)
- [Changelog](https://github.com/ben-eb/caniuse-lite/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ben-eb/caniuse-lite/compare/v1.0.30001118...v1.0.30001119)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-28 12:16:32 +00:00
dependabot-preview[bot] 74dba50340 Bump dompurify from 2.0.12 to 2.0.14
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.0.12 to 2.0.14.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/2.0.12...2.0.14)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-28 12:16:22 +00:00
dependabot-preview[bot] dae0886456 Merge pull request #659 from amir20/dependabot/npm_and_yarn/release-it-13.7.0 2020-08-26 12:32:43 +00:00
dependabot-preview[bot] b04a85a10a Bump release-it from 13.6.9 to 13.7.0
Bumps [release-it](https://github.com/release-it/release-it) from 13.6.9 to 13.7.0.
- [Release notes](https://github.com/release-it/release-it/releases)
- [Changelog](https://github.com/release-it/release-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/release-it/release-it/compare/13.6.9...13.7.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-26 12:27:23 +00:00
dependabot-preview[bot] bde5b4287d Merge pull request #660 from amir20/dependabot/npm_and_yarn/caniuse-lite-1.0.30001118 2020-08-26 12:25:31 +00:00
dependabot-preview[bot] 078b9a11fd Merge pull request #661 from amir20/dependabot/npm_and_yarn/prettier-2.1.1 2020-08-26 12:25:27 +00:00
dependabot-preview[bot] bf89411ebf Bump prettier from 2.1.0 to 2.1.1
Bumps [prettier](https://github.com/prettier/prettier) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.1.0...2.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-26 12:19:31 +00:00
dependabot-preview[bot] 24f19fadec Bump caniuse-lite from 1.0.30001117 to 1.0.30001118
Bumps [caniuse-lite](https://github.com/ben-eb/caniuse-lite) from 1.0.30001117 to 1.0.30001118.
- [Release notes](https://github.com/ben-eb/caniuse-lite/releases)
- [Changelog](https://github.com/ben-eb/caniuse-lite/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ben-eb/caniuse-lite/compare/v1.0.30001117...v1.0.30001118)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-26 12:19:10 +00:00
dependabot-preview[bot] 0caf7da96b Merge pull request #658 from amir20/dependabot/npm_and_yarn/sass-loader-10.0.1 2020-08-26 11:57:23 +00:00
dependabot-preview[bot] 0fd5d91f12 Bump sass-loader from 10.0.0 to 10.0.1
Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 10.0.0 to 10.0.1.
- [Release notes](https://github.com/webpack-contrib/sass-loader/releases)
- [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/sass-loader/compare/v10.0.0...v10.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-26 11:50:57 +00:00
dependabot-preview[bot] 9bd1008291 Merge pull request #656 from amir20/dependabot/npm_and_yarn/lint-staged-10.2.13 2020-08-26 10:36:35 +00:00
dependabot-preview[bot] 2327b26bc7 Bump lint-staged from 10.2.11 to 10.2.13
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.2.11 to 10.2.13.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.2.11...v10.2.13)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-26 10:30:14 +00:00
dependabot-preview[bot] 807a044ebb Merge pull request #655 from amir20/dependabot/go_modules/github.com/magiconair/properties-1.8.2 2020-08-25 13:23:53 +00:00
dependabot-preview[bot] b658337b24 Bump github.com/magiconair/properties from 1.8.1 to 1.8.2
Bumps [github.com/magiconair/properties](https://github.com/magiconair/properties) from 1.8.1 to 1.8.2.
- [Release notes](https://github.com/magiconair/properties/releases)
- [Changelog](https://github.com/magiconair/properties/blob/master/CHANGELOG.md)
- [Commits](https://github.com/magiconair/properties/compare/v1.8.1...v1.8.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-25 13:17:21 +00:00
dependabot-preview[bot] 23231f9e25 Merge pull request #654 from amir20/dependabot/npm_and_yarn/css-loader-4.2.2 2020-08-25 06:52:22 +00:00
dependabot-preview[bot] 6fa20c3223 Merge pull request #653 from amir20/dependabot/npm_and_yarn/sass-loader-10.0.0 2020-08-25 06:52:15 +00:00
dependabot-preview[bot] f12b1ba7ee Bump css-loader from 4.2.1 to 4.2.2
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 4.2.1 to 4.2.2.
- [Release notes](https://github.com/webpack-contrib/css-loader/releases)
- [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/css-loader/compare/v4.2.1...v4.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-25 06:47:22 +00:00
dependabot-preview[bot] 88de77cce0 Bump sass-loader from 9.0.3 to 10.0.0
Bumps [sass-loader](https://github.com/webpack-contrib/sass-loader) from 9.0.3 to 10.0.0.
- [Release notes](https://github.com/webpack-contrib/sass-loader/releases)
- [Changelog](https://github.com/webpack-contrib/sass-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/sass-loader/compare/v9.0.3...v10.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-25 06:46:44 +00:00
dependabot-preview[bot] 30bbd333af Merge pull request #652 from amir20/dependabot/npm_and_yarn/prettier-2.1.0 2020-08-25 05:41:13 +00:00
dependabot-preview[bot] a371a68d54 Bump prettier from 2.0.5 to 2.1.0
Bumps [prettier](https://github.com/prettier/prettier) from 2.0.5 to 2.1.0.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.0.5...2.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-25 05:35:46 +00:00
dependabot-preview[bot] e2340d6656 Merge pull request #651 from amir20/dependabot/go_modules/github.com/gorilla/mux-1.8.0 2020-08-24 13:24:05 +00:00
dependabot-preview[bot] 9cd0e932bd Bump github.com/gorilla/mux from 1.7.4 to 1.8.0
Bumps [github.com/gorilla/mux](https://github.com/gorilla/mux) from 1.7.4 to 1.8.0.
- [Release notes](https://github.com/gorilla/mux/releases)
- [Commits](https://github.com/gorilla/mux/compare/v1.7.4...v1.8.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-24 13:17:45 +00:00
dependabot-preview[bot] 21bec08327 Merge pull request #650 from amir20/dependabot/npm_and_yarn/release-it-13.6.9 2020-08-22 18:46:32 +00:00
dependabot-preview[bot] 9213a7e4d0 Bump release-it from 13.6.8 to 13.6.9
Bumps [release-it](https://github.com/release-it/release-it) from 13.6.8 to 13.6.9.
- [Release notes](https://github.com/release-it/release-it/releases)
- [Changelog](https://github.com/release-it/release-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/release-it/release-it/compare/13.6.8...13.6.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-22 18:40:14 +00:00
dependabot-preview[bot] 4325810d94 Merge pull request #649 from amir20/dependabot/npm_and_yarn/jest-26.4.2 2020-08-22 12:53:16 +00:00
dependabot-preview[bot] 33e6830962 Bump jest from 26.4.1 to 26.4.2
Bumps [jest](https://github.com/facebook/jest) from 26.4.1 to 26.4.2.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/compare/v26.4.1...v26.4.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-22 12:47:43 +00:00
dependabot-preview[bot] c70d196e6d Merge pull request #648 from amir20/dependabot/npm_and_yarn/integration/jest-26.4.2 2020-08-22 12:45:50 +00:00
dependabot-preview[bot] 9357b49a92 Bump jest from 26.4.1 to 26.4.2 in /integration
Bumps [jest](https://github.com/facebook/jest) from 26.4.1 to 26.4.2.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/compare/v26.4.1...v26.4.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-22 12:40:16 +00:00
dependabot-preview[bot] d880800e17 Merge pull request #647 from amir20/dependabot/npm_and_yarn/buefy-0.9.2 2020-08-21 21:43:46 +00:00
dependabot-preview[bot] 0d37384259 Bump buefy from 0.9.1 to 0.9.2
Bumps [buefy](https://github.com/buefy/buefy) from 0.9.1 to 0.9.2.
- [Release notes](https://github.com/buefy/buefy/releases)
- [Changelog](https://github.com/buefy/buefy/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/buefy/buefy/compare/v0.9.1...v0.9.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-21 21:38:14 +00:00
31 changed files with 1261 additions and 1132 deletions
+9 -10
View File
@@ -31,20 +31,16 @@ Content-Type: text/plain; charset=utf-8
dev
/* snapshot: Test_handler_listContainers_happy */
HTTP/1.1 200 OK
Connection: close
Content-Type: text/plain; charset=utf-8
[{"id":"1234567890","names":null,"name":"test","image":"image","imageId":"image_id","command":"command","created":0,"state":"state","status":"status"}]
/* snapshot: Test_handler_streamEvents_error */
HTTP/1.1 200 OK
Connection: close
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/event-stream
X-Accel-Buffering: no
X-Accel-Buffering: no
event: containers-changed
data: []
/* snapshot: Test_handler_streamEvents_error_request */
HTTP/1.1 200 OK
@@ -52,7 +48,10 @@ Connection: close
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/event-stream
X-Accel-Buffering: no
X-Accel-Buffering: no
event: containers-changed
data: []
/* snapshot: Test_handler_streamEvents_happy */
HTTP/1.1 200 OK
@@ -63,7 +62,7 @@ Content-Type: text/event-stream
X-Accel-Buffering: no
event: containers-changed
data: start
data: []
/* snapshot: Test_handler_streamLogs_error_finding_container */
HTTP/1.1 404 Not Found
+11 -10
View File
@@ -17,31 +17,32 @@ describe("<App />", () => {
global.EventSource = EventSource;
const state = {
settings: { menuWidth: 15 },
containers: [{ id: "abc", name: "Test 1" }],
};
const getters = {
visibleContainers() {
return [
{ id: "abc", name: "Test 1" },
{ id: "xyz", name: "Test 2" },
];
visibleContainers(store) {
return store.containers;
},
activeContainers() {
return [];
},
};
const actions = {
FETCH_CONTAINERS: () => Promise.resolve(),
};
store = new Vuex.Store({
state,
getters,
actions,
});
});
test("has right title", async () => {
const wrapper = shallowMount(App, { stubs, store, localVue });
wrapper.vm.$store.state.containers = [
{ id: "abc", name: "Test 1" },
{ id: "xyz", name: "Test 2" },
];
await wrapper.vm.$nextTick();
expect(wrapper.vm.title).toContain("2 containers");
});
+5 -8
View File
@@ -15,7 +15,6 @@
<pane v-for="other in activeContainers" :key="other.id" v-if="!isMobile">
<log-container
:id="other.id"
:title="other.name"
show-title
scrollable
closable
@@ -72,10 +71,6 @@ export default {
titleTemplate: "%s - Dozzle",
};
},
async created() {
await this.fetchContainerList();
this.title = `${this.visibleContainers.length} containers`;
},
mounted() {
if (this.hasSmallerScrollbars) {
document.documentElement.classList.add("has-custom-scrollbars");
@@ -100,10 +95,13 @@ export default {
document.documentElement.removeAttribute("data-theme");
}
},
visibleContainers() {
this.title = `${this.visibleContainers.length} containers`;
},
},
computed: {
...mapState(["activeContainers", "isMobile", "settings"]),
...mapGetters(["visibleContainers"]),
...mapState(["isMobile", "settings"]),
...mapGetters(["visibleContainers", "activeContainers"]),
hasSmallerScrollbars() {
return this.settings.smallerScrollbars;
},
@@ -113,7 +111,6 @@ export default {
},
methods: {
...mapActions({
fetchContainerList: "FETCH_CONTAINERS",
removeActiveContainer: "REMOVE_ACTIVE_CONTAINER",
updateSetting: "UPDATE_SETTING",
}),
+40
View File
@@ -0,0 +1,40 @@
<template>
<div class="is-size-7 is-uppercase columns is-marginless is-mobile">
<div class="column is-narrow has-text-weight-bold">
{{ state }}
</div>
<div class="column is-narrow" v-if="stat.memoryUsage !== null">
<span class="has-text-weight-light">mem</span>
<span class="has-text-weight-bold">
{{ formatBytes(stat.memoryUsage) }}
</span>
</div>
<div class="column is-narrow" v-if="stat.cpu !== null">
<span class="has-text-weight-light">load</span>
<span class="has-text-weight-bold"> {{ stat.cpu }}% </span>
</div>
</div>
</template>
<script>
export default {
props: {
stat: Object,
state: String,
},
name: "ContainerStat",
methods: {
formatBytes(bytes, decimals = 2) {
if (bytes === 0) return "0 Bytes";
const k = 1024;
const dm = decimals < 0 ? 0 : decimals;
const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
},
},
};
</script>
<style lang="scss" scoped></style>
+2 -29
View File
@@ -1,9 +1,6 @@
<template>
<div class="name columns is-marginless">
<div class="columns is-marginless has-text-weight-bold is-family-monospace">
<span class="column">{{ value }}</span>
<span class="column is-narrow" v-if="closable">
<button class="delete is-medium" @click="$emit('close')"></button>
</span>
</div>
</template>
@@ -11,33 +8,9 @@
export default {
props: {
value: String,
closable: {
type: Boolean,
default: false,
},
},
name: "ContainerTitle",
};
</script>
<style lang="scss" scoped>
.name {
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
background: rgba(0, 0, 0, 0.1);
font-weight: bold;
font-family: monospace;
button.delete {
background-color: var(--scheme-main-ter);
opacity: 0.6;
&:after,
&:before {
background-color: var(--text-color);
}
&:hover {
opacity: 1;
}
}
}
</style>
<style lang="scss" scoped></style>
+36 -5
View File
@@ -1,7 +1,17 @@
<template>
<scrollable-view :scrollable="scrollable">
<scrollable-view :scrollable="scrollable" v-if="container">
<template v-slot:header v-if="showTitle">
<container-title :value="title" :closable="closable" @close="$emit('close')"></container-title>
<div class="columns is-vcentered pr-4 mr-0">
<div class="column is-narrow">
<container-title :value="container.name" @close="$emit('close')"></container-title>
</div>
<div class="column is-clipped">
<container-stat :stat="container.stat" :state="container.state"></container-stat>
</div>
<div class="column is-narrow" v-if="closable">
<button class="delete is-medium" @click="$emit('close')"></button>
</div>
</div>
</template>
<template v-slot="{ setLoading }">
<log-viewer-with-source :id="id" @loading-more="setLoading($event)"></log-viewer-with-source>
@@ -10,18 +20,18 @@
</template>
<script>
import { mapGetters } from "vuex";
import LogViewerWithSource from "./LogViewerWithSource";
import ScrollableView from "./ScrollableView";
import ContainerTitle from "./ContainerTitle";
import ContainerStat from "./ContainerStat";
export default {
props: {
id: {
type: String,
},
title: {
type: String,
},
showTitle: {
type: Boolean,
default: false,
@@ -40,6 +50,27 @@ export default {
LogViewerWithSource,
ScrollableView,
ContainerTitle,
ContainerStat,
},
computed: {
...mapGetters(["allContainersById"]),
container() {
return this.allContainersById[this.id];
},
},
};
</script>
<style lang="scss" scoped>
button.delete {
background-color: var(--scheme-main-ter);
opacity: 0.6;
&:after,
&:before {
background-color: var(--text-color);
}
&:hover {
opacity: 1;
}
}
</style>
+30 -20
View File
@@ -1,18 +1,29 @@
<template>
<aside>
<a
role="button"
class="navbar-burger burger is-hidden-tablet is-pulled-right"
@click="showNav = !showNav"
:class="{ 'is-active': showNav }"
>
<span></span> <span></span> <span></span>
</a>
<router-link :to="{ name: 'default' }">
<svg class="logo">
<use href="#logo"></use>
</svg>
</router-link>
<div class="columns is-marginless is-gapless is-mobile is-vcentered">
<div class="column is-narrow">
<router-link :to="{ name: 'default' }">
<svg class="logo">
<use href="#logo"></use>
</svg>
</router-link>
</div>
<div class="column ml-4 is-family-monospace is-ellipsis" v-if="$route.name == 'container'">
{{ allContainersById[$route.params.id].name }}
</div>
<div class="column is-narrow push-right">
<a
role="button"
class="navbar-burger burger is-hidden-tablet is-pulled-right"
@click="showNav = !showNav"
:class="{ 'is-active': showNav }"
>
<span></span> <span></span> <span></span>
</a>
</div>
</div>
<p class="menu-label is-hidden-mobile" :class="{ 'is-active': showNav }">Containers</p>
<ul class="menu-list is-hidden-mobile" :class="{ 'is-active': showNav }">
<li v-for="item in visibleContainers" :key="item.id">
@@ -21,7 +32,7 @@
active-class="is-active"
:title="item.name"
>
<div class="hide-overflow">
<div class="is-ellipsis">
{{ item.name }}
</div>
</router-link>
@@ -42,7 +53,7 @@ export default {
};
},
computed: {
...mapGetters(["activeContainersById", "visibleContainers"]),
...mapGetters(["visibleContainers", "allContainersById"]),
},
watch: {
$route(to, from) {
@@ -66,11 +77,6 @@ aside {
.menu-label {
margin-top: 1em;
}
.hide-overflow {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.title {
text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.2);
@@ -93,5 +99,9 @@ aside {
height: 36px;
fill: var(--logo-color);
}
.column.push-right {
margin-left: auto;
}
}
</style>
+4 -8
View File
@@ -5,24 +5,20 @@
</svg>
<div class="is-overlay columns is-vcentered is-centered has-text-weight-light">
<template v-if="indeterminate">
<div class="column is-narrow is-paddingless is-size-2">
&#8734;
</div>
<div class="column is-narrow is-paddingless is-size-2">&#8734;</div>
</template>
<template v-else>
<span class="column is-narrow is-paddingless is-size-2">
{{ Math.ceil(scrollProgress * 100) }}
</span>
<span class="column is-narrow is-paddingless">
%
</span>
<span class="column is-narrow is-paddingless"> % </span>
</template>
</div>
</div>
</template>
<script>
import { mapState } from "vuex";
import { mapGetters } from "vuex";
import throttle from "lodash.throttle";
export default {
@@ -61,7 +57,7 @@ export default {
},
},
computed: {
...mapState(["activeContainers"]),
...mapGetters(["activeContainers"]),
},
methods: {
attachEvents() {
+7
View File
@@ -85,6 +85,13 @@ section {
display: flex;
flex-direction: column;
header {
position: sticky;
top: 0;
background: var(--body-background-color);
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
&.is-full-height-scrollable {
height: 100vh;
min-height: 0;
+8 -9
View File
@@ -28,7 +28,7 @@
active-class="is-active"
:title="item.name"
>
<div class="hide-overflow">
<div class="is-ellipsis">
<span
@click.stop.prevent="appendActiveContainer(item)"
class="icon is-small will-append-container"
@@ -59,8 +59,13 @@ export default {
return {};
},
computed: {
...mapState(["activeContainers"]),
...mapGetters(["activeContainersById", "visibleContainers"]),
...mapGetters(["visibleContainers", "activeContainers"]),
activeContainersById() {
return this.activeContainers.reduce((map, obj) => {
map[obj.id] = obj;
return map;
}, {});
},
},
methods: {
...mapActions({
@@ -77,12 +82,6 @@ aside {
position: fixed;
width: inherit;
.hide-overflow {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.is-hidden-mobile.is-active {
display: block !important;
}
+2 -9
View File
@@ -1,11 +1,5 @@
<template>
<log-container
:id="id"
:title="title"
:show-title="activeContainers.length > 0"
:scrollable="activeContainers.length > 0"
>
</log-container>
<log-container :id="id" show-title :scrollable="activeContainers.length > 0"> </log-container>
</template>
<script>
@@ -36,8 +30,7 @@ export default {
}
},
computed: {
...mapState(["activeContainers"]),
...mapGetters(["allContainersById"]),
...mapGetters(["allContainersById", "activeContainers"]),
},
watch: {
id() {
+3 -7
View File
@@ -3,13 +3,11 @@
<section class="hero is-small mt-4">
<div class="hero-body">
<div class="container">
<h1 class="title">
Hello, there!
</h1>
<h1 class="title">Hello, there!</h1>
</div>
</div>
</section>
<section class="level section">
<section class="level section is-mobile">
<div class="level-item has-text-centered">
<div>
<p class="title">{{ containers.length }}</p>
@@ -33,9 +31,7 @@
<section class="columns is-centered section">
<div class="column is-4">
<div class="panel">
<p class="panel-heading">
Containers
</p>
<p class="panel-heading">Containers</p>
<div class="panel-block">
<p class="control has-icons-left">
<input
+34 -16
View File
@@ -12,7 +12,7 @@ storage.set(DOZZLE_SETTINGS_KEY, { ...DEFAULT_SETTINGS, ...storage.get(DOZZLE_SE
const state = {
containers: [],
activeContainers: [],
activeContainerIds: [],
searchFilter: null,
isMobile: mql.matches,
settings: storage.get(DOZZLE_SETTINGS_KEY),
@@ -20,13 +20,26 @@ const state = {
const mutations = {
SET_CONTAINERS(state, containers) {
const containersById = state.containers.reduce((map, obj) => {
map[obj.id] = obj;
return map;
}, {});
containers.forEach(
(container) =>
(container.stat =
containersById[container.id] && containersById[container.id].stat
? containersById[container.id].stat
: { memoryUsage: 0, cpu: 0 })
);
state.containers = containers;
},
ADD_ACTIVE_CONTAINERS(state, container) {
state.activeContainers.push(container);
ADD_ACTIVE_CONTAINERS(state, { id }) {
state.activeContainerIds.push(id);
},
REMOVE_ACTIVE_CONTAINER(state, container) {
state.activeContainers.splice(state.activeContainers.indexOf(container), 1);
REMOVE_ACTIVE_CONTAINER(state, { id }) {
state.activeContainerIds.splice(state.activeContainerIds.indexOf(id), 1);
},
SET_SEARCH(state, filter) {
state.searchFilter = filter;
@@ -38,6 +51,9 @@ const mutations = {
state.settings = { ...state.settings, ...newValues };
storage.set(DOZZLE_SETTINGS_KEY, state.settings);
},
UPDATE_STAT(state, { container, stat }) {
Vue.set(container, "stat", stat);
},
};
const actions = {
@@ -50,21 +66,18 @@ const actions = {
SET_SEARCH({ commit }, filter) {
commit("SET_SEARCH", filter);
},
async FETCH_CONTAINERS({ commit }) {
const containers = await (await fetch(`${config.base}/api/containers.json`)).json();
commit("SET_CONTAINERS", containers);
},
UPDATE_SETTING({ commit }, setting) {
commit("UPDATE_SETTINGS", setting);
},
UPDATE_STATS({ commit, getters }, stat) {
const { allContainersById } = getters;
const container = allContainersById[stat.id];
if (container) {
commit("UPDATE_STAT", { container, stat });
}
},
};
const getters = {
activeContainersById({ activeContainers }) {
return activeContainers.reduce((map, obj) => {
map[obj.id] = obj;
return map;
}, {});
},
allContainersById({ containers }) {
return containers.reduce((map, obj) => {
map[obj.id] = obj;
@@ -75,10 +88,15 @@ const getters = {
const filter = showAllContainers ? () => true : (c) => c.state === "running";
return containers.filter(filter);
},
activeContainers({ activeContainerIds }, { allContainersById }) {
return activeContainerIds.map((id) => allContainersById[id]);
},
};
const es = new EventSource(`${config.base}/api/events/stream`);
es.addEventListener("containers-changed", (e) => setTimeout(() => store.dispatch("FETCH_CONTAINERS"), 1000), false);
es.addEventListener("containers-changed", (e) => store.commit("SET_CONTAINERS", JSON.parse(e.data)), false);
es.addEventListener("container-stat", (e) => store.dispatch("UPDATE_STATS", JSON.parse(e.data)), false);
mql.addListener((e) => store.commit("SET_MOBILE_WIDTH", e.matches));
const store = new Vuex.Store({
+14
View File
@@ -135,3 +135,17 @@ html.has-custom-scrollbars {
border-color: transparent;
}
}
.splitpanes__pane {
overflow: unset;
}
.splitpanes__splitter {
z-index: 99;
}
.is-ellipsis {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
+45
View File
@@ -5,6 +5,7 @@ import (
"bytes"
"context"
"encoding/binary"
"encoding/json"
"fmt"
"io"
"sort"
@@ -29,6 +30,7 @@ type dockerProxy interface {
ContainerLogs(context.Context, string, types.ContainerLogsOptions) (io.ReadCloser, error)
Events(context.Context, types.EventsOptions) (<-chan events.Message, <-chan error)
ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error)
ContainerStats(ctx context.Context, containerID string, stream bool) (types.ContainerStats, error)
}
// Client is a proxy around the docker client
@@ -38,6 +40,7 @@ type Client interface {
ContainerLogs(context.Context, string, int, string) (<-chan string, <-chan error)
Events(context.Context) (<-chan events.Message, <-chan error)
ContainerLogsBetweenDates(context.Context, string, time.Time, time.Time) ([]string, error)
ContainerStats(context.Context, string, chan<- ContainerStat) error
}
// NewClient creates a new instance of Client
@@ -146,6 +149,48 @@ func logReader(reader io.ReadCloser, tty bool) func() (string, error) {
}
}
func (d *dockerClient) ContainerStats(ctx context.Context, id string, stats chan<- ContainerStat) error {
response, err := d.cli.ContainerStats(ctx, id, true)
if err != nil {
return err
}
go func() {
defer response.Body.Close()
decoder := json.NewDecoder(response.Body)
var v *types.StatsJSON
for {
if err := decoder.Decode(&v); err != nil {
if err == context.Canceled || err == io.EOF {
log.Debugf("stopping stats streaming for container %s", id)
break
}
log.Errorf("decoder for stats api returned an unknown error %v", err)
}
var (
cpuDelta = float64(v.CPUStats.CPUUsage.TotalUsage) - float64(v.PreCPUStats.CPUUsage.TotalUsage)
systemDelta = float64(v.CPUStats.SystemUsage) - float64(v.PreCPUStats.SystemUsage)
cpuPercent = int64((cpuDelta / systemDelta) * float64(len(v.CPUStats.CPUUsage.PercpuUsage)) * 100)
memUsage = int64(v.MemoryStats.Usage - v.MemoryStats.Stats["cache"])
memPercent = int64(float64(memUsage) / float64(v.MemoryStats.Limit) * 100)
)
if cpuPercent > 0 || memUsage > 0 {
stats <- ContainerStat{
ID: id,
CPUPercent: cpuPercent,
MemoryPercent: memPercent,
MemoryUsage: memUsage,
}
}
}
}()
return nil
}
func (d *dockerClient) ContainerLogs(ctx context.Context, id string, tailSize int, since string) (<-chan string, <-chan error) {
log.WithField("id", id).WithField("since", since).Debug("Streaming logs for container")
+5
View File
@@ -40,6 +40,7 @@ func (m *mockedProxy) ContainerLogs(ctx context.Context, id string, options type
}
return reader, args.Error(1)
}
func (m *mockedProxy) ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) {
args := m.Called(ctx, containerID)
json, ok := args.Get(0).(types.ContainerJSON)
@@ -50,6 +51,10 @@ func (m *mockedProxy) ContainerInspect(ctx context.Context, containerID string)
return json, args.Error(1)
}
func (m *mockedProxy) ContainerStats(ctx context.Context, containerID string, stream bool) (types.ContainerStats, error) {
return types.ContainerStats{}, nil
}
func Test_dockerClient_ListContainers_null(t *testing.T) {
proxy := new(mockedProxy)
proxy.On("ContainerList", mock.Anything, mock.Anything).Return(nil, nil)
+8
View File
@@ -12,3 +12,11 @@ type Container struct {
State string `json:"state"`
Status string `json:"status"`
}
// ContainerStat represent stats instant for a container
type ContainerStat struct {
ID string `json:"id"`
CPUPercent int64 `json:"cpu"`
MemoryPercent int64 `json:"memory"`
MemoryUsage int64 `json:"memoryUsage"`
}
+16 -15
View File
@@ -14,40 +14,41 @@ require (
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
github.com/Microsoft/go-winio v0.4.14 // indirect
github.com/beme/abide v0.0.0-20190723115211-635a09831760
github.com/containerd/containerd v1.3.3 // indirect
github.com/containerd/containerd v1.4.0 // indirect
github.com/docker/distribution v2.7.1+incompatible // indirect
github.com/docker/docker v0.0.0-20190827232753-32688a47f341
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/gobuffalo/envy v1.9.0 // indirect
github.com/gobuffalo/packd v1.0.0 // indirect
github.com/gobuffalo/packr v1.30.1
github.com/gogo/protobuf v1.3.1 // indirect
github.com/golang/protobuf v1.3.4 // indirect
github.com/google/go-cmp v0.3.1 // indirect
github.com/gorilla/mux v1.7.4
github.com/magiconair/properties v1.8.1
github.com/golang/protobuf v1.4.2 // indirect
github.com/gorilla/mux v1.8.0
github.com/magiconair/properties v1.8.2
github.com/mitchellh/mapstructure v1.3.3 // indirect
github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c // indirect
github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.1 // indirect
github.com/pelletier/go-toml v1.6.0 // indirect
github.com/pelletier/go-toml v1.8.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rogpeppe/go-internal v1.5.2 // indirect
github.com/rogpeppe/go-internal v1.6.2 // indirect
github.com/sergi/go-diff v1.0.0 // indirect
github.com/sirupsen/logrus v1.6.0
github.com/spf13/afero v1.2.2 // indirect
github.com/spf13/afero v1.3.5 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5
github.com/spf13/viper v1.7.1
github.com/stretchr/objx v0.2.0 // indirect
github.com/stretchr/testify v1.6.1
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b // indirect
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae // indirect
google.golang.org/genproto v0.0.0-20200226201735-46b91f19d98c // indirect
google.golang.org/grpc v1.27.1 // indirect
gopkg.in/ini.v1 v1.52.0 // indirect
gopkg.in/yaml.v2 v2.2.8 // indirect
golang.org/x/net v0.0.0-20200904194848-62affa334b73 // indirect
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f // indirect
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d // indirect
google.golang.org/grpc v1.31.1
google.golang.org/protobuf v1.25.0 // indirect
gopkg.in/ini.v1 v1.61.0 // indirect
gotest.tools v2.2.0+incompatible // indirect
)
+66
View File
@@ -45,8 +45,11 @@ github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3k
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/containerd/containerd v1.3.3 h1:LoIzb5y9x5l8VKAlyrbusNPXqBY0+kviRloxFUMFwKc=
github.com/containerd/containerd v1.3.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.4.0 h1:aWJB3lbDEaOxg1mkTBAINY2a+NsoKbAeRYefJPPRY+o=
github.com/containerd/containerd v1.4.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -74,11 +77,15 @@ github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -119,12 +126,22 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
@@ -138,6 +155,8 @@ github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
@@ -185,6 +204,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -194,6 +214,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.2 h1:znVR8Q4g7/WlcvsxLBRWvo+vtFJUAbDn3w+Yak2xVMI=
github.com/magiconair/properties v1.8.2/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
@@ -208,6 +230,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -221,6 +245,8 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
@@ -229,12 +255,15 @@ github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4=
github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys=
github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw=
github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs=
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
@@ -260,6 +289,8 @@ github.com/rogpeppe/go-internal v1.3.2 h1:XU784Pr0wdahMY2bYcyK6N1KuaRAdLtqD4qd8D
github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.5.2 h1:qLvObTrvO/XRCqmkKxUlOBc48bI3efyDuAZe25QiF0w=
github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0=
github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
@@ -285,6 +316,8 @@ github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
github.com/spf13/afero v1.3.5 h1:AWZ/w4lcfxuh52NVL78p9Eh8j6r1mCTEGSRFBJyIHAE=
github.com/spf13/afero v1.3.5/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
@@ -344,6 +377,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -382,6 +417,8 @@ golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA=
golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -410,12 +447,18 @@ golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f h1:Fqb3ao1hUmOR3GkUOg/Y+BadLwykBIzs5q8Ez2SbHyc=
golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -440,6 +483,7 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
@@ -463,6 +507,9 @@ google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBr
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200226201735-46b91f19d98c h1:xFOdgVPpeowWAH0MJ5i0XMp+3yWiWamMtN/kx9xThIQ=
google.golang.org/genproto v0.0.0-20200226201735-46b91f19d98c/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d h1:92D1fum1bJLKSdr11OJ+54YeCMCGYIygTA7R/YZxH5M=
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
@@ -470,9 +517,24 @@ google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs=
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -483,6 +545,8 @@ gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.52.0 h1:j+Lt/M1oPPejkniCg1TkWE2J3Eh1oZTsHSXzMTzUXn4=
gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.61.0 h1:LBCdW4FmFYL4s/vDZD1RQYX7oAR6IjujCYgMdbHBR10=
gopkg.in/ini.v1 v1.61.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -492,6 +556,8 @@ gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 76 KiB

+126 -121
View File
@@ -350,10 +350,10 @@
jest-util "^26.3.0"
slash "^3.0.0"
"@jest/core@^26.4.1":
version "26.4.1"
resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.4.1.tgz#04af2e4d985e035e13ef94d61d302a8458f587e9"
integrity sha512-EFziH1tJC5N8xb8OjUcQgyWdezJh6+zBX5p+9S7HR1jzBVeG8jCE/Edp7yqxW/cToLG/QKj8qrpox+HV9Qw1rw==
"@jest/core@^26.4.2":
version "26.4.2"
resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.4.2.tgz#85d0894f31ac29b5bab07aa86806d03dd3d33edc"
integrity sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==
dependencies:
"@jest/console" "^26.3.0"
"@jest/reporters" "^26.4.1"
@@ -366,17 +366,17 @@
exit "^0.1.2"
graceful-fs "^4.2.4"
jest-changed-files "^26.3.0"
jest-config "^26.4.1"
jest-config "^26.4.2"
jest-haste-map "^26.3.0"
jest-message-util "^26.3.0"
jest-regex-util "^26.0.0"
jest-resolve "^26.4.0"
jest-resolve-dependencies "^26.4.1"
jest-runner "^26.4.1"
jest-runtime "^26.4.1"
jest-snapshot "^26.4.1"
jest-resolve-dependencies "^26.4.2"
jest-runner "^26.4.2"
jest-runtime "^26.4.2"
jest-snapshot "^26.4.2"
jest-util "^26.3.0"
jest-validate "^26.4.0"
jest-validate "^26.4.2"
jest-watcher "^26.3.0"
micromatch "^4.0.2"
p-each-series "^2.1.0"
@@ -406,14 +406,14 @@
jest-mock "^26.3.0"
jest-util "^26.3.0"
"@jest/globals@^26.4.1":
version "26.4.1"
resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.4.1.tgz#4e8f6721f081444eda86a7c3e4ceefcf2baa5de1"
integrity sha512-gdsHefnwjck+AwDUwW+6rmctmKEcZEEZ4F3PB5kKnub7r0dUoN1KVSyNRXtB5qpZgRYESnxgDXhpw/XYKIsAeg==
"@jest/globals@^26.4.2":
version "26.4.2"
resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.4.2.tgz#73c2a862ac691d998889a241beb3dc9cada40d4a"
integrity sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==
dependencies:
"@jest/environment" "^26.3.0"
"@jest/types" "^26.3.0"
expect "^26.4.1"
expect "^26.4.2"
"@jest/reporters@^26.4.1":
version "26.4.1"
@@ -466,16 +466,16 @@
"@types/istanbul-lib-coverage" "^2.0.0"
collect-v8-coverage "^1.0.0"
"@jest/test-sequencer@^26.4.1":
version "26.4.1"
resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.4.1.tgz#b7cd13fedf4c1c20364bd40c134876b003f742e1"
integrity sha512-YR4PNPu1RVHxyv/HSQMjc+pBEWa6wuM7xbEX/u5M5FFg6ZM6m00m7Jf0fjRxGN6hZlY5vECmNhJu/kvJLrxR8w==
"@jest/test-sequencer@^26.4.2":
version "26.4.2"
resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz#58a3760a61eec758a2ce6080201424580d97cbba"
integrity sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==
dependencies:
"@jest/test-result" "^26.3.0"
graceful-fs "^4.2.4"
jest-haste-map "^26.3.0"
jest-runner "^26.4.1"
jest-runtime "^26.4.1"
jest-runner "^26.4.2"
jest-runtime "^26.4.2"
"@jest/transform@^26.3.0":
version "26.3.0"
@@ -883,9 +883,9 @@ bcrypt-pbkdf@^1.0.0:
tweetnacl "^0.14.3"
bl@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a"
integrity sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==
version "4.0.3"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489"
integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
@@ -1447,15 +1447,15 @@ expect-puppeteer@^4.4.0:
resolved "https://registry.yarnpkg.com/expect-puppeteer/-/expect-puppeteer-4.4.0.tgz#1c948af08acdd6c8cbdb7f90e617f44d86888886"
integrity sha512-6Ey4Xy2xvmuQu7z7YQtMsaMV0EHJRpVxIDOd5GRrm04/I3nkTKIutELfECsLp6le+b3SSa3cXhPiw6PgqzxYWA==
expect@^26.4.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/expect/-/expect-26.4.1.tgz#6ed3dc218e6a9ffce16c15edc518f44bad9a6731"
integrity sha512-PnsyF/VmPRH/HAWELjrIAgQ5h+4JLTiomA1A2djx+jXrCQzQ/4egZYBOEx9hShoX+mQLS4enYk6Ouxk8b4kcEw==
expect@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/expect/-/expect-26.4.2.tgz#36db120928a5a2d7d9736643032de32f24e1b2a1"
integrity sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==
dependencies:
"@jest/types" "^26.3.0"
ansi-styles "^4.0.0"
jest-get-type "^26.3.0"
jest-matcher-utils "^26.4.1"
jest-matcher-utils "^26.4.2"
jest-message-util "^26.3.0"
jest-regex-util "^26.0.0"
@@ -2132,12 +2132,12 @@ jest-changed-files@^26.3.0:
execa "^4.0.0"
throat "^5.0.0"
jest-cli@^26.4.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.4.1.tgz#877fff1c17661c7bbd8e7df56711ee489091236f"
integrity sha512-c6px+IOO0OsZ7X/uSr65wcjZnd7NYNUDWFT5OETyCnJRkkwoTER7gneRDrwgr3Ex5+gCGO7D/IMWxUHB/L624A==
jest-cli@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.4.2.tgz#24afc6e4dfc25cde4c7ec4226fb7db5f157c21da"
integrity sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw==
dependencies:
"@jest/core" "^26.4.1"
"@jest/core" "^26.4.2"
"@jest/test-result" "^26.3.0"
"@jest/types" "^26.3.0"
chalk "^4.0.0"
@@ -2145,19 +2145,19 @@ jest-cli@^26.4.1:
graceful-fs "^4.2.4"
import-local "^3.0.2"
is-ci "^2.0.0"
jest-config "^26.4.1"
jest-config "^26.4.2"
jest-util "^26.3.0"
jest-validate "^26.4.0"
jest-validate "^26.4.2"
prompts "^2.0.1"
yargs "^15.3.1"
jest-config@^26.4.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.4.1.tgz#16b5a8e25c43279025718b1678115e39607f914f"
integrity sha512-0kUnVceEax0sYN+wdkNYF7fxjYKbsvmKmjVWwJvsSYA2p94bIL6wSy3oehewev7L9Dp/FDZFhmc9dyOoavdT6A==
jest-config@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.4.2.tgz#da0cbb7dc2c131ffe831f0f7f2a36256e6086558"
integrity sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==
dependencies:
"@babel/core" "^7.1.0"
"@jest/test-sequencer" "^26.4.1"
"@jest/test-sequencer" "^26.4.2"
"@jest/types" "^26.3.0"
babel-jest "^26.3.0"
chalk "^4.0.0"
@@ -2167,13 +2167,13 @@ jest-config@^26.4.1:
jest-environment-jsdom "^26.3.0"
jest-environment-node "^26.3.0"
jest-get-type "^26.3.0"
jest-jasmine2 "^26.4.1"
jest-jasmine2 "^26.4.2"
jest-regex-util "^26.0.0"
jest-resolve "^26.4.0"
jest-util "^26.3.0"
jest-validate "^26.4.0"
jest-validate "^26.4.2"
micromatch "^4.0.2"
pretty-format "^26.4.0"
pretty-format "^26.4.2"
jest-dev-server@^4.4.0:
version "4.4.0"
@@ -2188,15 +2188,15 @@ jest-dev-server@^4.4.0:
tree-kill "^1.2.2"
wait-on "^3.3.0"
jest-diff@^26.4.0:
version "26.4.0"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.4.0.tgz#d073a0a11952b5bd9f1ff39bb9ad24304a0c55f7"
integrity sha512-wwC38HlOW+iTq6j5tkj/ZamHn6/nrdcEOc/fKaVILNtN2NLWGdkfRaHWwfNYr5ehaLvuoG2LfCZIcWByVj0gjg==
jest-diff@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.4.2.tgz#a1b7b303bcc534aabdb3bd4a7caf594ac059f5aa"
integrity sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==
dependencies:
chalk "^4.0.0"
diff-sequences "^26.3.0"
jest-get-type "^26.3.0"
pretty-format "^26.4.0"
pretty-format "^26.4.2"
jest-docblock@^26.0.0:
version "26.0.0"
@@ -2205,16 +2205,16 @@ jest-docblock@^26.0.0:
dependencies:
detect-newline "^3.0.0"
jest-each@^26.4.0:
version "26.4.0"
resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.4.0.tgz#c53605b20e7a0a58d6dcf4d8b2f309e607d35d5a"
integrity sha512-+cyBh1ehs6thVT/bsZVG+WwmRn2ix4Q4noS9yLZgM10yGWPW12/TDvwuOV2VZXn1gi09/ZwJKJWql6YW1C9zNw==
jest-each@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.4.2.tgz#bb14f7f4304f2bb2e2b81f783f989449b8b6ffae"
integrity sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==
dependencies:
"@jest/types" "^26.3.0"
chalk "^4.0.0"
jest-get-type "^26.3.0"
jest-util "^26.3.0"
pretty-format "^26.4.0"
pretty-format "^26.4.2"
jest-environment-jsdom@^26.3.0:
version "26.3.0"
@@ -2278,9 +2278,9 @@ jest-haste-map@^26.3.0:
fsevents "^2.1.2"
jest-image-snapshot@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/jest-image-snapshot/-/jest-image-snapshot-4.1.0.tgz#107fed0bbf68d465037071a337f4bc17cf54cc2c"
integrity sha512-jSceASW6BQWSuU2r0/47sBYdxgHUI//49gYUKwCxn5d7faP39kB1TRTuH30dEMmjvzob0t/NKer5H0mwoPuZwA==
version "4.2.0"
resolved "https://registry.yarnpkg.com/jest-image-snapshot/-/jest-image-snapshot-4.2.0.tgz#559d7ade69e9918517269cef184261c80029a69e"
integrity sha512-6aAqv2wtfOgxiJeBayBCqHo1zX+A12SUNNzo7rIxiXh6W6xYVu8QyHWkada8HeRi+QUTHddp0O0Xa6kmQr+xbQ==
dependencies:
chalk "^1.1.3"
get-stdin "^5.0.1"
@@ -2292,10 +2292,10 @@ jest-image-snapshot@^4.0.0:
rimraf "^2.6.2"
ssim.js "^3.1.1"
jest-jasmine2@^26.4.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.4.1.tgz#85f5997720332bedaa64b65b1e7b01074d8485c1"
integrity sha512-GMPqJXyAWpohCg4wfA82lwac65lmgANH4/rOhNNaAN9yjInMAeMExQcWE1xb3fcCgLwibqeAuqVrV83oQl+szg==
jest-jasmine2@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz#18a9d5bec30904267ac5e9797570932aec1e2257"
integrity sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==
dependencies:
"@babel/traverse" "^7.1.0"
"@jest/environment" "^26.3.0"
@@ -2305,34 +2305,34 @@ jest-jasmine2@^26.4.1:
"@types/node" "*"
chalk "^4.0.0"
co "^4.6.0"
expect "^26.4.1"
expect "^26.4.2"
is-generator-fn "^2.0.0"
jest-each "^26.4.0"
jest-matcher-utils "^26.4.1"
jest-each "^26.4.2"
jest-matcher-utils "^26.4.2"
jest-message-util "^26.3.0"
jest-runtime "^26.4.1"
jest-snapshot "^26.4.1"
jest-runtime "^26.4.2"
jest-snapshot "^26.4.2"
jest-util "^26.3.0"
pretty-format "^26.4.0"
pretty-format "^26.4.2"
throat "^5.0.0"
jest-leak-detector@^26.4.0:
version "26.4.0"
resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.4.0.tgz#1efeeef693af3c9332062876add5ac5f25cb0a70"
integrity sha512-7EXKKEKnAWUPyiVtGZzJflbPOtYUdlNoevNVOkAcPpdR8xWiYKPGNGA6sz25S+8YhZq3rmkQJYAh3/P0VnoRwA==
jest-leak-detector@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz#c73e2fa8757bf905f6f66fb9e0070b70fa0f573f"
integrity sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==
dependencies:
jest-get-type "^26.3.0"
pretty-format "^26.4.0"
pretty-format "^26.4.2"
jest-matcher-utils@^26.4.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.4.1.tgz#f9f2d1d37d301e328eb22e9df09e7343d6cc1b25"
integrity sha512-nmHWaOz54R/w6zJju5tuW0bw6+m38Rb1jnDKehKM/bOngDDL0UwtN634cRxpFoUNVRUrX8Wa0Z34xq/f8iuP5A==
jest-matcher-utils@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz#fa81f3693f7cb67e5fc1537317525ef3b85f4b06"
integrity sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==
dependencies:
chalk "^4.0.0"
jest-diff "^26.4.0"
jest-diff "^26.4.2"
jest-get-type "^26.3.0"
pretty-format "^26.4.0"
pretty-format "^26.4.2"
jest-message-util@^26.3.0:
version "26.3.0"
@@ -2374,14 +2374,14 @@ jest-regex-util@^26.0.0:
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
jest-resolve-dependencies@^26.4.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.1.tgz#8e7cd28a1774cfdd64bb79b77ef8cd07e0f35598"
integrity sha512-Gx4JfQ1k/hGb4lqVOOx8TPOkNtyJIQSHcJU68pB+sdyDJi9rbMxD1XXiYyaEq9WXufiZo90k9GTK6z6a5m0SQw==
jest-resolve-dependencies@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz#739bdb027c14befb2fe5aabbd03f7bab355f1dc5"
integrity sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==
dependencies:
"@jest/types" "^26.3.0"
jest-regex-util "^26.0.0"
jest-snapshot "^26.4.1"
jest-snapshot "^26.4.2"
jest-resolve@^26.4.0:
version "26.4.0"
@@ -2397,10 +2397,10 @@ jest-resolve@^26.4.0:
resolve "^1.17.0"
slash "^3.0.0"
jest-runner@^26.4.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.4.1.tgz#5a98c87b558aacf88e761d5ee83e98bfb0a59839"
integrity sha512-QcKwn1YNlzFumTtFsocETgIm13KNt2X8sae4wcqsF3JnxGUcYYUGBstCQhtAG4fKD/TKThHkgE/ZgQVKipj7oA==
jest-runner@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.4.2.tgz#c3ec5482c8edd31973bd3935df5a449a45b5b853"
integrity sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==
dependencies:
"@jest/console" "^26.3.0"
"@jest/environment" "^26.3.0"
@@ -2411,27 +2411,27 @@ jest-runner@^26.4.1:
emittery "^0.7.1"
exit "^0.1.2"
graceful-fs "^4.2.4"
jest-config "^26.4.1"
jest-config "^26.4.2"
jest-docblock "^26.0.0"
jest-haste-map "^26.3.0"
jest-leak-detector "^26.4.0"
jest-leak-detector "^26.4.2"
jest-message-util "^26.3.0"
jest-resolve "^26.4.0"
jest-runtime "^26.4.1"
jest-runtime "^26.4.2"
jest-util "^26.3.0"
jest-worker "^26.3.0"
source-map-support "^0.5.6"
throat "^5.0.0"
jest-runtime@^26.4.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.4.1.tgz#9a6ffefc7167b0f244e0907f4820ab38d825cdd2"
integrity sha512-zXPQBS4iL/CEZtDfX+rDz+oZ/inQK/EYOeVt3uDWu8kwSdP/Cw4yOZtCTPApeNsGtZy6X5WQ1U+fyagN1B/Qkw==
jest-runtime@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.4.2.tgz#94ce17890353c92e4206580c73a8f0c024c33c42"
integrity sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==
dependencies:
"@jest/console" "^26.3.0"
"@jest/environment" "^26.3.0"
"@jest/fake-timers" "^26.3.0"
"@jest/globals" "^26.4.1"
"@jest/globals" "^26.4.2"
"@jest/source-map" "^26.3.0"
"@jest/test-result" "^26.3.0"
"@jest/transform" "^26.3.0"
@@ -2442,15 +2442,15 @@ jest-runtime@^26.4.1:
exit "^0.1.2"
glob "^7.1.3"
graceful-fs "^4.2.4"
jest-config "^26.4.1"
jest-config "^26.4.2"
jest-haste-map "^26.3.0"
jest-message-util "^26.3.0"
jest-mock "^26.3.0"
jest-regex-util "^26.0.0"
jest-resolve "^26.4.0"
jest-snapshot "^26.4.1"
jest-snapshot "^26.4.2"
jest-util "^26.3.0"
jest-validate "^26.4.0"
jest-validate "^26.4.2"
slash "^3.0.0"
strip-bom "^4.0.0"
yargs "^15.3.1"
@@ -2463,25 +2463,25 @@ jest-serializer@^26.3.0:
"@types/node" "*"
graceful-fs "^4.2.4"
jest-snapshot@^26.4.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.4.1.tgz#41dd85c41dbb76ac874e36c18dcfe722c88d22c4"
integrity sha512-5DsxbSSuYA8rZ/ynO+l5J65wSIyzDB2AXjuIvep90YmtslrROqDtba2hBgq1Cj6L6A0j/jv6h8JydEe2WYPM/g==
jest-snapshot@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.4.2.tgz#87d3ac2f2bd87ea8003602fbebd8fcb9e94104f6"
integrity sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==
dependencies:
"@babel/types" "^7.0.0"
"@jest/types" "^26.3.0"
"@types/prettier" "^2.0.0"
chalk "^4.0.0"
expect "^26.4.1"
expect "^26.4.2"
graceful-fs "^4.2.4"
jest-diff "^26.4.0"
jest-diff "^26.4.2"
jest-get-type "^26.3.0"
jest-haste-map "^26.3.0"
jest-matcher-utils "^26.4.1"
jest-matcher-utils "^26.4.2"
jest-message-util "^26.3.0"
jest-resolve "^26.4.0"
natural-compare "^1.4.0"
pretty-format "^26.4.0"
pretty-format "^26.4.2"
semver "^7.3.2"
jest-util@^26.3.0:
@@ -2496,17 +2496,17 @@ jest-util@^26.3.0:
is-ci "^2.0.0"
micromatch "^4.0.2"
jest-validate@^26.4.0:
version "26.4.0"
resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.4.0.tgz#3874a7cc9e27328afac88899ee9e2fae5e3a4293"
integrity sha512-t56Z/FRMrLP6mpmje7/YgHy0wOzcuc6i3LBXz6kjmsUWYN62OuMdC86Vg9/dX59SvyitSqqegOrx+h7BkNXeaQ==
jest-validate@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.4.2.tgz#e871b0dfe97747133014dcf6445ee8018398f39c"
integrity sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==
dependencies:
"@jest/types" "^26.3.0"
camelcase "^6.0.0"
chalk "^4.0.0"
jest-get-type "^26.3.0"
leven "^3.1.0"
pretty-format "^26.4.0"
pretty-format "^26.4.2"
jest-watcher@^26.3.0:
version "26.3.0"
@@ -2531,13 +2531,13 @@ jest-worker@^26.3.0:
supports-color "^7.0.0"
jest@^26.0.1:
version "26.4.1"
resolved "https://registry.yarnpkg.com/jest/-/jest-26.4.1.tgz#4c187999c9af761eba862d720f66f43e80b8d12f"
integrity sha512-q+az+ZXFOTxTlD6BRIMcZC+a33O9lsryV4Wo9gU4D/AI+Y6KKgVRCmyzpc4H2gWv0rn45lACukmMS2uSB7e1LA==
version "26.4.2"
resolved "https://registry.yarnpkg.com/jest/-/jest-26.4.2.tgz#7e8bfb348ec33f5459adeaffc1a25d5752d9d312"
integrity sha512-LLCjPrUh98Ik8CzW8LLVnSCfLaiY+wbK53U7VxnFSX7Q+kWC4noVeDvGWIFw0Amfq1lq2VfGm7YHWSLBV62MJw==
dependencies:
"@jest/core" "^26.4.1"
"@jest/core" "^26.4.2"
import-local "^3.0.2"
jest-cli "^26.4.1"
jest-cli "^26.4.2"
js-tokens@^4.0.0:
version "4.0.0"
@@ -3130,10 +3130,10 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
pretty-format@^26.4.0:
version "26.4.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.0.tgz#c08073f531429e9e5024049446f42ecc9f933a3b"
integrity sha512-mEEwwpCseqrUtuMbrJG4b824877pM5xald3AkilJ47Po2YLr97/siejYQHqj2oDQBeJNbu+Q0qUuekJ8F0NAPg==
pretty-format@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.2.tgz#d081d032b398e801e2012af2df1214ef75a81237"
integrity sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==
dependencies:
"@jest/types" "^26.3.0"
ansi-regex "^5.0.0"
@@ -3382,7 +3382,7 @@ rx@^4.1.0:
resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=
safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
safe-buffer@^5.0.1, safe-buffer@^5.1.2:
version "5.2.0"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
@@ -3392,6 +3392,11 @@ safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+5 -26
View File
@@ -70,32 +70,8 @@ func (m *MockedClient) Events(ctx context.Context) (<-chan events.Message, <-cha
return channel, err
}
func Test_handler_listContainers_happy(t *testing.T) {
req, err := http.NewRequest("GET", "/api/containers.json", nil)
require.NoError(t, err, "NewRequest should not return an error.")
rr := httptest.NewRecorder()
mockedClient := new(MockedClient)
containers := []docker.Container{
{
ID: "1234567890",
Status: "status",
State: "state",
Name: "test",
Created: 0,
Command: "command",
ImageID: "image_id",
Image: "image",
},
}
mockedClient.On("ListContainers", mock.Anything).Return(containers, nil)
h := handler{client: mockedClient}
handler := http.HandlerFunc(h.listContainers)
handler.ServeHTTP(rr, req)
abide.AssertHTTPResponse(t, t.Name(), rr.Result())
mockedClient.AssertExpectations(t)
func (m *MockedClient) ContainerStats(context.Context, string, chan<- docker.ContainerStat) error {
return nil
}
func Test_handler_streamLogs_happy(t *testing.T) {
@@ -232,6 +208,7 @@ func Test_handler_streamEvents_happy(t *testing.T) {
messages := make(chan events.Message)
errChannel := make(chan error)
mockedClient.On("Events", mock.Anything).Return(messages, errChannel)
mockedClient.On("ListContainers").Return([]docker.Container{}, nil)
go func() {
messages <- events.Message{
@@ -258,6 +235,7 @@ func Test_handler_streamEvents_error(t *testing.T) {
messages := make(chan events.Message)
errChannel := make(chan error)
mockedClient.On("Events", mock.Anything).Return(messages, errChannel)
mockedClient.On("ListContainers").Return([]docker.Container{}, nil)
go func() {
errChannel <- errors.New("fake error")
@@ -281,6 +259,7 @@ func Test_handler_streamEvents_error_request(t *testing.T) {
messages := make(chan events.Message)
errChannel := make(chan error)
mockedClient.On("Events", mock.Anything).Return(messages, errChannel)
mockedClient.On("ListContainers").Return([]docker.Container{}, nil)
ctx, cancel := context.WithCancel(context.Background())
req = req.WithContext(ctx)
+16 -16
View File
@@ -1,6 +1,6 @@
{
"name": "dozzle",
"version": "2.2.0",
"version": "3.0.1",
"description": "Realtime log viewer for docker containers. ",
"scripts": {
"prestart": "yarn clean",
@@ -28,10 +28,10 @@
"homepage": "https://github.com/amir20/dozzle#readme",
"dependencies": {
"ansi-to-html": "^0.6.14",
"buefy": "^0.9.1",
"buefy": "^0.9.3",
"bulma": "^0.9.0",
"date-fns": "^2.15.0",
"dompurify": "^2.0.12",
"date-fns": "^2.16.1",
"dompurify": "^2.0.15",
"hotkeys-js": "^3.8.1",
"lodash.debounce": "^4.0.8",
"lodash.throttle": "^4.1.1",
@@ -44,30 +44,30 @@
"vuex": "^3.5.1"
},
"devDependencies": {
"@babel/core": "^7.11.4",
"@babel/plugin-transform-runtime": "^7.11.0",
"@babel/core": "^7.11.6",
"@babel/plugin-transform-runtime": "^7.11.5",
"@vue/component-compiler-utils": "^3.2.0",
"@vue/test-utils": "^1.0.4",
"@vue/test-utils": "^1.0.5",
"babel-core": "^7.0.0-bridge.0",
"babel-jest": "^26.3.0",
"babel-preset-env": "^1.7.0",
"caniuse-lite": "^1.0.30001117",
"css-loader": "^4.2.1",
"caniuse-lite": "^1.0.30001124",
"css-loader": "^4.2.2",
"eventsourcemock": "^2.0.0",
"html-webpack-plugin": "^4.3.0",
"html-webpack-plugin": "^4.4.1",
"husky": "^4.2.5",
"jest": "^26.4.1",
"jest": "^26.4.2",
"jest-serializer-vue": "^2.0.2",
"lint-staged": "^10.2.11",
"mini-css-extract-plugin": "^0.10.0",
"lint-staged": "^10.3.0",
"mini-css-extract-plugin": "^0.11.0",
"npm-run-all": "^4.1.5",
"postcss-cssnext": "^3.1.0",
"postcss-import": "^12.0.1",
"postcss-loader": "^3.0.0",
"prettier": "^2.0.5",
"release-it": "^13.6.8",
"prettier": "^2.1.1",
"release-it": "^14.0.2",
"sass": "^1.26.10",
"sass-loader": "^9.0.3",
"sass-loader": "^10.0.2",
"vue-hot-reload-api": "^2.3.4",
"vue-jest": "^3.0.6",
"vue-loader": "^15.9.3",
+93 -20
View File
@@ -8,8 +8,10 @@ import (
"net/http"
"runtime"
"strings"
"sync"
"time"
"github.com/amir20/dozzle/docker"
"github.com/gorilla/mux"
log "github.com/sirupsen/logrus"
)
@@ -23,7 +25,6 @@ func createRoutes(base string, h *handler) *mux.Router {
}))
}
s := r.PathPrefix(base).Subrouter()
s.HandleFunc("/api/containers.json", h.listContainers)
s.HandleFunc("/api/logs/stream", h.streamLogs)
s.HandleFunc("/api/logs", h.fetchLogsBetweenDates)
s.HandleFunc("/api/events/stream", h.streamEvents)
@@ -69,19 +70,6 @@ func (h *handler) index(w http.ResponseWriter, req *http.Request) {
}
}
func (h *handler) listContainers(w http.ResponseWriter, r *http.Request) {
containers, err := h.client.ListContainers()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
err = json.NewEncoder(w).Encode(containers)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
func (h *handler) fetchLogsBetweenDates(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain; charset=UTF-8")
@@ -166,24 +154,65 @@ func (h *handler) streamEvents(w http.ResponseWriter, r *http.Request) {
w.Header().Set("X-Accel-Buffering", "no")
ctx := r.Context()
messages, err := h.client.Events(ctx)
stats := make(chan docker.ContainerStat)
runningContainers := map[string]docker.Container{}
if containers, err := h.client.ListContainers(); err == nil {
for _, c := range containers {
if c.State == "running" {
h.client.ContainerStats(ctx, c.ID, stats)
runningContainers[c.ID] = c
}
}
}
if err := sendContainersJSON(h.client, w); err != nil {
log.Errorf("Error while encoding containers to stream: %v", err)
}
f.Flush()
delayer := delayedFunc(time.Second)
Loop:
for {
select {
case stat := <-stats:
bytes, _ := json.Marshal(stat)
_, err := fmt.Fprintf(w, "event: container-stat\ndata: %s\n\n", string(bytes))
if err != nil {
log.Debugf("Error while writing to event stream: %v", err)
break
}
f.Flush()
case message, ok := <-messages:
if !ok {
break Loop
}
switch message.Action {
case "connect", "disconnect", "create", "destroy", "start", "stop":
case "start", "connect", "disconnect", "die":
log.Debugf("Triggering docker event: %v", message.Action)
_, err := fmt.Fprintf(w, "event: containers-changed\ndata: %s\n\n", message.Action)
if err != nil {
log.Debugf("Error while writing to event stream: %v", err)
break
if message.Action == "start" {
log.Debugf("Scanning for new containers")
if containers, err := h.client.ListContainers(); err == nil {
for _, c := range containers {
if _, ok = runningContainers[c.ID]; c.State == "running" && !ok {
log.Debugf("Found a new container %v", c.ID)
h.client.ContainerStats(ctx, c.ID, stats)
runningContainers[c.ID] = c
}
}
}
}
delayer(func() {
if err := sendContainersJSON(h.client, w); err != nil {
log.Errorf("Error while encoding containers to stream: %v", err)
}
})
f.Flush()
default:
log.Debugf("Ignoring docker event: %v", message.Action)
@@ -199,3 +228,47 @@ Loop:
func (h *handler) version(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, version)
}
func sendContainersJSON(client docker.Client, w http.ResponseWriter) error {
if containers, err := client.ListContainers(); err != nil {
return err
} else {
if _, err := fmt.Fprint(w, "event: containers-changed\ndata: "); err != nil {
return err
}
if err := json.NewEncoder(w).Encode(containers); err != nil {
return err
}
if _, err := fmt.Fprint(w, "\n\n"); err != nil {
return err
}
}
return nil
}
type delayedFun struct {
mu sync.Mutex
after time.Duration
timer *time.Timer
}
func delayedFunc(after time.Duration) func(f func()) {
d := &delayedFun{after: after}
return func(f func()) {
d.add(f)
}
}
func (d *delayedFun) add(f func()) {
d.mu.Lock()
defer d.mu.Unlock()
if d.timer != nil {
d.timer.Stop()
}
d.timer = time.AfterFunc(d.after, f)
}
+676 -803
View File
File diff suppressed because it is too large Load Diff