Replace charting library Flotr2 with ChartJS using React. Fixes #3904

This commit is contained in:
Aditya Toshniwal 2020-07-29 14:49:22 +05:30 committed by Akshay Joshi
parent 5820b9521e
commit f715373218
25 changed files with 2004 additions and 826 deletions

View File

@ -40,11 +40,11 @@ speaklater 1.3
sqlparse 0.2.4 BSD https://github.com/andialbrecht/sqlparse
WTForms 2.2.1 BSD https://wtforms.readthedocs.io/
Flask-Paranoid 0.2.0 MIT http://github.com/miguelgrinberg/flask-paranoid/
psutil 5.7.0 BSD https://github.com/giampaolo/psutil
psutil 5.7.2 BSD https://github.com/giampaolo/psutil
psycopg2 2.8.5 LGPL with exceptions https://psycopg.org/
python-dateutil 2.8.1 Dual License https://dateutil.readthedocs.io
SQLAlchemy 1.3.17 MIT http://www.sqlalchemy.org
Flask-Security-Too 3.4.3 MIT https://github.com/Flask-Middleware/flask-security
SQLAlchemy 1.3.18 MIT http://www.sqlalchemy.org
Flask-Security-Too 3.4.4 MIT https://github.com/Flask-Middleware/flask-security
sshtunnel 0.1.5 MIT https://github.com/pahaz/sshtunnel
ldap3 2.7 LGPL v3 https://github.com/cannatag/ldap3
@ -57,32 +57,50 @@ Name Version
---- ------- ------- ---
@babel/cli 7.10.1 MIT https://github.com/babel/babel.git
@babel/code-frame 7.10.1 MIT https://github.com/babel/babel.git
@babel/code-frame 7.10.4 MIT https://github.com/babel/babel.git
@babel/core 7.6.4 MIT https://github.com/babel/babel/tree/master/packages/babel-core
@babel/generator 7.10.4 MIT https://github.com/babel/babel.git
@babel/generator 7.10.2 MIT https://github.com/babel/babel.git
@babel/helper-annotate-as-pure 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-annotate-as-pure 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-builder-binary-assignment-operator-visitor 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-builder-react-jsx 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-builder-react-jsx-experimental 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-create-class-features-plugin 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-create-regexp-features-plugin 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-define-map 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-explode-assignable-expression 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-function-name 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-function-name 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-get-function-arity 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-get-function-arity 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-hoist-variables 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-member-expression-to-functions 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-member-expression-to-functions 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-module-imports 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-module-imports 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-module-transforms 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-optimise-call-expression 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-optimise-call-expression 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-plugin-utils 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-plugin-utils 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-regex 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-remap-async-to-generator 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-replace-supers 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-replace-supers 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-simple-access 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-split-export-declaration 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-split-export-declaration 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-validator-identifier 7.10.4 MIT https://github.com/babel/babel.git
@babel/helper-validator-identifier 7.10.1 MIT https://github.com/babel/babel.git
@babel/helper-wrap-function 7.10.1 MIT https://github.com/babel/babel.git
@babel/helpers 7.10.1 MIT https://github.com/babel/babel.git
@babel/highlight 7.10.1 MIT https://github.com/babel/babel.git
@babel/highlight 7.10.4 MIT https://github.com/babel/babel.git
@babel/parser 7.10.4 MIT https://github.com/babel/babel.git
@babel/parser 7.10.2 MIT https://github.com/babel/babel.git
@babel/plugin-proposal-async-generator-functions 7.10.1 MIT https://github.com/babel/babel.git
@babel/plugin-proposal-class-properties 7.10.4 MIT https://github.com/babel/babel.git
@babel/plugin-proposal-dynamic-import 7.10.1 MIT https://github.com/babel/babel.git
@babel/plugin-proposal-json-strings 7.10.1 MIT https://github.com/babel/babel.git
@babel/plugin-proposal-object-rest-spread 7.10.1 MIT https://github.com/babel/babel.git
@ -91,6 +109,7 @@ Name Version
@babel/plugin-syntax-async-generators 7.8.4 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-async-generators
@babel/plugin-syntax-dynamic-import 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-dynamic-import
@babel/plugin-syntax-json-strings 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-json-strings
@babel/plugin-syntax-jsx 7.10.4 MIT https://github.com/babel/babel.git
@babel/plugin-syntax-object-rest-spread 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-object-rest-spread
@babel/plugin-syntax-optional-catch-binding 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-catch-binding
@babel/plugin-transform-arrow-functions 7.10.1 MIT https://github.com/babel/babel.git
@ -116,6 +135,12 @@ Name Version
@babel/plugin-transform-object-super 7.10.1 MIT https://github.com/babel/babel.git
@babel/plugin-transform-parameters 7.10.1 MIT https://github.com/babel/babel.git
@babel/plugin-transform-property-literals 7.10.1 MIT https://github.com/babel/babel.git
@babel/plugin-transform-react-display-name 7.10.4 MIT https://github.com/babel/babel.git
@babel/plugin-transform-react-jsx 7.10.4 MIT https://github.com/babel/babel.git
@babel/plugin-transform-react-jsx-development 7.10.4 MIT https://github.com/babel/babel.git
@babel/plugin-transform-react-jsx-self 7.10.4 MIT https://github.com/babel/babel.git
@babel/plugin-transform-react-jsx-source 7.10.4 MIT https://github.com/babel/babel.git
@babel/plugin-transform-react-pure-annotations 7.10.4 MIT https://github.com/babel/babel.git
@babel/plugin-transform-regenerator 7.10.1 MIT https://github.com/babel/babel.git
@babel/plugin-transform-reserved-words 7.10.1 MIT https://github.com/babel/babel.git
@babel/plugin-transform-shorthand-properties 7.10.1 MIT https://github.com/babel/babel.git
@ -125,10 +150,14 @@ Name Version
@babel/plugin-transform-typeof-symbol 7.10.1 MIT https://github.com/babel/babel.git
@babel/plugin-transform-unicode-regex 7.10.1 MIT https://github.com/babel/babel.git
@babel/preset-env 7.6.3 MIT https://github.com/babel/babel/tree/master/packages/babel-preset-env
@babel/preset-react 7.10.4 MIT https://github.com/babel/babel.git
@babel/runtime 7.10.2 MIT https://github.com/babel/babel.git
@babel/template 7.10.4 MIT https://github.com/babel/babel.git
@babel/template 7.10.1 MIT https://github.com/babel/babel.git
@babel/traverse 7.10.1 MIT https://github.com/babel/babel.git
@babel/traverse 7.10.4 MIT https://github.com/babel/babel.git
@babel/types 7.10.2 MIT https://github.com/babel/babel.git
@babel/types 7.10.4 MIT https://github.com/babel/babel.git
@simonwep/pickr 1.6.0 MIT https://github.com/Simonwep/pickr.git
@sindresorhus/is 0.7.0 MIT https://github.com/sindresorhus/is.git
@types/json-schema 7.0.5 MIT https://github.com/DefinitelyTyped/DefinitelyTyped.git
@ -159,6 +188,7 @@ acorn-jsx 5.2.0
acorn-walk 7.1.1 MIT https://github.com/acornjs/acorn.git
after 0.8.2 MIT git://github.com/Raynos/after.git
aggregate-error 3.0.1 MIT https://github.com/sindresorhus/aggregate-error.git
airbnb-prop-types 2.16.0 MIT git+https://github.com/airbnb/prop-types.git
ajv 6.12.2 MIT https://github.com/epoberezkin/ajv.git
ajv-errors 1.0.1 MIT git+https://github.com/epoberezkin/ajv-errors.git
ajv-keywords 3.4.1 MIT git+https://github.com/epoberezkin/ajv-keywords.git
@ -177,18 +207,23 @@ argparse 1.0.10
arr-diff 4.0.0 MIT https://github.com/jonschlinkert/arr-diff.git
arr-flatten 1.1.0 MIT https://github.com/jonschlinkert/arr-flatten.git
arr-union 3.1.0 MIT https://github.com/jonschlinkert/arr-union.git
array-filter 1.0.0 MIT git://github.com/juliangruber/array-filter.git
array-find-index 1.0.2 MIT https://github.com/sindresorhus/array-find-index.git
array-flatten 1.1.1 MIT git://github.com/blakeembrey/array-flatten.git
array-includes 3.1.1 MIT git://github.com/es-shims/array-includes.git
array-union 1.0.2 MIT https://github.com/sindresorhus/array-union.git
array-uniq 1.0.3 MIT https://github.com/sindresorhus/array-uniq.git
array-unique 0.3.2 MIT https://github.com/jonschlinkert/array-unique.git
array.prototype.find 2.1.1 MIT git://github.com/paulmillr/Array.prototype.find.git
array.prototype.flat 1.2.3 MIT git://github.com/es-shims/Array.prototype.flat.git
array.prototype.flatmap 1.2.3 MIT git://github.com/es-shims/Array.prototype.flatMap.git
arraybuffer.slice 0.0.7 MIT git@github.com:rase-/arraybuffer.slice.git
asn1.js 4.10.1 MIT git@github.com:indutny/asn1.js
assert 1.5.0 MIT git://github.com/browserify/commonjs-assert.git
assign-symbols 1.0.0 MIT https://github.com/jonschlinkert/assign-symbols.git
astral-regex 1.0.0 MIT https://github.com/kevva/astral-regex.git
async 3.2.0 MIT https://github.com/caolan/async.git
async 2.6.3 MIT https://github.com/caolan/async.git
async 3.2.0 MIT https://github.com/caolan/async.git
async-each 1.0.3 MIT git://github.com/paulmillr/async-each.git
async-limiter 1.0.1 MIT https://github.com/strml/async-limiter.git
autoprefixer 9.8.0 MIT https://github.com/postcss/autoprefixer.git
@ -239,8 +274,8 @@ babel-traverse 6.26.0
babel-types 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-types
babelify 10.0.0 MIT https://github.com/babel/babelify.git
babylon 6.18.0 MIT https://github.com/babel/babylon
backbone 1.4.0 MIT https://github.com/jashkenas/backbone.git
backbone 1.2.3 MIT https://github.com/jashkenas/backbone.git
backbone 1.4.0 MIT https://github.com/jashkenas/backbone.git
backbone 1.3.3 MIT https://github.com/jashkenas/backbone.git
backform 0.2.0 MIT https://github.com/AmiliaApp/backform
backgrid 0.3.8 MIT http://github.com/cloudflare/backgrid
@ -262,14 +297,14 @@ bin-check 4.1.0
bin-version 3.1.0 MIT https://github.com/sindresorhus/bin-version.git
bin-version-check 4.0.0 MIT https://github.com/sindresorhus/bin-version-check.git
bin-wrapper 4.1.0 MIT https://github.com/kevva/bin-wrapper.git
binary-extensions 1.13.1 MIT https://github.com/sindresorhus/binary-extensions.git
binary-extensions 2.0.0 MIT https://github.com/sindresorhus/binary-extensions.git
binary-extensions 1.13.1 MIT https://github.com/sindresorhus/binary-extensions.git
bindings 1.5.0 MIT git://github.com/TooTallNate/node-bindings.git
bl 1.2.2 MIT https://github.com/rvagg/bl.git
blob 0.0.5 MIT git://github.com/webmodules/blob.git
bluebird 3.7.2 MIT git://github.com/petkaantonov/bluebird.git
bn.js 5.1.2 MIT git@github.com:indutny/bn.js
bn.js 4.11.9 MIT git@github.com:indutny/bn.js
bn.js 5.1.2 MIT git@github.com:indutny/bn.js
body-parser 1.19.0 MIT https://github.com/expressjs/body-parser.git
bootstrap 4.5.0 MIT git+https://github.com/twbs/bootstrap.git
bootstrap4-toggle 3.4.0 MIT https://github.com/gitbrent/bootstrap4-toggle.git
@ -302,21 +337,26 @@ cacheable-request 2.1.4
cached-path-relative 1.0.2 MIT git://github.com/ashaffer/cached-path-relative.git
caller-callsite 2.0.0 MIT https://github.com/sindresorhus/caller-callsite.git
caller-path 2.0.0 MIT https://github.com/sindresorhus/caller-path.git
callsites 2.0.0 MIT https://github.com/sindresorhus/callsites.git
callsites 3.1.0 MIT https://github.com/sindresorhus/callsites.git
camelcase 2.1.1 MIT https://github.com/sindresorhus/camelcase.git
callsites 2.0.0 MIT https://github.com/sindresorhus/callsites.git
camelcase 5.3.1 MIT https://github.com/sindresorhus/camelcase.git
camelcase 2.1.1 MIT https://github.com/sindresorhus/camelcase.git
camelcase-keys 2.1.0 MIT https://github.com/sindresorhus/camelcase-keys.git
caniuse-api 3.0.0 MIT https://github.com/nyalab/caniuse-api.git
caw 2.0.1 MIT https://github.com/kevva/caw.git
chalk 2.4.2 MIT https://github.com/chalk/chalk.git
chalk 1.1.3 MIT https://github.com/chalk/chalk.git
chalk 2.4.2 MIT https://github.com/chalk/chalk.git
chardet 0.7.0 MIT git@github.com:runk/node-chardet.git
chart.js 2.9.3 MIT https://github.com/chartjs/Chart.js.git
chartjs-color 2.4.1 MIT https://github.com/chartjs/chartjs-color.git
chartjs-color-string 0.6.0 MIT https://github.com/chartjs/chartjs-color-string.git
check-types 8.0.3 MIT https://gitlab.com/philbooth/check-types.js.git
chokidar 3.4.0 MIT git+https://github.com/paulmillr/chokidar.git
cheerio 1.0.0-rc.3 MIT git://github.com/cheeriojs/cheerio.git
chokidar 2.1.8 MIT https://github.com/paulmillr/chokidar.git
chokidar 3.4.0 MIT git+https://github.com/paulmillr/chokidar.git
chrome-trace-event 1.0.2 MIT github.com:samccone/chrome-trace-event
cipher-base 1.0.4 MIT git+https://github.com/crypto-browserify/cipher-base.git
circular-json-es6 2.0.2 MIT git+https://github.com/yyx990803/circular-json-es6.git
class-utils 0.3.6 MIT https://github.com/jonschlinkert/class-utils.git
clean-stack 2.2.0 MIT https://github.com/sindresorhus/clean-stack.git
cli-cursor 2.1.0 MIT https://github.com/sindresorhus/cli-cursor.git
@ -331,9 +371,9 @@ color-name 1.1.3
color-string 1.5.3 MIT https://github.com/Qix-/color-string.git
colors 1.4.0 MIT http://github.com/Marak/colors.js.git
combine-source-map 0.8.0 MIT git://github.com/thlorenz/combine-source-map.git
commander 4.1.1 MIT https://github.com/tj/commander.js.git
commander 5.1.0 MIT https://github.com/tj/commander.js.git
commander 2.8.1 MIT https://github.com/tj/commander.js.git
commander 4.1.1 MIT https://github.com/tj/commander.js.git
commander 2.20.3 MIT https://github.com/tj/commander.js.git
commondir 1.0.1 MIT http://github.com/substack/node-commondir.git
component-emitter 1.2.1 MIT https://github.com/component/emitter.git
@ -352,8 +392,8 @@ cookie 0.3.1
cookie-signature 1.0.6 MIT https://github.com/visionmedia/node-cookie-signature.git
copy-descriptor 0.1.1 MIT https://github.com/jonschlinkert/copy-descriptor.git
copy-webpack-plugin 5.1.1 MIT https://github.com/webpack-contrib/copy-webpack-plugin.git
core-js 3.6.5 MIT https://github.com/zloirock/core-js.git
core-js 2.6.11 MIT https://github.com/zloirock/core-js.git
core-js 3.6.5 MIT https://github.com/zloirock/core-js.git
core-js-compat 3.6.5 MIT https://github.com/zloirock/core-js.git
core-util-is 1.0.2 MIT git://github.com/isaacs/core-util-is
cosmiconfig 5.2.1 MIT git+https://github.com/davidtheclark/cosmiconfig.git
@ -368,8 +408,8 @@ css-color-names 0.0.4
css-declaration-sorter 4.0.1 MIT https://github.com/Siilwyn/css-declaration-sorter.git
css-loader 2.1.0 MIT https://github.com/webpack-contrib/css-loader.git
css-select-base-adapter 0.1.1 MIT https://github.com/nrkn/css-select-base-adapter.git
css-tree 1.0.0-alpha.39 MIT https://github.com/csstree/csstree.git
css-tree 1.0.0-alpha.37 MIT https://github.com/csstree/csstree.git
css-tree 1.0.0-alpha.39 MIT https://github.com/csstree/csstree.git
cssesc 3.0.0 MIT https://github.com/mathiasbynens/cssesc.git
cssnano 4.1.10 MIT https://github.com/cssnano/cssnano.git
cssnano-preset-default 4.0.7 MIT https://github.com/cssnano/cssnano.git
@ -384,9 +424,9 @@ custom-event 1.0.1
cwebp-bin 5.1.0 MIT https://github.com/imagemin/cwebp-bin.git
cyclist 1.0.1 MIT git://github.com/mafintosh/cyclist
date-format 2.1.0 MIT https://github.com/nomiddlename/date-format.git
debug 3.1.0 MIT git://github.com/visionmedia/debug.git
debug 3.2.6 MIT git://github.com/visionmedia/debug.git
debug 2.6.9 MIT git://github.com/visionmedia/debug.git
debug 3.1.0 MIT git://github.com/visionmedia/debug.git
debug 4.1.1 MIT git://github.com/visionmedia/debug.git
decamelize 1.2.0 MIT https://github.com/sindresorhus/decamelize.git
decode-uri-component 0.2.0 MIT https://github.com/SamVerschueren/decode-uri-component.git
@ -396,10 +436,11 @@ decompress-tar 4.1.1
decompress-tarbz2 4.1.1 MIT https://github.com/kevva/decompress-tarbz2.git
decompress-targz 4.1.1 MIT https://github.com/kevva/decompress-targz.git
decompress-unzip 4.0.1 MIT https://github.com/kevva/decompress-unzip.git
deep-equal-ident 1.1.1 MIT http://github.com/fkling/deep-equal-ident.git
deep-is 0.1.3 MIT http://github.com/thlorenz/deep-is.git
define-properties 1.1.3 MIT git://github.com/ljharb/define-properties.git
define-property 0.2.5 MIT https://github.com/jonschlinkert/define-property.git
define-property 2.0.2 MIT https://github.com/jonschlinkert/define-property.git
define-property 0.2.5 MIT https://github.com/jonschlinkert/define-property.git
define-property 1.0.0 MIT https://github.com/jonschlinkert/define-property.git
defined 1.0.0 MIT git://github.com/substack/defined.git
depd 1.1.2 MIT https://github.com/dougwilson/nodejs-depd.git
@ -411,7 +452,9 @@ detective 5.2.0
di 0.0.1 MIT git://github.com/vojtajina/node-di.git
diffie-hellman 5.0.3 MIT https://github.com/crypto-browserify/diffie-hellman.git
dir-glob 2.2.2 MIT https://github.com/kevva/dir-glob.git
discontinuous-range 1.0.0 MIT https://github.com/dtudury/discontinuous-range.git
dom-serialize 2.2.1 MIT git://github.com/webmodules/dom-serialize.git
dom-serializer 0.1.1 MIT git://github.com/cheeriojs/dom-renderer.git
dom-serializer 0.2.2 MIT git://github.com/cheeriojs/dom-renderer.git
domain-browser 1.2.0 MIT https://github.com/bevry/domain-browser.git
dot-prop 5.2.0 MIT https://github.com/sindresorhus/dot-prop.git
@ -423,16 +466,21 @@ duplexify 3.7.1
ee-first 1.1.1 MIT https://github.com/jonathanong/ee-first.git
elliptic 6.5.2 MIT git@github.com:indutny/elliptic
emoji-regex 7.0.3 MIT https://github.com/mathiasbynens/emoji-regex.git
emojis-list 2.1.0 MIT git+https://github.com/kikobeats/emojis-list.git
emojis-list 3.0.0 MIT git+https://github.com/kikobeats/emojis-list.git
emojis-list 2.1.0 MIT git+https://github.com/kikobeats/emojis-list.git
encodeurl 1.0.2 MIT https://github.com/pillarjs/encodeurl.git
end-of-stream 1.4.4 MIT git://github.com/mafintosh/end-of-stream.git
engine.io 3.2.1 MIT git@github.com:socketio/engine.io.git
engine.io-client 3.2.1 MIT https://github.com/socketio/engine.io-client.git
engine.io-parser 2.1.3 MIT git@github.com:socketio/engine.io-parser.git
enhanced-resolve 4.1.0 MIT git://github.com/webpack/enhanced-resolve.git
enhanced-resolve 4.2.0 MIT git://github.com/webpack/enhanced-resolve.git
enhanced-resolve 4.1.0 MIT git://github.com/webpack/enhanced-resolve.git
ent 2.2.0 MIT https://github.com/substack/node-ent.git
enzyme 3.11.0 MIT https://github.com/airbnb/enzyme.git
enzyme-adapter-react-16 1.15.2 MIT https://github.com/airbnb/enzyme.git
enzyme-adapter-utils 1.13.0 MIT https://github.com/airbnb/enzyme.git
enzyme-matchers 7.1.2 MIT git+https://github.com/FormidableLabs/enzyme-matchers.git
enzyme-shallow-equal 1.0.1 MIT https://github.com/airbnb/enzyme.git
errno 0.1.7 MIT https://github.com/rvagg/node-errno.git
error-ex 1.3.2 MIT https://github.com/qix-/node-error-ex.git
es-abstract 1.17.6 MIT git://github.com/ljharb/es-abstract.git
@ -440,16 +488,17 @@ es-to-primitive 1.2.1
escape-html 1.0.3 MIT https://github.com/component/escape-html.git
escape-string-regexp 1.0.5 MIT https://github.com/sindresorhus/escape-string-regexp.git
eslint 5.15.1 MIT https://github.com/eslint/eslint.git
eslint-plugin-react 7.20.3 MIT https://github.com/yannickcr/eslint-plugin-react
eslint-utils 1.4.3 MIT git+https://github.com/mysticatea/eslint-utils.git
etag 1.8.1 MIT https://github.com/jshttp/etag.git
eventemitter3 4.0.4 MIT git://github.com/primus/eventemitter3.git
events 2.1.0 MIT git://github.com/Gozala/events.git
events 3.1.0 MIT git://github.com/Gozala/events.git
events 2.1.0 MIT git://github.com/Gozala/events.git
evp_bytestokey 1.0.3 MIT https://github.com/crypto-browserify/EVP_BytesToKey.git
exec-buffer 3.2.0 MIT https://github.com/kevva/exec-buffer.git
execa 0.7.0 MIT https://github.com/sindresorhus/execa.git
execa 1.0.0 MIT https://github.com/sindresorhus/execa.git
execa 0.10.0 MIT https://github.com/sindresorhus/execa.git
execa 1.0.0 MIT https://github.com/sindresorhus/execa.git
execa 0.7.0 MIT https://github.com/sindresorhus/execa.git
executable 4.1.1 MIT https://github.com/kevva/executable.git
expand-brackets 2.1.4 MIT https://github.com/jonschlinkert/expand-brackets.git
expand-tilde 2.0.2 MIT https://github.com/jonschlinkert/expand-tilde.git
@ -458,8 +507,8 @@ express 4.17.1
ext-list 2.2.2 MIT https://github.com/kevva/ext-list.git
ext-name 5.0.0 MIT https://github.com/kevva/ext-name.git
extend 3.0.2 MIT https://github.com/justmoon/node-extend.git
extend-shallow 3.0.2 MIT https://github.com/jonschlinkert/extend-shallow.git
extend-shallow 2.0.1 MIT https://github.com/jonschlinkert/extend-shallow.git
extend-shallow 3.0.2 MIT https://github.com/jonschlinkert/extend-shallow.git
external-editor 3.1.0 MIT git+https://github.com/mrkmg/node-external-editor.git
extglob 2.0.4 MIT https://github.com/micromatch/extglob.git
fast-deep-equal 3.1.3 MIT git+https://github.com/epoberezkin/fast-deep-equal.git
@ -471,28 +520,27 @@ figures 1.7.0
figures 2.0.0 MIT https://github.com/sindresorhus/figures.git
file-entry-cache 5.0.1 MIT https://github.com/royriojas/file-entry-cache.git
file-loader 3.0.1 MIT https://github.com/webpack-contrib/file-loader.git
file-type 5.2.0 MIT https://github.com/sindresorhus/file-type.git
file-type 3.9.0 MIT https://github.com/sindresorhus/file-type.git
file-type 8.1.0 MIT https://github.com/sindresorhus/file-type.git
file-type 6.2.0 MIT https://github.com/sindresorhus/file-type.git
file-type 4.4.0 MIT https://github.com/sindresorhus/file-type.git
file-type 8.1.0 MIT https://github.com/sindresorhus/file-type.git
file-type 5.2.0 MIT https://github.com/sindresorhus/file-type.git
file-type 10.11.0 MIT https://github.com/sindresorhus/file-type.git
file-type 6.2.0 MIT https://github.com/sindresorhus/file-type.git
file-type 3.9.0 MIT https://github.com/sindresorhus/file-type.git
file-uri-to-path 1.0.0 MIT git://github.com/TooTallNate/file-uri-to-path.git
filename-reserved-regex 2.0.0 MIT https://github.com/sindresorhus/filename-reserved-regex.git
filenamify 2.1.0 MIT https://github.com/sindresorhus/filenamify.git
fill-range 7.0.1 MIT https://github.com/jonschlinkert/fill-range.git
fill-range 4.0.0 MIT https://github.com/jonschlinkert/fill-range.git
fill-range 7.0.1 MIT https://github.com/jonschlinkert/fill-range.git
finalhandler 1.1.2 MIT https://github.com/pillarjs/finalhandler.git
find-cache-dir 3.3.1 MIT https://github.com/avajs/find-cache-dir.git
find-cache-dir 2.1.0 MIT https://github.com/avajs/find-cache-dir.git
find-up 3.0.0 MIT https://github.com/sindresorhus/find-up.git
find-up 1.1.2 MIT https://github.com/sindresorhus/find-up.git
find-up 4.1.0 MIT https://github.com/sindresorhus/find-up.git
find-cache-dir 3.3.1 MIT https://github.com/avajs/find-cache-dir.git
find-up 2.1.0 MIT https://github.com/sindresorhus/find-up.git
find-up 3.0.0 MIT https://github.com/sindresorhus/find-up.git
find-up 4.1.0 MIT https://github.com/sindresorhus/find-up.git
find-up 1.1.2 MIT https://github.com/sindresorhus/find-up.git
find-versions 3.2.0 MIT https://github.com/sindresorhus/find-versions.git
findup-sync 3.0.0 MIT https://github.com/gulpjs/findup-sync.git
flat-cache 2.0.1 MIT https://github.com/royriojas/flat-cache.git
flotr2 0.1.0 MIT https://github.com/HumbleSoftware/Flotr2.git
flush-write-stream 1.1.1 MIT https://github.com/mafintosh/flush-write-stream.git
follow-redirects 1.5.10 MIT git@github.com:follow-redirects/follow-redirects.git
for-in 1.0.2 MIT https://github.com/jonschlinkert/for-in.git
@ -507,12 +555,14 @@ fs-readdir-recursive 1.1.0
fsevents 2.1.3 MIT https://github.com/fsevents/fsevents.git
fsevents 1.2.13 MIT https://github.com/strongloop/fsevents.git
function-bind 1.1.1 MIT git://github.com/Raynos/function-bind.git
function.prototype.name 1.1.2 MIT git://github.com/es-shims/Function.prototype.name.git
functional-red-black-tree 1.0.1 MIT git://github.com/mikolalysenko/functional-red-black-tree.git
functions-have-names 1.2.1 MIT git+https://github.com/ljharb/functions-have-names.git
geometry-interfaces 1.1.4 MIT https://github.com/trusktr/geometry-interfaces.git
get-proxy 2.1.0 MIT https://github.com/kevva/get-proxy.git
get-stdin 4.0.1 MIT https://github.com/sindresorhus/get-stdin.git
get-stream 2.3.1 MIT https://github.com/sindresorhus/get-stream.git
get-stream 3.0.0 MIT https://github.com/sindresorhus/get-stream.git
get-stream 2.3.1 MIT https://github.com/sindresorhus/get-stream.git
get-stream 4.1.0 MIT https://github.com/sindresorhus/get-stream.git
get-value 2.0.6 MIT https://github.com/jonschlinkert/get-value.git
gifsicle 4.0.1 MIT https://github.com/imagemin/gifsicle-bin.git
@ -520,8 +570,8 @@ global-modules 1.0.0
global-modules 2.0.0 MIT https://github.com/jonschlinkert/global-modules.git
global-prefix 3.0.0 MIT https://github.com/jonschlinkert/global-prefix.git
global-prefix 1.0.2 MIT https://github.com/jonschlinkert/global-prefix.git
globals 11.12.0 MIT https://github.com/sindresorhus/globals.git
globals 9.18.0 MIT https://github.com/sindresorhus/globals.git
globals 11.12.0 MIT https://github.com/sindresorhus/globals.git
globby 6.1.0 MIT https://github.com/sindresorhus/globby.git
globby 7.1.1 MIT https://github.com/sindresorhus/globby.git
got 8.3.2 MIT https://github.com/sindresorhus/got.git
@ -539,8 +589,8 @@ has-symbols 1.0.1
has-to-string-tag-x 1.4.1 MIT https://github.com/Xotic750/has-to-string-tag-x.git
has-value 0.3.1 MIT https://github.com/jonschlinkert/has-value.git
has-value 1.0.0 MIT https://github.com/jonschlinkert/has-value.git
has-values 0.1.4 MIT https://github.com/jonschlinkert/has-values.git
has-values 1.0.0 MIT https://github.com/jonschlinkert/has-values.git
has-values 0.1.4 MIT https://github.com/jonschlinkert/has-values.git
hash-base 3.1.0 MIT https://github.com/crypto-browserify/hash-base.git
hash.js 1.1.7 MIT git@github.com:indutny/hash.js
hat 0.0.3 MIT http://github.com/substack/node-hat.git
@ -551,7 +601,9 @@ hoopy 0.1.4
hsl-regex 1.0.0 MIT https://github.com/regexps/hsl-regex.git
hsla-regex 1.0.0 MIT https://github.com/regexps/hsla-regex.git
html-comment-regex 1.1.2 MIT https://github.com/stevemao/html-comment-regex.git
html-element-map 1.2.0 MIT git+https://github.com/ljharb/html-element-map.git
htmlescape 1.1.1 MIT git://github.com/zertosh/htmlescape.git
htmlparser2 3.10.1 MIT git://github.com/fb55/htmlparser2.git
http-errors 1.7.2 MIT https://github.com/jshttp/http-errors.git
http-proxy 1.18.1 MIT https://github.com/http-party/node-http-proxy.git
https-browserify 1.0.0 MIT git://github.com/substack/https-browserify.git
@ -577,12 +629,13 @@ import-lazy 3.1.0
import-local 2.0.0 MIT https://github.com/sindresorhus/import-local.git
imports-loader 0.8.0 MIT https://github.com/webpack-contrib/imports-loader
imurmurhash 0.1.4 MIT https://github.com/jensyt/imurmurhash-js
indent-string 4.0.0 MIT https://github.com/sindresorhus/indent-string.git
indent-string 2.1.0 MIT https://github.com/sindresorhus/indent-string.git
indent-string 4.0.0 MIT https://github.com/sindresorhus/indent-string.git
indexes-of 1.0.1 MIT git://github.com/dominictarr/indexes-of.git
inline-source-map 0.6.2 MIT git://github.com/thlorenz/inline-source-map.git
inquirer 6.5.2 MIT https://github.com/SBoudrias/Inquirer.js.git
insert-module-globals 7.2.0 MIT git://github.com/browserify/insert-module-globals.git
internal-slot 1.0.2 MIT git+https://github.com/ljharb/internal-slot.git
interpret 1.2.0 MIT https://github.com/gulpjs/interpret.git
into-stream 3.1.0 MIT https://github.com/sindresorhus/into-stream.git
invariant 2.2.4 MIT https://github.com/zertosh/invariant
@ -592,10 +645,11 @@ ipaddr.js 1.9.1
is-absolute-url 2.1.0 MIT https://github.com/sindresorhus/is-absolute-url.git
is-accessor-descriptor 0.1.6 MIT https://github.com/jonschlinkert/is-accessor-descriptor.git
is-accessor-descriptor 1.0.0 MIT https://github.com/jonschlinkert/is-accessor-descriptor.git
is-arrayish 0.2.1 MIT https://github.com/qix-/node-is-arrayish.git
is-arrayish 0.3.2 MIT https://github.com/qix-/node-is-arrayish.git
is-binary-path 2.1.0 MIT https://github.com/sindresorhus/is-binary-path.git
is-arrayish 0.2.1 MIT https://github.com/qix-/node-is-arrayish.git
is-binary-path 1.0.1 MIT https://github.com/sindresorhus/is-binary-path.git
is-binary-path 2.1.0 MIT https://github.com/sindresorhus/is-binary-path.git
is-boolean-object 1.0.1 MIT git://github.com/ljharb/is-boolean-object.git
is-buffer 2.0.4 MIT git://github.com/feross/is-buffer.git
is-buffer 1.1.6 MIT git://github.com/feross/is-buffer.git
is-callable 1.2.0 MIT git://github.com/ljharb/is-callable.git
@ -603,8 +657,8 @@ is-color-stop 1.1.0
is-data-descriptor 1.0.0 MIT https://github.com/jonschlinkert/is-data-descriptor.git
is-data-descriptor 0.1.4 MIT https://github.com/jonschlinkert/is-data-descriptor.git
is-date-object 1.0.2 MIT git://github.com/ljharb/is-date-object.git
is-descriptor 0.1.6 MIT https://github.com/jonschlinkert/is-descriptor.git
is-descriptor 1.0.2 MIT https://github.com/jonschlinkert/is-descriptor.git
is-descriptor 0.1.6 MIT https://github.com/jonschlinkert/is-descriptor.git
is-directory 0.3.1 MIT https://github.com/jonschlinkert/is-directory.git
is-docker 1.1.0 MIT https://github.com/sindresorhus/is-docker.git
is-extendable 1.0.1 MIT https://github.com/jonschlinkert/is-extendable.git
@ -613,12 +667,13 @@ is-extglob 2.1.1
is-finite 1.1.0 MIT https://github.com/sindresorhus/is-finite.git
is-fullwidth-code-point 2.0.0 MIT https://github.com/sindresorhus/is-fullwidth-code-point.git
is-gif 3.0.0 MIT https://github.com/sindresorhus/is-gif.git
is-glob 3.1.0 MIT https://github.com/jonschlinkert/is-glob.git
is-glob 4.0.1 MIT https://github.com/micromatch/is-glob.git
is-glob 3.1.0 MIT https://github.com/jonschlinkert/is-glob.git
is-jpg 2.0.0 MIT https://github.com/sindresorhus/is-jpg.git
is-natural-number 4.0.1 MIT https://github.com/shinnn/is-natural-number.js.git
is-number 3.0.0 MIT https://github.com/jonschlinkert/is-number.git
is-number 7.0.0 MIT https://github.com/jonschlinkert/is-number.git
is-number 3.0.0 MIT https://github.com/jonschlinkert/is-number.git
is-number-object 1.0.4 MIT git://github.com/inspect-js/is-number-object.git
is-obj 2.0.0 MIT https://github.com/sindresorhus/is-obj.git
is-object 1.0.1 MIT git://github.com/ljharb/is-object.git
is-plain-obj 1.1.0 MIT https://github.com/sindresorhus/is-plain-obj.git
@ -627,6 +682,8 @@ is-png 1.1.0
is-regex 1.1.0 MIT git://github.com/ljharb/is-regex.git
is-retry-allowed 1.2.0 MIT https://github.com/floatdrop/is-retry-allowed.git
is-stream 1.1.0 MIT https://github.com/sindresorhus/is-stream.git
is-string 1.0.5 MIT git://github.com/ljharb/is-string.git
is-subset 0.1.1 MIT git@github.com:studio-b12/is-subset.git
is-svg 4.2.1 MIT https://github.com/sindresorhus/is-svg.git
is-svg 3.0.0 MIT https://github.com/sindresorhus/is-svg.git
is-symbol 1.0.3 MIT git://github.com/inspect-js/is-symbol.git
@ -634,21 +691,22 @@ is-utf8 0.2.1
is-windows 1.0.2 MIT https://github.com/jonschlinkert/is-windows.git
is-wsl 1.1.0 MIT https://github.com/sindresorhus/is-wsl.git
isarray 0.0.1 MIT git://github.com/juliangruber/isarray.git
isarray 1.0.0 MIT git://github.com/juliangruber/isarray.git
isarray 2.0.1 MIT git://github.com/juliangruber/isarray.git
isarray 1.0.0 MIT git://github.com/juliangruber/isarray.git
isbinaryfile 3.0.3 MIT https://github.com/gjtorikian/isBinaryFile
isobject 2.1.0 MIT https://github.com/jonschlinkert/isobject.git
isobject 3.0.1 MIT https://github.com/jonschlinkert/isobject.git
isobject 2.1.0 MIT https://github.com/jonschlinkert/isobject.git
isurl 1.0.0 MIT https://github.com/stevenvachon/isurl.git
jasmine-core 3.3.0 MIT https://github.com/jasmine/jasmine.git
jasmine-enzyme 7.1.2 MIT https://github.com/FormidableLabs/enzyme-matchers.git
jest-worker 25.5.0 MIT https://github.com/facebook/jest.git
jquery 3.5.1 MIT https://github.com/jquery/jquery.git
jquery-contextmenu 2.9.2 MIT git://github.com/swisnl/jQuery-contextMenu.git
jquery-ui 1.12.1 MIT git://github.com/jquery/jquery-ui.git
js-levenshtein 1.1.6 MIT https://github.com/gustf/js-levenshtein.git
js-string-escape 1.0.1 MIT https://github.com/joliss/js-string-escape
js-tokens 4.0.0 MIT https://github.com/lydell/js-tokens.git
js-tokens 3.0.2 MIT https://github.com/lydell/js-tokens.git
js-tokens 4.0.0 MIT https://github.com/lydell/js-tokens.git
js-yaml 3.14.0 MIT https://github.com/nodeca/js-yaml.git
jsbn 1.1.0 MIT https://github.com/andyperlitch/jsbn.git
jsesc 0.5.0 MIT https://github.com/mathiasbynens/jsesc.git
@ -659,10 +717,11 @@ json-parse-better-errors 1.0.2
json-schema-traverse 0.4.1 MIT git+https://github.com/epoberezkin/json-schema-traverse.git
json-stable-stringify 0.0.1 MIT git://github.com/substack/json-stable-stringify.git
json-stable-stringify-without-jsonify 1.0.1 MIT git://github.com/samn/json-stable-stringify.git
json5 1.0.1 MIT git+https://github.com/json5/json5.git
json5 2.1.3 MIT git+https://github.com/json5/json5.git
json5 1.0.1 MIT git+https://github.com/json5/json5.git
jsonfile 4.0.0 MIT git@github.com:jprichardson/node-jsonfile.git
jsonparse 1.3.1 MIT http://github.com/creationix/jsonparse.git
jsx-ast-utils 2.4.1 MIT https://github.com/evcohen/jsx-ast-utils
karma 4.4.1 MIT git://github.com/karma-runner/karma.git
karma-browserify 6.0.0 MIT git@github.com:nikku/karma-browserify.git
karma-chrome-launcher 2.2.0 MIT git://github.com/karma-runner/karma-chrome-launcher.git
@ -673,36 +732,48 @@ karma-source-map-support 1.4.0
karma-sourcemap-loader 0.3.7 MIT git@github.com:demerzel3/karma-sourcemap-loader.git
karma-webpack 4.0.2 MIT https://github.com/webpack-contrib/karma-webpack.git
keyv 3.0.0 MIT git+https://github.com/lukechilds/keyv.git
kind-of 6.0.3 MIT https://github.com/jonschlinkert/kind-of.git
kind-of 3.2.2 MIT https://github.com/jonschlinkert/kind-of.git
kind-of 5.1.0 MIT https://github.com/jonschlinkert/kind-of.git
kind-of 6.0.3 MIT https://github.com/jonschlinkert/kind-of.git
kind-of 4.0.0 MIT https://github.com/jonschlinkert/kind-of.git
kind-of 5.1.0 MIT https://github.com/jonschlinkert/kind-of.git
labeled-stream-splicer 2.0.2 MIT git://github.com/browserify/labeled-stream-splicer.git
last-call-webpack-plugin 3.0.0 MIT http://github.com/NMFR/last-call-webpack-plugin.git
lcid 2.0.0 MIT https://github.com/sindresorhus/lcid.git
levn 0.3.0 MIT git://github.com/gkz/levn.git
load-json-file 1.1.0 MIT https://github.com/sindresorhus/load-json-file.git
loader-runner 2.4.0 MIT git+https://github.com/webpack/loader-runner.git
loader-utils 1.2.3 MIT https://github.com/webpack/loader-utils.git
loader-utils 1.4.0 MIT https://github.com/webpack/loader-utils.git
locate-path 5.0.0 MIT https://github.com/sindresorhus/locate-path.git
loader-utils 1.2.3 MIT https://github.com/webpack/loader-utils.git
locate-path 2.0.0 MIT https://github.com/sindresorhus/locate-path.git
locate-path 5.0.0 MIT https://github.com/sindresorhus/locate-path.git
locate-path 3.0.0 MIT https://github.com/sindresorhus/locate-path.git
lodash 4.17.19 MIT https://github.com/lodash/lodash.git
lodash 4.17.15 MIT https://github.com/lodash/lodash.git
lodash.memoize 4.1.2 MIT https://github.com/lodash/lodash.git
lodash._baseisequal 3.0.7 MIT https://github.com/lodash/lodash.git
lodash._bindcallback 3.0.1 MIT https://github.com/lodash/lodash.git
lodash._getnative 3.9.1 MIT https://github.com/lodash/lodash.git
lodash.escape 4.0.1 MIT https://github.com/lodash/lodash.git
lodash.flattendeep 4.4.0 MIT https://github.com/lodash/lodash.git
lodash.isarguments 3.1.0 MIT https://github.com/lodash/lodash.git
lodash.isarray 3.0.4 MIT https://github.com/lodash/lodash.git
lodash.isequal 4.5.0 MIT https://github.com/lodash/lodash.git
lodash.isequal 3.0.4 MIT https://github.com/lodash/lodash.git
lodash.istypedarray 3.0.6 MIT https://github.com/lodash/lodash.git
lodash.keys 3.1.2 MIT https://github.com/lodash/lodash.git
lodash.memoize 3.0.4 MIT https://github.com/lodash/lodash.git
lodash.memoize 4.1.2 MIT https://github.com/lodash/lodash.git
lodash.uniq 4.5.0 MIT https://github.com/lodash/lodash.git
logalot 2.1.0 MIT https://github.com/imagemin/logalot.git
longest 1.0.1 MIT https://github.com/jonschlinkert/longest.git
loose-envify 1.4.0 MIT git://github.com/zertosh/loose-envify.git
loud-rejection 1.6.0 MIT https://github.com/sindresorhus/loud-rejection.git
lowercase-keys 1.0.1 MIT https://github.com/sindresorhus/lowercase-keys.git
lowercase-keys 1.0.0 MIT https://github.com/sindresorhus/lowercase-keys.git
lowercase-keys 1.0.1 MIT https://github.com/sindresorhus/lowercase-keys.git
lpad-align 1.1.2 MIT https://github.com/kevva/lpad-align.git
lunr 0.7.2 MIT https://github.com/olivernn/lunr.js.git
make-dir 2.1.0 MIT https://github.com/sindresorhus/make-dir.git
make-dir 1.3.0 MIT https://github.com/sindresorhus/make-dir.git
make-dir 3.1.0 MIT https://github.com/sindresorhus/make-dir.git
make-dir 2.1.0 MIT https://github.com/sindresorhus/make-dir.git
map-age-cleaner 0.1.3 MIT https://github.com/SamVerschueren/map-age-cleaner.git
map-cache 0.2.2 MIT https://github.com/jonschlinkert/map-cache.git
map-obj 1.0.1 MIT https://github.com/sindresorhus/map-obj.git
@ -729,21 +800,23 @@ mimic-fn 1.2.0
mimic-response 1.0.1 MIT https://github.com/sindresorhus/mimic-response.git
mini-css-extract-plugin 0.5.0 MIT https://github.com/webpack-contrib/mini-css-extract-plugin.git
minimalistic-crypto-utils 1.0.1 MIT git+ssh://git@github.com/indutny/minimalistic-crypto-utils.git
minimist 1.2.5 MIT git://github.com/substack/minimist.git
minimist 0.0.10 MIT git://github.com/substack/minimist.git
minimist 1.2.5 MIT git://github.com/substack/minimist.git
mixin-deep 1.3.2 MIT https://github.com/jonschlinkert/mixin-deep.git
mkdirp 0.5.5 MIT https://github.com/substack/node-mkdirp.git
module-deps 6.2.2 MIT git://github.com/browserify/module-deps.git
moment 2.26.0 MIT https://github.com/moment/moment.git
moment-timezone 0.5.31 MIT https://github.com/moment/moment-timezone.git
moment 2.27.0 MIT https://github.com/moment/moment.git
moment-timezone 0.4.1 MIT https://github.com/moment/moment-timezone.git
moment-timezone 0.5.31 MIT https://github.com/moment/moment-timezone.git
mozjpeg 6.0.1 MIT https://github.com/imagemin/mozjpeg-bin.git
ms 2.1.2 MIT https://github.com/zeit/ms.git
ms 2.0.0 MIT https://github.com/zeit/ms.git
ms 2.1.1 MIT https://github.com/zeit/ms.git
ms 2.0.0 MIT https://github.com/zeit/ms.git
nan 2.14.1 MIT git://github.com/nodejs/nan.git
nanomatch 1.2.13 MIT https://github.com/micromatch/nanomatch.git
natural-compare 1.4.0 MIT git://github.com/litejs/natural-compare-lite.git
nearley 2.19.5 MIT https://github.com/hardmath123/nearley.git
neatequal 1.0.0 MIT git@github.com:nfroidure/neatequal.git
negotiator 0.6.2 MIT https://github.com/jshttp/negotiator.git
neo-async 2.6.1 MIT git@github.com:suguru03/neo-async.git
@ -762,9 +835,12 @@ num2fraction 1.2.2
object-assign 4.1.1 MIT https://github.com/sindresorhus/object-assign.git
object-copy 0.1.0 MIT https://github.com/jonschlinkert/object-copy.git
object-inspect 1.7.0 MIT git://github.com/substack/object-inspect.git
object-is 1.1.2 MIT git://github.com/es-shims/object-is.git
object-keys 1.1.1 MIT git://github.com/ljharb/object-keys.git
object-visit 1.0.1 MIT https://github.com/jonschlinkert/object-visit.git
object.assign 4.1.0 MIT git://github.com/ljharb/object.assign.git
object.entries 1.1.2 MIT git://github.com/es-shims/Object.entries.git
object.fromentries 2.0.2 MIT git://github.com/es-shims/Object.fromEntries.git
object.getownpropertydescriptors 2.1.0 MIT git://github.com/es-shims/object.getownpropertydescriptors.git
object.pick 1.3.0 MIT https://github.com/jonschlinkert/object.pick.git
object.values 1.1.1 MIT git://github.com/es-shims/Object.values.git
@ -788,11 +864,11 @@ p-event 2.3.1
p-finally 1.0.0 MIT https://github.com/sindresorhus/p-finally.git
p-is-promise 1.1.0 MIT https://github.com/sindresorhus/p-is-promise.git
p-is-promise 2.1.0 MIT https://github.com/sindresorhus/p-is-promise.git
p-limit 1.3.0 MIT https://github.com/sindresorhus/p-limit.git
p-limit 2.3.0 MIT https://github.com/sindresorhus/p-limit.git
p-limit 1.3.0 MIT https://github.com/sindresorhus/p-limit.git
p-locate 2.0.0 MIT https://github.com/sindresorhus/p-locate.git
p-locate 4.1.0 MIT https://github.com/sindresorhus/p-locate.git
p-locate 3.0.0 MIT https://github.com/sindresorhus/p-locate.git
p-locate 2.0.0 MIT https://github.com/sindresorhus/p-locate.git
p-map 3.0.0 MIT https://github.com/sindresorhus/p-map.git
p-map-series 1.0.0 MIT https://github.com/sindresorhus/p-map-series.git
p-pipe 1.2.0 MIT https://github.com/sindresorhus/p-pipe.git
@ -804,18 +880,19 @@ p-try 2.2.0
parallel-transform 1.2.0 MIT git://github.com/mafintosh/parallel-transform
parent-module 1.0.1 MIT https://github.com/sindresorhus/parent-module.git
parents 1.0.1 MIT git://github.com/substack/node-parents.git
parse-json 4.0.0 MIT https://github.com/sindresorhus/parse-json.git
parse-json 2.2.0 MIT https://github.com/sindresorhus/parse-json.git
parse-json 4.0.0 MIT https://github.com/sindresorhus/parse-json.git
parse-passwd 1.0.0 MIT https://github.com/doowb/parse-passwd.git
parse5 3.0.3 MIT git://github.com/inikulin/parse5.git
parseqs 0.0.5 MIT https://github.com/get/querystring.git
parseuri 0.0.5 MIT https://github.com/get/parseuri.git
parseurl 1.3.3 MIT https://github.com/pillarjs/parseurl.git
pascalcase 0.1.1 MIT https://github.com/jonschlinkert/pascalcase.git
path-browserify 0.0.1 MIT git://github.com/substack/path-browserify.git
path-dirname 1.0.2 MIT https://github.com/es128/path-dirname.git
path-exists 3.0.0 MIT https://github.com/sindresorhus/path-exists.git
path-exists 4.0.0 MIT https://github.com/sindresorhus/path-exists.git
path-exists 2.1.0 MIT https://github.com/sindresorhus/path-exists.git
path-exists 4.0.0 MIT https://github.com/sindresorhus/path-exists.git
path-exists 3.0.0 MIT https://github.com/sindresorhus/path-exists.git
path-is-absolute 1.0.1 MIT https://github.com/sindresorhus/path-is-absolute.git
path-key 2.0.1 MIT https://github.com/sindresorhus/path-key.git
path-parse 1.0.6 MIT https://github.com/jbgutierrez/path-parse.git
@ -825,10 +902,11 @@ path-type 3.0.0
path-type 1.1.0 MIT https://github.com/sindresorhus/path-type.git
pbkdf2 3.1.1 MIT https://github.com/crypto-browserify/pbkdf2.git
pend 1.2.0 MIT git://github.com/andrewrk/node-pend.git
performance-now 2.1.0 MIT git://github.com/braveg1rl/performance-now.git
picomatch 2.2.2 MIT https://github.com/micromatch/picomatch.git
pify 2.3.0 MIT https://github.com/sindresorhus/pify.git
pify 4.0.1 MIT https://github.com/sindresorhus/pify.git
pify 3.0.0 MIT https://github.com/sindresorhus/pify.git
pify 4.0.1 MIT https://github.com/sindresorhus/pify.git
pinkie 2.0.4 MIT https://github.com/floatdrop/pinkie.git
pinkie-promise 2.0.1 MIT https://github.com/floatdrop/pinkie-promise.git
pkg-dir 4.2.0 MIT https://github.com/sindresorhus/pkg-dir.git
@ -837,8 +915,8 @@ pkg-up 2.0.0
pngquant-bin 5.0.2 MIT https://github.com/imagemin/pngquant-bin.git
popper.js 1.16.1 MIT git+https://github.com/FezVrasta/popper.js.git
posix-character-classes 0.1.1 MIT https://github.com/jonschlinkert/posix-character-classes.git
postcss 7.0.32 MIT https://github.com/postcss/postcss.git
postcss 7.0.27 MIT https://github.com/postcss/postcss.git
postcss 7.0.32 MIT https://github.com/postcss/postcss.git
postcss-calc 7.0.2 MIT https://github.com/postcss/postcss-calc.git
postcss-colormin 4.0.3 MIT https://github.com/cssnano/cssnano.git
postcss-convert-values 4.0.1 MIT https://github.com/cssnano/cssnano.git
@ -867,8 +945,8 @@ postcss-normalize-whitespace 4.0.2
postcss-ordered-values 4.1.2 MIT https://github.com/cssnano/cssnano.git
postcss-reduce-initial 4.0.3 MIT https://github.com/cssnano/cssnano.git
postcss-reduce-transforms 4.0.2 MIT https://github.com/cssnano/cssnano.git
postcss-selector-parser 3.1.2 MIT https://github.com/postcss/postcss-selector-parser.git
postcss-selector-parser 6.0.2 MIT https://github.com/postcss/postcss-selector-parser.git
postcss-selector-parser 3.1.2 MIT https://github.com/postcss/postcss-selector-parser.git
postcss-svgo 4.0.2 MIT https://github.com/cssnano/cssnano.git
postcss-unique-selectors 4.0.1 MIT https://github.com/cssnano/cssnano.git
postcss-value-parser 4.1.0 MIT https://github.com/TrySound/postcss-value-parser.git
@ -880,40 +958,50 @@ private 0.1.8
process 0.11.10 MIT git://github.com/shtylman/node-process.git
process-nextick-args 2.0.1 MIT https://github.com/calvinmetcalf/process-nextick-args.git
progress 2.0.3 MIT git://github.com/visionmedia/node-progress
prop-types 15.7.2 MIT https://github.com/facebook/prop-types.git
prop-types-exact 1.2.0 MIT git+https://github.com/airbnb/prop-types-exact.git
proxy-addr 2.0.6 MIT https://github.com/jshttp/proxy-addr.git
prr 1.0.1 MIT https://github.com/rvagg/prr.git
public-encrypt 4.0.3 MIT https://github.com/crypto-browserify/publicEncrypt.git
pump 3.0.0 MIT git://github.com/mafintosh/pump.git
pump 2.0.1 MIT git://github.com/mafintosh/pump.git
pump 3.0.0 MIT git://github.com/mafintosh/pump.git
pumpify 1.5.1 MIT git://github.com/mafintosh/pumpify
punycode 1.4.1 MIT https://github.com/bestiejs/punycode.js.git
punycode 1.3.2 MIT https://github.com/bestiejs/punycode.js.git
punycode 2.1.1 MIT https://github.com/bestiejs/punycode.js.git
punycode 1.4.1 MIT https://github.com/bestiejs/punycode.js.git
q 1.5.1 MIT git://github.com/kriskowal/q.git
qjobs 1.2.0 MIT git://github.com/franck34/qjobs.git
query-string 5.1.1 MIT https://github.com/sindresorhus/query-string.git
querystring 0.2.0 MIT git://github.com/Gozala/querystring.git
querystring-es3 0.2.1 MIT git://github.com/mike-spainhower/querystring.git
raf 3.4.1 MIT git://github.com/chrisdickinson/raf.git
randexp 0.4.6 MIT git://github.com/fent/randexp.js.git
randombytes 2.1.0 MIT git@github.com:crypto-browserify/randombytes.git
randomfill 1.0.4 MIT https://github.com/crypto-browserify/randomfill.git
range-parser 1.2.1 MIT https://github.com/jshttp/range-parser.git
raw-body 2.4.0 MIT https://github.com/stream-utils/raw-body.git
raw-loader 1.0.0 MIT https://github.com/webpack-contrib/raw-loader.git
react 16.13.1 MIT https://github.com/facebook/react.git
react-dom 16.13.1 MIT https://github.com/facebook/react.git
react-is 16.13.1 MIT https://github.com/facebook/react.git
react-test-renderer 16.13.1 MIT https://github.com/facebook/react.git
read-only-stream 2.0.0 MIT git://github.com/substack/read-only-stream.git
read-pkg 1.1.0 MIT https://github.com/sindresorhus/read-pkg.git
read-pkg-up 1.0.1 MIT https://github.com/sindresorhus/read-pkg-up.git
readable-stream 1.1.14 MIT git://github.com/isaacs/readable-stream
readable-stream 3.6.0 MIT git://github.com/nodejs/readable-stream
readable-stream 2.3.7 MIT git://github.com/nodejs/readable-stream
readdirp 2.2.1 MIT git://github.com/paulmillr/readdirp.git
readable-stream 3.6.0 MIT git://github.com/nodejs/readable-stream
readdirp 3.4.0 MIT git://github.com/paulmillr/readdirp.git
readdirp 2.2.1 MIT git://github.com/paulmillr/readdirp.git
redent 1.0.0 MIT https://github.com/sindresorhus/redent.git
reflect.ownkeys 0.2.0 MIT https://github.com/glenjamin/Reflect.ownKeys.git
regenerate 1.4.1 MIT https://github.com/mathiasbynens/regenerate.git
regenerate-unicode-properties 8.2.0 MIT https://github.com/mathiasbynens/regenerate-unicode-properties.git
regenerator-runtime 0.11.1 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime
regenerator-runtime 0.13.5 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime
regenerator-transform 0.14.4 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-transform
regex-not 1.0.2 MIT https://github.com/jonschlinkert/regex-not.git
regexp.prototype.flags 1.3.0 MIT git://github.com/es-shims/RegExp.prototype.flags.git
regexpp 2.0.1 MIT git+https://github.com/mysticatea/regexpp.git
regexpu-core 4.7.0 MIT https://github.com/mathiasbynens/regexpu-core.git
regexpu-core 2.0.0 MIT https://github.com/mathiasbynens/regexpu-core.git
@ -926,12 +1014,12 @@ replace-ext 1.0.1
require-directory 2.1.1 MIT git://github.com/troygoode/node-require-directory.git
requirejs 2.3.6 MIT https://github.com/jrburke/r.js.git
requires-port 1.0.0 MIT https://github.com/unshiftio/requires-port
resolve 1.1.7 MIT git://github.com/substack/node-resolve.git
resolve 1.17.0 MIT git://github.com/browserify/resolve.git
resolve 1.1.7 MIT git://github.com/substack/node-resolve.git
resolve-cwd 2.0.0 MIT https://github.com/sindresorhus/resolve-cwd.git
resolve-dir 1.0.1 MIT https://github.com/jonschlinkert/resolve-dir.git
resolve-from 3.0.0 MIT https://github.com/sindresorhus/resolve-from.git
resolve-from 4.0.0 MIT https://github.com/sindresorhus/resolve-from.git
resolve-from 3.0.0 MIT https://github.com/sindresorhus/resolve-from.git
resolve-url 0.2.1 MIT https://github.com/lydell/resolve-url.git
responselike 1.0.2 MIT https://github.com/lukechilds/responselike.git
restore-cursor 2.0.0 MIT https://github.com/sindresorhus/restore-cursor.git
@ -941,13 +1029,14 @@ rgb-regex 1.0.1
rgba-regex 1.0.0 MIT https://github.com/johnotander/rgba-regex.git
ripemd160 2.0.2 MIT https://github.com/crypto-browserify/ripemd160
run-async 2.4.1 MIT https://github.com/SBoudrias/run-async.git
safe-buffer 5.2.1 MIT git://github.com/feross/safe-buffer.git
safe-buffer 5.1.2 MIT git://github.com/feross/safe-buffer.git
safe-buffer 5.2.1 MIT git://github.com/feross/safe-buffer.git
safe-regex 1.1.0 MIT git://github.com/substack/safe-regex.git
safer-buffer 2.1.2 MIT git+https://github.com/ChALkeR/safer-buffer.git
sass 1.26.8 MIT https://github.com/sass/dart-sass
sass-loader 7.3.1 MIT https://github.com/webpack-contrib/sass-loader.git
sass-resources-loader 2.0.3 MIT https://github.com/shakacode/sass-resources-loader.git
scheduler 0.19.1 MIT https://github.com/facebook/react.git
schema-utils 2.7.0 MIT https://github.com/webpack/schema-utils.git
schema-utils 1.0.0 MIT https://github.com/webpack-contrib/schema-utils
seek-bzip 1.0.5 MIT https://github.com/cscott/seek-bzip.git
@ -964,6 +1053,7 @@ shebang-command 1.2.0
shebang-regex 1.0.0 MIT https://github.com/sindresorhus/shebang-regex.git
shell-quote 1.7.2 MIT http://github.com/substack/node-shell-quote.git
shim-loader 1.0.1 MIT https://github.com/zinserjan/shim-loader
side-channel 1.0.2 MIT git+https://github.com/ljharb/side-channel.git
simple-concat 1.0.0 MIT git://github.com/feross/simple-concat.git
simple-swizzle 0.2.2 MIT https://github.com/qix-/node-simple-swizzle.git
slash 1.0.0 MIT https://github.com/sindresorhus/slash.git
@ -980,8 +1070,8 @@ socket.io-parser 3.2.0
sort-keys 1.1.2 MIT https://github.com/sindresorhus/sort-keys.git
sort-keys 2.0.0 MIT https://github.com/sindresorhus/sort-keys.git
sort-keys-length 1.0.1 MIT https://github.com/kevva/sort-keys-length.git
source-list-map 2.0.1 MIT https://github.com/webpack/source-list-map.git
source-list-map 1.1.2 MIT https://github.com/webpack/source-list-map.git
source-list-map 2.0.1 MIT https://github.com/webpack/source-list-map.git
source-map-resolve 0.5.3 MIT https://github.com/lydell/source-map-resolve.git
source-map-support 0.5.19 MIT https://github.com/evanw/node-source-map-support
source-map-url 0.4.0 MIT https://github.com/lydell/source-map-url.git
@ -1000,18 +1090,20 @@ stream-shift 1.0.1
stream-splicer 2.0.1 MIT git://github.com/browserify/stream-splicer.git
streamroller 1.0.6 MIT https://github.com/nomiddlename/streamroller.git
strict-uri-encode 1.1.0 MIT https://github.com/kevva/strict-uri-encode.git
string_decoder 1.3.0 MIT git://github.com/nodejs/string_decoder.git
string_decoder 1.1.1 MIT git://github.com/nodejs/string_decoder.git
string_decoder 0.10.31 MIT git://github.com/rvagg/string_decoder.git
string-width 3.1.0 MIT https://github.com/sindresorhus/string-width.git
string_decoder 1.1.1 MIT git://github.com/nodejs/string_decoder.git
string_decoder 1.3.0 MIT git://github.com/nodejs/string_decoder.git
string-width 2.1.1 MIT https://github.com/sindresorhus/string-width.git
string-width 3.1.0 MIT https://github.com/sindresorhus/string-width.git
string.fromcodepoint 0.2.1 MIT https://github.com/mathiasbynens/String.fromCodePoint.git
string.prototype.codepointat 0.2.1 MIT https://github.com/mathiasbynens/String.prototype.codePointAt.git
string.prototype.matchall 4.0.2 MIT git+https://github.com/ljharb/String.prototype.matchAll.git
string.prototype.trim 1.2.1 MIT git://github.com/es-shims/String.prototype.trim.git
string.prototype.trimend 1.0.1 MIT git://github.com/es-shims/String.prototype.trimEnd.git
string.prototype.trimstart 1.0.1 MIT git://github.com/es-shims/String.prototype.trimStart.git
strip-ansi 3.0.1 MIT https://github.com/chalk/strip-ansi.git
strip-ansi 5.2.0 MIT https://github.com/chalk/strip-ansi.git
strip-ansi 4.0.0 MIT https://github.com/chalk/strip-ansi.git
strip-ansi 3.0.1 MIT https://github.com/chalk/strip-ansi.git
strip-bom 2.0.0 MIT https://github.com/sindresorhus/strip-bom.git
strip-dirs 2.1.0 MIT https://github.com/shinnn/node-strip-dirs.git
strip-eof 1.0.0 MIT https://github.com/sindresorhus/strip-eof.git
@ -1021,10 +1113,10 @@ strip-outer 1.0.1
style-loader 0.23.1 MIT https://github.com/webpack-contrib/style-loader.git
stylehacks 4.0.3 MIT https://github.com/cssnano/cssnano.git
subarg 1.0.0 MIT git://github.com/substack/subarg.git
supports-color 5.5.0 MIT https://github.com/chalk/supports-color.git
supports-color 2.0.0 MIT https://github.com/chalk/supports-color.git
supports-color 6.1.0 MIT https://github.com/chalk/supports-color.git
supports-color 7.1.0 MIT https://github.com/chalk/supports-color.git
supports-color 6.1.0 MIT https://github.com/chalk/supports-color.git
supports-color 5.5.0 MIT https://github.com/chalk/supports-color.git
svg-pathdata 5.0.5 MIT https://github.com/nfroidure/svg-pathdata.git
svg2ttf 4.3.0 MIT https://github.com/fontello/svg2ttf.git
svgicons2svgfont 9.1.1 MIT git://github.com/nfroidure/svgicons2svgfont
@ -1037,21 +1129,21 @@ temp-dir 1.0.0
tempfile 2.0.0 MIT https://github.com/sindresorhus/tempfile.git
tempusdominus-bootstrap-4 5.1.2 MIT https://github.com/tempusdominus/bootstrap-4.git
tempusdominus-core 5.0.3 MIT https://github.com/tempusdominus/core.git
terser-webpack-plugin 2.3.7 MIT https://github.com/webpack-contrib/terser-webpack-plugin.git
terser-webpack-plugin 1.4.4 MIT https://github.com/webpack-contrib/terser-webpack-plugin.git
terser-webpack-plugin 2.3.7 MIT https://github.com/webpack-contrib/terser-webpack-plugin.git
text-table 0.2.0 MIT git://github.com/substack/text-table.git
through 2.3.8 MIT https://github.com/dominictarr/through.git
through2 2.0.5 MIT https://github.com/rvagg/through2.git
timed-out 4.0.1 MIT https://github.com/floatdrop/timed-out.git
timers-browserify 1.4.2 MIT git://github.com/jryans/timers-browserify.git
timers-browserify 2.0.11 MIT git://github.com/jryans/timers-browserify.git
timers-browserify 1.4.2 MIT git://github.com/jryans/timers-browserify.git
timsort 0.3.0 MIT https://github.com/mziccard/node-timsort.git
tmp 0.0.33 MIT https://github.com/raszi/node-tmp.git
to-array 0.1.4 MIT git://github.com/Raynos/to-array.git
to-arraybuffer 1.0.1 MIT git://github.com/jhiesey/to-arraybuffer.git
to-buffer 1.1.1 MIT https://github.com/mafintosh/to-buffer.git
to-fast-properties 2.0.0 MIT https://github.com/sindresorhus/to-fast-properties.git
to-fast-properties 1.0.3 MIT https://github.com/sindresorhus/to-fast-properties.git
to-fast-properties 2.0.0 MIT https://github.com/sindresorhus/to-fast-properties.git
to-object-path 0.3.0 MIT https://github.com/jonschlinkert/to-object-path.git
to-regex 3.0.2 MIT https://github.com/jonschlinkert/to-regex.git
to-regex-range 2.1.1 MIT https://github.com/micromatch/to-regex-range.git
@ -1091,9 +1183,9 @@ url-parse-lax 1.0.0
url-to-options 1.0.1 MIT https://github.com/stevenvachon/url-to-options.git
use 3.1.1 MIT https://github.com/jonschlinkert/use.git
useragent 2.3.0 MIT http://github.com/3rd-Eden/useragent.git
util 0.10.4 MIT git://github.com/defunctzombie/node-util
util 0.10.3 MIT git://github.com/defunctzombie/node-util
util 0.11.1 MIT git://github.com/defunctzombie/node-util
util 0.10.3 MIT git://github.com/defunctzombie/node-util
util 0.10.4 MIT git://github.com/defunctzombie/node-util
util-deprecate 1.0.2 MIT git://github.com/TooTallNate/util-deprecate.git
util.promisify 1.0.1 MIT git+https://github.com/ljharb/util.promisify.git
utils-merge 1.0.1 MIT git://github.com/jaredhanson/utils-merge.git
@ -1112,8 +1204,8 @@ webpack-cli 3.3.11
webpack-dev-middleware 3.7.2 MIT https://github.com/webpack/webpack-dev-middleware.git
webpack-log 2.0.0 MIT https://github.com/webpack-contrib/webpack-log.git
webpack-require-from 1.8.1 MIT https://github.com/agoldis/webpack-require-from.git
webpack-sources 0.2.3 MIT git+https://github.com/webpack/webpack-sources.git
webpack-sources 1.4.3 MIT git+https://github.com/webpack/webpack-sources.git
webpack-sources 0.2.3 MIT git+https://github.com/webpack/webpack-sources.git
wkx 0.4.8 MIT http://github.com/cschwarz/wkx.git
word-wrap 1.2.3 MIT https://github.com/jonschlinkert/word-wrap.git
wordwrap 0.0.3 MIT git://github.com/substack/node-wordwrap.git
@ -1134,8 +1226,8 @@ anymatch 2.0.0
aproba 1.2.0 ISC https://github.com/iarna/aproba
boolbase 1.0.0 ISC https://github.com/fb55/boolbase
browserify-sign 4.2.0 ISC https://github.com/crypto-browserify/browserify-sign.git
cacache 12.0.4 ISC https://github.com/npm/cacache
cacache 13.0.1 ISC https://github.com/npm/cacache
cacache 12.0.4 ISC https://github.com/npm/cacache
chownr 1.1.4 ISC git://github.com/isaacs/chownr.git
cli-width 2.2.1 ISC git@github.com:knownasilya/cli-width.git
cliui 5.0.0 ISC http://github.com/yargs/cliui.git
@ -1157,8 +1249,8 @@ icss-utils 4.1.1
infer-owner 1.0.4 ISC https://github.com/npm/infer-owner
inflight 1.0.6 ISC https://github.com/npm/inflight.git
inherits 2.0.1 ISC git://github.com/isaacs/inherits
inherits 2.0.3 ISC git://github.com/isaacs/inherits
inherits 2.0.4 ISC git://github.com/isaacs/inherits
inherits 2.0.3 ISC git://github.com/isaacs/inherits
ini 1.3.5 ISC git://github.com/isaacs/ini.git
is-resolvable 1.1.0 ISC https://github.com/shinnn/is-resolvable.git
isexe 2.0.0 ISC git+https://github.com/isaacs/isexe.git
@ -1187,9 +1279,9 @@ rimraf 2.7.1
rimraf 2.6.3 ISC git://github.com/isaacs/rimraf.git
run-queue 1.0.3 ISC git+https://github.com/iarna/run-queue.git
sax 1.2.4 ISC git://github.com/isaacs/sax-js.git
semver 7.0.0 ISC https://github.com/npm/node-semver
semver 6.3.0 ISC https://github.com/npm/node-semver
semver 5.7.1 ISC https://github.com/npm/node-semver
semver 7.0.0 ISC https://github.com/npm/node-semver
set-blocking 2.0.0 ISC git+https://github.com/yargs/set-blocking.git
setprototypeof 1.1.1 ISC https://github.com/wesleytodd/setprototypeof.git
signal-exit 3.0.3 ISC https://github.com/tapjs/signal-exit.git
@ -1211,7 +1303,9 @@ duplexer3 0.1.4
esquery 1.3.1 BSD-3-Clause https://github.com/estools/esquery.git
filesize 3.6.1 BSD-3-Clause git://github.com/avoidwork/filesize.js.git
ieee754 1.1.13 BSD-3-Clause git://github.com/feross/ieee754.git
moo 0.5.1 BSD-3-Clause https://github.com/tjvr/moo.git
qs 6.7.0 BSD-3-Clause https://github.com/ljharb/qs.git
rst-selector-parser 2.2.3 BSD-3-Clause https://github.com/aweary/rst-selector-parser
serialize-javascript 3.1.0 BSD-3-Clause git+https://github.com/yahoo/serialize-javascript.git
serialize-javascript 2.1.2 BSD-3-Clause git+https://github.com/yahoo/serialize-javascript.git
source-map 0.7.3 BSD-3-Clause http://github.com/mozilla/source-map.git
@ -1225,6 +1319,7 @@ table 5.4.6
acorn-node 1.8.2 Apache-2.0 https://github.com/browserify/acorn-node.git
bootstrap-datepicker 1.9.0 Apache-2.0 https://github.com/uxsolutions/bootstrap-datepicker.git
dash-ast 1.0.0 Apache-2.0 https://github.com/goto-bus-stop/dash-ast.git
doctrine 2.1.0 Apache-2.0 https://github.com/eslint/doctrine.git
doctrine 3.0.0 Apache-2.0 https://github.com/eslint/doctrine.git
ejs 2.7.4 Apache-2.0 git://github.com/mde/ejs.git
ejs 3.0.2 Apache-2.0 git://github.com/mde/ejs.git
@ -1249,11 +1344,16 @@ object-component 0.0.3
precond 0.2.3 MIT* https://github.com/MathieuTurcotte/node-precond.git
webcabin-docker 2.2.4-dev MIT* Unknown
caniuse-lite 1.0.30001081 CC-BY-4.0 https://github.com/ben-eb/caniuse-lite.git
css-select 1.2.0 BSD-2-Clause git://github.com/fb55/css-select.git
css-select 2.1.0 BSD-2-Clause git://github.com/fb55/css-select.git
css-what 3.3.0 BSD-2-Clause https://github.com/fb55/css-what
css-what 2.1.3 BSD-2-Clause https://github.com/fb55/css-what
domelementtype 2.0.1 BSD-2-Clause git://github.com/fb55/domelementtype.git
domelementtype 1.3.1 BSD-2-Clause git://github.com/fb55/domelementtype.git
domhandler 2.4.2 BSD-2-Clause git://github.com/fb55/DomHandler.git
domutils 1.7.0 BSD-2-Clause git://github.com/FB55/domutils.git
domutils 1.5.1 BSD-2-Clause git://github.com/FB55/domutils.git
entities 1.1.2 BSD-2-Clause git://github.com/fb55/entities.git
entities 2.0.3 BSD-2-Clause git://github.com/fb55/entities.git
eslint-scope 4.0.3 BSD-2-Clause https://github.com/eslint/eslint-scope.git
espree 5.0.1 BSD-2-Clause https://github.com/eslint/espree.git
@ -1267,8 +1367,8 @@ leaflet 1.6.0
mississippi 3.0.0 BSD-2-Clause git+https://github.com/maxogden/mississippi.git
normalize-package-data 2.5.0 BSD-2-Clause git://github.com/npm/normalize-package-data.git
nth-check 1.0.2 BSD-2-Clause https://github.com/fb55/nth-check
regjsparser 0.1.5 BSD-2-Clause git@github.com:jviereck/regjsparser.git
regjsparser 0.6.4 BSD-2-Clause git@github.com:jviereck/regjsparser.git
regjsparser 0.1.5 BSD-2-Clause git@github.com:jviereck/regjsparser.git
terser 4.8.0 BSD-2-Clause https://github.com/terser/terser
uri-js 4.2.2 BSD-2-Clause http://github.com/garycourt/uri-js
FileSaver 0.10.0 UNKNOWN Unknown
@ -1277,6 +1377,7 @@ font-awesome 4.7.0
is-cwebp-readable 2.0.1 CC0-1.0 https://github.com/shinnn/is-cwebp-readable.git
mdn-data 2.0.6 CC0-1.0 https://github.com/mdn/data.git
mdn-data 2.0.4 CC0-1.0 https://github.com/mdn/data.git
railroad-diagrams 1.0.0 CC0-1.0 https://github.com/tabatkins/railroad-diagrams.git
spdx-license-ids 3.0.5 CC0-1.0 https://github.com/shinnn/spdx-license-ids.git
jsonify 0.0.0 Public Domain http://github.com/substack/jsonify.git
mousetrap 1.6.5 Apache-2.0 WITH LLVM-exception git://github.com/ccampbell/mousetrap.git
@ -1290,5 +1391,5 @@ tablesorter 2.31.3
tslib 1.13.0 0BSD https://github.com/Microsoft/tslib.git
xmldom 0.1.31 (LGPL-2.0 or MIT) git://github.com/xmldom/xmldom.git
1234 dependencies listed.
1335 dependencies listed.

View File

@ -9,7 +9,8 @@ This release contains a number of bug fixes and new features since the release o
New features
************
| `Issue #5610 <https://redmine.postgresql.org/issues/5610>`_ - Add a --yes command line option to setup-web.sh to allow non-interactive use.
| `Issue #3904 <https://redmine.postgresql.org/issues/3904>`_ - Replace charting library Flotr2 with ChartJS using React.
| `Issue #5610 <https://redmine.postgresql.org/issues/5610>`_ - Add a --yes command line option to setup-web.sh to allow non-interactive use.
Housekeeping
************

View File

@ -16,12 +16,17 @@ module.exports = {
},
'extends': [
'eslint:recommended',
'plugin:react/recommended',
],
'parserOptions': {
'ecmaVersion': 2018,
'ecmaFeatures': {
'jsx': true
},
'sourceType': 'module',
},
'plugins': [
'react'
],
'globals': {
'_': true,
@ -49,4 +54,9 @@ module.exports = {
// We need to exclude below for RegEx case
"no-useless-escape": 0,
},
'settings': {
'react': {
'version': 'detect',
},
}
};

View File

@ -16,12 +16,16 @@
"copy-webpack-plugin": "^5.1.0",
"core-js": "^3.2.1",
"cross-env": "^5.2.0",
"enzyme": "^3.11.0",
"enzyme-adapter-react-16": "^1.15.2",
"eslint": "5.15.1",
"eslint-plugin-react": "^7.20.3",
"file-loader": "^3.0.1",
"iconfont-webpack-plugin": "^4.2.1",
"image-webpack-loader": "^4.6.0",
"is-docker": "^1.1.0",
"jasmine-core": "~3.3.0",
"jasmine-enzyme": "^7.1.2",
"karma": "^4.0.1",
"karma-babel-preprocessor": "^8.0.0",
"karma-browserify": "~6.0.0",
@ -36,6 +40,7 @@
"optimize-css-assets-webpack-plugin": "^5.0.1",
"popper.js": "^1.14.7",
"postcss-loader": "^3.0.0",
"prop-types": "^15.7.2",
"raw-loader": "^1.0.0",
"sass": "^1.24.4",
"sass-loader": "^7.1.0",
@ -50,6 +55,8 @@
"yarn-audit-html": "^1.1.0"
},
"dependencies": {
"@babel/plugin-proposal-class-properties": "^7.10.4",
"@babel/preset-react": "^7.10.4",
"@simonwep/pickr": "^1.5.1",
"acitree": "git+https://github.com/imsurinder90/jquery-aciTree.git#rc.7",
"alertifyjs": "git+https://github.com/EnterpriseDB/AlertifyJS/#72c1d794f5b6d4ec13a68d123c08f19021afe263",
@ -67,12 +74,12 @@
"bootstrap4-toggle": "3.4.0",
"bowser": "2.1.2",
"browserify": "~16.2.3",
"chart.js": "^2.9.3",
"codemirror": "^5.54.0",
"css-loader": "2.1.0",
"cssnano": "^4.1.10",
"dropzone": "^5.5.1",
"exports-loader": "~0.7.0",
"flotr2": "git+https://github.com/EnterpriseDB/Flotr2.git",
"font-awesome": "^4.7.0",
"immutability-helper": "^3.0.0",
"imports-loader": "^0.8.0",
@ -85,6 +92,8 @@
"moment": "^2.24.0",
"moment-timezone": "^0.5.23",
"mousetrap": "^1.6.3",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"requirejs": "~2.3.6",
"select2": "^4.0.6-rc.1",
"shim-loader": "^1.0.1",

View File

@ -24,11 +24,6 @@
line-height: 30px;
}
.graph-container {
margin-top: 10px;
height: 150px;
}
.icon-postgres:before {
height: 43px;
margin-top: 13px;

View File

@ -0,0 +1,51 @@
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import React from 'react';
import ReactDOM from 'react-dom';
import Graphs from './Graphs';
export default class ChartsDOM {
constructor(container, preferences, sid, did, pageVisible=true) {
this.container = container;
this.preferences = preferences;
this.sid = sid;
this.did = did;
this.pageVisible = pageVisible;
}
mount() {
if(this.container && this.preferences.show_graphs) {
ReactDOM.render(<Graphs sid={this.sid} did={this.did} preferences={this.preferences} pageVisible={this.pageVisible}/>, this.container);
}
}
unmount() {
this.container && ReactDOM.unmountComponentAtNode(this.container);
}
setSidDid(sid, did) {
this.sid = sid;
this.did = did;
this.mount();
}
reflectPreferences(preferences) {
this.preferences = preferences;
if(preferences.show_graphs) {
this.mount();
} else {
this.unmount();
}
}
setPageVisible(visible) {
this.pageVisible = visible;
this.mount();
}
}

View File

@ -0,0 +1,388 @@
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import React, { useEffect, useRef, useState, useReducer, useCallback, useMemo } from 'react';
import {LineChart} from 'sources/chartjs';
import {ChartContainer, DashboardRowCol, DashboardRow} from './dashboard_components';
import url_for from 'sources/url_for';
import axios from 'axios';
import gettext from 'sources/gettext';
import {getGCD, getEpoch} from 'sources/utils';
import {useInterval, usePrevious} from 'sources/custom_hooks';
import PropTypes from 'prop-types';
export const X_AXIS_LENGTH = 75;
export const POINT_SIZE = 2;
/* Transform the labels data to suit ChartJS */
export function transformData(labels, refreshRate) {
const colors = ['#00BCD4', '#9CCC65', '#E64A19'];
let datasets = Object.keys(labels).map((label, i)=>{
return {
label: label,
data: labels[label] || [],
borderColor: colors[i],
backgroundColor: colors[i],
pointHitRadius: POINT_SIZE,
};
}) || [];
return {
labels: [...Array(X_AXIS_LENGTH).keys()],
datasets: datasets,
refreshRate: refreshRate,
};
}
/* Custom ChartJS legend callback */
export function legendCallback(chart) {
var text = [];
text.push('<div class="' + chart.id + '-legend d-flex">');
for (var i = 0; i < chart.data.datasets.length; i++) {
text.push('<div class="legend-value"><span style="background-color:' + chart.data.datasets[i].backgroundColor + '">&nbsp;&nbsp;&nbsp;&nbsp;</span>');
if (chart.data.datasets[i].label) {
text.push('<span class="legend-label">' + chart.data.datasets[i].label + '</span>');
}
text.push('</div>');
}
text.push('</div>');
return text.join('');
}
/* URL for fetching graphs data */
export function getStatsUrl(sid=-1, did=-1, chart_names=[]) {
let base_url = url_for('dashboard.dashboard_stats');
base_url += '/' + sid;
base_url += (did > 0) ? ('/' + did) : '';
base_url += '?chart_names=' + chart_names.join(',');
return base_url;
}
/* This will process incoming charts data add it the the previous charts
* data to get the new state.
*/
export function statsReducer(state, action) {
let newState = {};
if(action.reset) {
return action.reset;
}
if(!action.incoming) {
return state;
}
if(!action.counterData) {
action.counterData = action.incoming;
}
Object.keys(action.incoming).forEach(label => {
if(state[label]) {
if(state[label].length >= X_AXIS_LENGTH) {
state[label].unshift();
}
newState[label] = [
action.counter ? action.incoming[label] - action.counterData[label] : action.incoming[label],
...state[label],
];
} else {
newState[label] = [
action.counter ? action.incoming[label] - action.counterData[label] : action.incoming[label],
];
}
});
return newState;
}
const chartsDefault = {
'session_stats': {'Total': [], 'Active': [], 'Idle': []},
'tps_stats': {'Transactions': [], 'Commits': [], 'Rollbacks': []},
'ti_stats': {'Inserts': [], 'Updates': [], 'Delete': []},
'to_stats': {'Fetched': [], 'Returned': []},
'bio_stats': {'Reads': [], 'Hits': []},
};
export default function Graphs({preferences, sid, did, pageVisible, enablePoll=true}) {
const refreshOn = useRef(null);
const prevPrefernces = usePrevious(preferences);
const [sessionStats, sessionStatsReduce] = useReducer(statsReducer, chartsDefault['session_stats']);
const [tpsStats, tpsStatsReduce] = useReducer(statsReducer, chartsDefault['tps_stats']);
const [tiStats, tiStatsReduce] = useReducer(statsReducer, chartsDefault['ti_stats']);
const [toStats, toStatsReduce] = useReducer(statsReducer, chartsDefault['to_stats']);
const [bioStats, bioStatsReduce] = useReducer(statsReducer, chartsDefault['bio_stats']);
const [counterData, setCounterData] = useState({});
const [errorMsg, setErrorMsg] = useState(null);
const [pollDelay, setPollDelay] = useState(1000);
const [chartDrawnOnce, setChartDrawnOnce] = useState(false);
useEffect(()=>{
let calcPollDelay = false;
if(prevPrefernces) {
if(prevPrefernces['session_stats_refresh'] != preferences['session_stats_refresh']) {
sessionStatsReduce({reset: chartsDefault['session_stats']});
calcPollDelay = true;
}
if(prevPrefernces['tps_stats_refresh'] != preferences['tps_stats_refresh']) {
tpsStatsReduce({reset:chartsDefault['tps_stats']});
calcPollDelay = true;
}
if(prevPrefernces['ti_stats_refresh'] != preferences['ti_stats_refresh']) {
tiStatsReduce({reset:chartsDefault['ti_stats']});
calcPollDelay = true;
}
if(prevPrefernces['to_stats_refresh'] != preferences['to_stats_refresh']) {
toStatsReduce({reset:chartsDefault['to_stats']});
calcPollDelay = true;
}
if(prevPrefernces['bio_stats_refresh'] != preferences['bio_stats_refresh']) {
bioStatsReduce({reset:chartsDefault['bio_stats']});
calcPollDelay = true;
}
} else {
calcPollDelay = true;
}
if(calcPollDelay) {
setPollDelay(
getGCD(Object.keys(chartsDefault).map((name)=>preferences[name+'_refresh']))*1000
);
}
}, [preferences]);
useEffect(()=>{
/* Charts rendered are not visible when, the dashboard is hidden but later visible */
if(pageVisible && !chartDrawnOnce) {
setChartDrawnOnce(true);
}
}, [pageVisible]);
useInterval(()=>{
const currEpoch = getEpoch();
if(refreshOn.current === null) {
let tmpRef = {};
Object.keys(chartsDefault).forEach((name)=>{
tmpRef[name] = currEpoch;
});
refreshOn.current = tmpRef;
}
let getFor = [];
Object.keys(chartsDefault).forEach((name)=>{
if(currEpoch >= refreshOn.current[name]) {
getFor.push(name);
refreshOn.current[name] = currEpoch + preferences[name+'_refresh'];
}
});
let path = getStatsUrl(sid, did, getFor);
axios.get(path)
.then((resp)=>{
let data = resp.data;
setErrorMsg(null);
sessionStatsReduce({incoming: data['session_stats']});
tpsStatsReduce({incoming: data['tps_stats'], counter: true, counterData: counterData['tps_stats']});
tiStatsReduce({incoming: data['ti_stats'], counter: true, counterData: counterData['ti_stats']});
toStatsReduce({incoming: data['to_stats'], counter: true, counterData: counterData['to_stats']});
bioStatsReduce({incoming: data['bio_stats'], counter: true, counterData: counterData['bio_stats']});
setCounterData((prevCounterData)=>{
return {
...prevCounterData,
...data,
};
});
})
.catch((error)=>{
if(!errorMsg) {
sessionStatsReduce({reset: chartsDefault['session_stats']});
tpsStatsReduce({reset:chartsDefault['tps_stats']});
tiStatsReduce({reset:chartsDefault['ti_stats']});
toStatsReduce({reset:chartsDefault['to_stats']});
bioStatsReduce({reset:chartsDefault['bio_stats']});
setCounterData({});
if(error.response) {
if (error.response.status === 428) {
setErrorMsg(gettext('Please connect to the selected server to view the graph.'));
} else {
setErrorMsg(gettext('An error occurred whilst rendering the graph.'));
}
} else if(error.request) {
setErrorMsg(gettext('Not connected to the server or the connection to the server has been closed.'));
return;
} else {
console.error(error);
}
}
});
}, enablePoll ? pollDelay : -1);
return (
<>
<div data-testid='graph-poll-delay' className='d-none'>{pollDelay}</div>
{chartDrawnOnce &&
<GraphsWrapper
sessionStats={transformData(sessionStats, preferences['session_stats_refresh'])}
tpsStats={transformData(tpsStats, preferences['tps_stats_refresh'])}
tiStats={transformData(tiStats, preferences['ti_stats_refresh'])}
toStats={transformData(toStats, preferences['to_stats_refresh'])}
bioStats={transformData(bioStats, preferences['bio_stats_refresh'])}
errorMsg={errorMsg}
showTooltip={preferences['graph_mouse_track']}
showDataPoints={preferences['graph_data_points']}
isDatabase={did > 0}
/>
}
</>
);
}
Graphs.propTypes = {
preferences: PropTypes.object.isRequired,
sid: PropTypes.oneOfType([
PropTypes.string.isRequired,
PropTypes.number.isRequired,
]),
did: PropTypes.oneOfType([
PropTypes.string.isRequired,
PropTypes.number.isRequired,
]),
enablePoll: PropTypes.bool,
};
export function GraphsWrapper(props) {
const sessionStatsLegendRef = useRef();
const tpsStatsLegendRef = useRef();
const tiStatsLegendRef = useRef();
const toStatsLegendRef = useRef();
const bioStatsLegendRef = useRef();
const options = useMemo(()=>({
legendCallback: legendCallback,
animation: {
duration: 0,
},
hover: {
animationDuration: 0,
},
responsiveAnimationDuration: 0,
legend: {
display: false,
},
elements: {
point: {
radius: props.showDataPoints ? POINT_SIZE : 0,
},
},
tooltips: {
enabled: props.showTooltip,
callbacks: {
title: function(tooltipItem, data) {
let title = '';
try {
title = parseInt(tooltipItem[0].xLabel)*data.refreshRate + gettext(' seconds ago');
} catch (error) {
title = '';
}
return title;
},
},
},
scales: {
yAxes: [{
ticks: {
min: 0,
userCallback: function(label) {
if (Math.floor(label) === label) {
return label;
}
},
fontColor: getComputedStyle(document.documentElement).getPropertyValue('--color-fg'),
},
gridLines: {
drawBorder: false,
zeroLineColor: getComputedStyle(document.documentElement).getPropertyValue('--border-color'),
color: getComputedStyle(document.documentElement).getPropertyValue('--border-color'),
},
}],
xAxes: [{
display: false,
gridLines: {
display: false,
},
ticks: {
display: false,
reverse: true,
},
}],
},
}), [props.showTooltip, props.showDataPoints]);
const updateOptions = useMemo(()=>({duration: 0}), []);
const onInitCallback = useCallback(
(legendRef)=>(chart)=>{
legendRef.current.innerHTML = chart.generateLegend();
}
);
return (
<>
<DashboardRow>
<DashboardRowCol breakpoint='md' parts={6}>
<ChartContainer id='sessions-graph' title={props.isDatabase ? gettext('Database sessions') : gettext('Server sessions')} legendRef={sessionStatsLegendRef} errorMsg={props.errorMsg}>
<LineChart options={options} data={props.sessionStats} updateOptions={updateOptions}
onInit={onInitCallback(sessionStatsLegendRef)}/>
</ChartContainer>
</DashboardRowCol>
<DashboardRowCol breakpoint='md' parts={6}>
<ChartContainer id='tps-graph' title={gettext('Transactions per second')} legendRef={tpsStatsLegendRef} errorMsg={props.errorMsg}>
<LineChart options={options} data={props.tpsStats} updateOptions={updateOptions}
onInit={onInitCallback(tpsStatsLegendRef)}/>
</ChartContainer>
</DashboardRowCol>
</DashboardRow>
<DashboardRow>
<DashboardRowCol breakpoint='md' parts={4}>
<ChartContainer id='ti-graph' title={gettext('Tuples in')} legendRef={tiStatsLegendRef} errorMsg={props.errorMsg}>
<LineChart options={options} data={props.tiStats} updateOptions={updateOptions}
onInit={onInitCallback(tiStatsLegendRef)}/>
</ChartContainer>
</DashboardRowCol>
<DashboardRowCol breakpoint='md' parts={4}>
<ChartContainer id='to-graph' title={gettext('Tuples out')} legendRef={toStatsLegendRef} errorMsg={props.errorMsg}>
<LineChart options={options} data={props.toStats} updateOptions={updateOptions}
onInit={onInitCallback(toStatsLegendRef)}/>
</ChartContainer>
</DashboardRowCol>
<DashboardRowCol breakpoint='md' parts={4}>
<ChartContainer id='bio-graph' title={gettext('Block I/O')} legendRef={bioStatsLegendRef} errorMsg={props.errorMsg}>
<LineChart options={options} data={props.bioStats} updateOptions={updateOptions}
onInit={onInitCallback(bioStatsLegendRef)}/>
</ChartContainer>
</DashboardRowCol>
</DashboardRow>
</>
);
}
const propTypeStats = PropTypes.shape({
labels: PropTypes.array.isRequired,
datasets: PropTypes.array,
refreshRate: PropTypes.number.isRequired,
});
GraphsWrapper.propTypes = {
sessionStats: propTypeStats.isRequired,
tpsStats: propTypeStats.isRequired,
tiStats: propTypeStats.isRequired,
toStats: propTypeStats.isRequired,
bioStats: propTypeStats.isRequired,
errorMsg: PropTypes.string,
showTooltip: PropTypes.bool.isRequired,
showDataPoints: PropTypes.bool.isRequired,
isDatabase: PropTypes.bool.isRequired,
};

View File

@ -1,121 +0,0 @@
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
export class Chart {
constructor(container, options) {
let self = this;
require.ensure(['flotr2'], function(require) {
self.chartApi = require('flotr2');
}, function(error){
throw(error);
}, 'chart');
/* Html Node where the graph goes */
this._container = container;
/* Graph library options */
this._options = {};
this._defaultOptions = {
legend: {
position: 'nw',
backgroundColor: '#D2E8FF',
},
lines: {
show: true,
lineWidth: 2,
},
shadowSize: 0,
resolution : 3,
grid: {
color: 'transparent',
tickColor: '#8f8f8f',
},
};
this._dataset = null;
this._tooltipFormatter = null;
/* Just to store other data related to charts. Used nowhere here in the module */
this._otherData = {};
this.setOptions(options);
}
getContainer() {
return this._container;
}
getContainerDimensions() {
return {
height: this._container.clientHeight,
width: this._container.clientWidth,
};
}
getOptions() {
return this._options;
}
/* This should be changed if library changed */
setOptions(options, mergeOptions=true) {
/* If mergeOptions then merge the options, else replace existing options */
if(mergeOptions) {
this._options = {...this._defaultOptions, ...this._options, ...options};
} else {
this._options = {...this._defaultOptions, ...options};
}
}
removeOptions(optionKey) {
if(this._options[optionKey]) {
delete this._options[optionKey];
}
}
getOtherData(key) {
if(this._otherData[key]) {
return this._otherData[key];
}
}
setOtherData(key, value) {
this._otherData[key] = value;
}
isVisible() {
let dim = this.getContainerDimensions();
return (dim.height > 0 && dim.width > 0);
}
isInPage() {
return (this._container === document.body) ? false : document.body.contains(this._container);
}
setTooltipFormatter(tooltipFormatter) {
let opt = this.getOptions();
this._tooltipFormatter = tooltipFormatter;
if(this._tooltipFormatter) {
this.setOptions({
mouse: {
...opt.mouse,
trackFormatter: this._tooltipFormatter,
},
});
}
}
draw(dataset) {
this._dataset = dataset;
if(this._container) {
if(this.chartApi) {
this.chartApi.draw(this._container, this._dataset, this._options);
}
}
}
}

View File

@ -9,12 +9,12 @@
define('pgadmin.dashboard', [
'sources/url_for', 'sources/gettext', 'require', 'jquery', 'underscore',
'sources/pgadmin', 'backbone', 'backgrid', './charting',
'sources/pgadmin', 'backbone', 'backgrid',
'pgadmin.alertifyjs', 'pgadmin.backform', 'sources/nodes/dashboard',
'sources/utils', 'sources/window', 'pgadmin.browser', 'bootstrap', 'wcdocker',
'sources/window', './ChartsDOM', 'pgadmin.browser', 'bootstrap', 'wcdocker',
], function(
url_for, gettext, r, $, _, pgAdmin, Backbone, Backgrid, charting,
Alertify, Backform, NodesDashboard, commonUtils, pgWindow
url_for, gettext, r, $, _, pgAdmin, Backbone, Backgrid,
Alertify, Backform, NodesDashboard, pgWindow, ChartsDOM
) {
pgAdmin.Browser = pgAdmin.Browser || {};
@ -203,6 +203,7 @@ define('pgadmin.dashboard', [
return;
this.initialized = true;
this.chartsDomObj = null;
this.sid = this.did = -1;
this.version = -1;
@ -221,10 +222,6 @@ define('pgadmin.dashboard', [
// Load the default welcome dashboard
var url = url_for('dashboard.index');
/* Store the chart objects, refresh freq and next refresh time */
this.chart_store = {};
this.charts_poller_int_id = -1;
var dashboardPanel = pgBrowser.panels['dashboard'].panel;
if (dashboardPanel) {
var div = dashboardPanel.layout().scene().find('.pg-panel-content');
@ -283,18 +280,7 @@ define('pgadmin.dashboard', [
object_selected: function(item, itemData, node) {
let self = this;
if (dashboardVisible === false) {
/*
* Clear all the interval functions, even when dashboard is not
* visible (in case of connection of the object got disconnected).
*/
if (
!_.isUndefined(itemData.connected) &&
itemData.connected !== true
) {
self.clearChartFromStore();
}
} else if (itemData && itemData._type) {
if (dashboardVisible && itemData && itemData._type) {
var treeHierarchy = node.getTreeNodeHierarchy(item),
url = NodesDashboard.url(itemData, item, treeHierarchy);
@ -355,11 +341,9 @@ define('pgadmin.dashboard', [
$(dashboardPanel).data('server_status') == false
)
) {
this.chartsDomObj && this.chartsDomObj.unmount();
$(div).empty();
/* Clear all the charts previous dashboards */
self.clearChartFromStore();
let ajaxHook = function() {
$.ajax({
url: url,
@ -393,14 +377,8 @@ define('pgadmin.dashboard', [
$(dashboardPanel).data('server_status', true);
}
} else {
this.chartsDomObj && this.chartsDomObj.unmount();
$(div).empty();
if (
!_.isUndefined(itemData.connected) &&
itemData.connected !== true
) {
/* Clear all the charts previous dashboards */
self.clearChartFromStore();
}
$(div).html(
'<div class="pg-panel-message" role="alert">' + gettext('Please connect to the selected server to view the dashboard.') + '</div>'
);
@ -413,218 +391,6 @@ define('pgadmin.dashboard', [
}
},
// Render the charts
renderCharts: function(charts_config) {
let self = this,
tooltipFormatter = function(refresh, currVal) {
return(`Seconds ago: ${parseInt(currVal.x * refresh)}</br>
Value: ${currVal.y}`);
},
curr_epoch=commonUtils.getEpoch();
self.stopChartsPoller();
charts_config.map((chart_config) => {
if(self.chart_store[chart_config.chart_name]
&& self.old_preferences[chart_config.refresh_pref_name] !=
self.preferences[chart_config.refresh_pref_name]) {
self.clearChartFromStore(chart_config.chart_name);
}
if(self.chart_store[chart_config.chart_name]) {
let chart_obj = self.chart_store[chart_config.chart_name].chart_obj;
chart_obj.setOptions(chart_config.options, false);
chart_obj.setTooltipFormatter(
tooltipFormatter.bind(null, self.preferences[chart_config.refresh_pref_name])
);
}
if(!self.chart_store[chart_config.chart_name]) {
let chart_obj = new charting.Chart(chart_config.container, chart_config.options);
chart_obj.setTooltipFormatter(
tooltipFormatter.bind(null, self.preferences[chart_config.refresh_pref_name])
);
chart_obj.setOtherData('counter', chart_config.counter);
self.chart_store[chart_config.chart_name] = {
'chart_obj' : chart_obj,
'refresh_on': curr_epoch,
'refresh_rate': self.preferences[chart_config.refresh_pref_name],
};
}
});
self.startChartsPoller(self.chart_store, self.sid, self.did);
},
getStatsUrl: function(sid=-1, did=-1, chart_names=[]) {
let base_url = url_for('dashboard.dashboard_stats');
base_url += '/' + sid;
base_url += (did > 0) ? ('/' + did) : '';
base_url += '?chart_names=' + chart_names.join(',');
return base_url;
},
updateChart: function(chart_obj, new_data){
// Dataset format:
// [
// { data: [[0, y0], [1, y1]...], label: 'Label 1', [options] },
// { data: [[0, y0], [1, y1]...], label: 'Label 2', [options] },
// { data: [[0, y0], [1, y1]...], label: 'Label 3', [options] }
// ]
let dataset = chart_obj.getOtherData('dataset') || [],
counter_prev_data = chart_obj.getOtherData('counter_prev_data') || new_data,
counter = chart_obj.getOtherData('counter') || false;
if (dataset.length == 0) {
// Create the initial data structure
for (let label in new_data) {
dataset.push({
'data': [
[0, counter ? (new_data[label] - counter_prev_data[label]) : new_data[label]],
],
'label': label,
});
}
} else {
Object.keys(new_data).forEach((label, label_ind) => {
// Push new values onto the existing data structure
// If this is a counter stat, we need to subtract the previous value
if (!counter) {
dataset[label_ind]['data'].unshift([0, new_data[label]]);
} else {
// Store the current value, minus the previous one we stashed.
// It's possible the tab has been reloaded, in which case out previous values are gone
if (_.isUndefined(counter_prev_data))
return;
dataset[label_ind]['data'].unshift([0, new_data[label] - counter_prev_data[label]]);
}
// Reset the time index to get a proper scrolling display
for (var time_ind = 0; time_ind < dataset[label_ind]['data'].length; time_ind++) {
dataset[label_ind]['data'][time_ind][0] = time_ind;
}
});
counter_prev_data = new_data;
}
// Remove old data points
for (let label_ind = 0; label_ind < dataset.length; label_ind++) {
if (dataset[label_ind]['data'].length > 101) {
dataset[label_ind]['data'].pop();
}
}
chart_obj.setOtherData('dataset', dataset);
chart_obj.setOtherData('counter_prev_data', counter_prev_data);
if (chart_obj.isInPage()) {
if (chart_obj.isVisible()) {
chart_obj.draw(dataset);
}
} else {
return;
}
},
stopChartsPoller: function() {
clearInterval(this.charts_poller_int_id);
},
startChartsPoller: function(chart_store, sid, did) {
let self = this;
/* polling will the greatest common divisor of the refresh rates*/
let poll_interval = commonUtils.getGCD(
Object.values(chart_store).map(item => item.refresh_rate)
);
const WAIT_COUNTER = 3;
let last_poll_wait_counter = 0;
let resp_not_received_counter = 0;
/* Stop if running, only one poller lives */
self.stopChartsPoller();
var thePollingFunc = function() {
let curr_epoch = commonUtils.getEpoch();
let chart_names_to_get = [];
for(let chart_name in chart_store) {
/* when its time to get the data */
if(chart_store[chart_name].refresh_on <= curr_epoch) {
/* set the next trigger point */
chart_store[chart_name].refresh_on = curr_epoch + chart_store[chart_name].refresh_rate;
chart_names_to_get.push(chart_name);
}
}
/* If none of the chart wants data, don't trouble
* If response not received from prev poll, don't trouble !!
*/
if(chart_names_to_get.length == 0 || last_poll_wait_counter > 0 || resp_not_received_counter >= WAIT_COUNTER) {
/* reduce the number of tries, request should be sent if last_poll_wait_counter
* completes WAIT_COUNTER times.*/
last_poll_wait_counter--;
return;
}
var path = self.getStatsUrl(sid, did, chart_names_to_get);
resp_not_received_counter++;
$.ajax({
url: path,
type: 'GET',
})
.done(function(resp) {
for(let chart_name in resp) {
let chart_obj = chart_store[chart_name].chart_obj;
$(chart_obj.getContainer()).removeClass('graph-error');
self.updateChart(chart_obj, resp[chart_name]);
}
})
.fail(function(xhr) {
let err = '';
let msg = '';
let cls = 'info';
if (xhr.readyState === 0) {
msg = gettext('Not connected to the server or the connection to the server has been closed.');
} else {
err = JSON.parse(xhr.responseText);
msg = err.errormsg;
// If we get a 428, it means the server isn't connected
if (xhr.status === 428) {
if (_.isUndefined(msg) || _.isNull(msg)) {
msg = gettext('Please connect to the selected server to view the graph.');
}
} else {
msg = gettext('An error occurred whilst rendering the graph.');
cls = 'error';
}
}
for(let chart_name in chart_store) {
let chart_obj = chart_store[chart_name].chart_obj;
$(chart_obj.getContainer()).addClass('graph-error');
$(chart_obj.getContainer()).html(
'<div class="pg-panel-' + cls + ' pg-panel-message" role="alert">' + msg + '</div>'
);
}
})
.always(function() {
last_poll_wait_counter = 0;
resp_not_received_counter--;
});
last_poll_wait_counter = WAIT_COUNTER;
};
/* Execute once for the first time as setInterval will not do */
thePollingFunc();
self.charts_poller_int_id = setInterval(thePollingFunc, poll_interval * 1000);
},
// Handler function to support the "Add Server" link
add_new_server: function() {
if (pgBrowser && pgBrowser.tree) {
@ -759,23 +525,18 @@ define('pgadmin.dashboard', [
});
},
clearChartFromStore: function(chartName) {
var self = this;
if(!chartName){
self.stopChartsPoller();
_.each(self.chart_store, function(chart, key) {
delete self.chart_store[key];
});
}
else {
delete self.chart_store[chartName];
}
},
// Rock n' roll on the dashboard
init_dashboard: function() {
let self = this;
this.chartsDomObj = new ChartsDOM.default(
document.getElementById('dashboard-graphs'),
self.preferences,
self.sid,
self.did,
$('.dashboard-container')[0].clientHeight <=0 ? false : true
);
/* Cache may take time to load for the first time
* Keep trying till available
*/
@ -796,81 +557,14 @@ define('pgadmin.dashboard', [
pgBrowser.onPreferencesChange('dashboards', function() {
self.reflectPreferences();
});
},
reflectPreferences: function() {
var self = this;
var tickColor = getComputedStyle(document.documentElement).getPropertyValue('--border-color');
/* We will use old preferences for selective graph updates on preference change */
if(self.preferences) {
self.old_preferences = self.preferences;
self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards');
}
else {
self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards');
self.old_preferences = self.preferences;
}
self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards');
this.chartsDomObj.reflectPreferences(self.preferences);
if(is_server_dashboard || is_database_dashboard) {
/* Common things can come here */
var div_sessions = $('.dashboard-container').find('#graph-sessions')[0];
var div_tps = $('.dashboard-container').find('#graph-tps')[0];
var div_ti = $('.dashboard-container').find('#graph-ti')[0];
var div_to = $('.dashboard-container').find('#graph-to')[0];
var div_bio = $('.dashboard-container').find('#graph-bio')[0];
var options_line = {
parseFloat: false,
xaxis: {
min: 100,
max: 0,
autoscale: 0,
},
yaxis: {
autoscale: 1,
},
grid: {
color: 'transparent',
tickColor: tickColor,
},
};
if(self.preferences.graph_data_points) {
/* Merge data points related options */
options_line = {
...options_line,
...{
points: {
show:true,
radius: 1,
hitRadius: 3,
},
},
};
}
if(self.preferences.graph_mouse_track) {
/* Merge mouse track related options */
options_line = {
...options_line,
...{
mouse: {
track:true,
position: 'sw',
},
},
};
}
if(self.preferences.show_graphs && $('#dashboard-graphs').hasClass('dashboard-hidden')) {
$('#dashboard-graphs').removeClass('dashboard-hidden');
}
else if(!self.preferences.show_graphs) {
$('#dashboard-graphs').addClass('dashboard-hidden');
self.clearChartFromStore();
}
if (self.preferences.show_activity && $('#dashboard-activity').hasClass('dashboard-hidden')) {
$('#dashboard-activity').removeClass('dashboard-hidden');
}
@ -878,46 +572,11 @@ define('pgadmin.dashboard', [
$('#dashboard-activity').addClass('dashboard-hidden');
}
if(self.preferences.show_graphs) {
// Render the graphs
pgAdmin.Dashboard.renderCharts([{
chart_name: 'session_stats',
container: div_sessions,
options: options_line,
counter: false,
refresh_pref_name: 'session_stats_refresh',
}, {
chart_name: 'tps_stats',
container: div_tps,
options: options_line,
counter: true,
refresh_pref_name: 'tps_stats_refresh',
}, {
chart_name: 'ti_stats',
container: div_ti,
options: options_line,
counter: true,
refresh_pref_name: 'ti_stats_refresh',
}, {
chart_name: 'to_stats',
container: div_to,
options: options_line,
counter: true,
refresh_pref_name: 'to_stats_refresh',
}, {
chart_name: 'bio_stats',
container: div_bio,
options: options_line,
counter: true,
refresh_pref_name: 'bio_stats_refresh',
}]);
if (self.preferences.show_activity && $('#dashboard-activity').hasClass('dashboard-hidden')) {
$('#dashboard-activity').removeClass('dashboard-hidden');
}
if(!self.preferences.show_graphs && !self.preferences.show_activity) {
$('#dashboard-none-show').removeClass('dashboard-hidden');
}
else {
$('#dashboard-none-show').addClass('dashboard-hidden');
else if(!self.preferences.show_activity) {
$('#dashboard-activity').addClass('dashboard-hidden');
}
/* Dashboard specific preferences can be updated in the
@ -1440,7 +1099,9 @@ define('pgadmin.dashboard', [
toggleVisibility: function(visible, closed=false) {
dashboardVisible = visible;
if(closed) {
this.clearChartFromStore();
this.chartsDomObj && this.chartsDomObj.unmount();
} else {
this.chartsDomObj && this.chartsDomObj.setPageVisible(dashboardVisible);
}
},
can_take_action: function(m) {

View File

@ -0,0 +1,74 @@
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import React from 'react';
import PropTypes from 'prop-types';
export function ChartContainer(props) {
return (
<div className="card dashboard-graph" role="object-document" tabIndex="0" aria-labelledby={props.id}>
<div className="card-header">
<div className="d-flex">
<div id={props.id}>{props.title}</div>
<div className="ml-auto my-auto legend" ref={props.legendRef}></div>
</div>
</div>
<div className="card-body dashboard-graph-body">
<div className={'chart-wrapper ' + (props.errorMsg ? 'd-none': '')}>
{props.children}
</div>
<ChartError message={props.errorMsg} />
</div>
</div>
);
}
ChartContainer.propTypes = {
id: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
legendRef: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.any }),
]).isRequired,
children: PropTypes.node.isRequired,
errorMsg: PropTypes.string,
};
export function ChartError(props) {
if(props.message === null) {
return <></>;
}
return (
<div className="pg-panel-error pg-panel-message" role="alert">{props.message}</div>
);
}
ChartError.propTypes = {
message: PropTypes.string,
};
export function DashboardRow({children}) {
return (
<div className="row dashboard-row">{children}</div>
);
}
DashboardRow.propTypes = {
children: PropTypes.node.isRequired,
};
export function DashboardRowCol({breakpoint, parts, children}) {
return (
<div className={`col-${breakpoint}-${parts}`}>{children}</div>
);
}
DashboardRowCol.propTypes = {
breakpoint: PropTypes.oneOf(['xs', 'sm', 'md', 'lg', 'xl']).isRequired,
parts: PropTypes.number.isRequired,
children: PropTypes.node.isRequired,
};

View File

@ -35,8 +35,22 @@
color: $color-fg;
}
.dashboard-graph {
& .legend {
font-size: $tree-font-size;
& .legend-value {
font-weight: normal;
margin-left: 0.25rem;
& .legend-label {
margin-left: 0.25rem;
}
}
}
}
.dashboard-graph-body {
padding: 0.25rem 0.5rem;
height: 175px;
& .flotr-labels {
color: $color-fg !important;

View File

@ -1,60 +1,5 @@
<div class="container-fluid dashboard-container negative-space">
<div id="dashboard-graphs" class="dashboard-hidden">
<div class="row dashboard-row">
<div class="col-md-6 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="database-session-graph">
<div class="card-header" id="database-session-graph">
{{ _('Database sessions') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-sessions" class="graph-container"></div>
</div>
</div>
</div>
<div class="col-md-6 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="transactions-per-second-graph">
<div class="card-header" id="transactions-per-second-graph">
{{ _('Transactions per second') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-tps" class="graph-container"></div>
</div>
</div>
</div>
</div>
<div class="row dashboard-row">
<div class="col-md-4 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="tuples-in-graph">
<div class="card-header" id="tuples-in-graph">
{{ _('Tuples in') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-ti" class="graph-container"></div>
</div>
</div>
</div>
<div class="col-md-4 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="tuples-out-graph">
<div class="card-header" id="tuples-out-graph">
{{ _('Tuples out') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-to" class="graph-container"></div>
</div>
</div>
</div>
<div class="col-md-4 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="block-io-graph">
<div class="card-header" id="block-io-graph">
{{ _('Block I/O') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-bio" class="graph-container"></div>
</div>
</div>
</div>
</div>
</div>
<div id="dashboard-graphs"></div>
<div id="dashboard-activity" class="card dashboard-row dashboard-hidden">
<div class="card-header">
<span id="dashboard-activity-header">{{ _('Server activity') }}</span>

View File

@ -1,59 +1,5 @@
<div class="container-fluid dashboard-container negative-space">
<div id="dashboard-graphs" class="dashboard-hidden">
<div class="row dashboard-row">
<div class="col-md-6 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="server-sessions-graph">
<div class="card-header" id="server-sessions-graph">
{{ _('Server sessions') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-sessions" class="graph-container"></div>
</div>
</div>
</div>
<div class="col-md-6 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="transactions-per-second-graph">
<div class="card-header" id="transactions-per-second-graph">
{{ _('Transactions per second') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-tps" class="graph-container"></div>
</div>
</div>
</div>
</div>
<div class="row dashboard-row">
<div class="col-md-4 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="tuples-in-graph">
<div class="card-header" id="tuples-in-graph">
{{ _('Tuples in') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-ti" class="graph-container"></div>
</div>
</div>
</div>
<div class="col-md-4 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="tuples-out-graph">
<div class="card-header" id="tuples-out-graph">
{{ _('Tuples out') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-to" class="graph-container"></div>
</div>
</div>
</div>
<div class="col-md-4 col-12">
<div class="card" role="object-document" tabindex="0" aria-labelledby="block-o-graph">
<div class="card-header" id="block-o-graph">
{{ _('Block I/O') }}
</div>
<div class="card-body dashboard-graph-body">
<div id="graph-bio" class="graph-container"></div>
</div>
</div>
</div>
</div>
<div id="dashboard-graphs">
</div>
<div id="dashboard-activity" class="card dashboard-row dashboard-hidden">
<div class="card-header">

View File

@ -0,0 +1,95 @@
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import React, { useEffect } from 'react';
import Chart from 'chart.js';
import PropTypes from 'prop-types';
const defaultOptions = {
responsive: true,
maintainAspectRatio: false,
elements: {
line: {
tension: 0,
borderWidth: 2,
fill: false,
},
},
layout: {
padding: 8,
},
hover: {
animationDuration:0,
},
};
export default function BaseChart({type='line', id, options, data, redraw=false, ...props}) {
const chartRef = React.useRef();
const chartObj = React.useRef();
let optionsMerged = Chart.helpers.configMerge(defaultOptions, options);
const initChart = function() {
let chartContext = chartRef.current.getContext('2d');
chartObj.current = new Chart(chartContext, {
type: type,
data: data,
options: optionsMerged,
});
props.onInit && props.onInit(chartObj.current);
}
const destroyChart = function() {
chartObj.current && chartObj.current.destroy();
}
useEffect(()=>{
initChart();
return destroyChart;
}, []);
useEffect(()=>{
if(typeof(chartObj.current) != 'undefined') {
chartObj.current.data = data;
for(let i=0; i<chartObj.current.data.datasets.length; i++) {
chartObj.current.data.datasets[i] = {
...chartObj.current.data.datasets[i],
...data.datasets[i],
};
}
chartObj.current.options = optionsMerged;
chartObj.current.update(props.updateOptions || {});
props.onUpdate && props.onUpdate(chartObj.current);
}
}, [data, options]);
useEffect(()=>{
if(redraw) {
destroyChart();
initChart();
}
}, [redraw])
return (
<canvas id={id} ref={chartRef}></canvas>
);
}
BaseChart.propTypes = {
type: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
options: PropTypes.object,
updateOptions: PropTypes.object,
onInit: PropTypes.func,
onUpdate: PropTypes.func,
};
export function LineChart(props) {
return (
<BaseChart {...props} type='line'/>
);
}

View File

@ -0,0 +1,29 @@
import {useRef, useEffect} from 'react';
/* React hook for setInterval */
export function useInterval(callback, delay) {
const savedCallback = useRef();
useEffect(() => {
savedCallback.current = callback;
});
useEffect(() => {
function tick() {
savedCallback.current();
}
if(delay > -1) {
let id = setInterval(tick, delay);
return () => clearInterval(id);
}
}, [delay]);
}
export function usePrevious(value) {
const ref = useRef();
useEffect(() => {
ref.current = value;
});
return ref.current;
}

View File

@ -7,6 +7,7 @@ $theme-colors: (
/* Certain variables are required in JS directly */
:root {
--color-fg: #{$color-fg};
--border-color: #{$border-color};
}

View File

@ -1,100 +0,0 @@
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2020, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import $ from 'jquery';
import {Chart} from 'top/dashboard/static/js/charting';
describe('In charting related testcases', ()=> {
let chartObj = undefined,
chartDiv = undefined,
options = {};
beforeEach(()=> {
$('body').append(
'<div id="charting-test-container"></div>'
);
chartDiv = $('#charting-test-container')[0];
chartObj = new Chart(chartDiv, options);
});
it('Return the correct container', ()=>{
expect(chartObj.getContainer()).toEqual(chartDiv);
});
it('Returns the container dimensions', ()=>{
let dim = chartObj.getContainerDimensions();
expect(dim.height).toBeDefined();
expect(dim.width).toBeDefined();
});
it('Check if options are set', ()=>{
chartObj.setOptions({
mouse: {
track:true,
},
});
let opt = chartObj.getOptions();
expect(opt.mouse).toBeDefined();
});
it('Check if options are set with mergeOptions false', ()=>{
let overOpt = {
mouse: {
track:true,
},
};
chartObj.setOptions(overOpt, false);
let newOptShouldBe = {...chartObj._defaultOptions, ...overOpt};
let opt = chartObj.getOptions();
expect(JSON.stringify(opt)).toEqual(JSON.stringify(newOptShouldBe));
});
it('Check if other data is set', ()=>{
chartObj.setOtherData('some_val', 1);
expect(chartObj._otherData['some_val']).toEqual(1);
});
it('Check if other data is get', ()=>{
chartObj.setOtherData('some_val', 1);
expect(chartObj.getOtherData('some_val')).toEqual(1);
});
it('Check if other data returns undefined for not set', ()=>{
expect(chartObj.getOtherData('some_val_not_set')).toEqual(undefined);
});
it('Check if isVisible returns correct', ()=>{
let dimSpy = spyOn(chartObj, 'getContainerDimensions');
dimSpy.and.returnValue({
height: 1, width: 1,
});
expect(chartObj.isVisible()).toEqual(true);
dimSpy.and.stub();
dimSpy.and.returnValue({
height: 0, width: 0,
});
expect(chartObj.isVisible()).toEqual(false);
});
it('Check if isInPage returns correct', ()=>{
expect(chartObj.isInPage()).toEqual(true);
$('body').find('#charting-test-container').remove();
expect(chartObj.isInPage()).toEqual(false);
});
afterEach(()=>{
$('body').find('#charting-test-container').remove();
});
});

View File

@ -0,0 +1,169 @@
import jasmineEnzyme from 'jasmine-enzyme';
import React from 'react';
import {mount} from 'enzyme';
import '../helper/enzyme.helper';
import Graphs, {GraphsWrapper} from '../../../pgadmin/dashboard/static/js/Graphs';
import {X_AXIS_LENGTH, POINT_SIZE, transformData, legendCallback,
getStatsUrl, statsReducer} from '../../../pgadmin/dashboard/static/js/Graphs';
describe('Graphs.js', ()=>{
it('transformData', ()=>{
expect(transformData({'Label1': [], 'Label2': []}, 1)).toEqual({
labels: [...Array(X_AXIS_LENGTH).keys()],
datasets: [{
label: 'Label1',
data: [],
borderColor: '#00BCD4',
backgroundColor: '#00BCD4',
pointHitRadius: POINT_SIZE,
},{
label: 'Label2',
data: [],
borderColor: '#9CCC65',
backgroundColor: '#9CCC65',
pointHitRadius: POINT_SIZE,
}],
refreshRate: 1,
});
});
it('legendCallback', ()=>{
expect(legendCallback({
id: 1,
data: {
datasets: [{
label: 'Label1',
backgroundColor: '#00BCD4',
},{
label: 'Label2',
backgroundColor: '#9CCC65',
}],
},
})).toEqual([
'<div class="1-legend d-flex">',
'<div class="legend-value"><span style="background-color:#00BCD4">&nbsp;&nbsp;&nbsp;&nbsp;</span>',
'<span class="legend-label">Label1</span>',
'</div>',
'<div class="legend-value"><span style="background-color:#9CCC65">&nbsp;&nbsp;&nbsp;&nbsp;</span>',
'<span class="legend-label">Label2</span>',
'</div>',
'</div>',
].join(''));
});
describe('getStatsUrl', ()=>{
it('for server', ()=>{
expect(getStatsUrl(432, -1, ['chart1'])).toEqual('/dashboard/dashboard_stats/432?chart_names=chart1');
});
it('for database', ()=>{
expect(getStatsUrl(432, 123, ['chart1'])).toEqual('/dashboard/dashboard_stats/432/123?chart_names=chart1');
});
it('for multiple graphs', ()=>{
expect(getStatsUrl(432, 123, ['chart1', 'chart2'])).toEqual('/dashboard/dashboard_stats/432/123?chart_names=chart1,chart2');
});
});
describe('statsReducer', ()=>{
it('with incoming no counter', ()=>{
let state = {
'Label1': [], 'Label2': [],
};
let action = {
incoming: {
'Label1': 1, 'Label2': 2,
},
};
let newState = {
'Label1': [1], 'Label2': [2],
};
state = statsReducer(state, action);
expect(state).toEqual(newState);
});
it('with incoming with counter', ()=>{
let state = {
'Label1': [1], 'Label2': [2],
};
let action = {
incoming: {
'Label1': 1, 'Label2': 3,
},
counter: true,
counterData: {'Label1': 1, 'Label2': 2},
};
let newState = {
'Label1': [0, 1], 'Label2': [1, 2],
};
state = statsReducer(state, action);
expect(state).toEqual(newState);
});
it('with reset', ()=>{
let state = {
'Label1': [0, 1], 'Label2': [1, 2],
};
let action = {
reset: {
'Label1': [2], 'Label2': [2],
},
};
let newState = {
'Label1': [2], 'Label2': [2],
};
state = statsReducer(state, action);
expect(state).toEqual(newState);
});
});
describe('<Graphs /> component', ()=>{
let graphComp = null;
let sid = 1;
let did = 1;
beforeEach(()=>{
jasmineEnzyme();
let dashboardPref = {
session_stats_refresh: 1,
tps_stats_refresh: 1,
ti_stats_refresh: 1,
to_stats_refresh: 1,
bio_stats_refresh: 1,
show_graphs: true,
graph_data_points: true,
graph_mouse_track: true,
};
graphComp = mount(<Graphs preferences={dashboardPref} sid={sid} did={did} enablePoll={false} pageVisible={true} />);
});
it('GraphsWrapper is rendered', (done)=>{
let found = graphComp.find(GraphsWrapper);
expect(found.length).toBe(1);
done();
});
it('pollDelay is set', (done)=>{
let found = graphComp.find('[data-testid="graph-poll-delay"]');
expect(found).toHaveClassName('d-none');
expect(found).toHaveText('1000');
done();
});
it('pollDelay on preference update', (done)=>{
let dashboardPref = {
session_stats_refresh: 5,
tps_stats_refresh: 10,
ti_stats_refresh: 5,
to_stats_refresh: 10,
bio_stats_refresh: 10,
show_graphs: true,
graph_data_points: true,
graph_mouse_track: true,
};
graphComp.setProps({preferences: dashboardPref});
let found = graphComp.find('[data-testid="graph-poll-delay"]');
expect(found).toHaveText('5000');
done();
});
});
});

View File

@ -0,0 +1,90 @@
import jasmineEnzyme from 'jasmine-enzyme';
import React from 'react';
import {mount} from 'enzyme';
import '../helper/enzyme.helper';
import {GraphsWrapper, X_AXIS_LENGTH, POINT_SIZE} from '../../../pgadmin/dashboard/static/js/Graphs';
describe('<GraphsWrapper /> component', ()=>{
let graphComp = null;
let defaultStats = {
labels: [...Array(X_AXIS_LENGTH).keys()],
datasets: [{
label: 'Label1',
data: [],
borderColor: '#00BCD4',
backgroundColor: '#00BCD4',
pointHitRadius: POINT_SIZE,
},{
label: 'Label2',
data: [],
borderColor: '#9CCC65',
backgroundColor: '#9CCC65',
pointHitRadius: POINT_SIZE,
}],
refreshRate: 1,
};
beforeEach(()=>{
jasmineEnzyme();
graphComp = mount(<GraphsWrapper sessionStats={defaultStats}
tpsStats={defaultStats}
tiStats={defaultStats}
toStats={defaultStats}
bioStats={defaultStats}
errorMsg={null}
showTooltip={true}
showDataPoints={true}
isDatabase={false} />);
});
it('graph containers are rendered', (done)=>{
let found = graphComp.find('.card.dashboard-graph');
expect(found.length).toBe(5);
done();
});
it('graph headers are correct', (done)=>{
let found = graphComp.find('.card.dashboard-graph');
expect(found.at(0)).toIncludeText('Server sessions');
expect(found.at(1)).toIncludeText('Transactions per second');
expect(found.at(2)).toIncludeText('Tuples in');
expect(found.at(3)).toIncludeText('Tuples out');
expect(found.at(4)).toIncludeText('Block I/O');
done();
});
it('graph headers when database', (done)=>{
let found = graphComp.find('.card.dashboard-graph');
graphComp.setProps({isDatabase: true});
expect(found.at(0)).toIncludeText('Database sessions');
done();
});
it('graph body has the canvas', (done)=>{
let found = graphComp.find('.card.dashboard-graph .dashboard-graph-body canvas');
expect(found.at(0).length).toBe(1);
expect(found.at(1).length).toBe(1);
expect(found.at(2).length).toBe(1);
expect(found.at(3).length).toBe(1);
expect(found.at(4).length).toBe(1);
done();
});
it('graph body shows the error', (done)=>{
graphComp.setProps({errorMsg: 'Some error occurred'});
let found = graphComp.find('.card.dashboard-graph .dashboard-graph-body .chart-wrapper');
expect(found.at(0)).toHaveClassName('d-none');
expect(found.at(1)).toHaveClassName('d-none');
expect(found.at(2)).toHaveClassName('d-none');
expect(found.at(3)).toHaveClassName('d-none');
expect(found.at(4)).toHaveClassName('d-none');
found = graphComp.find('.card.dashboard-graph .dashboard-graph-body .pg-panel-error.pg-panel-message');
expect(found.at(0)).toIncludeText('Some error occurred');
expect(found.at(1)).toIncludeText('Some error occurred');
expect(found.at(2)).toIncludeText('Some error occurred');
expect(found.at(3)).toIncludeText('Some error occurred');
expect(found.at(4)).toIncludeText('Some error occurred');
done();
});
});

View File

@ -21,5 +21,6 @@ define(function () {
'datagrid.panel': '/panel/<int:trans_id>',
'search_objects.types': '/search_objects/types/<int:sid>/<int:did>',
'search_objects.search': '/search_objects/search/<int:sid>/<int:did>',
'dashboard.dashboard_stats': '/dashboard/dashboard_stats',
};
});

View File

@ -0,0 +1,4 @@
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({adapter: new Adapter()});

View File

@ -309,11 +309,6 @@ var getThemeWebpackConfig = function(theme_name) {
// Module and Rules: https://webpack.js.org/configuration/module/
// Loaders: https://webpack.js.org/loaders/
//
// imports-loader: it adds dependent modules(use:imports-loader?module1)
// at the beginning of module it is dependency of like:
// var jQuery = require('jquery'); var browser = require('pgadmin.browser')
// It solves number of problems
// Ref: http:/github.com/webpack-contrib/imports-loader/
rules: themeCssRules(theme_name),
},
resolve: {
@ -393,12 +388,13 @@ module.exports = [{
// It solves number of problems
// Ref: http:/github.com/webpack-contrib/imports-loader/
rules: [{
test: /\.js$/,
test: /\.jsx?$/,
exclude: [/node_modules/, /vendor/],
use: {
loader: 'babel-loader',
options: {
presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}]],
presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}], '@babel/preset-react'],
plugins: ['@babel/plugin-proposal-class-properties'],
},
},
}, {
@ -420,6 +416,11 @@ module.exports = [{
query: webpackShimConfig,
include: path.join(__dirname, '/pgadmin/browser'),
}, {
// imports-loader: it adds dependent modules(use:imports-loader?module1)
// at the beginning of module it is dependency of like:
// var jQuery = require('jquery'); var browser = require('pgadmin.browser')
// It solves number of problems
// Ref: http:/github.com/webpack-contrib/imports-loader/
test: require.resolve('./pgadmin/tools/datagrid/static/js/datagrid'),
use: {
loader: 'imports-loader?' +
@ -517,7 +518,7 @@ module.exports = [{
resolve: {
alias: webpackShimConfig.resolveAlias,
modules: ['node_modules', '.'],
extensions: ['.js'],
extensions: ['.js', '.jsx'],
unsafeCache: true,
},
// Watch mode Configuration: After initial build, webpack will watch for

View File

@ -82,9 +82,6 @@ var webpackShimConfig = {
'deps': ['jquery', 'jquery.ui', 'jquery.event.drag'],
'exports': 'Slick',
},
'flotr2': {
deps: ['bean'],
},
'alertify': {
'exports': 'alertify',
},
@ -141,8 +138,6 @@ var webpackShimConfig = {
'moment': path.join(__dirname, './node_modules/moment/moment'),
'jquery.event.drag': path.join(__dirname, './node_modules/slickgrid/lib/jquery.event.drag-2.3.0'),
'jquery.ui': path.join(__dirname, './node_modules/slickgrid/lib/jquery-ui-1.11.3'),
'flotr2': path.join(__dirname, './node_modules/flotr2/flotr2.amd'),
'bean': path.join(__dirname, './node_modules/flotr2/lib/bean'),
'jqueryui.position': path.join(__dirname, './node_modules/jquery-contextmenu/dist/jquery.ui.position'),
'jquery.contextmenu': path.join(__dirname, './node_modules/jquery-contextmenu/dist/jquery.contextMenu'),
'dropzone': path.join(__dirname, './node_modules/dropzone/dist/dropzone'),

View File

@ -31,12 +31,13 @@ module.exports = {
module: {
rules: [
{
test: /\.js$/,
test: /\.jsx?$/,
exclude: [/node_modules/, /vendor/],
use: {
loader: 'babel-loader',
options: {
presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}]],
presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}], '@babel/preset-react'],
plugins: ['@babel/plugin-proposal-class-properties'],
sourceMap: 'inline',
},
},
@ -68,7 +69,7 @@ module.exports = {
},
resolve: {
extensions: ['.js'],
extensions: ['.js', '.jsx'],
alias: {
'top': path.join(__dirname, './pgadmin'),
'jquery': path.join(__dirname, './node_modules/jquery/dist/jquery'),
@ -90,8 +91,6 @@ module.exports = {
'slickgrid': nodeModulesDir + '/slickgrid/',
'slickgrid.plugins': nodeModulesDir + '/slickgrid/plugins/',
'slickgrid.grid': nodeModulesDir + '/slickgrid/slick.grid',
'bean': path.join(__dirname, './node_modules/flotr2/lib/bean'),
'flotr2': path.join(__dirname, './node_modules/flotr2/flotr2.amd'),
'moment': path.join(__dirname, './node_modules/moment/moment'),
'browser': path.resolve(__dirname, 'pgadmin/browser/static/js'),
'pgadmin': sourcesDir + '/js/pgadmin',

File diff suppressed because it is too large Load Diff