diff --git a/.gitignore b/.gitignore index 31b8d65a8..8564f7729 100644 --- a/.gitignore +++ b/.gitignore @@ -19,11 +19,12 @@ /redhat-build /src-build /win-build +/win-temp _build /build-* pgadmin4.log pkg/win32/installer.iss -pkg/mac/codesign.conf +pkg/mac/codesign.confx pkg/mac/framework.conf runtime/.qmake.cache runtime/.qmake.stash diff --git a/DEPENDENCIES b/DEPENDENCIES index 93321c5c5..5e80e829f 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -1,20 +1,22 @@ pgAdmin 4 Dependency Inventory ============================== -pgAdmin 4 is built on C++, Python and Javascript, and is dependent on various -third party libraries. These are automatically compiled from the system, -requirements.txt.and packages.json and listed below. +pgAdmin 4 is built on Python, Javascript and NW.js (node-webkit), and is +dependent on various third party libraries. These are automatically compiled +from the system, requirements.txt and packages.json and listed below. -C++ Dependencies -================ +Runtime Dependencies +==================== Name Version Licence URL ---- ------- ------- --- -QT 5+ LGPL v2.1/3 https://www.qt.io/ -QDarkStyleSheet 2.8.1 MIT (code), CC BY 4.0 (images) https://github.com/ColinDuquesnoy/QDarkStyleSheet -Python 3.4+ PSF https://www.python.org/ +Python 3.6+ PSF https://www.python.org/ +nw 0.50.2 MIT git://github.com/nwjs/npm-installer.git +axios 0.21.0 MIT https://github.com/axios/axios.git +bootstrap 4.5.3 MIT git+https://github.com/twbs/bootstrap.git +follow-redirects 1.13.1 MIT git@github.com:follow-redirects/follow-redirects.git -3 dependencies listed. +5 dependencies listed. Python Dependencies =================== @@ -22,6 +24,7 @@ Python Dependencies Name Version Licence URL ---- ------- ------- --- blinker 1.4 MIT License http://pythonhosted.org/blinker/ +cheroot 8.5.1 UNKNOWN https://cheroot.cherrypy.org Flask 1.0.2 BSD https://www.palletsprojects.com/p/flask/ Werkzeug 1.0.1 BSD-3-Clause https://palletsprojects.com/p/werkzeug/ Flask-Gravatar 0.5.0 BSD https://github.com/zzzsochi/Flask-Gravatar/ @@ -52,7 +55,7 @@ ldap3 2.8.1 Flask-BabelEx 0.9.4 BSD http://github.com/mrjoes/flask-babelex gssapi 1.6.12 LICENSE.txt https://github.com/pythongssapi/python-gssapi -30 dependencies listed. +31 dependencies listed. Javascript Dependencies ======================= @@ -60,118 +63,34 @@ Javascript Dependencies Name Version Licence URL ---- ------- ------- --- @babel/code-frame 7.12.11 MIT https://github.com/babel/babel.git -@babel/compat-data 7.12.7 MIT https://github.com/babel/babel.git @babel/core 7.12.10 MIT https://github.com/babel/babel.git @babel/generator 7.12.11 MIT https://github.com/babel/babel.git @babel/helper-annotate-as-pure 7.12.10 MIT https://github.com/babel/babel.git -@babel/helper-builder-binary-assignment-operator-visitor 7.10.4 MIT https://github.com/babel/babel.git -@babel/helper-compilation-targets 7.12.5 MIT https://github.com/babel/babel.git @babel/helper-create-class-features-plugin 7.12.1 MIT https://github.com/babel/babel.git -@babel/helper-create-regexp-features-plugin 7.12.7 MIT https://github.com/babel/babel.git -@babel/helper-define-map 7.10.5 MIT https://github.com/babel/babel.git -@babel/helper-explode-assignable-expression 7.12.1 MIT https://github.com/babel/babel.git @babel/helper-function-name 7.12.11 MIT https://github.com/babel/babel.git @babel/helper-get-function-arity 7.12.10 MIT https://github.com/babel/babel.git -@babel/helper-hoist-variables 7.10.4 MIT https://github.com/babel/babel.git @babel/helper-member-expression-to-functions 7.12.7 MIT https://github.com/babel/babel.git @babel/helper-module-imports 7.12.5 MIT https://github.com/babel/babel.git @babel/helper-module-transforms 7.12.1 MIT https://github.com/babel/babel.git @babel/helper-optimise-call-expression 7.12.10 MIT https://github.com/babel/babel.git @babel/helper-plugin-utils 7.10.4 MIT https://github.com/babel/babel.git -@babel/helper-remap-async-to-generator 7.12.1 MIT https://github.com/babel/babel.git @babel/helper-replace-supers 7.12.11 MIT https://github.com/babel/babel.git @babel/helper-simple-access 7.12.1 MIT https://github.com/babel/babel.git -@babel/helper-skip-transparent-expression-wrappers 7.12.1 MIT https://github.com/babel/babel.git @babel/helper-split-export-declaration 7.12.11 MIT https://github.com/babel/babel.git @babel/helper-validator-identifier 7.12.11 MIT https://github.com/babel/babel.git -@babel/helper-validator-option 7.12.11 MIT https://github.com/babel/babel.git -@babel/helper-wrap-function 7.12.3 MIT https://github.com/babel/babel.git @babel/helpers 7.12.5 MIT https://github.com/babel/babel.git @babel/highlight 7.10.4 MIT https://github.com/babel/babel.git @babel/parser 7.12.11 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-async-generator-functions 7.12.12 MIT https://github.com/babel/babel.git @babel/plugin-proposal-class-properties 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-dynamic-import 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-export-namespace-from 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-json-strings 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-logical-assignment-operators 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-nullish-coalescing-operator 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-numeric-separator 7.12.7 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-object-rest-spread 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-optional-catch-binding 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-optional-chaining 7.12.7 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-private-methods 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-proposal-unicode-property-regex 7.12.1 MIT https://github.com/babel/babel.git -@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-class-properties 7.12.1 MIT https://github.com/babel/babel.git -@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-export-namespace-from 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-export-namespace-from -@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.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-syntax-logical-assignment-operators 7.10.4 MIT https://github.com/babel/babel.git -@babel/plugin-syntax-nullish-coalescing-operator 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-nullish-coalescing-operator -@babel/plugin-syntax-numeric-separator 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-syntax-optional-chaining 7.8.3 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-optional-chaining -@babel/plugin-syntax-top-level-await 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-arrow-functions 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-async-to-generator 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-block-scoped-functions 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-block-scoping 7.12.12 MIT https://github.com/babel/babel.git -@babel/plugin-transform-classes 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-computed-properties 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-destructuring 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-dotall-regex 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-duplicate-keys 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-exponentiation-operator 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-for-of 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-function-name 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-literals 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-member-expression-literals 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-modules-amd 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-modules-commonjs 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-modules-systemjs 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-modules-umd 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-named-capturing-groups-regex 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-new-target 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-object-super 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-parameters 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-property-literals 7.12.1 MIT https://github.com/babel/babel.git @babel/plugin-transform-react-display-name 7.12.1 MIT https://github.com/babel/babel.git @babel/plugin-transform-react-jsx 7.12.12 MIT https://github.com/babel/babel.git @babel/plugin-transform-react-jsx-development 7.12.12 MIT https://github.com/babel/babel.git @babel/plugin-transform-react-pure-annotations 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-regenerator 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-reserved-words 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-shorthand-properties 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-spread 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-sticky-regex 7.12.7 MIT https://github.com/babel/babel.git -@babel/plugin-transform-template-literals 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-typeof-symbol 7.12.10 MIT https://github.com/babel/babel.git -@babel/plugin-transform-unicode-escapes 7.12.1 MIT https://github.com/babel/babel.git -@babel/plugin-transform-unicode-regex 7.12.1 MIT https://github.com/babel/babel.git -@babel/preset-env 7.12.11 MIT https://github.com/babel/babel.git -@babel/preset-modules 0.1.4 MIT Unknown @babel/preset-react 7.12.10 MIT https://github.com/babel/babel.git -@babel/runtime 7.12.5 MIT https://github.com/babel/babel.git @babel/template 7.12.7 MIT https://github.com/babel/babel.git @babel/traverse 7.12.12 MIT https://github.com/babel/babel.git @babel/types 7.12.12 MIT https://github.com/babel/babel.git -@emotion/cache 10.0.29 MIT https://github.com/emotion-js/emotion/tree/master/packages/cache -@emotion/core 10.1.1 MIT https://github.com/emotion-js/emotion/tree/master/packages/core -@emotion/css 10.0.27 MIT https://github.com/emotion-js/emotion/tree/master/packages/css -@emotion/hash 0.8.0 MIT https://github.com/emotion-js/emotion/tree/master/packages/hash -@emotion/is-prop-valid 0.8.8 MIT https://github.com/emotion-js/emotion/tree/master/packages/is-prop-valid -@emotion/memoize 0.7.4 MIT https://github.com/emotion-js/emotion/tree/master/packages/memoize -@emotion/serialize 0.11.16 MIT https://github.com/emotion-js/emotion/tree/master/packages/serialize -@emotion/sheet 0.9.4 MIT https://github.com/emotion-js/emotion/tree/master/packages/sheet -@emotion/styled 10.0.27 MIT https://github.com/emotion-js/emotion/tree/master/packages/styled -@emotion/styled-base 10.0.31 MIT https://github.com/emotion-js/emotion/tree/master/packages/styled-base -@emotion/stylis 0.8.5 MIT https://github.com/emotion-js/emotion/tree/master/packages/stylis -@emotion/unitless 0.7.5 MIT https://github.com/emotion-js/emotion/tree/master/packages/unitless -@emotion/utils 0.11.3 MIT https://github.com/emotion-js/emotion/tree/master/packages/serialize -@emotion/weak-memoize 0.2.5 MIT https://github.com/emotion-js/emotion/tree/master/packages/weak-memoize @istanbuljs/schema 0.1.2 MIT git+https://github.com/istanbuljs/schema.git @popperjs/core 2.6.0 MIT https://github.com/popperjs/popper-core.git @projectstorm/geometry 6.3.0 MIT https://github.com/projectstorm/react-diagrams.git @@ -181,90 +100,35 @@ Name Version @projectstorm/react-diagrams-defaults 6.3.0 MIT https://github.com/projectstorm/react-diagrams.git @projectstorm/react-diagrams-routing 6.3.0 MIT https://github.com/projectstorm/react-diagrams.git @simonwep/pickr 1.8.0 MIT https://github.com/Simonwep/pickr.git -@sindresorhus/is 0.7.0 MIT https://github.com/sindresorhus/is.git @tippyjs/react 4.2.0 MIT git+https://github.com/atomiks/tippyjs-react.git @types/estree 0.0.45 MIT https://github.com/DefinitelyTyped/DefinitelyTyped.git -@types/json-schema 7.0.6 MIT https://github.com/DefinitelyTyped/DefinitelyTyped.git @types/node 14.14.16 MIT https://github.com/DefinitelyTyped/DefinitelyTyped.git -@types/parse-json 4.0.0 MIT https://www.github.com/DefinitelyTyped/DefinitelyTyped.git @types/q 1.5.4 MIT https://github.com/DefinitelyTyped/DefinitelyTyped.git -@webassemblyjs/ast 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/floating-point-hex-parser 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/helper-api-error 1.9.0 MIT Unknown -@webassemblyjs/helper-buffer 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/helper-code-frame 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/helper-module-context 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/helper-wasm-bytecode 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/helper-wasm-section 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/ieee754 1.9.0 MIT Unknown -@webassemblyjs/leb128 1.9.0 MIT Unknown -@webassemblyjs/utf8 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/wasm-edit 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/wasm-gen 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/wasm-opt 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/wasm-parser 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/wast-parser 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -@webassemblyjs/wast-printer 1.9.0 MIT https://github.com/xtuc/webassemblyjs.git -accepts 1.3.7 MIT https://github.com/jshttp/accepts.git acitree 4.5.0-rc.7 MIT https://github.com/imsurinder90/jquery-aciTree.git -acorn 6.4.2 MIT https://github.com/acornjs/acorn.git acorn 7.4.1 MIT https://github.com/acornjs/acorn.git -acorn-jsx 5.3.1 MIT https://github.com/acornjs/acorn-jsx acorn-walk 7.2.0 MIT https://github.com/acornjs/acorn.git -after 0.8.2 MIT git://github.com/Raynos/after.git -aggregate-error 3.1.0 MIT https://github.com/sindresorhus/aggregate-error.git -airbnb-prop-types 2.16.0 MIT git+https://github.com/airbnb/prop-types.git -ajv 5.5.2 MIT https://github.com/epoberezkin/ajv.git ajv 6.12.6 MIT https://github.com/ajv-validator/ajv.git +ajv 5.5.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.5.2 MIT git+https://github.com/epoberezkin/ajv-keywords.git alertifyjs 1.7.1 MIT git@github.com:MohammadYounes/AlertifyJS.git alphanum-sort 1.0.2 MIT https://github.com/TrySound/alphanum-sort.git -ansi-colors 3.2.4 MIT https://github.com/doowb/ansi-colors.git -ansi-escapes 3.2.0 MIT https://github.com/sindresorhus/ansi-escapes.git ansi-regex 2.1.1 MIT https://github.com/chalk/ansi-regex.git -ansi-regex 3.0.0 MIT https://github.com/chalk/ansi-regex.git -ansi-regex 4.1.0 MIT https://github.com/chalk/ansi-regex.git ansi-styles 3.2.1 MIT https://github.com/chalk/ansi-styles.git ansi-styles 2.2.1 MIT https://github.com/chalk/ansi-styles.git -ansi-styles 4.3.0 MIT https://github.com/chalk/ansi-styles.git -arch 2.2.0 MIT git://github.com/feross/arch.git -archive-type 4.0.0 MIT https://github.com/kevva/archive-type.git argparse 1.0.10 MIT https://github.com/nodeca/argparse.git 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.2 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.4 MIT git://github.com/es-shims/Array.prototype.flat.git -array.prototype.flatmap 1.2.4 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 5.4.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 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.6 MIT https://github.com/postcss/autoprefixer.git axios 0.18.1 MIT https://github.com/axios/axios.git -axios-mock-adapter 1.19.0 MIT git+https://github.com/ctimmerm/axios-mock-adapter.git babel-code-frame 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-code-frame -babel-eslint 10.1.0 MIT https://github.com/babel/babel-eslint.git babel-generator 6.26.1 MIT https://github.com/babel/babel/tree/master/packages/babel-generator -babel-loader 8.2.2 MIT https://github.com/babel/babel-loader.git babel-messages 6.23.0 MIT https://github.com/babel/babel/tree/master/packages/babel-messages -babel-plugin-dynamic-import-node 2.3.3 MIT git+https://github.com/airbnb/babel-plugin-dynamic-import-node.git -babel-plugin-emotion 10.0.33 MIT https://github.com/emotion-js/emotion/tree/master/packages/babel-plugin-emotion -babel-plugin-macros 2.8.0 MIT https://github.com/kentcdodds/babel-plugin-macros.git -babel-plugin-syntax-jsx 6.18.0 MIT https://github.com/babel/babel/tree/master/packages/babel-plugin-syntax-jsx babel-runtime 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-runtime babel-template 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-template babel-traverse 6.26.0 MIT https://github.com/babel/babel/tree/master/packages/babel-traverse @@ -272,145 +136,86 @@ babel-types 6.26.0 babelify 10.0.0 MIT https://github.com/babel/babelify.git babylon 6.18.0 MIT https://github.com/babel/babylon backbone 1.3.3 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.2.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 backgrid-filter 0.3.7 MIT git://github.com/wyuenho/backgrid-text-cell.git backgrid-select-all 0.3.5 MIT git://github.com/wyuenho/backgrid-select-all.git -backo2 1.0.2 MIT https://github.com/mokesmokes/backo.git balanced-match 1.0.0 MIT git://github.com/juliangruber/balanced-match.git base 0.11.2 MIT https://github.com/node-base/base.git -base64-arraybuffer 0.1.5 MIT https://github.com/niklasvh/base64-arraybuffer base64-js 1.5.1 MIT git://github.com/beatgammit/base64-js.git -base64id 1.0.0 MIT https://github.com/faeldt/base64id.git -better-assert 1.0.2 MIT https://github.com/visionmedia/better-assert.git -bfj 6.1.2 MIT https://gitlab.com/philbooth/bfj.git big.js 5.2.2 MIT https://github.com/MikeMcl/big.js.git -bignumber.js 8.1.1 MIT https://github.com/MikeMcl/bignumber.js.git bignumber.js 7.2.1 MIT https://github.com/MikeMcl/bignumber.js.git -bin-build 3.0.0 MIT https://github.com/kevva/bin-build.git -bin-check 4.1.0 MIT https://github.com/kevva/bin-check.git -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 +bignumber.js 8.1.1 MIT https://github.com/MikeMcl/bignumber.js.git binary-extensions 1.13.1 MIT https://github.com/sindresorhus/binary-extensions.git -binary-extensions 2.1.0 MIT https://github.com/sindresorhus/binary-extensions.git bindings 1.5.0 MIT git://github.com/TooTallNate/node-bindings.git -bl 1.2.3 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.3 MIT git@github.com:indutny/bn.js bn.js 4.11.9 MIT git@github.com:indutny/bn.js -body-parser 1.19.0 MIT https://github.com/expressjs/body-parser.git +bn.js 5.1.3 MIT git@github.com:indutny/bn.js bootstrap 4.5.3 MIT git+https://github.com/twbs/bootstrap.git bootstrap4-toggle 3.4.0 MIT https://github.com/gitbrent/bootstrap4-toggle.git bowser 2.1.2 MIT git+https://github.com/lancedikson/bowser.git brace-expansion 1.1.11 MIT git://github.com/juliangruber/brace-expansion.git -braces 3.0.2 MIT https://github.com/micromatch/braces.git braces 2.3.2 MIT https://github.com/micromatch/braces.git brorand 1.1.0 MIT git@github.com:indutny/brorand browser-pack 6.1.0 MIT git://github.com/browserify/browser-pack.git -browser-resolve 2.0.0 MIT git://github.com/browserify/browser-resolve.git browser-resolve 1.11.3 MIT git://github.com/shtylman/node-browser-resolve.git -browserify 16.2.3 MIT http://github.com/browserify/browserify.git +browser-resolve 2.0.0 MIT git://github.com/browserify/browser-resolve.git browserify 16.5.2 MIT http://github.com/browserify/browserify.git +browserify 16.2.3 MIT http://github.com/browserify/browserify.git browserify-aes 1.2.0 MIT git://github.com/crypto-browserify/browserify-aes.git browserify-cipher 1.0.1 MIT git@github.com:crypto-browserify/browserify-cipher.git browserify-des 1.0.2 MIT git+https://github.com/crypto-browserify/browserify-des.git browserify-rsa 4.1.0 MIT https://github.com:crypto-browserify/browserify-rsa.git browserify-zlib 0.2.0 MIT git+https://github.com/devongovett/browserify-zlib.git browserslist 4.16.0 MIT https://github.com/browserslist/browserslist.git -buffer 4.9.2 MIT git://github.com/feross/buffer.git -buffer 5.2.1 MIT git://github.com/feross/buffer.git buffer 5.7.1 MIT git://github.com/feross/buffer.git -buffer-alloc 1.2.0 MIT https://github.com/LinusU/buffer-alloc.git -buffer-alloc-unsafe 1.1.0 MIT https://github.com/LinusU/buffer-alloc-unsafe.git -buffer-crc32 0.2.13 MIT git://github.com/brianloveswords/buffer-crc32.git -buffer-fill 1.0.0 MIT https://github.com/LinusU/buffer-fill.git +buffer 5.2.1 MIT git://github.com/feross/buffer.git buffer-from 1.1.1 MIT https://github.com/LinusU/buffer-from.git buffer-xor 1.0.3 MIT https://github.com/crypto-browserify/buffer-xor.git builtin-status-codes 3.0.0 MIT https://github.com/bendrucker/builtin-status-codes.git -bytes 3.1.0 MIT https://github.com/visionmedia/bytes.js.git cache-base 1.0.1 MIT https://github.com/jonschlinkert/cache-base.git -cacheable-request 2.1.4 MIT git+https://github.com/lukechilds/cacheable-request.git cached-path-relative 1.0.2 MIT git://github.com/ashaffer/cached-path-relative.git call-bind 1.0.0 MIT git+https://github.com/ljharb/call-bind.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 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 4.1.0 MIT https://github.com/chalk/chalk.git chalk 2.4.2 MIT https://github.com/chalk/chalk.git chalk 1.1.3 MIT https://github.com/chalk/chalk.git -chardet 0.7.0 MIT git@github.com:runk/node-chardet.git chart.js 2.9.4 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 -cheerio 1.0.0-rc.5 MIT git://github.com/cheeriojs/cheerio.git -chokidar 3.4.3 MIT git+https://github.com/paulmillr/chokidar.git chokidar 2.1.8 MIT 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 -clone-deep 4.0.1 MIT https://github.com/jonschlinkert/clone-deep.git -clone-response 1.0.2 MIT git+https://github.com/lukechilds/clone-response.git closest 0.0.1 MIT https://github.com/ForbesLindesay/closest.git co 4.6.0 MIT https://github.com/tj/co.git coa 2.0.2 MIT git://github.com/veged/coa.git codemirror 5.59.0 MIT https://github.com/codemirror/CodeMirror.git collection-visit 1.0.0 MIT https://github.com/jonschlinkert/collection-visit.git color 3.1.3 MIT https://github.com/Qix-/color.git -color-convert 2.0.1 MIT https://github.com/Qix-/color-convert.git color-convert 1.9.3 MIT https://github.com/Qix-/color-convert.git -color-name 1.1.4 MIT git@github.com:colorjs/color-name.git color-name 1.1.3 MIT git@github.com:dfcreative/color-name.git +color-name 1.1.4 MIT git@github.com:colorjs/color-name.git color-string 1.5.4 MIT https://github.com/Qix-/color-string.git colorette 1.2.1 MIT https://github.com/jorgebucaran/colorette.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 6.2.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 component-emitter 1.3.0 MIT https://github.com/component/emitter.git concat-map 0.0.1 MIT git://github.com/substack/node-concat-map.git concat-stream 1.6.2 MIT http://github.com/maxogden/concat-stream.git -config-chain 1.1.12 MIT https://github.com/dominictarr/config-chain.git -connect 3.7.0 MIT https://github.com/senchalabs/connect.git console-browserify 1.2.0 MIT git://github.com/browserify/console-browserify.git -console-stream 0.1.1 MIT git://github.com/Raynos/console-stream.git constants-browserify 1.0.0 MIT git://github.com/juliangruber/constants-browserify.git -content-disposition 0.5.3 MIT https://github.com/jshttp/content-disposition.git -content-type 1.0.4 MIT https://github.com/jshttp/content-type.git -convert-source-map 1.7.0 MIT git://github.com/thlorenz/convert-source-map.git convert-source-map 1.1.3 MIT git://github.com/thlorenz/convert-source-map.git -cookie 0.3.1 MIT https://github.com/jshttp/cookie.git -cookie 0.4.0 MIT https://github.com/jshttp/cookie.git -cookie-signature 1.0.6 MIT https://github.com/visionmedia/node-cookie-signature.git +convert-source-map 1.7.0 MIT git://github.com/thlorenz/convert-source-map.git copy-descriptor 0.1.1 MIT https://github.com/jonschlinkert/copy-descriptor.git -copy-webpack-plugin 5.1.2 MIT https://github.com/webpack-contrib/copy-webpack-plugin.git core-js 2.6.12 MIT https://github.com/zloirock/core-js.git core-js 3.8.1 MIT https://github.com/zloirock/core-js.git -core-js-compat 3.8.1 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 -cosmiconfig 6.0.0 MIT git+https://github.com/davidtheclark/cosmiconfig.git create-ecdh 4.0.4 MIT https://github.com/crypto-browserify/createECDH.git create-hash 1.2.0 MIT git@github.com:crypto-browserify/createHash.git create-hmac 1.1.7 MIT https://github.com/crypto-browserify/createHmac.git -cross-env 5.2.1 MIT https://github.com/kentcdodds/cross-env.git -cross-spawn 5.1.0 MIT git://github.com/IndigoUnited/node-cross-spawn.git -cross-spawn 6.0.5 MIT git@github.com:moxystudio/node-cross-spawn.git crypto-browserify 3.12.0 MIT git://github.com/crypto-browserify/crypto-browserify.git css-color-names 0.0.4 MIT git://github.com/bahamas10/css-color-names.git css-declaration-sorter 4.0.1 MIT https://github.com/Siilwyn/css-declaration-sorter.git @@ -426,401 +231,158 @@ cssnano-util-get-match 4.0.0 cssnano-util-raw-cache 4.0.1 MIT https://github.com/cssnano/cssnano.git cssnano-util-same-parent 4.0.1 MIT https://github.com/cssnano/cssnano.git csso 4.2.0 MIT https://github.com/css/csso.git -csstype 2.6.14 MIT https://github.com/frenic/csstype -cubic2quad 1.1.1 MIT https://github.com/fontello/cubic2quad.git -currently-unhandled 0.4.1 MIT https://github.com/jamestalmage/currently-unhandled.git -custom-event 1.0.1 MIT git://github.com/webmodules/custom-event.git -cwebp-bin 5.1.0 MIT https://github.com/imagemin/cwebp-bin.git -cyclist 1.0.1 MIT git://github.com/mafintosh/cyclist dagre 0.8.5 MIT https://github.com/dagrejs/dagre.git -date-format 2.1.0 MIT https://github.com/nomiddlename/date-format.git -debug 3.2.7 MIT git://github.com/visionmedia/debug.git -debug 2.6.9 MIT git://github.com/visionmedia/debug.git debug 4.3.1 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 -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 -decompress 4.2.1 MIT https://github.com/kevva/decompress.git -decompress-response 3.3.0 MIT https://github.com/sindresorhus/decompress-response.git -decompress-tar 4.1.1 MIT https://github.com/kevva/decompress-tar.git -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 1.0.0 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 deps-sort 2.0.1 MIT git://github.com/substack/deps-sort.git des.js 1.0.1 MIT git+ssh://git@github.com/indutny/des.js.git -destroy 1.0.4 MIT https://github.com/stream-utils/destroy.git -detect-file 1.0.0 MIT https://github.com/doowb/detect-file.git detect-indent 4.0.0 MIT https://github.com/sindresorhus/detect-indent.git detective 5.2.0 MIT git://github.com/browserify/detective.git -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.2.2 MIT git://github.com/cheeriojs/dom-renderer.git -dom-serializer 1.2.0 MIT git://github.com/cheeriojs/dom-renderer.git domain-browser 1.2.0 MIT https://github.com/bevry/domain-browser.git dot-prop 5.3.0 MIT https://github.com/sindresorhus/dot-prop.git -download 7.1.0 MIT https://github.com/kevva/download.git -download 6.2.5 MIT https://github.com/kevva/download.git dropzone 5.7.2 MIT https://gitlab.com/meno/dropzone.git -duplexer 0.1.2 MIT git://github.com/Raynos/duplexer.git -duplexify 3.7.1 MIT git://github.com/mafintosh/duplexify -ee-first 1.1.1 MIT https://github.com/jonathanong/ee-first.git elliptic 6.5.3 MIT git@github.com:indutny/elliptic -emoji-regex 7.0.3 MIT https://github.com/mathiasbynens/emoji-regex.git emojis-list 3.0.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.3.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.5 MIT https://github.com/enzymejs/enzyme.git -enzyme-adapter-utils 1.14.0 MIT https://github.com/enzymejs/enzyme.git -enzyme-matchers 7.1.2 MIT git+https://github.com/FormidableLabs/enzyme-matchers.git -enzyme-shallow-equal 1.0.4 MIT https://github.com/enzymejs/enzyme.git -errno 0.1.8 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.7 MIT git://github.com/ljharb/es-abstract.git es-abstract 1.18.0-next.1 MIT git://github.com/ljharb/es-abstract.git +es-abstract 1.17.7 MIT git://github.com/ljharb/es-abstract.git es-to-primitive 1.2.1 MIT git://github.com/ljharb/es-to-primitive.git escalade 3.1.1 MIT https://github.com/lukeed/escalade.git -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.21.5 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.7 MIT git://github.com/primus/eventemitter3.git events 2.1.0 MIT git://github.com/Gozala/events.git -events 3.2.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.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 exports-loader 0.7.0 MIT https://github.com/webpack-contrib/exports-loader.git -express 4.17.1 MIT https://github.com/expressjs/express.git -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 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 1.1.0 MIT git+https://github.com/epoberezkin/fast-deep-equal.git fast-deep-equal 3.1.3 MIT git+https://github.com/epoberezkin/fast-deep-equal.git +fast-deep-equal 1.1.0 MIT git+https://github.com/epoberezkin/fast-deep-equal.git fast-json-stable-stringify 2.1.0 MIT git://github.com/epoberezkin/fast-json-stable-stringify.git -fast-levenshtein 2.0.6 MIT https://github.com/hiddentao/fast-levenshtein.git fast-safe-stringify 2.0.7 MIT git+https://github.com/davidmarkclements/fast-safe-stringify.git -fd-slicer 1.1.0 MIT git://github.com/andrewrk/node-fd-slicer.git -figures 2.0.0 MIT https://github.com/sindresorhus/figures.git -figures 1.7.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 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-type 5.2.0 MIT https://github.com/sindresorhus/file-type.git -file-type 8.1.0 MIT https://github.com/sindresorhus/file-type.git -file-type 4.4.0 MIT https://github.com/sindresorhus/file-type.git -file-type 10.11.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 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 2.1.0 MIT https://github.com/avajs/find-cache-dir.git -find-cache-dir 3.3.1 MIT https://github.com/avajs/find-cache-dir.git -find-root 1.1.0 MIT git@github.com:js-n/find-root.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-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 -flush-write-stream 1.1.1 MIT https://github.com/mafintosh/flush-write-stream.git -follow-redirects 1.13.1 MIT git@github.com:follow-redirects/follow-redirects.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 -forwarded 0.1.2 MIT https://github.com/jshttp/forwarded.git fragment-cache 0.2.1 MIT https://github.com/jonschlinkert/fragment-cache.git -fresh 0.5.2 MIT https://github.com/jshttp/fresh.git -from2 2.3.0 MIT git://github.com/hughsk/from2 -fs-access 1.0.1 MIT https://github.com/sindresorhus/fs-access.git -fs-constants 1.0.0 MIT https://github.com/mafintosh/fs-constants.git -fs-extra 7.0.1 MIT https://github.com/jprichardson/node-fs-extra fsevents 1.2.13 MIT https://github.com/strongloop/fsevents.git -fsevents 2.1.3 MIT https://github.com/fsevents/fsevents.git function-bind 1.1.1 MIT git://github.com/Raynos/function-bind.git -function.prototype.name 1.1.3 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.2 MIT git+https://github.com/inspect-js/functions-have-names.git gensync 1.0.0-beta.2 MIT https://github.com/loganfsmyth/gensync.git -geometry-interfaces 1.1.4 MIT https://github.com/trusktr/geometry-interfaces.git get-intrinsic 1.0.2 MIT git+https://github.com/ljharb/get-intrinsic.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 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 -global-modules 1.0.0 MIT https://github.com/jonschlinkert/global-modules.git -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 -globby 6.1.0 MIT https://github.com/sindresorhus/globby.git -globby 7.1.1 MIT https://github.com/sindresorhus/globby.git -got 7.1.0 MIT https://github.com/sindresorhus/got.git -got 8.3.2 MIT https://github.com/sindresorhus/got.git +globals 11.12.0 MIT https://github.com/sindresorhus/globals.git graphlib 2.1.8 MIT https://github.com/dagrejs/graphlib.git -gzip-size 5.1.1 MIT https://github.com/sindresorhus/gzip-size.git has 1.0.3 MIT git://github.com/tarruda/has.git has-ansi 2.0.0 MIT https://github.com/sindresorhus/has-ansi.git -has-binary2 1.0.3 MIT Unknown -has-cors 1.1.0 MIT git://github.com/component/has-cors.git has-flag 4.0.0 MIT https://github.com/sindresorhus/has-flag.git has-flag 3.0.0 MIT https://github.com/sindresorhus/has-flag.git -has-symbol-support-x 1.4.2 MIT https://github.com/Xotic750/has-symbol-support-x.git has-symbols 1.0.1 MIT git://github.com/ljharb/has-symbols.git -has-to-string-tag-x 1.4.1 MIT https://github.com/Xotic750/has-to-string-tag-x.git -has-value 1.0.0 MIT https://github.com/jonschlinkert/has-value.git has-value 0.3.1 MIT https://github.com/jonschlinkert/has-value.git -has-values 1.0.0 MIT https://github.com/jonschlinkert/has-values.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 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 hex-color-regex 1.1.0 MIT https://github.com/regexps/hex-color-regex.git hmac-drbg 1.0.1 MIT git+ssh://git@github.com/indutny/hmac-drbg.git -homedir-polyfill 1.0.3 MIT https://github.com/doowb/homedir-polyfill.git -hoopy 0.1.4 MIT git+https://gitlab.com/philbooth/hoopy.git 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 html-escaper 2.0.2 MIT https://github.com/WebReflection/html-escaper.git htmlescape 1.1.1 MIT git://github.com/zertosh/htmlescape.git -htmlparser2 6.0.0 MIT git://github.com/fb55/htmlparser2.git -http-errors 1.7.2 MIT https://github.com/jshttp/http-errors.git -http-errors 1.7.3 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 -iconfont-webpack-plugin 4.2.2 MIT https://github.com/jantimon/iconfont-webpack-plugin.git -iconv-lite 0.4.24 MIT git://github.com/ashtuchkin/iconv-lite.git -iferr 0.1.5 MIT https://github.com/shesek/iferr -ignore 4.0.6 MIT git@github.com:kaelzhang/node-ignore.git -ignore 3.3.10 MIT git@github.com:kaelzhang/node-ignore.git -image-webpack-loader 4.6.0 MIT git@github.com:tcoopman/image-webpack-loader.git -imagemin 5.3.1 MIT https://github.com/imagemin/imagemin.git -imagemin-gifsicle 6.0.1 MIT https://github.com/imagemin/imagemin-gifsicle.git -imagemin-mozjpeg 8.0.0 MIT https://github.com/imagemin/imagemin-mozjpeg.git -imagemin-optipng 6.0.0 MIT https://github.com/imagemin/imagemin-optipng.git -imagemin-pngquant 6.0.1 MIT https://github.com/imagemin/imagemin-pngquant.git -imagemin-svgo 7.1.0 MIT https://github.com/imagemin/imagemin-svgo.git -imagemin-webp 5.1.0 MIT https://github.com/imagemin/imagemin-webp.git immutability-helper 3.1.1 MIT git+https://github.com/kolodny/immutability-helper.git -import-cwd 2.1.0 MIT https://github.com/sindresorhus/import-cwd.git -import-fresh 3.3.0 MIT https://github.com/sindresorhus/import-fresh.git import-fresh 2.0.0 MIT https://github.com/sindresorhus/import-fresh.git -import-from 2.1.0 MIT https://github.com/sindresorhus/import-from.git -import-lazy 3.1.0 MIT https://github.com/sindresorhus/import-lazy.git -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 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.1 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.4.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 ip-address 5.9.4 MIT git://github.com/beaugunderson/ip-address.git -ipaddr.js 1.9.1 MIT git://github.com/whitequark/ipaddr.js is-absolute-url 2.1.0 MIT https://github.com/sindresorhus/is-absolute-url.git is-accessor-descriptor 1.0.0 MIT https://github.com/jonschlinkert/is-accessor-descriptor.git is-accessor-descriptor 0.1.6 MIT https://github.com/jonschlinkert/is-accessor-descriptor.git is-any-array 0.1.0 MIT https://github.com/cheminfo-js/is-any-array.git -is-arrayish 0.3.2 MIT https://github.com/qix-/node-is-arrayish.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 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.1.0 MIT git://github.com/ljharb/is-boolean-object.git -is-buffer 2.0.5 MIT git://github.com/feross/is-buffer.git is-buffer 1.1.6 MIT git://github.com/feross/is-buffer.git +is-buffer 2.0.5 MIT git://github.com/feross/is-buffer.git is-callable 1.2.2 MIT git://github.com/ljharb/is-callable.git is-color-stop 1.1.0 MIT git+https://github.com/pigcan/is-color-stop.git is-core-module 2.2.0 MIT git+https://github.com/inspect-js/is-core-module.git -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-data-descriptor 1.0.0 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 0.1.1 MIT https://github.com/jonschlinkert/is-extendable.git is-extendable 1.0.1 MIT https://github.com/jonschlinkert/is-extendable.git +is-extendable 0.1.1 MIT https://github.com/jonschlinkert/is-extendable.git is-extglob 2.1.1 MIT https://github.com/jonschlinkert/is-extglob.git 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 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-glob 4.0.1 MIT https://github.com/micromatch/is-glob.git is-negative-zero 2.0.1 MIT git://github.com/inspect-js/is-negative-zero.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.2 MIT git://github.com/inspect-js/is-object.git -is-plain-obj 1.1.0 MIT https://github.com/sindresorhus/is-plain-obj.git is-plain-object 2.0.4 MIT https://github.com/jonschlinkert/is-plain-object.git -is-png 1.1.0 MIT https://github.com/sindresorhus/is-png.git is-regex 1.1.1 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 3.0.0 MIT https://github.com/sindresorhus/is-svg.git -is-svg 4.2.1 MIT https://github.com/sindresorhus/is-svg.git is-symbol 1.0.3 MIT git://github.com/inspect-js/is-symbol.git -is-utf8 0.2.1 MIT https://github.com/wayfind/is-utf8.git 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 2.0.1 MIT git://github.com/juliangruber/isarray.git -isarray 0.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 istanbul-instrumenter-loader 3.0.1 MIT https://github.com/webpack-contrib/istanbul-instrumenter-loader.git -isurl 1.0.0 MIT https://github.com/stevenvachon/isurl.git -jasmine-core 3.6.0 MIT https://github.com/jasmine/jasmine.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-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-yaml 3.14.1 MIT https://github.com/nodeca/js-yaml.git jsbn 1.1.0 MIT https://github.com/andyperlitch/jsbn.git -jsesc 2.5.2 MIT https://github.com/mathiasbynens/jsesc.git -jsesc 0.5.0 MIT https://github.com/mathiasbynens/jsesc.git jsesc 1.3.0 MIT https://github.com/mathiasbynens/jsesc.git +jsesc 2.5.2 MIT https://github.com/mathiasbynens/jsesc.git json-bignumber 1.0.2 MIT git@github.com:wbuss/JSONBigNumber.git -json-buffer 3.0.0 MIT git://github.com/dominictarr/json-buffer.git json-parse-better-errors 1.0.2 MIT https://github.com/zkat/json-parse-better-errors -json-parse-even-better-errors 2.3.1 MIT https://github.com/npm/json-parse-even-better-errors json-schema-traverse 0.3.1 MIT git+https://github.com/epoberezkin/json-schema-traverse.git 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 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 +json5 2.1.3 MIT git+https://github.com/json5/json5.git jsonparse 1.3.1 MIT http://github.com/creationix/jsonparse.git -jsx-ast-utils 3.2.0 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 karma-coverage 2.0.3 MIT git://github.com/karma-runner/karma-coverage.git -karma-jasmine 2.0.1 MIT git://github.com/karma-runner/karma-jasmine.git -karma-jasmine-html-reporter 1.5.4 MIT https://github.com/dfederm/karma-jasmine-html-reporter -karma-requirejs 1.1.0 MIT git://github.com/karma-runner/karma-requirejs.git -karma-source-map-support 1.4.0 MIT git://github.com/tschaub/karma-source-map-support.git -karma-sourcemap-loader 0.3.8 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 3.2.2 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 -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 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 -levn 0.3.0 MIT git://github.com/gkz/levn.git -lines-and-columns 1.1.6 MIT https://github.com/eventualbuddha/lines-and-columns.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 2.0.0 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 -locate-path 3.0.0 MIT https://github.com/sindresorhus/locate-path.git lodash 4.17.20 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 3.0.4 MIT https://github.com/lodash/lodash.git -lodash.isequal 4.5.0 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.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 3.1.0 MIT https://github.com/sindresorhus/make-dir.git -make-dir 1.3.0 MIT https://github.com/sindresorhus/make-dir.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 map-visit 1.0.0 MIT https://github.com/jonschlinkert/map-visit.git -marked 1.2.7 MIT git://github.com/markedjs/marked.git matches-selector 0.0.1 MIT https://github.com/ForbesLindesay/matches-selector.git md5.js 1.3.5 MIT https://github.com/crypto-browserify/md5.js.git -media-typer 0.3.0 MIT https://github.com/jshttp/media-typer.git -memory-fs 0.5.0 MIT https://github.com/webpack/memory-fs.git -memory-fs 0.4.1 MIT https://github.com/webpack/memory-fs.git -meow 3.7.0 MIT https://github.com/sindresorhus/meow.git -merge-descriptors 1.0.1 MIT https://github.com/component/merge-descriptors.git -merge-stream 2.0.0 MIT https://github.com/grncdr/merge-stream.git -methods 1.1.2 MIT https://github.com/jshttp/methods.git -microbuffer 1.0.0 MIT https://github.com/fontello/microbuffer.git micromatch 3.1.10 MIT https://github.com/micromatch/micromatch.git miller-rabin 4.0.1 MIT git@github.com:indutny/miller-rabin -mime 1.6.0 MIT https://github.com/broofa/node-mime -mime 2.4.7 MIT https://github.com/broofa/mime -mime-db 1.45.0 MIT https://github.com/jshttp/mime-db.git -mime-db 1.44.0 MIT https://github.com/jshttp/mime-db.git -mime-types 2.1.27 MIT https://github.com/jshttp/mime-types.git -mimic-fn 1.2.0 MIT https://github.com/sindresorhus/mimic-fn.git -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 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 @@ -833,113 +395,40 @@ module-deps 6.2.3 moment 2.24.0 MIT https://github.com/moment/moment.git moment 2.29.1 MIT https://github.com/moment/moment.git moment-timezone 0.5.32 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.1.3 MIT https://github.com/vercel/ms.git nan 2.14.2 MIT git://github.com/nodejs/nan.git nanomatch 1.2.13 MIT https://github.com/micromatch/nanomatch.git nanopop 2.1.0 MIT https://github.com/Simonwep/nanopop.git -natural-compare 1.4.0 MIT git://github.com/litejs/natural-compare-lite.git -nearley 2.20.1 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.2 MIT git@github.com:suguru03/neo-async.git -nice-try 1.0.5 MIT https://github.com/electerious/nice-try.git -node-libs-browser 2.2.1 MIT git+https://github.com/webpack/node-libs-browser.git node-releases 1.1.67 MIT git+https://github.com/chicoxyzzy/node-releases.git normalize-path 2.1.1 MIT https://github.com/jonschlinkert/normalize-path.git normalize-path 3.0.0 MIT https://github.com/jonschlinkert/normalize-path.git -normalize-range 0.1.2 MIT https://github.com/jamestalmage/normalize-range.git normalize-url 3.3.0 MIT https://github.com/sindresorhus/normalize-url.git -normalize-url 2.0.1 MIT https://github.com/sindresorhus/normalize-url.git -npm-conf 1.1.3 MIT https://github.com/kevva/npm-conf.git -npm-run-path 2.0.2 MIT https://github.com/sindresorhus/npm-run-path.git -null-check 1.0.0 MIT https://github.com/sindresorhus/null-check.git -num2fraction 1.2.2 MIT git@github.com:yisibl/num2fraction.git 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.9.0 MIT git://github.com/inspect-js/object-inspect.git -object-is 1.1.4 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.2 MIT git://github.com/ljharb/object.assign.git -object.entries 1.1.3 MIT git://github.com/es-shims/Object.entries.git -object.fromentries 2.0.3 MIT git://github.com/es-shims/Object.fromEntries.git object.getownpropertydescriptors 2.1.1 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.2 MIT git://github.com/es-shims/Object.values.git -on-finished 2.3.0 MIT https://github.com/jshttp/on-finished.git -onetime 2.0.1 MIT https://github.com/sindresorhus/onetime.git -optimist 0.6.1 MIT http://github.com/substack/node-optimist.git -optimize-css-assets-webpack-plugin 5.0.4 MIT http://github.com/NMFR/optimize-css-assets-webpack-plugin.git -optionator 0.8.3 MIT git://github.com/gkz/optionator.git -optipng-bin 5.1.0 MIT https://github.com/imagemin/optipng-bin.git os-browserify 0.3.0 MIT http://github.com/CoderPuppy/os-browserify.git -os-filter-obj 2.0.0 MIT https://github.com/kevva/os-filter-obj.git -os-shim 0.1.3 MIT https://github.com/h2non/node-os-shim.git -os-tmpdir 1.0.2 MIT https://github.com/sindresorhus/os-tmpdir.git outpipe 1.1.1 MIT git://github.com/substack/outpipe.git -p-cancelable 0.3.0 MIT https://github.com/sindresorhus/p-cancelable.git -p-cancelable 0.4.1 MIT https://github.com/sindresorhus/p-cancelable.git -p-event 2.3.1 MIT https://github.com/sindresorhus/p-event.git -p-event 1.3.0 MIT https://github.com/sindresorhus/p-event.git -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-limit 2.3.0 MIT https://github.com/sindresorhus/p-limit.git -p-locate 3.0.0 MIT https://github.com/sindresorhus/p-locate.git -p-locate 4.1.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 -p-reduce 1.0.0 MIT https://github.com/sindresorhus/p-reduce.git -p-timeout 1.2.1 MIT https://github.com/sindresorhus/p-timeout.git -p-timeout 2.0.1 MIT https://github.com/sindresorhus/p-timeout.git -p-try 2.2.0 MIT https://github.com/sindresorhus/p-try.git -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 5.1.0 MIT https://github.com/sindresorhus/parse-json.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-passwd 1.0.0 MIT https://github.com/doowb/parse-passwd.git -parse5 6.0.1 MIT git://github.com/inikulin/parse5.git -parse5-htmlparser2-tree-adapter 6.0.1 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 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 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 path-platform 0.11.15 MIT http://github.com/tjfontaine/node-path-platform.git -path-to-regexp 0.1.7 MIT https://github.com/component/path-to-regexp.git -path-type 3.0.0 MIT https://github.com/sindresorhus/path-type.git -path-type 1.1.0 MIT https://github.com/sindresorhus/path-type.git -path-type 4.0.0 MIT https://github.com/sindresorhus/path-type.git pathfinding 0.4.18 MIT git://github.com/qiao/PathFinding.js.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 3.0.0 MIT https://github.com/sindresorhus/pify.git -pify 2.3.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 -pkg-dir 3.0.0 MIT https://github.com/sindresorhus/pkg-dir.git -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.35 MIT https://github.com/postcss/postcss.git -postcss 7.0.27 MIT https://github.com/postcss/postcss.git postcss-calc 7.0.5 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 @@ -947,8 +436,6 @@ postcss-discard-comments 4.0.2 postcss-discard-duplicates 4.0.2 MIT https://github.com/cssnano/cssnano.git postcss-discard-empty 4.0.1 MIT https://github.com/cssnano/cssnano.git postcss-discard-overridden 4.0.1 MIT https://github.com/cssnano/cssnano.git -postcss-load-config 2.1.2 MIT https://github.com/postcss/postcss-load-config.git -postcss-loader 3.0.0 MIT https://github.com/postcss/postcss-loader.git postcss-merge-longhand 4.0.11 MIT https://github.com/cssnano/cssnano.git postcss-merge-rules 4.0.3 MIT https://github.com/cssnano/cssnano.git postcss-minify-font-values 4.0.2 MIT https://github.com/cssnano/cssnano.git @@ -974,456 +461,198 @@ postcss-svgo 4.0.2 postcss-unique-selectors 4.0.1 MIT https://github.com/cssnano/cssnano.git postcss-value-parser 3.3.1 MIT https://github.com/TrySound/postcss-value-parser.git postcss-value-parser 4.1.0 MIT https://github.com/TrySound/postcss-value-parser.git -prelude-ls 1.1.2 MIT git://github.com/gkz/prelude-ls.git -prepend-http 2.0.0 MIT https://github.com/sindresorhus/prepend-http.git -prepend-http 1.0.4 MIT https://github.com/sindresorhus/prepend-http.git 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 -pumpify 1.5.1 MIT git://github.com/mafintosh/pumpify +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 -punycode 1.3.2 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 3.1.0 MIT https://github.com/webpack-contrib/raw-loader.git react 16.14.0 MIT git+https://github.com/facebook/react.git react-dom 16.14.0 MIT git+https://github.com/facebook/react.git react-is 16.13.1 MIT https://github.com/facebook/react.git -react-test-renderer 16.14.0 MIT git+https://github.com/facebook/react.git react-to-print 2.12.1 MIT git+https://github.com/gregnb/react-to-print.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 2.3.7 MIT git://github.com/nodejs/readable-stream -readable-stream 1.1.14 MIT git://github.com/isaacs/readable-stream readable-stream 3.6.0 MIT git://github.com/nodejs/readable-stream readdirp 2.2.1 MIT git://github.com/paulmillr/readdirp.git -readdirp 3.5.0 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.2 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.13.7 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime regenerator-runtime 0.11.1 MIT https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime -regenerator-transform 0.14.5 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.1 MIT https://github.com/mathiasbynens/regexpu-core.git -regjsgen 0.5.2 MIT https://github.com/bnjmnt4n/regjsgen.git repeat-element 1.1.3 MIT https://github.com/jonschlinkert/repeat-element.git repeat-string 1.6.1 MIT https://github.com/jonschlinkert/repeat-string.git repeating 2.0.1 MIT https://github.com/sindresorhus/repeating.git -replace-ext 1.0.1 MIT https://github.com/gulpjs/replace-ext.git -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 -resize-observer-polyfill 1.5.1 MIT https://github.com/que-etc/resize-observer-polyfill.git -resolve 1.1.7 MIT git://github.com/substack/node-resolve.git resolve 1.19.0 MIT git://github.com/browserify/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 4.0.0 MIT https://github.com/sindresorhus/resolve-from.git +resolve 1.1.7 MIT git://github.com/substack/node-resolve.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 ret 0.1.15 MIT git://github.com/fent/ret.js.git -rfdc 1.1.4 MIT git+https://github.com/davidmarkclements/rfdc.git rgb-regex 1.0.1 MIT https://github.com/regexps/rgb-regex.git rgba-regex 1.0.0 MIT https://github.com/johnotander/rgba-regex.git ripemd160 2.0.2 MIT https://github.com/crypto-browserify/ripemd160 rollup 1.32.1 MIT https://github.com/rollup/rollup.git -run-async 2.4.1 MIT https://github.com/SBoudrias/run-async.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-buffer 5.1.2 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.30.0 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.1.1 MIT https://github.com/shakacode/sass-resources-loader.git scheduler 0.19.1 MIT https://github.com/facebook/react.git -schema-utils 0.3.0 MIT git+https://github.com/webpack-contrib/schema-utils.git -schema-utils 2.7.1 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.6 MIT https://github.com/cscott/seek-bzip.git +schema-utils 0.3.0 MIT git+https://github.com/webpack-contrib/schema-utils.git select2 4.0.13 MIT git://github.com/select2/select2.git -semver-regex 2.0.0 MIT https://github.com/sindresorhus/semver-regex.git -semver-truncate 1.1.2 MIT https://github.com/sindresorhus/semver-truncate.git -send 0.17.1 MIT https://github.com/pillarjs/send.git -serve-static 1.14.1 MIT https://github.com/expressjs/serve-static.git set-value 2.0.1 MIT https://github.com/jonschlinkert/set-value.git -setimmediate 1.0.5 MIT https://github.com/YuzuJS/setImmediate.git -shallow-clone 3.0.1 MIT https://github.com/jonschlinkert/shallow-clone.git shasum 1.0.2 MIT git://github.com/dominictarr/shasum.git -shebang-command 1.2.0 MIT https://github.com/kevva/shebang-command.git -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.3 MIT git+https://github.com/ljharb/side-channel.git simple-concat 1.0.1 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 -slice-ansi 2.1.0 MIT https://github.com/chalk/slice-ansi.git slickgrid 2.3.16 MIT git+https://github.com/6pac/SlickGrid.git snapdragon 0.8.2 MIT https://github.com/jonschlinkert/snapdragon.git snapdragon-node 2.1.1 MIT https://github.com/jonschlinkert/snapdragon-node.git snapdragon-util 3.0.1 MIT https://github.com/jonschlinkert/snapdragon-util.git -socket.io 2.1.1 MIT git://github.com/socketio/socket.io -socket.io-adapter 1.1.2 MIT git://github.com/socketio/socket.io-adapter.git -socket.io-client 2.1.1 MIT https://github.com/Automattic/socket.io-client.git -socket.io-parser 3.2.0 MIT https://github.com/Automattic/socket.io-parser.git -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 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 -spdx-expression-parse 3.0.1 MIT https://github.com/jslicense/spdx-expression-parse.js.git split-string 3.1.0 MIT https://github.com/jonschlinkert/split-string.git split.js 1.6.2 MIT https://github.com/nathancahill/split -squeak 1.3.0 MIT https://github.com/kevva/squeak.git stable 0.1.8 MIT https://github.com/Two-Screen/stable.git static-extend 0.1.2 MIT https://github.com/jonschlinkert/static-extend.git -statuses 1.5.0 MIT https://github.com/jshttp/statuses.git stream-browserify 2.0.2 MIT git://github.com/browserify/stream-browserify.git stream-combiner2 1.1.1 MIT git://github.com/substack/stream-combiner2.git -stream-each 1.2.3 MIT https://github.com/mafintosh/stream-each.git -stream-http 3.1.1 MIT git://github.com/jhiesey/stream-http.git stream-http 2.8.3 MIT git://github.com/jhiesey/stream-http.git -stream-shift 1.0.1 MIT https://github.com/mafintosh/stream-shift.git +stream-http 3.1.1 MIT git://github.com/jhiesey/stream-http.git 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.1.1 MIT git://github.com/nodejs/string_decoder.git string_decoder 1.3.0 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-width 2.1.1 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.3 MIT git+https://github.com/ljharb/String.prototype.matchAll.git -string.prototype.trim 1.2.3 MIT git://github.com/es-shims/String.prototype.trim.git +string_decoder 1.1.1 MIT git://github.com/nodejs/string_decoder.git string.prototype.trimend 1.0.3 MIT git://github.com/es-shims/String.prototype.trimEnd.git string.prototype.trimstart 1.0.3 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 4.0.0 MIT https://github.com/chalk/strip-ansi.git -strip-ansi 5.2.0 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 -strip-indent 1.0.1 MIT https://github.com/sindresorhus/strip-indent.git -strip-json-comments 2.0.1 MIT https://github.com/sindresorhus/strip-json-comments.git -strip-outer 1.0.1 MIT https://github.com/sindresorhus/strip-outer.git -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 2.0.0 MIT https://github.com/chalk/supports-color.git supports-color 7.2.0 MIT https://github.com/chalk/supports-color.git -supports-color 5.5.0 MIT https://github.com/chalk/supports-color.git supports-color 6.1.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 +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 svgo 1.3.2 MIT git://github.com/svg/svgo.git -svgpath 2.3.0 MIT https://github.com/fontello/svgpath.git syntax-error 1.4.0 MIT git://github.com/substack/node-syntax-error.git -tapable 1.1.3 MIT http://github.com/webpack/tapable.git -tar-stream 1.6.2 MIT git+https://github.com/mafintosh/tar-stream.git -temp-dir 1.0.0 MIT https://github.com/sindresorhus/temp-dir.git -tempfile 2.0.0 MIT https://github.com/sindresorhus/tempfile.git tempusdominus-bootstrap-4 5.39.0 MIT https://github.com/tempusdominus/bootstrap-4.git tempusdominus-core 5.19.0 MIT https://github.com/tempusdominus/core.git -terser-webpack-plugin 2.3.8 MIT https://github.com/webpack-contrib/terser-webpack-plugin.git -terser-webpack-plugin 1.4.5 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.12 MIT git://github.com/jryans/timers-browserify.git timsort 0.3.0 MIT https://github.com/mziccard/node-timsort.git tippy.js 6.2.7 MIT git+https://github.com/atomiks/tippyjs.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-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 -to-regex-range 5.0.1 MIT https://github.com/micromatch/to-regex-range.git -toidentifier 1.0.0 MIT https://github.com/component/toidentifier.git -transformation-matrix-js 2.7.6 MIT https://gitlab.com/epistemex/transformation-matrix-js.git -trim-newlines 1.0.0 MIT https://github.com/sindresorhus/trim-newlines.git -trim-repeated 1.0.0 MIT https://github.com/sindresorhus/trim-repeated.git trim-right 1.0.1 MIT https://github.com/sindresorhus/trim-right.git -tryer 1.0.1 MIT git+https://gitlab.com/philbooth/tryer.git -ttf2woff 2.0.1 MIT https://github.com/fontello/ttf2woff.git tty-browserify 0.0.1 MIT git://github.com/browserify/tty-browserify.git -tty-browserify 0.0.0 MIT git://github.com/substack/tty-browserify.git -type-check 0.3.2 MIT git://github.com/gkz/type-check.git -type-is 1.6.18 MIT https://github.com/jshttp/type-is.git typedarray 0.0.6 MIT git://github.com/substack/typedarray.git -ultron 1.1.1 MIT https://github.com/unshiftio/ultron umd 3.0.3 MIT https://github.com/ForbesLindesay/umd.git -unbzip2-stream 1.4.3 MIT https://github.com/regular/unbzip2-stream.git underscore 1.12.0 MIT git://github.com/jashkenas/underscore.git -unicode-canonical-property-names-ecmascript 1.0.4 MIT https://github.com/mathiasbynens/unicode-canonical-property-names-ecmascript.git -unicode-match-property-ecmascript 1.0.4 MIT https://github.com/mathiasbynens/unicode-match-property-ecmascript.git -unicode-match-property-value-ecmascript 1.2.0 MIT https://github.com/mathiasbynens/unicode-match-property-value-ecmascript.git -unicode-property-aliases-ecmascript 1.1.0 MIT https://github.com/mathiasbynens/unicode-property-aliases-ecmascript.git union-value 1.0.1 MIT https://github.com/jonschlinkert/union-value.git uniq 1.0.1 MIT git://github.com/mikolalysenko/uniq.git uniqs 2.0.0 MIT git://github.com/fgnass/uniqs.git -universalify 0.1.2 MIT git+https://github.com/RyanZim/universalify.git -unpipe 1.0.0 MIT https://github.com/stream-utils/unpipe.git unquote 1.1.1 MIT https://github.com/lakenen/node-unquote.git unset-value 1.0.0 MIT https://github.com/jonschlinkert/unset-value.git upath 1.2.0 MIT git://github.com/anodynos/upath urix 0.1.0 MIT https://github.com/lydell/urix.git url 0.11.0 MIT https://github.com/defunctzombie/node-url.git -url-loader 1.1.2 MIT https://github.com/webpack-contrib/url-loader.git -url-parse-lax 1.0.0 MIT https://github.com/sindresorhus/url-parse-lax.git -url-parse-lax 3.0.0 MIT https://github.com/sindresorhus/url-parse-lax.git -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.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 0.10.3 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 -uuid 3.4.0 MIT https://github.com/uuidjs/uuid.git -v8-compile-cache 2.2.0 MIT https://github.com/zertosh/v8-compile-cache.git -vary 1.1.2 MIT https://github.com/jshttp/vary.git vendors 1.0.4 MIT https://github.com/wooorm/vendors.git vm-browserify 1.1.2 MIT http://github.com/substack/vm-browserify.git -void-elements 2.0.1 MIT https://github.com/hemanth/void-elements.git watchify 3.11.1 MIT git://github.com/substack/watchify.git -watchpack 1.7.5 MIT https://github.com/webpack/watchpack.git -watchpack-chokidar2 2.0.1 MIT https://github.com/webpack/watchpack.git -webpack 4.44.2 MIT https://github.com/webpack/webpack.git -webpack-bundle-analyzer 3.9.0 MIT git+https://github.com/webpack-contrib/webpack-bundle-analyzer.git -webpack-cli 3.3.12 MIT https://github.com/webpack/webpack-cli.git -webpack-dev-middleware 3.7.3 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.2 MIT https://github.com/agoldis/webpack-require-from.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 -worker-farm 1.7.0 MIT https://github.com/rvagg/node-worker-farm.git -wrap-ansi 5.1.0 MIT https://github.com/chalk/wrap-ansi.git -write 1.0.3 MIT https://github.com/jonschlinkert/write.git -ws 3.3.3 MIT https://github.com/websockets/ws.git -ws 6.2.1 MIT https://github.com/websockets/ws.git -xmlhttprequest-ssl 1.5.5 MIT git://github.com/mjwwit/node-XMLHttpRequest.git xtend 4.0.2 MIT git://github.com/Raynos/xtend.git -yargs 13.3.2 MIT https://github.com/yargs/yargs.git -yarn-audit-html 1.4.0 MIT https://github.com/davityavryan/yarn-audit-html.git -yauzl 2.10.0 MIT https://github.com/thejoshwolfe/yauzl.git -yeast 0.1.2 MIT https://github.com/unshiftio/yeast.git @fortawesome/fontawesome-free 5.15.1 (CC-BY-4.0 AND OFL-1.1 AND MIT) https://github.com/FortAwesome/Font-Awesome -@webassemblyjs/helper-fsm 1.9.0 ISC Unknown -anymatch 3.1.1 ISC https://github.com/micromatch/anymatch +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 +eve 0.5.4 Apache-2.0 git@github.com:adobe-webplatform/eve.git +get-assigned-identifiers 1.2.0 Apache-2.0 https://github.com/goto-bus-stop/get-assigned-identifiers.git +paths-js 0.4.11 Apache-2.0 https://github.com/andreaferretti/paths-js.git +shasum-object 1.0.0 Apache-2.0 https://github.com/goto-bus-stop/shasum-object.git +snapsvg 0.5.1 Apache-2.0 git@github.com:adobe-webplatform/Snap.svg.git +undeclared-identifiers 1.1.3 Apache-2.0 https://github.com/goto-bus-stop/undeclared-identifiers.git anymatch 2.0.0 ISC https://github.com/micromatch/anymatch -aproba 1.2.0 ISC https://github.com/iarna/aproba boolbase 1.0.0 ISC https://github.com/fb55/boolbase browserify-sign 4.2.1 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 -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 -copy-concurrently 1.0.5 ISC git+https://github.com/npm/copy-concurrently.git electron-to-chromium 1.3.633 ISC https://github.com/kilian/electron-to-chromium/ -figgy-pudding 3.5.2 ISC https://github.com/npm/figgy-pudding -flatted 2.0.2 ISC git+https://github.com/WebReflection/flatted.git -fs-minipass 2.1.0 ISC git+https://github.com/npm/fs-minipass.git -fs-write-stream-atomic 1.0.10 ISC https://github.com/npm/fs-write-stream-atomic fs.realpath 1.0.0 ISC git+https://github.com/isaacs/fs.realpath.git -get-caller-file 2.0.5 ISC git+https://github.com/stefanpenner/get-caller-file.git glob 7.1.6 ISC git://github.com/isaacs/node-glob.git -glob-parent 5.1.1 ISC https://github.com/gulpjs/glob-parent.git glob-parent 3.1.0 ISC https://github.com/es128/glob-parent graceful-fs 4.2.4 ISC https://github.com/isaacs/node-graceful-fs -hosted-git-info 2.8.8 ISC git+https://github.com/npm/hosted-git-info.git icss-replace-symbols 1.1.0 ISC git+https://github.com/css-modules/icss-replace-symbols.git icss-utils 4.1.1 ISC git+https://github.com/css-modules/icss-utils.git -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.1 ISC git://github.com/isaacs/inherits inherits 2.0.4 ISC git://github.com/isaacs/inherits -ini 1.3.8 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 -karma-babel-preprocessor 8.0.1 ISC https://github.com/babel/karma-babel-preprocessor.git -lru-cache 5.1.1 ISC git://github.com/isaacs/node-lru-cache.git -lru-cache 4.1.5 ISC git://github.com/isaacs/node-lru-cache.git minimalistic-assert 1.0.1 ISC https://github.com/calvinmetcalf/minimalistic-assert.git minimatch 3.0.4 ISC git://github.com/isaacs/minimatch.git -minipass 3.1.3 ISC git+https://github.com/isaacs/minipass.git -minipass-collect 1.0.2 ISC Unknown -minipass-flush 1.0.5 ISC git+https://github.com/isaacs/minipass-flush.git -minipass-pipeline 1.2.4 ISC Unknown -move-concurrently 1.0.1 ISC git+https://github.com/npm/move-concurrently.git -mute-stream 0.0.7 ISC git://github.com/isaacs/mute-stream once 1.4.0 ISC git://github.com/isaacs/once parse-asn1 5.1.6 ISC git://github.com/crypto-browserify/parse-asn1.git postcss-modules-extract-imports 2.0.0 ISC https://github.com/css-modules/postcss-modules-extract-imports.git postcss-modules-scope 2.2.0 ISC https://github.com/css-modules/postcss-modules-scope.git postcss-modules-values 2.0.0 ISC git+https://github.com/css-modules/postcss-modules-values.git -promise-inflight 1.0.1 ISC git+https://github.com/iarna/promise-inflight.git -proto-list 1.2.4 ISC https://github.com/isaacs/proto-list -pseudomap 1.0.2 ISC git+https://github.com/isaacs/pseudomap.git remove-trailing-separator 1.1.0 ISC git+https://github.com/darsain/remove-trailing-separator.git -require-main-filename 2.0.0 ISC git+ssh://git@github.com/yargs/require-main-filename.git -rimraf 2.6.3 ISC git://github.com/isaacs/rimraf.git -rimraf 2.7.1 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 -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 -ssri 6.0.1 ISC https://github.com/zkat/ssri -ssri 7.1.0 ISC https://github.com/npm/ssri -unique-filename 1.1.1 ISC https://github.com/iarna/unique-filename.git -unique-slug 2.0.2 ISC git://github.com/iarna/unique-slug.git -which 1.3.1 ISC git://github.com/isaacs/node-which.git -which-module 2.0.0 ISC git+https://github.com/nexdrew/which-module.git +semver 6.3.0 ISC https://github.com/npm/node-semver wrappy 1.0.2 ISC https://github.com/npm/wrappy -y18n 4.0.1 ISC git@github.com:yargs/y18n.git -yallist 3.1.1 ISC git+https://github.com/isaacs/yallist.git -yallist 2.1.2 ISC git+https://github.com/isaacs/yallist.git -yallist 4.0.0 ISC git+https://github.com/isaacs/yallist.git -yaml 1.10.0 ISC https://github.com/eemeli/yaml.git -yargs-parser 13.1.2 ISC git@github.com:yargs/yargs-parser.git -@xtuc/ieee754 1.2.0 BSD-3-Clause git://github.com/feross/ieee754.git +atob 2.1.2 (MIT OR Apache-2.0) git://git.coolaj86.com/coolaj86/atob.js.git +JSONStream 1.3.5 (MIT OR Apache-2.0) git://github.com/dominictarr/JSONStream.git +caniuse-lite 1.0.30001170 CC-BY-4.0 https://github.com/ben-eb/caniuse-lite.git +css-select 2.1.0 BSD-2-Clause git://github.com/fb55/css-select.git +css-what 3.4.2 BSD-2-Clause https://github.com/fb55/css-what +domelementtype 2.1.0 BSD-2-Clause git://github.com/fb55/domelementtype.git +domelementtype 1.3.1 BSD-2-Clause git://github.com/fb55/domelementtype.git +domutils 1.7.0 BSD-2-Clause git://github.com/FB55/domutils.git +entities 2.1.0 BSD-2-Clause git://github.com/fb55/entities.git +esprima 4.0.1 BSD-2-Clause https://github.com/jquery/esprima.git +esutils 2.0.3 BSD-2-Clause http://github.com/estools/esutils.git +leaflet 1.7.1 BSD-2-Clause git://github.com/Leaflet/Leaflet.git +nth-check 1.0.2 BSD-2-Clause https://github.com/fb55/nth-check +uri-js 4.4.0 BSD-2-Clause http://github.com/garycourt/uri-js duplexer2 0.1.4 BSD-3-Clause https://github.com/deoxxa/duplexer2.git -duplexer3 0.1.4 BSD-3-Clause https://github.com/floatdrop/duplexer3.git -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.2.1 BSD-3-Clause git://github.com/feross/ieee754.git -istanbul-lib-coverage 1.2.1 BSD-3-Clause git@github.com:istanbuljs/istanbuljs.git istanbul-lib-coverage 3.0.0 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.git -istanbul-lib-instrument 4.0.3 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.git +istanbul-lib-coverage 1.2.1 BSD-3-Clause git@github.com:istanbuljs/istanbuljs.git istanbul-lib-instrument 1.10.2 BSD-3-Clause git@github.com:istanbuljs/istanbuljs.git +istanbul-lib-instrument 4.0.3 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.git istanbul-lib-report 3.0.0 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.git istanbul-lib-source-maps 4.0.0 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.git istanbul-reports 3.0.2 BSD-3-Clause git+ssh://git@github.com/istanbuljs/istanbuljs.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 4.0.0 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 source-map 0.5.7 BSD-3-Clause http://github.com/mozilla/source-map.git source-map 0.6.1 BSD-3-Clause http://github.com/mozilla/source-map.git source-map 0.5.0 BSD-3-Clause http://github.com/mozilla/source-map.git -sprintf-js 1.0.3 BSD-3-Clause https://github.com/alexei/sprintf.js.git sprintf-js 1.1.2 BSD-3-Clause https://github.com/alexei/sprintf.js.git -table 5.4.6 BSD-3-Clause https://github.com/gajus/table -@xtuc/long 4.2.2 Apache-2.0 https://github.com/dcodeIO/long.js.git -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 3.0.0 Apache-2.0 https://github.com/eslint/doctrine.git -doctrine 2.1.0 Apache-2.0 https://github.com/eslint/doctrine.git -ejs 3.0.2 Apache-2.0 git://github.com/mde/ejs.git -ejs 2.7.4 Apache-2.0 git://github.com/mde/ejs.git -eslint-visitor-keys 1.3.0 Apache-2.0 https://github.com/eslint/eslint-visitor-keys.git -eve 0.5.4 Apache-2.0 git@github.com:adobe-webplatform/eve.git -get-assigned-identifiers 1.2.0 Apache-2.0 https://github.com/goto-bus-stop/get-assigned-identifiers.git -log4js 4.5.1 Apache-2.0 https://github.com/log4js-node/log4js-node.git -paths-js 0.4.11 Apache-2.0 https://github.com/andreaferretti/paths-js.git -rxjs 6.6.3 Apache-2.0 https://github.com/reactivex/rxjs.git -shasum-object 1.0.0 Apache-2.0 https://github.com/goto-bus-stop/shasum-object.git -snapsvg 0.5.1 Apache-2.0 git@github.com:adobe-webplatform/Snap.svg.git -spdx-correct 3.1.1 Apache-2.0 https://github.com/jslicense/spdx-correct.js.git -tunnel-agent 0.6.0 Apache-2.0 https://github.com/mikeal/tunnel-agent -undeclared-identifiers 1.1.3 Apache-2.0 https://github.com/goto-bus-stop/undeclared-identifiers.git -validate-npm-package-license 3.0.4 Apache-2.0 https://github.com/kemitchell/validate-npm-package-license.js.git -atob 2.1.2 (MIT OR Apache-2.0) git://git.coolaj86.com/coolaj86/atob.js.git -JSONStream 1.3.5 (MIT OR Apache-2.0) git://github.com/dominictarr/JSONStream.git -callsite 1.0.0 MIT* Unknown -component-bind 1.0.0 MIT* https://github.com/component/bind.git -component-inherit 0.0.3 MIT* https://github.com/component/inherit.git -indexof 0.0.1 MIT* Unknown -object-component 0.0.3 MIT* Unknown -precond 0.2.3 MIT* https://github.com/MathieuTurcotte/node-precond.git -webcabin-docker 2.2.4-dev MIT* Unknown -caniuse-lite 1.0.30001170 CC-BY-4.0 https://github.com/ben-eb/caniuse-lite.git -cheerio-select-tmp 0.1.1 BSD-2-Clause git://github.com/cheeriojs/cheerio-select.git -css-select 2.1.0 BSD-2-Clause git://github.com/fb55/css-select.git -css-select 3.1.2 BSD-2-Clause git://github.com/fb55/css-select.git -css-what 3.4.2 BSD-2-Clause https://github.com/fb55/css-what -css-what 4.0.0 BSD-2-Clause https://github.com/fb55/css-what -domelementtype 1.3.1 BSD-2-Clause git://github.com/fb55/domelementtype.git -domelementtype 2.1.0 BSD-2-Clause git://github.com/fb55/domelementtype.git -domhandler 4.0.0 BSD-2-Clause git://github.com/fb55/domhandler.git -domutils 1.7.0 BSD-2-Clause git://github.com/FB55/domutils.git -domutils 2.4.4 BSD-2-Clause git://github.com/fb55/domutils.git -entities 2.1.0 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 -esprima 4.0.1 BSD-2-Clause https://github.com/jquery/esprima.git -esrecurse 4.3.0 BSD-2-Clause https://github.com/estools/esrecurse.git -estraverse 4.3.0 BSD-2-Clause http://github.com/estools/estraverse.git -estraverse 5.2.0 BSD-2-Clause http://github.com/estools/estraverse.git -esutils 2.0.3 BSD-2-Clause http://github.com/estools/esutils.git -http-cache-semantics 3.8.1 BSD-2-Clause https://github.com/pornel/http-cache-semantics.git -leaflet 1.7.1 BSD-2-Clause git://github.com/Leaflet/Leaflet.git -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 -nth-check 2.0.0 BSD-2-Clause https://github.com/fb55/nth-check -regjsparser 0.6.4 BSD-2-Clause git@github.com:jviereck/regjsparser.git -terser 4.8.0 BSD-2-Clause https://github.com/terser/terser -uri-js 4.4.0 BSD-2-Clause http://github.com/garycourt/uri-js +sprintf-js 1.0.3 BSD-3-Clause https://github.com/alexei/sprintf.js.git FileSaver 0.10.0 UNKNOWN Unknown heap 0.2.5 UNKNOWN git://github.com/qiao/heap.js.git -varstream 0.3.2 UNKNOWN http://github.com/nfroidure/VarStream.git -is-cwebp-readable 2.0.1 CC0-1.0 https://github.com/shinnn/is-cwebp-readable.git +jsonify 0.0.0 Public Domain http://github.com/substack/jsonify.git mdn-data 2.0.4 CC0-1.0 https://github.com/mdn/data.git mdn-data 2.0.14 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.7 CC0-1.0 https://github.com/jslicense/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 -opener 1.5.2 (WTFPL OR MIT) https://github.com/domenic/opener.git -path-is-inside 1.0.2 (WTFPL OR MIT) https://github.com/domenic/path-is-inside.git pako 1.0.11 (MIT AND Zlib) https://github.com/nodeca/pako.git +precond 0.2.3 MIT* https://github.com/MathieuTurcotte/node-precond.git +webcabin-docker 2.2.4-dev MIT* Unknown sha.js 2.4.11 (MIT AND BSD-3-Clause) git://github.com/crypto-browserify/sha.js.git -spdx-exceptions 2.3.0 CC-BY-3.0 https://github.com/kemitchell/spdx-exceptions.json.git tablesorter 2.31.3 (MIT OR GPL-2.0) git://github.com/Mottie/tablesorter.git -tslib 1.14.1 0BSD https://github.com/Microsoft/tslib.git -xmldom 0.1.31 (LGPL-2.0 or MIT) git://github.com/xmldom/xmldom.git -1365 dependencies listed. +591 dependencies listed. diff --git a/Make.bat b/Make.bat index 052ba3353..8d940ff9b 100644 --- a/Make.bat +++ b/Make.bat @@ -3,6 +3,7 @@ SETLOCAL SET WD=%CD% SET "BUILDROOT=%WD%\win-build" +SET "TMPDIR=%WD%\win-temp" SET "DISTROOT=%WD%\dist" SET CMDOPTIONS="" @@ -18,19 +19,13 @@ IF "%1" == "clean" ( EXIT /B %ERRORLEVEL% ) -set "ARCHITECTURE=x64" -if "%Platform%" == "X86" ( - set "ARCHITECTURE=x86" -) - REM Main build sequence CALL :SET_ENVIRONMENT CALL :VALIDATE_ENVIRONMENT || EXIT /B 1 CALL :CLEAN || EXIT /B 1 CALL :CREATE_VIRTUAL_ENV || EXIT /B 1 -CALL :CREATE_RUNTIME_ENV || EXIT /B 1 CALL :CREATE_PYTHON_ENV || EXIT /B 1 -CALL :CLEANUP_ENV || EXIT /B 1 +CALL :CREATE_RUNTIME_ENV || EXIT /B 1 CALL :CREATE_INSTALLER || EXIT /B 1 CALL :SIGN_INSTALLER || EXIT /B 1 @@ -42,7 +37,10 @@ REM Main build sequence Ends ECHO Removing build directory... IF EXIST "%BUILDROOT%" RD "%BUILDROOT%" /S /Q > nul || EXIT /B 1 - ECHO Removing temp build directory... + ECHO Removing tmp directory... + IF EXIST "%TMPDIR%" RD "%TMPDIR%" /S /Q > nul || EXIT /B 1 + + ECHO Removing installer build directory... IF EXIST "%WD%\pkg\win32\Output" rd "%WD%\pkg\win32\Output" /S /Q > nul || EXIT /B 1 ECHO Removing installer configuration script... @@ -54,7 +52,6 @@ REM Main build sequence Ends :SET_ENVIRONMENT ECHO Configuring the environment... IF "%PGADMIN_PYTHON_DIR%" == "" SET "PGADMIN_PYTHON_DIR=C:\Python38" - IF "%PGADMIN_QT_DIR%" == "" SET "PGADMIN_QT_DIR=C:\Qt\5.14.2\msvc2017_64" IF "%PGADMIN_KRB5_DIR%" == "" SET "PGADMIN_KRB5_DIR=C:\Program Files\MIT\Kerberos" IF "%PGADMIN_POSTGRES_DIR%" == "" SET "PGADMIN_POSTGRES_DIR=C:\Program Files (x86)\PostgreSQL\12" IF "%PGADMIN_INNOTOOL_DIR%" == "" SET "PGADMIN_INNOTOOL_DIR=C:\Program Files (x86)\Inno Setup 6" @@ -62,7 +59,7 @@ REM Main build sequence Ends IF "%PGADMIN_SIGNTOOL_DIR%" == "" SET "PGADMIN_SIGNTOOL_DIR=C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64" REM Set REDIST_NAME (the filename) - set "VCREDIST_FILE=vcredist_%ARCHITECTURE%.exe" + set "VCREDIST_FILE=vcredist_x64.exe" REM Set additional variables we need FOR /F "tokens=3" %%a IN ('findstr /C:"APP_RELEASE =" %WD%\web\config.py') DO SET APP_MAJOR=%%a @@ -74,13 +71,13 @@ REM Main build sequence Ends FOR /F "tokens=2* DELims='" %%a IN ('findstr /C:"APP_NAME =" web\config.py') DO SET APP_NAME=%%a FOR /f "tokens=1 DELims=." %%G IN ('%PGADMIN_PYTHON_DIR%/python.exe -c "print('%APP_NAME%'.lower().replace(' ', ''))"') DO SET APP_SHORTNAME=%%G SET APP_VERSION=%APP_MAJOR%.%APP_MINOR% - SET INSTALLERNAME=%APP_SHORTNAME%-%APP_MAJOR%.%APP_MINOR%-%APP_VERSION_SUFFIX%-%ARCHITECTURE%.exe - IF "%APP_VERSION_SUFFIX%" == "" SET INSTALLERNAME=%APP_SHORTNAME%-%APP_MAJOR%.%APP_MINOR%-%ARCHITECTURE%.exe + SET INSTALLERNAME=%APP_SHORTNAME%-%APP_MAJOR%.%APP_MINOR%-%APP_VERSION_SUFFIX%-x64.exe + IF "%APP_VERSION_SUFFIX%" == "" SET INSTALLERNAME=%APP_SHORTNAME%-%APP_MAJOR%.%APP_MINOR%-x64.exe REM get Python version for the runtime build ex. 2.7.1 will be 27 FOR /f "tokens=1 DELims=." %%G IN ('%PGADMIN_PYTHON_DIR%/python.exe -c "import sys; print(sys.version.split(' ')[0])"') DO SET PYTHON_MAJOR=%%G FOR /f "tokens=2 DELims=." %%G IN ('%PGADMIN_PYTHON_DIR%/python.exe -c "import sys; print(sys.version.split(' ')[0])"') DO SET PYTHON_MINOR=%%G - SET "PYTHON_VERSION=%PYTHON_MAJOR%%PYTHON_MINOR%" + FOR /f "tokens=3 DELims=." %%G IN ('%PGADMIN_PYTHON_DIR%/python.exe -c "import sys; print(sys.version.split(' ')[0])"') DO SET PYTHON_REVISION=%%G EXIT /B 0 @@ -94,10 +91,8 @@ REM Main build sequence Ends ECHO Installer name: %INSTALLERNAME% ECHO. ECHO Python directory: %PGADMIN_PYTHON_DIR% - ECHO Python DLL: %PGADMIN_PYTHON_DIR%\Python%PYTHON_VERSION%.dll - ECHO Python version: %PYTHON_MAJOR%.%PYTHON_MINOR% + ECHO Python version: %PYTHON_MAJOR%.%PYTHON_MINOR%.%PYTHON_REVISION% ECHO. - ECHO Qt directory: %PGADMIN_QT_DIR% ECHO KRB5 directory: %PGADMIN_KRB5_DIR% ECHO PostgreSQL directory: %PGADMIN_POSTGRES_DIR% ECHO. @@ -125,36 +120,18 @@ REM Main build sequence Ends EXIT /B 1 ) - IF NOT EXIST "%PGADMIN_QT_DIR%" ( - ECHO !PGADMIN_QT_DIR! does not exist. - ECHO Please install Qt and set the PGADMIN_QT_DIR environment variable. - EXIT /B 1 - ) - IF NOT EXIST "%PGADMIN_KRB5_DIR%" ( ECHO !PGADMIN_KRB5_DIR! does not exist. ECHO Please install MIT Kerberos for Windows and set the PGADMIN_KRB5_DIR environment variable. EXIT /B 1 ) - IF NOT EXIST "%PGADMIN_QT_DIR%\bin\qmake.exe" ( - ECHO !QMAKE! does not exist. - ECHO Please install Qt and set the PGADMIN_QT_DIR environment variable. - EXIT /B 1 - ) - IF NOT EXIST "%PGADMIN_PYTHON_DIR%" ( ECHO !PGADMIN_PYTHON_DIR! does not exist. ECHO Please install Python and set the PGADMIN_PYTHON_DIR environment variable. EXIT /B 1 ) - IF NOT EXIST "%PGADMIN_PYTHON_DIR%\Python%PYTHON_VERSION%.dll" ( - ECHO !PGADMIN_PYTHON_DIR!\Python!PYTHON_VERSION!.dll does not exist. - ECHO Please check your Python installation is complete. - EXIT /B 1 - ) - IF NOT EXIST "%PGADMIN_POSTGRES_DIR%" ( ECHO !PGADMIN_POSTGRES_DIR! does not exist. ECHO Please install PostgreSQL and set the PGADMIN_POSTGRES_DIR environment variable. @@ -174,47 +151,75 @@ REM Main build sequence Ends :CREATE_VIRTUAL_ENV ECHO Creating virtual environment... - IF NOT EXIST "%BUILDROOT%" MKDIR "%BUILDROOT%" - - CD "%BUILDROOT%" + IF NOT EXIST "%TMPDIR%" MKDIR "%TMPDIR%" + + CD "%TMPDIR%" REM Note that we must use virtualenv.exe here, as the venv module doesn't allow python.exe to relocate. "%PGADMIN_PYTHON_DIR%\Scripts\virtualenv.exe" venv - XCOPY /S /I /E /H /Y "%PGADMIN_PYTHON_DIR%\DLLs" "%BUILDROOT%\venv\DLLs" > nul || EXIT /B 1 - XCOPY /S /I /E /H /Y "%PGADMIN_PYTHON_DIR%\Lib" "%BUILDROOT%\venv\Lib" > nul || EXIT /B 1 + XCOPY /S /I /E /H /Y "%PGADMIN_PYTHON_DIR%\DLLs" "%TMPDIR%\venv\DLLs" > nul || EXIT /B 1 + XCOPY /S /I /E /H /Y "%PGADMIN_PYTHON_DIR%\Lib" "%TMPDIR%\venv\Lib" > nul || EXIT /B 1 - ECHO Activating virtual environment - %BUILDROOT%\venv... - CALL "%BUILDROOT%\venv\Scripts\activate" || EXIT /B 1 + ECHO Activating virtual environment - %TMPDIR%\venv... + CALL "%TMPDIR%\venv\Scripts\activate" || EXIT /B 1 ECHO Installing dependencies... - CALL pip install -r "%WD%\requirements.txt" || EXIT /B 1 - CALL pip install sphinx || EXIT /B 1 - - REM If this is Python 3.6+, we need to remove the hack above or it will break qmake. Sigh. - IF %PYTHON_VERSION% GEQ 36 SET CL= + CALL pip install --upgrade pip + CALL pip install --only-binary=cryptography -r "%WD%\requirements.txt" || EXIT /B 1 CD %WD% EXIT /B 0 +:CREATE_PYTHON_ENV + ECHO Staging Python... + MKDIR "%BUILDROOT%\python\Lib" || EXIT /B 1 + + ECHO Downloading embedded Python... + REM Get the python embeddable and extract it to %BUILDROOT%\python + CD "%TMPDIR% + %PGADMIN_PYTHON_DIR%\python -c "import sys; from urllib.request import urlretrieve; urlretrieve('https://www.python.org/ftp/python/' + sys.version.split(' ')[0] + '/python-' + sys.version.split(' ')[0] + '-embed-amd64.zip', 'python-embedded.zip')" || EXIT /B 1 + %PGADMIN_PYTHON_DIR%\python -c "import zipfile; z = zipfile.ZipFile('python-embedded.zip', 'r'); z.extractall('../win-build/python/')" || EXIT /B 1 + + ECHO Copying site-packages... + XCOPY /S /I /E /H /Y "%TMPDIR%\venv\Lib\site-packages" "%BUILDROOT%\python\Lib\site-packages" > nul || EXIT /B 1 + + REM NOTE: There is intentionally no space after "site" in the line below, to prevent Python barfing if there's one in the file + ECHO import site>> "%BUILDROOT%\python\python%PYTHON_MAJOR%%PYTHON_MINOR%._pth" + + ECHO Staging Kerberos components... + COPY "%PGADMIN_KRB5_DIR%\bin\kinit.exe" "%BUILDROOT%\python" > nul || EXIT /B 1 + COPY "%PGADMIN_KRB5_DIR%\bin\krb5_64.dll" "%BUILDROOT%\python" > nul || EXIT /B 1 + COPY "%PGADMIN_KRB5_DIR%\bin\comerr64.dll" "%BUILDROOT%\python" > nul || EXIT /B 1 + COPY "%PGADMIN_KRB5_DIR%\bin\k5sprt64.dll" "%BUILDROOT%\python" > nul || EXIT /B 1 + COPY "%PGADMIN_KRB5_DIR%\bin\gssapi64.dll" "%BUILDROOT%\python" > nul || EXIT /B 1 + + ECHO Cleaning up unnecessary .pyc and .pyo files... + FOR /R "%BUILDROOT%\python" %%f in (*.pyc *.pyo) do DEL /q "%%f" 1> nul 2>&1 + ECHO Removing tests... + FOR /R "%BUILDROOT%\python\Lib" %%f in (test tests) do RD /Q /S "%%f" 1> nul 2>&1 + + EXIT /B 0 + + :CREATE_RUNTIME_ENV + IF NOT EXIST "%BUILDROOT%" MKDIR "%BUILDROOT%" MKDIR "%BUILDROOT%\runtime" - CD "%WD%\web" - - ECHO Installing javascript dependencies... - CALL yarn install || EXIT /B 1 - - ECHO Bundling javascript... - CALL yarn run bundle || EXIT /B 1 - ECHO Removing webpack caches... RD /Q /S "%WD%\web\pgadmin\static\js\generated\.cache" 1> nul 2>&1 ECHO Copying web directory... XCOPY /S /I /E /H /Y "%WD%\web" "%BUILDROOT%\web" > nul || EXIT /B 1 + ECHO Installing javascript dependencies... + CD "%BUILDROOT%\web" + CALL yarn install || EXIT /B 1 + + ECHO Bundling javascript... + CALL yarn run bundle || EXIT /B 1 + ECHO Cleaning up unnecessary .pyc and .pyo files... FOR /R "%BUILDROOT%\web" %%f in (*.pyc *.pyo) do DEL /q "%%f" 1> nul 2>&1 ECHO Removing tests, Python caches and node modules... @@ -240,60 +245,34 @@ REM Main build sequence Ends ECHO } >> "%BUILDROOT%\web\config_distro.py" ECHO Building docs... + CALL pip install sphinx || EXIT /B 1 MKDIR "%BUILDROOT%\docs\en_US\html" CD "%WD%\docs\en_US" - CALL "%BUILDROOT%\venv\Scripts\python.exe" build_code_snippet.py || EXIT /B 1 - CALL "%BUILDROOT%\venv\Scripts\sphinx-build.exe" "%WD%\docs\en_US" "%BUILDROOT%\docs\en_US\html" || EXIT /B 1 + CALL "%TMPDIR%\venv\Scripts\python.exe" build_code_snippet.py || EXIT /B 1 + CALL "%TMPDIR%\venv\Scripts\sphinx-build.exe" "%WD%\docs\en_US" "%BUILDROOT%\docs\en_US\html" || EXIT /B 1 - ECHO Removing Sphinx - CALL pip uninstall -y sphinx Pygments alabaster colorama docutils imagesize requests snowballstemmer + ECHO Staging runtime components... + XCOPY /S /I /E /H /Y "%WD%\runtime\assets" "%BUILDROOT%\runtime\assets" > nul || EXIT /B 1 + XCOPY /S /I /E /H /Y "%WD%\runtime\src" "%BUILDROOT%\runtime\src" > nul || EXIT /B 1 - ECHO Assembling runtime environment... - CD "%WD%\runtime" + COPY "%WD%\runtime\package.json" "%BUILDROOT%\runtime\" > nul || EXIT /B 1 + CD "%BUILDROOT%\runtime\" + CALL yarn install --production=true || EXIT /B 1 - ECHO Running qmake... - CALL set "PGADMIN_PYTHON_DIR=%PGADMIN_PYTHON_DIR%" && "%PGADMIN_QT_DIR%\bin\qmake.exe" || EXIT /B 1 + ECHO Downloading NWjs to %TMPDIR%... + CALL yarn --cwd "%TMPDIR%" add nw || EXIT /B - ECHO Cleaning the build directory... - CALL nmake clean || EXIT /B 1 + XCOPY /S /I /E /H /Y "%TMPDIR%\node_modules\nw\nwjs\*" "%BUILDROOT%\runtime" > nul || EXIT /B 1 + MOVE "%BUILDROOT%\runtime\nw.exe" "%BUILDROOT%\runtime\pgAdmin4.exe" - ECHO Running make... - CALL nmake || EXIT /B 1 - - ECHO Staging pgAdmin4.exe... - COPY "%WD%\runtime\release\pgAdmin4.exe" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - - ECHO Staging Qt components... - COPY "%PGADMIN_QT_DIR%\bin\Qt5Core.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_QT_DIR%\bin\Qt5Gui.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_QT_DIR%\bin\Qt5Widgets.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_QT_DIR%\bin\Qt5Network.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_QT_DIR%\bin\Qt5Svg.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - MKDIR "%BUILDROOT%\runtime\platforms" > nul || EXIT /B 1 - COPY "%PGADMIN_QT_DIR%\plugins\platforms\qwindows.dll" "%BUILDROOT%\runtime\platforms" > nul || EXIT /B 1 - MKDIR "%BUILDROOT%\runtime\imageformats" > nul || EXIT /B 1 - COPY "%PGADMIN_QT_DIR%\plugins\imageformats\qsvg.dll" "%BUILDROOT%\runtime\imageformats" > nul || EXIT /B 1 - ECHO [Paths] > "%BUILDROOT%\runtime\qt.conf" - ECHO Plugins=plugins >> "%BUILDROOT%\runtime\qt.conf" - - ECHO Staging Kerberos components... - IF "%ARCHITECTURE%" == "x64" ( - COPY "%PGADMIN_KRB5_DIR%\bin\kinit.exe" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_KRB5_DIR%\bin\krb5_64.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_KRB5_DIR%\bin\comerr64.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_KRB5_DIR%\bin\k5sprt64.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_KRB5_DIR%\bin\gssapi64.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - ) + ECHO Replacing executable icon... + CALL yarn --cwd "%TMPDIR%" add winresourcer || EXIT /B + "%TMPDIR%\node_modules\winresourcer\bin\Resourcer.exe" -op:upd -src:"%BUILDROOT%\runtime\pgAdmin4.exe" -type:Icongroup -name:IDR_MAINFRAME -file:"%WD%\pkg\win32\Resources\pgAdmin4.ico" ECHO Staging PostgreSQL components... COPY "%PGADMIN_POSTGRES_DIR%\bin\libpq.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - IF "%ARCHITECTURE%" == "x64" ( - COPY "%PGADMIN_POSTGRES_DIR%\bin\libcrypto-1_1-x64.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_POSTGRES_DIR%\bin\libssl-1_1-x64.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - ) ELSE ( - COPY "%PGADMIN_POSTGRES_DIR%\bin\libcrypto-1_1.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY "%PGADMIN_POSTGRES_DIR%\bin\libssl-1_1.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 - ) + COPY "%PGADMIN_POSTGRES_DIR%\bin\libcrypto-1_1-x64.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 + COPY "%PGADMIN_POSTGRES_DIR%\bin\libssl-1_1-x64.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 IF EXIST "%PGADMIN_POSTGRES_DIR%\bin\libintl-*.dll" COPY "%PGADMIN_POSTGRES_DIR%\bin\libintl-*.dll" "%BUILDROOT%\runtime" > nul IF EXIST "%PGADMIN_POSTGRES_DIR%\bin\libiconv-*.dll" COPY "%PGADMIN_POSTGRES_DIR%\bin\libiconv-*.dll" "%BUILDROOT%\runtime" > nul COPY "%PGADMIN_POSTGRES_DIR%\bin\zlib.dll" "%BUILDROOT%\runtime" > nul || EXIT /B 1 @@ -308,22 +287,6 @@ REM Main build sequence Ends CD %WD% EXIT /B 0 - - -:CREATE_PYTHON_ENV - ECHO Staging Python... - COPY %PGADMIN_PYTHON_DIR%\python%PYTHON_VERSION%.dll "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY %PGADMIN_PYTHON_DIR%\python.exe "%BUILDROOT%\runtime" > nul || EXIT /B 1 - COPY %PGADMIN_PYTHON_DIR%\pythonw.exe "%BUILDROOT%\runtime" > nul || EXIT /B 1 - - ECHO Cleaning up unnecessary .pyc and .pyo files... - FOR /R "%BUILDROOT%\venv" %%f in (*.pyc *.pyo) do DEL /q "%%f" 1> nul 2>&1 - ECHO Removing tests... - FOR /R "%BUILDROOT%\venv\Lib" %%f in (test tests) do RD /Q /S "%%f" 1> nul 2>&1 - ECHO Removing TCL... - RD /Q /S "%BUILDROOT%\venv\tcl" 1> nul 2>&1 - - EXIT /B 0 :CREATE_INSTALLER @@ -339,12 +302,7 @@ REM Main build sequence Ends CALL "%PGADMIN_PYTHON_DIR%\python" "%WD%\pkg\win32\replace.py" "-i" "%WD%\pkg\win32\installer.iss.in" "-o" "%WD%\pkg\win32\installer.iss.in_stage1" "-s" MYAPP_NAME -r """%APP_NAME%""" CALL "%PGADMIN_PYTHON_DIR%\python" "%WD%\pkg\win32\replace.py" "-i" "%WD%\pkg\win32\installer.iss.in_stage1" "-o" "%WD%\pkg\win32\installer.iss.in_stage2" "-s" MYAPP_FULLVERSION -r """%APP_VERSION%""" CALL "%PGADMIN_PYTHON_DIR%\python" "%WD%\pkg\win32\replace.py" "-i" "%WD%\pkg\win32\installer.iss.in_stage2" "-o" "%WD%\pkg\win32\installer.iss.in_stage3" "-s" MYAPP_VERSION -r """v%APP_MAJOR%""" - - SET ARCMODE= - IF "%ARCHITECTURE%" == "x64" ( - set ARCMODE="x64" - ) - CALL "%PGADMIN_PYTHON_DIR%\python" "%WD%\pkg\win32\replace.py" "-i" "%WD%\pkg\win32\installer.iss.in_stage3" "-o" "%WD%\pkg\win32\installer.iss.in_stage4" "-s" MYAPP_ARCHITECTURESMODE -r """%ARCMODE%""" + CALL "%PGADMIN_PYTHON_DIR%\python" "%WD%\pkg\win32\replace.py" "-i" "%WD%\pkg\win32\installer.iss.in_stage3" "-o" "%WD%\pkg\win32\installer.iss.in_stage4" "-s" MYAPP_ARCHITECTURESMODE -r """x64""" CALL "%PGADMIN_PYTHON_DIR%\python" "%WD%\pkg\win32\replace.py" "-i" "%WD%\pkg\win32\installer.iss.in_stage4" "-o" "%WD%\pkg\win32\installer.iss" "-s" MYAPP_VCDIST -r """%PGADMIN_VCREDIST_DIRNAME%\%VCREDIST_FILE%""" ECHO Cleaning up... @@ -377,14 +335,6 @@ REM Main build sequence Ends EXIT /B 0 -:CLEANUP_ENV - ECHO Cleaning the build environment... - RD "%BUILDROOT%\venv\Include" /S /Q 1> nul 2>&1 - DEL /s "%BUILDROOT%\venv\pip-selfcheck.json" 1> nul 2>&1 - - EXIT /B 0 - - :USAGE ECHO Invalid command line options. ECHO Usage: "Make.bat [clean]" diff --git a/Makefile b/Makefile index 917c14d3c..0b4d1a7fd 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ APP_REVISION := $(shell grep ^APP_REVISION web/config.py | awk -F"=" '{print $$N # Include only platform-independent builds in all all: docs pip src runtime -appbundle: docs +appbundle: ./pkg/mac/build.sh install-node: diff --git a/README b/README index 745e4cf5f..8c26c0733 100644 --- a/README +++ b/README @@ -17,59 +17,32 @@ utilised. Although developed using web technologies, pgAdmin 4 can be deployed either on a web server using a browser, or standalone on a workstation. The runtime/ -subdirectory contains a QT based runtime application intended to allow this - -it is essentially a Python application server that runs in the system tray -and allows the user to connect to the application using their web browser. +subdirectory contains an NWjs based runtime application intended to allow this, +which will execute the Python server and display the UI. Building the Runtime -------------------- To build the runtime, the following packages must be installed: -- QT 5 (Use the VC++ build on Windows, not MinGW). -- Python 3.4+ +- NodeJS 12+ +- Yarn -An environment variable named PGADMIN_PYTHON_DIR must be set to the directory -in which Python has been installed, for example: +Change into the runtime directory, and run "yarn install". This will install the +dependencies required. -- /usr -- /usr/local/python-3.8 -- C:\Python38 +In order to use the runtime in a development environment, you'll need to copy +dev_config.json.in file to dev_config.json, and edit the paths to the Python +executable and pgAdmin.py file, otherwise the runtime will use the default +paths it would expect to find in the standard package for your platform. -Assuming both qmake is in the path: +You can then execute the runtime by running something like: - dpage@hal:~/git/pgadmin4$ cd runtime - dpage@hal:~/git/pgadmin4/runtime$ export PGADMIN_PYTHON_DIR=/opt/local - dpage@hal:~/git/pgadmin4/runtime$ qmake - Project MESSAGE: ================================== - Project MESSAGE: Configuring the pgAdmin 4 runtime. - Project MESSAGE: ================================== - Project MESSAGE: Qt version: 5 - Project MESSAGE: Platform: macOS - Project MESSAGE: Python executable: /opt/local/bin/python3 - Project MESSAGE: Python version: 3.8 (38) - Project MESSAGE: Python config: /opt/local/bin/python3-config - Project MESSAGE: CXXFLAGS: -pipe -stdlib=libc++ -I/opt/local/Library/Frameworks/Python.framework/Versions/3.8/include/python3.8 -I/opt/local/Library/Frameworks/Python.framework/Versions/3.8/include/python3.8 - Project MESSAGE: LDFLAGS: -stdlib=libc++ -L/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/config-3.8-darwin -ldl -framework CoreFoundation - Project MESSAGE: LIBS: -lpython3.8 -ldl -framework CoreFoundation - dpage@hal:~/git/pgadmin4/runtime$ make - ... +node_modules/nw/nwjs/nw . -To build the runtime in debug mode, use the option below with qmake: -$ qmake CONFIG+=debug +or on macOS: -To build the runtime in release mode, use the option below with qmake: -$ qmake CONFIG+=release - -By default, the runtime application will be built in release mode. - -On Linux, an executable called 'pgAdmin4' will be built, on Windows, -'pgAdmin4.exe', and on Mac OS X, an app bundle called pgAdmin4.app will be -created. - -You can also use Qt Creator to build, develop and debug the runtime. Simply -open the $PGADMIN4_SRC/runtime/pgAdmin4.pro project file in Qt Creator and -configure the project with a supported version of Qt when prompted. +node_modules/nw/nwjs/nwjs.app/Contents/MacOS/nwjs . Create Database Migrations -------------------------- @@ -92,7 +65,7 @@ Configuring the Python Environment ---------------------------------- In order to run the Python code, a suitable runtime environment is required. -Python version 3.4 and later are currently supported. It is recommended that a +Python version 3.5 and later are currently supported. It is recommended that a Python Virtual Environment is setup for this purpose, rather than using the system Python environment. On Linux and Mac systems, the process is fairly simple - adapt as required for your distribution: @@ -231,33 +204,6 @@ entries to make them available in preferences. The name of the theme is derived from the directory name. Underscores (_) and hyphens (-) will be replaced with spaces and the result will be camel cased. -Configuring the Runtime ------------------------ - -The pgAdmin 4 Runtime maintains it's own Python Path to avoid conflicts with -packages or other issues in the system Python installation. It will also search -a number of known locations for the pgAdmin4.py file needed to run pgAdmin -(including relative locations in a source code tree), however you can specify -an alternate path if needed. - -If either a working environment or pgAdmin4.py cannot be found at startup, the -runtime will prompt for the locations. Alternatively, you can click the try -icon and select the Configuration option to open the configuration dialogue. - -On a Linux/Mac system, the Python Path will typically consist of a single path -to the virtual environment's site-packages directory, e.g. - - /Users//.virtualenvs/pgadmin4/lib/python3.8/site-packages - -On Windows, multiple paths are likely to be required, e.g. - - C:\Users\dpage\.virtualenvs\pgadmin4\Lib\site-packages;C:\Users\dpage\.virtualenvs\pgadmin4\Lib;C:\Users\dpage\.virtualenvs\pgadmin4\Lib\lib-tk;C:\Users\dpage\.virtualenvs\pgadmin4\DLLs - -If you wish to specify a specific copy of the Python code to run, you can set -the Application Path to a directory containing pgAdmin4.py, e.g. - - /Users//git/pgadmin4-test/web/ - Building the documentation -------------------------- diff --git a/docs/en_US/code_overview.rst b/docs/en_US/code_overview.rst index c3cf2d8a7..dab80e88a 100644 --- a/docs/en_US/code_overview.rst +++ b/docs/en_US/code_overview.rst @@ -7,14 +7,14 @@ The bulk of pgAdmin is a Python web application written using the Flask framework on the backend, and HTML5 with CSS3, Bootstrap and jQuery on the front end. A desktop runtime is also included for users that prefer a desktop application to -a web application, which is written in C++ using the QT framework. +a web application, which is written using NWjs (Node Webkit). Runtime ******* -The runtime is essentially a Python webserver and browser in a box. Found in the -**/runtime** directory in the source tree, it is a relatively simple QT -application that is most easily modified using the **QT Creator** application. +The runtime is based on NWjs which integrates a browser and the Python server +creating a standalone application. The source code can be found in the +**/runtime** directory in the source tree. Web Application *************** @@ -213,4 +213,4 @@ divided each module in small chunks as much as possible. Not all javascript modules are required to be loaded (i.e. loading a javascript module for database will make sense only when a server node is loaded completely.) Please look at the the javascript files node.js, browser.js, menu.js, panel.js, etc for -better understanding of the code. \ No newline at end of file +better understanding of the code. diff --git a/docs/en_US/coding_standards.rst b/docs/en_US/coding_standards.rst index d8d090183..a418df29d 100644 --- a/docs/en_US/coding_standards.rst +++ b/docs/en_US/coding_standards.rst @@ -109,54 +109,6 @@ names. .. note:: From version 3.0 onwards, new or refactored code should be written using ES6 features and conventions. -C++ -*** - -C++ code is used in the desktop runtime for the application, primarily with the -QT framework and an embedded Python interpreter. Note the use of hanging braces, -which may be omitted if on a single statement is present: - -.. code-block:: c++ - - // Ping the application server to see if it's alive - bool PingServer(QUrl url) - { - QNetworkAccessManager manager; - QEventLoop loop; - QNetworkReply *reply; - QVariant redirectUrl; - - url.setPath("/utils/ping"); - - do - { - reply = manager.get(QNetworkRequest(url)); - - QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); - loop.exec(); - - redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); - url = redirectUrl.toUrl(); - - if (!redirectUrl.isNull()) - delete reply; - - } while (!redirectUrl.isNull()); - - if (reply->error() != QNetworkReply::NoError) - return false; - - QString response = reply->readAll(); - - if (response != "PING") - { - qDebug() << "Failed to connect, server response: " << response; - return false; - } - - return true; - } - Python ****** diff --git a/docs/en_US/desktop_deployment.rst b/docs/en_US/desktop_deployment.rst index 3453ab73e..20a257cfa 100644 --- a/docs/en_US/desktop_deployment.rst +++ b/docs/en_US/desktop_deployment.rst @@ -8,13 +8,8 @@ pgAdmin may be deployed as a desktop application by configuring the application to run in desktop mode and then utilising the desktop runtime to host the program on a supported Windows, Mac OS X or Linux installation. -The desktop runtime is a system-tray application that when launched, runs the -pgAdmin server and launches a web browser to render the user interface. If -additional instances of pgAdmin are launched, a new browser tab will be opened -and be served by the existing instance of the server in order to minimise system -resource utilisation. Clicking the icon in the system tray will present a menu -offering options to open a new pgAdmin window, configure the runtime, view the -server log and shut down the server. +The desktop runtime is a standalone application that when launched, runs the +pgAdmin server and opens a window to render the user interface. .. note:: Pre-compiled and configured installation packages are available for a number of platforms. These packages should be used by end-users whereever @@ -42,19 +37,26 @@ Runtime ******* When executed, the runtime will automatically try to execute the pgAdmin Python -application. If execution fails, it will prompt you to adjust the Python Path -to include the directories containing the pgAdmin code as well as any additional -Python dependencies. You can enter a list of paths by separating them with a -semi-colon character, for example: +application. If execution fails, it will prompt you with error message +displaying a *Configure* button at the bottom. You can configure a fixed port +number to avoid clashes of the default random port number with other +applications and a connection timeout if desired. -.. code-block:: bash +If the error is related to Python Path or pgAdmin Python file then you need to +create a file named 'dev_config.json' and specify the following entries: - /Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/;/Users/dpage/python-libs/ +{ + "pythonPath": For Example: "../../venv/bin/python3", + "pgadminFile": For Example: "../web/pgAdmin4.py" +} -The configuration settings are stored using the QSettings class in Qt, which -will use an INI file on Unix systems (~/.config/pgadmin/pgadmin4.conf), -a plist file on Mac OS X (~/Library/Preferences/org.pgadmin.pgadmin4.plist), -and the registry on Windows (HKEY_CURRENT_USER\\Software\\pgadmin\\pgadmin4). +Note that the dev_config.py file should only be required by developers who are +working outside of a standard installation. + +The configuration settings are stored in *runtime_config.json* file, which +will be available on Unix systems (~/.local/share/pgadmin/), +on Mac OS X (~/Library/Preferences/pgadmin), +and on Windows (%APPDATA%/pgadmin). The configuration settings: @@ -65,18 +67,10 @@ The configuration settings: +--------------------------+--------------------+---------------------------------------------------------------+ | Key | Type | Purpose | +==========================+====================+===============================================================+ - | ApplicationPath | String | The directory containing pgAdmin4.py | - +--------------------------+--------------------+---------------------------------------------------------------+ - | BrowserCommand | String | An alternate command to run instead of the default browser. | - +--------------------------+--------------------+---------------------------------------------------------------+ - | ConnectionTimeout | Integer | The number of seconds to wait for application server startup. | - +--------------------------+--------------------+---------------------------------------------------------------+ | FixedPort | Boolean | Use a fixed network port number rather than a random one. | +--------------------------+--------------------+---------------------------------------------------------------+ - | OpenTabAtStartup | Boolean | Open a browser tab at startup. | - +--------------------------+--------------------+---------------------------------------------------------------+ | PortNumber | Integer | The port number to use, if using a fixed port. | +--------------------------+--------------------+---------------------------------------------------------------+ - | PythonPath | String | The Python module search path | + | ConnectionTimeout | Integer | The number of seconds to wait for application server startup. | +--------------------------+--------------------+---------------------------------------------------------------+ diff --git a/docs/en_US/release_notes_5_0.rst b/docs/en_US/release_notes_5_0.rst index d3179c80c..d4f4d79ae 100644 --- a/docs/en_US/release_notes_5_0.rst +++ b/docs/en_US/release_notes_5_0.rst @@ -9,10 +9,12 @@ This release contains a number of bug fixes and new features since the release o New features ************ +| `Issue #5967 `_ - Implemented runtime using NWjs to open pgAdmin4 in a standalone window instead of the system tray and web browser. Housekeeping ************ +| `Issue #5017 `_ - Use cheroot as the default production server for pgAdmin4. Bug fixes ********* @@ -25,8 +27,3 @@ Bug fixes | `Issue #6177 `_ - Fixed an issue while downloading ERD images in Safari and Firefox. | `Issue #6179 `_ - Fixed an issue where Generate SQL displayed twice in the ERD tool. | `Issue #6180 `_ - Updated missing documentation for the 'Download Image' option in ERD. - -. Documentation missing for 'Download Image' option in ERD. Fixes #6180. -2. Generate SQL displayed twice in ERD tool. Fixes #6179. -3. Zooming out too far makes the diagram vanish entirely. Fixes #6164. -4. Zoom to fit button only works if the diagram is larger than the canvas. Fixes #6163. diff --git a/pkg/debian/build.sh b/pkg/debian/build.sh index ac7a08309..1b4ad9b95 100755 --- a/pkg/debian/build.sh +++ b/pkg/debian/build.sh @@ -36,7 +36,7 @@ Package: ${APP_NAME}-server Version: ${APP_LONG_VERSION} Architecture: ${OS_ARCH} Depends: python3, libpq5 (>= 11.0), libgssapi-krb5-2 -Recommends: postgresql-client | postgresql-client-12 | postgresql-client-11 | postgresql-client-10 +Recommends: postgresql-client | postgresql-client-13 | postgresql-client-12 | postgresql-client-11 | postgresql-client-10 Maintainer: pgAdmin Development Team Description: The core server package for pgAdmin. pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world. EOF @@ -56,7 +56,7 @@ cat << EOF > "${DESKTOPROOT}/DEBIAN/control" Package: ${APP_NAME}-desktop Version: ${APP_LONG_VERSION} Architecture: ${OS_ARCH} -Depends: ${APP_NAME}-server, libqt5gui5 +Depends: ${APP_NAME}-server Maintainer: pgAdmin Development Team Description: The desktop user interface for pgAdmin. pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world. EOF diff --git a/pkg/debian/setup.sh b/pkg/debian/setup.sh index 89ddb7792..229d029b0 100755 --- a/pkg/debian/setup.sh +++ b/pkg/debian/setup.sh @@ -30,5 +30,5 @@ apt update # Install pre-reqs echo "Installing build pre-requisites..." -apt install -y build-essential python3-dev python3-venv python3-sphinx python3-wheel libpq-dev libffi-dev qtbase5-dev qt5-qmake nodejs yarn libkrb5-dev +apt install -y build-essential python3-dev python3-venv python3-sphinx python3-wheel libpq-dev libffi-dev nodejs yarn libkrb5-dev diff --git a/pkg/linux/build-functions.sh b/pkg/linux/build-functions.sh index 20a1dd683..ca3604c79 100644 --- a/pkg/linux/build-functions.sh +++ b/pkg/linux/build-functions.sh @@ -53,7 +53,8 @@ _create_python_virtualenv() { python3 -m venv venv source venv/bin/activate - # Make sure we have the wheel package present + # Make sure we have the wheel package present, as well as the latest pip + pip3 install --upgrade pip pip3 install wheel # Install the requirements @@ -63,7 +64,7 @@ _create_python_virtualenv() { # Use "python3" here as we want the venv path PYMODULES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") DIR_PYMODULES_PATH=`dirname ${PYMODULES_PATH}` - + # Use /usr/bin/python3 here as we want the system path if [ $1 == "debian" ]; then PYSYSLIB_PATH=$(/usr/bin/python3 -c "import sys; print('%s/lib/python%d.%.d' % (sys.prefix, sys.version_info.major, sys.version_info.minor))") @@ -105,23 +106,60 @@ _create_python_virtualenv() { } _build_runtime() { - echo "Building the desktop runtime..." - cd ${SOURCEDIR}/runtime - if [ -f Makefile ]; then - make clean - fi - if hash qmake-qt5 2>/dev/null; then - PGADMIN_PYTHON_DIR=/usr qmake-qt5 - else - PGADMIN_PYTHON_DIR=/usr qmake - fi - make + echo "Assembling the desktop runtime..." + + # Get a fresh copy of nwjs. + # NOTE: The nw download servers seem to be very unreliable, so at the moment we're using wget + # in a retry loop as Yarn/Npm don't seem to like that. + + # YARN: + # yarn add --cwd "${BUILDROOT}" nw + # YARN END + + # WGET: + NW_VERSION=$(yarn info nw | grep latest | awk -F "'" '{ print $2}') + pushd "${BUILDROOT}" > /dev/null + while true;do + wget https://dl.nwjs.io/v${NW_VERSION}/nwjs-v${NW_VERSION}-linux-x64.tar.gz && break + rm nwjs-v${NW_VERSION}-linux-x64.tar.gz + done + tar -zxvf nwjs-v${NW_VERSION}-linux-x64.tar.gz + popd > /dev/null + # WGET END + + # Copy nwjs into the staging directory mkdir -p "${DESKTOPROOT}/usr/${APP_NAME}/bin" - cp pgAdmin4 "${DESKTOPROOT}/usr/${APP_NAME}/bin/pgadmin4" - mkdir -p "${DESKTOPROOT}/usr/${APP_NAME}/share" - cp pgAdmin4.ico "${DESKTOPROOT}/usr/${APP_NAME}/share/pgadmin4.ico" + + # YARN: + # cp -r "${BUILDROOT}/node_modules/nw/nwjs"/* "${DESKTOPROOT}/usr/${APP_NAME}/bin" + # YARN END + + # WGET: + cp -r "${BUILDROOT}/nwjs-v${NW_VERSION}-linux-x64"/* "${DESKTOPROOT}/usr/${APP_NAME}/bin" + # WGET END + + mv "${DESKTOPROOT}/usr/${APP_NAME}/bin/nw" "${DESKTOPROOT}/usr/${APP_NAME}/bin/${APP_NAME}" + + cp -r "${SOURCEDIR}/runtime/assets" "${DESKTOPROOT}/usr/${APP_NAME}/bin/assets" + cp -r "${SOURCEDIR}/runtime/src" "${DESKTOPROOT}/usr/${APP_NAME}/bin/src" + + cp "${SOURCEDIR}/runtime/package.json" "${DESKTOPROOT}/usr/${APP_NAME}/bin/" + yarn --cwd "${DESKTOPROOT}/usr/${APP_NAME}/bin" install --production=true + + # Create the icon + mkdir -p "${DESKTOPROOT}/usr/share/icons/hicolor/128x128/apps/" + cp "${SOURCEDIR}/pkg/linux/pgadmin4-128x128.png" "${DESKTOPROOT}/usr/share/icons/hicolor/128x128/apps/${APP_NAME}.png" + mkdir -p "${DESKTOPROOT}/usr/share/icons/hicolor/64x64/apps/" + cp "${SOURCEDIR}/pkg/linux/pgadmin4-64x64.png" "${DESKTOPROOT}/usr/share/icons/hicolor/64x64/apps/${APP_NAME}.png" + mkdir -p "${DESKTOPROOT}/usr/share/icons/hicolor/48x48/apps/" + cp "${SOURCEDIR}/pkg/linux/pgadmin4-48x48.png" "${DESKTOPROOT}/usr/share/icons/hicolor/48x48/apps/${APP_NAME}.png" + mkdir -p "${DESKTOPROOT}/usr/share/icons/hicolor/32x32/apps/" + cp "${SOURCEDIR}/pkg/linux/pgadmin4-32x32.png" "${DESKTOPROOT}/usr/share/icons/hicolor/32x32/apps/${APP_NAME}.png" + mkdir -p "${DESKTOPROOT}/usr/share/icons/hicolor/16x16/apps/" + cp "${SOURCEDIR}/pkg/linux/pgadmin4-16x16.png" "${DESKTOPROOT}/usr/share/icons/hicolor/16x16/apps/${APP_NAME}.png" + mkdir -p "${DESKTOPROOT}/usr/share/applications" - cp ../pkg/linux/pgadmin4.desktop "${DESKTOPROOT}/usr/share/applications" + cp "${SOURCEDIR}/pkg/linux/pgadmin4.desktop" "${DESKTOPROOT}/usr/share/applications" } _build_docs() { diff --git a/pkg/linux/pgadmin4-128x128.png b/pkg/linux/pgadmin4-128x128.png new file mode 100644 index 000000000..d6d40f583 Binary files /dev/null and b/pkg/linux/pgadmin4-128x128.png differ diff --git a/pkg/linux/pgadmin4-16x16.png b/pkg/linux/pgadmin4-16x16.png new file mode 100644 index 000000000..9628d8f8b Binary files /dev/null and b/pkg/linux/pgadmin4-16x16.png differ diff --git a/pkg/linux/pgadmin4-32x32.png b/pkg/linux/pgadmin4-32x32.png new file mode 100644 index 000000000..44a378322 Binary files /dev/null and b/pkg/linux/pgadmin4-32x32.png differ diff --git a/pkg/linux/pgadmin4-48x48.png b/pkg/linux/pgadmin4-48x48.png new file mode 100644 index 000000000..c5c1c0b4d Binary files /dev/null and b/pkg/linux/pgadmin4-48x48.png differ diff --git a/pkg/linux/pgadmin4-64x64.png b/pkg/linux/pgadmin4-64x64.png new file mode 100644 index 000000000..513ef2bf9 Binary files /dev/null and b/pkg/linux/pgadmin4-64x64.png differ diff --git a/pkg/linux/pgadmin4.desktop b/pkg/linux/pgadmin4.desktop index 1c8873e1a..628c8a9ec 100644 --- a/pkg/linux/pgadmin4.desktop +++ b/pkg/linux/pgadmin4.desktop @@ -2,7 +2,7 @@ Encoding=UTF-8 Name=pgAdmin 4 Exec=/usr/pgadmin4/bin/pgadmin4 -Icon=/usr/pgadmin4/share/pgadmin4.ico +Icon=pgadmin4 Type=Application Categories=Application;Development; MimeType=text/html diff --git a/pkg/mac/.gitignore b/pkg/mac/.gitignore index a9aa86f67..d4005ba2d 100644 --- a/pkg/mac/.gitignore +++ b/pkg/mac/.gitignore @@ -1,4 +1,2 @@ # Global excludes across all subdirectories codesign.conf -debug.pgadmin.Info.plist -pgadmin.Info.plist diff --git a/pkg/mac/Info.plist-template_Python b/pkg/mac/Info.plist-template_Python deleted file mode 100644 index ca2aec6eb..000000000 --- a/pkg/mac/Info.plist-template_Python +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundlePackageType - FMWK - CFBundleShortVersionString - __SHORT_VERSION__ - CFBundleVersion - __FULL_VERSION__ - CFBundleGetInfoString - Created by Qt/QMake - CFBundleSignature - ???? - CFBundleExecutable - __FRAMEWORK_NAME__ - CFBundleIdentifier - org.pgadmin.__FRAMEWORK_NAME__ - NOTE - Please, do NOT change this file -- It was generated by Qt/QMake. - - diff --git a/pkg/mac/Info.plist-template_Qt5 b/pkg/mac/Info.plist-template_Qt5 deleted file mode 100644 index 534c6fbb0..000000000 --- a/pkg/mac/Info.plist-template_Qt5 +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundlePackageType - FMWK - CFBundleShortVersionString - __SHORT_VERSION__ - CFBundleVersion - __FULL_VERSION__ - CFBundleGetInfoString - Created by Qt/QMake - CFBundleSignature - ???? - CFBundleExecutable - __FRAMEWORK_NAME__ - CFBundleIdentifier - org.qt-project.Qt.__FRAMEWORK_NAME__ - NOTE - Please, do NOT change this file -- It was generated by Qt/QMake. - - diff --git a/pkg/mac/Info.plist.in b/pkg/mac/Info.plist.in new file mode 100644 index 000000000..57cf55673 --- /dev/null +++ b/pkg/mac/Info.plist.in @@ -0,0 +1,73 @@ + + + + + BuildMachineOSBuild + 18G103 + CFBundleDevelopmentRegion + en + CFBundleDisplayName + %APPNAME% + CFBundleExecutable + %APPNAME% + CFBundleIconFile + app.icns + CFBundleIdentifier + %APPID% + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + %APPNAME% + CFBundlePackageType + APPL + CFBundleShortVersionString + %APPVER% + CFBundleSignature + %APPNAME% + CFBundleVersion + 4280.88 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTSDKBuild + 10.15 + DTSDKName + macosx10.15 + DTXcode + 1131 + DTXcodeBuild + 11C505 + GPUEjectPolicy + wait + LSEnvironment + + MallocNanoZone + 0 + SYSTEM_VERSION_COMPAT + 0 + + LSFileQuarantineEnabled + + LSHasLocalizedDisplayName + 1 + LSMinimumSystemVersion + 10.10.0 + NSAppleScriptEnabled + + NSPrincipalClass + BrowserCrApplication + NSRequiresAquaSystemAppearance + + NSSupportsAutomaticGraphicsSwitching + + NSUserActivityTypes + + NSUserActivityTypeBrowsingWeb + + NSUserNotificationAlertStyle + none + OSAScriptingDefinition + scripting.sdef + SCMRevision + 62f83a7521ae1f32e563795732dff0c9da1b660d-refs/heads/master@{#812354} + + diff --git a/pkg/mac/PkgInfo b/pkg/mac/PkgInfo deleted file mode 100644 index bd04210fb..000000000 --- a/pkg/mac/PkgInfo +++ /dev/null @@ -1 +0,0 @@ -APPL???? \ No newline at end of file diff --git a/pkg/mac/README b/pkg/mac/README index 5980169a9..e245c177f 100644 --- a/pkg/mac/README +++ b/pkg/mac/README @@ -1,44 +1,31 @@ -Building pgAdmin4.dmg on Mac OS X -================================= +Building pgAdmin4.dmg on macOS +============================== Required Packages (Either build the sources or get them from macports or similar): -1. Python installation - - Python 3.4+ or above from https://www.python.org/ +1. Yarn & NodeJS -2. QT installation - - Qt 5 from http://www.qt.io/ - -3. PostgreSQL installation - - PostgreSQL 9.5 or above from http://www.postgresql.org/ +2. PostgreSQL installation + - PostgreSQL 12 or above from http://www.postgresql.org/ Building: -1. If a value different from the default of /usr/local/python is required, set - the PGADMIN_PYTHON_DIR environment variable to the Python root installation - directory, e.g. +1. To bundle a different version of Python from the default of 3.9.0, set the + PGADMIN_PYTHON_VERSION environment variable, e.g: - export PGADMIN_PYTHON_DIR=/opt/local + export PGADMIN_PYTHON_VERSION=3.8.5 -2. If a value different from the default of ~/Qt/5.13.2/clang_64, is required, - set the PGADMIN_QT_DIR environment variable to the QT root installation - directory, e.g. - - export PGADMIN_QT_DIR=~/Qt/5.14.2/clang_64 - -3. If a value different from the default of /usr/local/pgsql is required, set - the PGADMIN_POSTGRES_DIR environment variable to the PostgreSQL installation - directory, e.g. +2. If a path different from the default of /usr/local/pgsql for the PostgreSQL + installation has been used, set the PGADMIN_POSTGRES_DIR environment variable + appropriately, e.g: export PGADMIN_POSTGRES_DIR=/opt/local/pgsql -4. Copy framework.conf.in to framework.conf, and edit the values accordingly. - -5. If you want to codesign the appbundle, copy codesign.conf.in to +3. If you want to codesign the appbundle, copy codesign.conf.in to codesign.conf and set the values accordingly. -6. To build, go to pgAdmin4 source root directory and execute "make appbundle". +4. To build, go to pgAdmin4 source root directory and execute "make appbundle". This will create the python virtual environment and install all the required python modules mentioned in the requirements file using pip, build the runtime code and finally create the app bundle and the DMG in ./dist diff --git a/pkg/mac/build-functions.sh b/pkg/mac/build-functions.sh index 00c0bbbd4..e00ed28bc 100644 --- a/pkg/mac/build-functions.sh +++ b/pkg/mac/build-functions.sh @@ -13,58 +13,160 @@ _setup_env() { _cleanup() { echo Cleaning up the old environment and app bundle... - rm -rf ${SOURCE_DIR}/runtime/*.app - rm -rf ${BUILD_ROOT} + rm -rf "${BUILD_ROOT}" + rm -rf "${TEMP_DIR}" rm -f ${DIST_ROOT}/*.dmg } -_create_venv() { +_build_runtime() { + echo "Assembling the runtime environment..." + test -d "${BUILD_ROOT}" || mkdir "${BUILD_ROOT}" + + # Copy in the template application + cd "${BUILD_ROOT}" + yarn --cwd "${BUILD_ROOT}" add nw + cp -R "${BUILD_ROOT}/node_modules/nw/nwjs/nwjs.app" "${BUILD_ROOT}/" + mv "${BUILD_ROOT}/nwjs.app" "${BUNDLE_DIR}" + + # Copy in the runtime code + mkdir "${BUNDLE_DIR}/Contents/Resources/app.nw/" + cp -R "${SOURCE_DIR}/runtime/assets" "${BUNDLE_DIR}/Contents/Resources/app.nw/" + cp -R "${SOURCE_DIR}/runtime/src" "${BUNDLE_DIR}/Contents/Resources/app.nw/" + cp "${SOURCE_DIR}/runtime/package.json" "${BUNDLE_DIR}/Contents/Resources/app.nw/" + + # Install the runtime node_modules, then replace the package.json + yarn --cwd "${BUNDLE_DIR}/Contents/Resources/app.nw/" install --production=true +} + +_create_python_env() { + echo "Creating the Python environment..." PATH=${PGADMIN_POSTGRES_DIR}/bin:${PATH} LD_LIBRARY_PATH=${PGADMIN_POSTGRES_DIR}/lib:${LD_LIBRARY_PATH} - test -d ${BUILD_ROOT} || mkdir ${BUILD_ROOT} - cd ${BUILD_ROOT} + git clone https://github.com/gregneagle/relocatable-python.git "${BUILD_ROOT}/relocatable_python" + PATH=$PATH:/usr/local/pgsql/bin "${BUILD_ROOT}/relocatable_python/make_relocatable_python_framework.py" --upgrade-pip --python-version ${PGADMIN_PYTHON_VERSION} --pip-requirements "${SOURCE_DIR}/requirements.txt" --destination "${BUNDLE_DIR}/Contents/Frameworks/" - ${PYTHON_EXE} -m venv --copies venv - - source venv/bin/activate - pip install --no-cache-dir --no-binary psycopg2 -r ${SOURCE_DIR}/requirements.txt - - # Figure the source path for use when completing the venv - SOURCE_PYMODULES_PATH=$(dirname $("${PYTHON_EXE}" -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")) - - # Figure the target path for use when completing the venv - # Use "python" here as we want the venv path - TARGET_PYMODULES_PATH=$(dirname $(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")) - - # Copy in the additional system python modules - cp -R ${SOURCE_PYMODULES_PATH}/* "${TARGET_PYMODULES_PATH}/" - - # Link the python directory to python so that the private environment path is found by the application. - ln -s "$(basename ${TARGET_PYMODULES_PATH})" "${TARGET_PYMODULES_PATH}/../python" - - # Remove tests - find venv -name "test" -type d -print0 | xargs -0 rm -rf - find venv -name "tests" -type d -print0 | xargs -0 rm -rf -} - -_build_runtime() { - cd ${SOURCE_DIR}/runtime - if [ -f Makefile ]; then - make clean - fi - ${QMAKE} - make - cp -r pgAdmin4.app "${BUNDLE_DIR}" + # Remove some things we don't need + cd "${BUNDLE_DIR}/Contents/Frameworks/Python.framework" + find . -name test -type d -print0 | xargs -0 rm -rf + find . -name tkinter -type d -print0 | xargs -0 rm -rf + find . -name turtle.py -type f -print0 | xargs -0 rm -rf + find . -name turtledemo -type d -print0 | xargs -0 rm -rf + find . -name tcl* -type d -print0 | xargs -0 rm -rf + find . -name tk* -type d -print0 | xargs -0 rm -rf + find . -name tdbc* -type d -print0 | xargs -0 rm -rf + find . -name itcl* -type d -print0 | xargs -0 rm -rf + rm -f Versions/Current/lib/Tk.* + rm -f Versions/Current/lib/libtcl*.dylib + rm -f Versions/Current/lib/libtk*.dylib + rm -f Versions/Current/lib/tcl*.sh + rm -f Versions/Current/lib/tk*.sh + rm -rf Versions/Current/share } _build_docs() { - cd ${SOURCE_DIR}/docs/en_US + echo "Building the docs..." + # Create a temporary venv for the doc build, so we don't contaminate the one + # that we're going to ship. + "${BUNDLE_DIR}/Contents/Frameworks/Python.framework/Versions/Current/bin/python3" -m venv "${BUILD_ROOT}/venv" + source "${BUILD_ROOT}/venv/bin/activate" + pip3 install --upgrade pip + pip3 install -r "${SOURCE_DIR}/requirements.txt" + pip3 install sphinx + + cd "${SOURCE_DIR}" + make docs + + cd "${SOURCE_DIR}/docs/en_US" test -d "${BUNDLE_DIR}/Contents/Resources/docs/en_US" || mkdir -p "${BUNDLE_DIR}/Contents/Resources/docs/en_US" cp -r _build/html "${BUNDLE_DIR}/Contents/Resources/docs/en_US/" + + # Remove some things we don't need + rm -rf "${BUNDLE_DIR}/Contents/Resources/docs/en_US/html/_sources" + rm -f "${BUNDLE_DIR}/Contents/Resources/docs/en_US/html/_static"/*.png +} + +_fixup_imports() { + local TODO TODO_OLD FW_RELPATH LIB LIB_BN + + echo "Fixing imports on the core appbundle..." + pushd "$1" > /dev/null + + # Find all the files that may need tweaks + TODO=$(file `find . -perm +0111 -type f` | \ + grep -v "Frameworks/Python.framework" | \ + grep -v "Frameworks/nwjs" | \ + grep -E "Mach-O 64-bit" | \ + awk -F ':| ' '{ORS=" "; print $1}' | \ + uniq) + + # Add anything in the site-packages Python directory + TODO+=$(file `find ./Contents/Frameworks/Python.framework/Versions/Current/lib/python*/site-packages -perm +0111 -type f` | \ + grep -E "Mach-O 64-bit" | \ + awk -F ':| ' '{ORS=" "; print $1}' | \ + uniq) + + echo "Found executables: ${TODO}" + while test "${TODO}" != ""; do + TODO_OLD=${TODO} ; + TODO="" ; + for TODO_OBJ in ${TODO_OLD}; do + echo "Post-processing: ${TODO_OBJ}" + + # Figure out the relative path from ${TODO_OBJ} to Contents/Frameworks + FW_RELPATH=$(echo "${TODO_OBJ}" | \ + sed -n 's|^\(\.//*\)\(\([^/][^/]*/\)*\)[^/][^/]*$|\2|gp' | \ + sed -n 's|[^/][^/]*/|../|gp' \ + )"Contents/Frameworks" + + # Find all libraries ${TODO_OBJ} depends on, but skip system libraries + for LIB in $( + otool -L ${TODO_OBJ} | \ + sed -n 's|^.*[[:space:]]\([^[:space:]]*\.dylib\).*$|\1|p' | \ + egrep -v '^(/usr/lib)|(/System)|@executable_path' \ + ); do + # Copy in any required dependencies + LIB_BN="$(basename "${LIB}")" ; + if ! test -f "Contents/Frameworks/${LIB_BN}"; then + TARGET_FILE="" + TARGET_PATH="" + echo "Adding symlink: ${LIB_BN} (because of: ${TODO_OBJ})" + cp -R "${LIB}" "Contents/Frameworks/${LIB_BN}" + if ! test -L "Contents/Frameworks/${LIB_BN}"; then + chmod 755 "Contents/Frameworks/${LIB_BN}" + else + TARGET_FILE=$(readlink "${LIB}") + TARGET_PATH=$(dirname "${LIB}")/${TARGET_FILE} + echo "Adding symlink target: ${TARGET_PATH}" + cp "${TARGET_PATH}" "Contents/Frameworks/${TARGET_FILE}" + chmod 755 "Contents/Frameworks/${TARGET_FILE}" + fi + echo "Rewriting ID in Contents/Frameworks/${LIB_BN} to ${LIB_BN}" + install_name_tool \ + -id "${LIB_BN}" \ + "Contents/Frameworks/${LIB_BN}" || exit 1 + TODO="${TODO} ./Contents/Frameworks/${LIB_BN}" + fi + # Rewrite the dependency paths + echo "Rewriting library ${LIB} to @loader_path/${FW_RELPATH}/${LIB_BN} in ${TODO_OBJ}" + install_name_tool -change \ + "${LIB}" \ + "@loader_path/${FW_RELPATH}/${LIB_BN}" \ + "${TODO_OBJ}" || exit 1 + install_name_tool -change \ + "${TARGET_PATH}" \ + "@loader_path/${FW_RELPATH}/${TARGET_FILE}" \ + "${TODO_OBJ}" || exit 1 + done + done + done + + echo "Imports updated on the core appbundle." + popd > /dev/null } _complete_bundle() { + echo "Completing the appbundle..." cd ${SCRIPT_DIR} # Copy the binary utilities into place @@ -73,129 +175,35 @@ _complete_bundle() { cp "${PGADMIN_POSTGRES_DIR}/bin/pg_dumpall" "${BUNDLE_DIR}/Contents/SharedSupport/" cp "${PGADMIN_POSTGRES_DIR}/bin/pg_restore" "${BUNDLE_DIR}/Contents/SharedSupport/" cp "${PGADMIN_POSTGRES_DIR}/bin/psql" "${BUNDLE_DIR}/Contents/SharedSupport/" - - # Replace the place holders with the current version - sed -e "s/PGADMIN_LONG_VERSION/${APP_LONG_VERSION}/g" -e "s/PGADMIN_SHORT_VERSION/${APP_SHORT_VERSION}/g" pgadmin.Info.plist.in > pgadmin.Info.plist - # copy Python private environment to app bundle - cp -PR ${BUILD_ROOT}/venv "${BUNDLE_DIR}/Contents/Resources/" + # Update the plist + cp Info.plist.in "${BUNDLE_DIR}/Contents/Info.plist" + sed -i '' "s/%APPNAME%/${APP_NAME}/g" "${BUNDLE_DIR}/Contents/Info.plist" + sed -i '' "s/%APPVER%/${APP_LONG_VERSION}/g" "${BUNDLE_DIR}/Contents/Info.plist" + sed -i '' "s/%APPID%/org.pgadmin.pgadmin4/g" "${BUNDLE_DIR}/Contents/Info.plist" + for FILE in "${BUNDLE_DIR}"/Contents/Resources/*.lproj/InfoPlist.strings; do + sed -i '' 's/CFBundleGetInfoString =.*/CFBundleGetInfoString = "Copyright (C) 2013 - 2021, The pgAdmin Development Team";/g' "${FILE}" + sed -i '' 's/NSHumanReadableCopyright =.*/NSHumanReadableCopyright = "Copyright (C) 2013 - 2021, The pgAdmin Development Team";/g' "${FILE}" + echo CFBundleDisplayName = \"${APP_NAME}\"\; >> "${FILE}" + done - # Remove any TCL-related files that may cause us problems - find "${BUNDLE_DIR}/Contents/Resources/venv/" -name "_tkinter*" -print0 | xargs -0 rm -f + # PkgInfo + echo APPLPGA4 > "${BUNDLE_DIR}/Contents/PkgInfo" - test -d "${BUNDLE_DIR}/Contents/Resources" || mkdir -p "${BUNDLE_DIR}/Contents/Resources" - # Create qt.conf so that app knows where the Plugins are present - cat >> "${BUNDLE_DIR}/Contents/Resources/qt.conf" << EOF -[Paths] -Plugins = PlugIns -EOF + # Icon + cp pgAdmin4.icns "${BUNDLE_DIR}/Contents/Resources/app.icns" - test -d "${BUNDLE_DIR}/Contents/Frameworks" || mkdir -p "${BUNDLE_DIR}/Contents/Frameworks" - test -d "${BUNDLE_DIR}/Contents/PlugIns/platforms" || mkdir -p "${BUNDLE_DIR}/Contents/PlugIns/platforms" - test -d "${BUNDLE_DIR}/Contents/PlugIns/imageformats" || mkdir -p "${BUNDLE_DIR}/Contents/PlugIns/imageformats" - cp -f ${PGADMIN_QT_DIR}/plugins/platforms/libqcocoa.dylib "${BUNDLE_DIR}/Contents/PlugIns/platforms" - cp -f ${PGADMIN_QT_DIR}/plugins/imageformats/libqsvg.dylib "${BUNDLE_DIR}/Contents/PlugIns/imageformats" - cp -f ${PGADMIN_POSTGRES_DIR}/lib/libpq.5.dylib "${BUNDLE_DIR}/Contents/Frameworks" + # Rename the executable + mv "${BUNDLE_DIR}/Contents/MacOS/nwjs" "${BUNDLE_DIR}/Contents/MacOS/${APP_NAME}" - local todo todo_old fw_relpath lib lib_bn + # Rename the app in package.json so the menu looks as it should + sed -i '' "s/\"name\": \"pgadmin4\"/\"name\": \"${APP_NAME}\"/g" "${BUNDLE_DIR}/Contents/Resources/app.nw/package.json" - pushd "${BUNDLE_DIR}" > /dev/null + # Import the dependencies, and rewrite any library references + _fixup_imports "${BUNDLE_DIR}" - # We skip nested apps here - those are treated specially - todo=$(file `find ./ -perm +0111 ! -type d ! -path "*.app/*" ! -name "*.app"` | grep -E "Mach-O 64-bit" | awk -F ':| ' '{ORS=" "; print $1}') - - echo "Found executables: ${todo}" - while test "${todo}" != ""; do - todo_old=${todo} ; - todo="" ; - for todo_obj in ${todo_old}; do - echo "Post-processing: ${todo_obj}" - - # Figure out the relative path from todo_obj to Contents/Frameworks - fw_relpath=$(echo "${todo_obj}" | sed -n 's|^\(\.//*\)\(\([^/][^/]*/\)*\)[^/][^/]*$|\2|gp' | sed -n 's|[^/][^/]*/|../|gp')"Contents/Frameworks" - fw_relpath_old=${fw_relpath} - - # Find all libraries $todo_obj depends on, but skip system libraries - for lib in $(otool -L ${todo_obj} | grep "Qt\|dylib\|Frameworks\|PlugIns" | grep -v ":" | sed 's/(.*//' | egrep -v '(/usr/lib)|(/System)|@executable_path@'); do - if echo ${lib} | grep "PlugIns\|libqcocoa" > /dev/null; then - lib_loc="Contents/PlugIns/platforms" - elif echo ${lib} | grep "PlugIns\|libqsvg" > /dev/null; then - lib_loc="Contents/PlugIns/imageformats" - elif echo ${lib} | grep "Qt" > /dev/null; then - qtfw_path="$(dirname ${lib} | sed 's|.*\(Qt.*framework\)|\1|')" - lib_loc="Contents/Frameworks/${qtfw_path}" - if [ "$(basename ${todo_obj})" = "${lib}" ]; then - lib_loc="$(dirname ${todo_obj})" - qtfw_path=$(echo ${lib_loc} | sed 's/Contents\/Frameworks\///') - fi - elif echo ${lib} | grep "Python" > /dev/null; then - pyfw_path="$(dirname ${lib} | sed 's|.*\(Python.*framework\)|\1|')" - lib_loc="Contents/Frameworks/${pyfw_path}" - if [ "$(basename ${todo_obj})" = "${lib}" ]; then - lib_loc="$(dirname ${todo_obj})" - pyfw_path=$(echo ${lib_loc} | sed 's/Contents\/Frameworks\///') - fi - else - lib_loc="Contents/Frameworks" - fi - lib_bn="$(basename "${lib}")" ; - if ! test -f "${lib_loc}/${lib_bn}"; then - target_file="" - target_path="" - echo "Adding symlink: ${lib_bn} (because of: ${todo_obj})" - - # Copy the QT and Python framework - if echo ${lib} | grep Qt > /dev/null ; then - test -d ${lib_loc} || mkdir -p ${lib_loc} - echo Copying -R ${PGADMIN_QT_DIR}/lib/${qtfw_path}/${lib_bn} to ${lib_loc}/ - cp ${PGADMIN_QT_DIR}/lib/${qtfw_path}/${lib_bn} ${lib_loc}/ - elif echo ${lib} | grep Python > /dev/null ; then - test -d ${lib_loc} || mkdir -p ${lib_loc} - cp -R "${lib}" "${lib_loc}/${lib_bn}" - else - cp -R "${lib}" "${lib_loc}/${lib_bn}" - fi - if ! test -L "${lib_loc}/${lib_bn}"; then - chmod 755 "${lib_loc}/${lib_bn}" - else - target_file=$(readlink "${lib}") - target_path=$(dirname "${lib}")/${target_file} - - echo "Adding symlink target: ${target_path}" - cp "${target_path}" "${lib_loc}/${target_file}" - chmod 755 "${lib_loc}/${target_file}" - fi - echo "Rewriting ID in ${lib_loc}/${lib_bn} to ${lib_bn}" - install_name_tool -id "${lib_bn}" "${lib_loc}/${lib_bn}" - - todo="${todo} ./${lib_loc}/${lib_bn}" - fi - if echo ${lib} | grep Qt > /dev/null ; then - fw_relpath="${fw_relpath}/${qtfw_path}" - fi - if echo ${lib} | grep Python > /dev/null ; then - fw_relpath="${fw_relpath}/${pyfw_path}" - fi - chmod +w ${todo_obj} - echo "Rewriting library ${lib} to @loader_path/${fw_relpath}/${lib_bn} in ${todo_obj}" - - install_name_tool -change "${lib}" "@loader_path/${fw_relpath}/${lib_bn}" "${todo_obj}" - install_name_tool -change "${target_path}" "@loader_path/${fw_relpath}/${target_file}" "${todo_obj}" - - fw_relpath="${fw_relpath_old}" - done - done - done - - # Fix the rpaths for psycopg module - find "${BUNDLE_DIR}/Contents/Resources/venv/" -name _psycopg.so -print0 | xargs -0 install_name_tool -change libpq.5.dylib @loader_path/../../../../../../Frameworks/libpq.5.dylib - find "${BUNDLE_DIR}/Contents/Resources/venv/" -name _psycopg.so -print0 | xargs -0 install_name_tool -change libssl.1.0.0.dylib @loader_path/../../../../../../Frameworks/libssl.1.0.0.dylib - find "${BUNDLE_DIR}/Contents/Resources/venv/" -name _psycopg.so -print0 | xargs -0 install_name_tool -change libcrypto.1.0.0.dylib @loader_path/../../../../../../Frameworks/libcrypto.1.0.0.dylib - - echo "App completed: ${BUNDLE_DIR}" - popd > /dev/null - - pushd ${SOURCE_DIR}/web > /dev/null + # Build node modules + pushd "${SOURCE_DIR}/web" > /dev/null yarn install yarn run bundle @@ -203,7 +211,7 @@ EOF popd > /dev/null # copy the web directory to the bundle as it is required by runtime - cp -r ${SOURCE_DIR}/web "${BUNDLE_DIR}/Contents/Resources/" + cp -r "${SOURCE_DIR}/web" "${BUNDLE_DIR}/Contents/Resources/" cd "${BUNDLE_DIR}/Contents/Resources/web" rm -f pgadmin4.db config_local.* rm -rf karma.conf.js package.json node_modules/ regression/ tools/ pgadmin/static/js/generated/.cache @@ -226,66 +234,6 @@ EOF find "${BUNDLE_DIR}" -name "*.pyc" -print0 | xargs -0 rm -f } -_framework_config() { - # Get the config - source ${SCRIPT_DIR}/framework.conf - - echo Reorganising the framework structure... - - # Create "Current" and "Current/Resources" inside each of the framework dirs - find "${BUNDLE_DIR}/Contents/Frameworks"/*framework -type d -name "Versions" | while read -r framework_dir; do - pushd "${framework_dir}" > /dev/null - - # Create framework 'Current' soft link - VERSION_NUMBER=`ls -1` - ln -s ${VERSION_NUMBER} Current - - # Create "Resources" subdirectory - if [ ! -d Current/Resources ]; then - mkdir Current/Resources - fi - - popd > /dev/null - done - - # Stuff for Qt framework files only - find "${BUNDLE_DIR}/Contents/Frameworks" -type d -name "Qt*framework" | while read -r framework_dir; do - pushd "${framework_dir}" > /dev/null - - # Create soft link to the framework binary - ln -s Versions/Current/Qt* - - # Create soft link to the framework Resources dir - ln -s Versions/Current/Resources - - # Create the Info.plist files - MYNAME=`ls -1 Qt*` - if [ -f Resources/Info.plist ]; then - chmod +w Resources/Info.plist - fi - sed 's/__SHORT_VERSION__/${QT_SHORT_VERSION}/' "${SCRIPT_DIR}/Info.plist-template_Qt5" | sed 's/__FULL_VERSION__/${QT_FULL_VERSION}/' | sed "s/__FRAMEWORK_NAME__/${MYNAME}/" > "Resources/Info.plist" - - popd > /dev/null - done - - # Same thing, but specific to the Python framework dir - find "${BUNDLE_DIR}/Contents/Frameworks" -type d -name "P*framework" | while read -r framework_dir; do - pushd "${framework_dir}" > /dev/null - - # Create soft link to the framework binary - ln -s Versions/Current/Py* - - # Create soft link to the framework Resources dir - ln -s Versions/Current/Resources - - # Create the Info.plist file - MYNAME=`ls -1 Py*` - sed 's/__SHORT_VERSION__/${PYTHON_SHORT_VERSION}/' "${SCRIPT_DIR}/Info.plist-template_Python" | sed 's/__FULL_VERSION__/${PYTHON_FULL_VERSION}/' | sed "s/__FRAMEWORK_NAME__/${MYNAME}/" > "Resources/Info.plist" - - popd > /dev/null - done -} - _codesign_binaries() { if [ ${CODESIGN} -eq 0 ]; then return @@ -300,17 +248,22 @@ _codesign_binaries() { echo "Developer Bundle Identifier not found in codesign.conf" >&2 fi + # Create the entitlements file + cp "${SCRIPT_DIR}/entitlements.plist.in" "${BUILD_ROOT}/entitlements.plist" + TEAM_ID=$(echo ${DEVELOPER_ID} | awk -F"[()]" '{print $2}') + sed -i '' "s/%TEAMID%/${TEAM_ID}/g" "${BUILD_ROOT}/entitlements.plist" + echo Signing ${BUNDLE_DIR} binaries... IFS=$'\n' - for i in $(find "${BUNDLE_DIR}" -type f -perm +111 -exec file "{}" \; | grep -E "Mach-O executable|Mach-O 64-bit executable|Mach-O 64-bit bundle" | awk -F":| \\\(" '{print $1}' | uniq) + for i in $(find "${BUNDLE_DIR}" -type f -perm +111 -exec file "{}" \; | grep -v "(for architecture" | grep -E "Mach-O executable|Mach-O 64-bit executable|Mach-O 64-bit bundle" | awk -F":" '{print $1}' | uniq) do - codesign --deep --force --verify --verbose --timestamp --options runtime -i "${DEVELOPER_BUNDLE_ID}" --sign "${DEVELOPER_ID}" "$i" + codesign --deep --force --verify --verbose --timestamp --options runtime --entitlements "${BUILD_ROOT}/entitlements.plist" -i "${DEVELOPER_BUNDLE_ID}" --sign "${DEVELOPER_ID}" "$i" done echo Signing ${BUNDLE_DIR} libraries... for i in $(find "${BUNDLE_DIR}" -type f -name "*.dylib*") do - codesign --deep --force --verify --verbose --timestamp --options runtime -i "${DEVELOPER_BUNDLE_ID}" --sign "${DEVELOPER_ID}" "$i" + codesign --deep --force --verify --verbose --timestamp --options runtime --entitlements "${BUILD_ROOT}/entitlements.plist" -i "${DEVELOPER_BUNDLE_ID}" --sign "${DEVELOPER_ID}" "$i" done } @@ -321,44 +274,32 @@ _codesign_bundle() { # Sign the .app echo Signing ${BUNDLE_DIR}... - codesign --deep --force --verify --verbose --timestamp --options runtime -i "${DEVELOPER_BUNDLE_ID}" --sign "${DEVELOPER_ID}" "${BUNDLE_DIR}" - - # Verify it worked - echo Verifying the signature... - codesign --verify --verbose --deep --force "${BUNDLE_DIR}" - echo ${BUNDLE_DIR} successfully signed. + codesign --deep --force --verify --verbose --timestamp --options runtime --entitlements "${BUILD_ROOT}/entitlements.plist" -i "${DEVELOPER_BUNDLE_ID}" --sign "${DEVELOPER_ID}" "${BUNDLE_DIR}" } _create_dmg() { # move to the directory where we want to create the DMG test -d ${DIST_ROOT} || mkdir ${DIST_ROOT} - cd ${DIST_ROOT} - DMG_LICENCE=./../pkg/mac/licence.rtf - DMG_VOLUME_NAME=${APP_NAME} - DMG_NAME=`echo ${DMG_VOLUME_NAME} | sed 's/ //g' | awk '{print tolower($0)}'` - DMG_IMAGE=${DMG_NAME}-${APP_LONG_VERSION}.dmg + echo "Checking out create-dmg..." + git clone https://github.com/create-dmg/create-dmg.git "${BUILD_ROOT}/create-dmg" - DMG_DIR=./${DMG_IMAGE}.src - - if test -e "${DMG_DIR}"; then - echo "Directory ${DMG_DIR} already exists. Please delete it manually." >&2 - exit 1 - fi - - echo "Cleaning up" - rm -f "${DMG_IMAGE}" - mkdir "${DMG_DIR}" - - echo "Copying data into temporary directory" - cp -R "${BUNDLE_DIR}" "${DMG_DIR}" - - echo "Creating image" - hdiutil create -quiet -srcfolder "$DMG_DIR" -fs HFS+ -format UDZO -volname "${DMG_VOLUME_NAME}" -ov "${DMG_IMAGE}" - rm -rf "${DMG_DIR}" - - echo Attaching License to image... - python ${SCRIPT_DIR}/dmg-license.py "${DMG_IMAGE}" "${DMG_LICENCE}" -c bz2 + "${BUILD_ROOT}/create-dmg/create-dmg" \ + --volname "${APP_NAME}" \ + --volicon "${SCRIPT_DIR}/dmg-icon.icns" \ + --eula "${SCRIPT_DIR}/licence.rtf" \ + --background "${SCRIPT_DIR}/dmg-background.png" \ + --app-drop-link 600 220 \ + --icon "${APP_NAME}.app" 200 220 \ + --window-pos 200 120 \ + --window-size 800 400 \ + --hide-extension "${APP_NAME}.app" \ + --add-file .DS_Store "${SCRIPT_DIR}/dmg.DS_Store" 5 5 \ + --format UDBZ \ + --skip-jenkins \ + --no-internet-enable \ + "${DIST_ROOT}/$(echo ${APP_NAME} | sed 's/ //g' | awk '{print tolower($0)}')-${APP_LONG_VERSION}.dmg" \ + "${BUNDLE_DIR}" } _codesign_dmg() { @@ -366,21 +307,7 @@ _codesign_dmg() { return fi - DMG_VOLUME_NAME=${APP_NAME} - DMG_NAME=`echo ${DMG_VOLUME_NAME} | sed 's/ //g' | awk '{print tolower($0)}'` - DMG_IMAGE=${DIST_ROOT}/${DMG_NAME}-${APP_LONG_VERSION}.dmg - - if ! test -f "${DMG_IMAGE}" ; then - echo "${DMG_IMAGE} is no disk image!" >&2 - exit 1 - fi - # Sign the .app - echo Signing ${DMG_IMAGE}... - codesign --deep --force --verify --verbose --timestamp --options runtime -i "${DEVELOPER_BUNDLE_ID}" --sign "${DEVELOPER_ID}" "${DMG_IMAGE}" - - # Verify it worked - echo Verifying the signature... - codesign --verify --verbose --force "${DMG_IMAGE}" - echo ${DMG_IMAGE} successfully signed. -} \ No newline at end of file + echo Signing disk image... + codesign --force --verify --verbose --timestamp --options runtime -i "${DEVELOPER_BUNDLE_ID}" --sign "${DEVELOPER_ID}" "${DIST_ROOT}/$(echo ${APP_NAME} | sed 's/ //g' | awk '{print tolower($0)}')-${APP_LONG_VERSION}.dmg" +} diff --git a/pkg/mac/build.sh b/pkg/mac/build.sh index cdf191556..223ae69dd 100755 --- a/pkg/mac/build.sh +++ b/pkg/mac/build.sh @@ -12,21 +12,14 @@ trap 'if [ $? -ne 0 ]; then echo "\"${last_command}\" command filed with exit co SCRIPT_DIR=$(cd `dirname $0` && pwd) SOURCE_DIR=$(realpath ${SCRIPT_DIR}/../..) BUILD_ROOT=$(realpath ${SCRIPT_DIR}/../..)/mac-build +TEMP_DIR=$(realpath ${SCRIPT_DIR}/../..)/mac-temp DIST_ROOT=$(realpath ${SCRIPT_DIR}/../..)/dist -if [ ! -f ${SCRIPT_DIR}/framework.conf ]; then - echo - echo "Error: pkg/mac/framework.conf not found!" - echo "Copy pkg/mac/framework.conf.in to pkg/mac/framework.conf and edit as required for the current system." - echo - exit 1 -fi - CODESIGN=1 if [ ! -f ${SCRIPT_DIR}/codesign.conf ]; then echo echo "******************************************************************" - echo "* ${SCRIPT_DIR}/codesign.conf not found. NOT signing the binaries." + echo "* pkg/mac/codesign.conf not found. NOT signing the binaries." echo "******************************************************************" echo CODESIGN=0 @@ -35,50 +28,24 @@ else source ${SCRIPT_DIR}/codesign.conf fi -if [ "x${PGADMIN_PYTHON_DIR}" == "x" ]; then - echo "PGADMIN_PYTHON_DIR not set. Setting it to the default: /usr/local/python" - export PGADMIN_PYTHON_DIR=/usr/local/python -fi -PYTHON_EXE=${PGADMIN_PYTHON_DIR}/bin/python3 - -# Check if Python is working and calculate PYTHON_VERSION -if ${PYTHON_EXE} -V > /dev/null 2>&1; then - PYTHON_VERSION=`${PYTHON_EXE} -V 2>&1 | awk '{print $2}' | cut -d"." -f1-2 | sed 's/\.//'` -else - echo "Error: Python installation missing!" - exit 1 -fi - -if [ "${PYTHON_VERSION}" -gt "38" ] && [ "${PYTHON_VERSION}" -lt "34" ]; then - echo "Python version not supported." - exit 1 -fi - -if [ "x${PGADMIN_QT_DIR}" == "x" ]; then - echo "PGADMIN_QT_DIR not set. Setting it to the default: ~/Qt/5.13.2/clang_64" - export PGADMIN_QT_DIR=~/Qt/5.13.2/clang_64 -fi - -QMAKE=${PGADMIN_QT_DIR}/bin/qmake -if ! ${QMAKE} --version > /dev/null 2>&1; then - echo "Error: qmake not found. QT installation is not present or incomplete." - exit 1 -fi - if [ "x${PGADMIN_POSTGRES_DIR}" == "x" ]; then echo "PGADMIN_POSTGRES_DIR not set. Setting it to the default: /usr/local/pgsql" export PGADMIN_POSTGRES_DIR=/usr/local/pgsql fi +if [ "x${PGADMIN_PYTHON_VERSION}" == "x" ]; then + echo "PGADMIN_PYTHON_VERSION not set. Setting it to the default: 3.9.0" + export PGADMIN_PYTHON_VERSION=3.9.0 +fi + source ${SCRIPT_DIR}/build-functions.sh _setup_env _cleanup -_create_venv _build_runtime +_create_python_env _build_docs _complete_bundle -_framework_config _codesign_binaries _codesign_bundle _create_dmg diff --git a/pkg/mac/dmg-background.png b/pkg/mac/dmg-background.png new file mode 100644 index 000000000..85e2331cb Binary files /dev/null and b/pkg/mac/dmg-background.png differ diff --git a/pkg/mac/dmg-icon.icns b/pkg/mac/dmg-icon.icns new file mode 100644 index 000000000..9bf2c6bb5 Binary files /dev/null and b/pkg/mac/dmg-icon.icns differ diff --git a/pkg/mac/dmg-license.py b/pkg/mac/dmg-license.py deleted file mode 100644 index d2bf514a1..000000000 --- a/pkg/mac/dmg-license.py +++ /dev/null @@ -1,166 +0,0 @@ -#! /usr/bin/env python -""" -This script adds a license file to a DMG. Requires Xcode and a plain ascii text -license file. -Obviously only runs on a Mac. - -Copyright (C) 2011-2013 Jared Hobbs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -""" -import os -import sys -import tempfile -import optparse - - -class Path(str): - def __enter__(self): - return self - - def __exit__(self, type, value, traceback): - os.unlink(self) - - -def mktemp(dir=None, suffix=''): - (fd, filename) = tempfile.mkstemp(dir=dir, suffix=suffix) - os.close(fd) - return Path(filename) - - -def main(options, args): - dmg_file, license_file = args - with mktemp('.') as tmp_file: - with open(tmp_file, 'w') as f: - f.write("""data 'TMPL' (128, "LPic") { - $"1344 6566 6175 6C74 204C 616E 6775 6167" - $"6520 4944 4457 5244 0543 6F75 6E74 4F43" - $"4E54 042A 2A2A 2A4C 5354 430B 7379 7320" - $"6C61 6E67 2049 4444 5752 441E 6C6F 6361" - $"6C20 7265 7320 4944 2028 6F66 6673 6574" - $"2066 726F 6D20 3530 3030 4457 5244 1032" - $"2D62 7974 6520 6C61 6E67 7561 6765 3F44" - $"5752 4404 2A2A 2A2A 4C53 5445" -}; - -data 'LPic' (5000) { - $"0000 0002 0000 0000 0000 0000 0004 0000" -}; - -data 'STR#' (5000, "English buttons") { - $"0006 0D45 6E67 6C69 7368 2074 6573 7431" - $"0541 6772 6565 0844 6973 6167 7265 6505" - $"5072 696E 7407 5361 7665 2E2E 2E7A 4966" - $"2079 6F75 2061 6772 6565 2077 6974 6820" - $"7468 6520 7465 726D 7320 6F66 2074 6869" - $"7320 6C69 6365 6E73 652C 2063 6C69 636B" - $"2022 4167 7265 6522 2074 6F20 6163 6365" - $"7373 2074 6865 2073 6F66 7477 6172 652E" - $"2020 4966 2079 6F75 2064 6F20 6E6F 7420" - $"6167 7265 652C 2070 7265 7373 2022 4469" - $"7361 6772 6565 2E22" -}; - -data 'STR#' (5002, "English") { - $"0006 0745 6E67 6C69 7368 0541 6772 6565" - $"0844 6973 6167 7265 6505 5072 696E 7407" - $"5361 7665 2E2E 2E7B 4966 2079 6F75 2061" - $"6772 6565 2077 6974 6820 7468 6520 7465" - $"726D 7320 6F66 2074 6869 7320 6C69 6365" - $"6E73 652C 2070 7265 7373 2022 4167 7265" - $"6522 2074 6F20 696E 7374 616C 6C20 7468" - $"6520 736F 6674 7761 7265 2E20 2049 6620" - $"796F 7520 646F 206E 6F74 2061 6772 6565" - $"2C20 7072 6573 7320 2244 6973 6167 7265" - $"6522 2E" -};\n\n""") - with open(license_file, 'r') as lines: - kind = 'RTF ' if license_file.lower().endswith('.rtf') \ - else 'TEXT' - f.write('data \'%s\' (5000, "English") {\n' % kind) - - def escape(s): - return s.strip().replace('\\', '\\\\').replace('"', '\\"') - - for line in lines: - if len(line) < 1000: - f.write(' "' + escape(line) + '\\n"\n') - else: - for liner in line.split('.'): - f.write(' "' + escape(liner) + '. \\n"\n') - f.write('};\n\n') - f.write("""data 'styl' (5000, "English") { - $"0003 0000 0000 000C 0009 0014 0000 0000" - $"0000 0000 0000 0000 0027 000C 0009 0014" - $"0100 0000 0000 0000 0000 0000 002A 000C" - $"0009 0014 0000 0000 0000 0000 0000" -};\n""") - os.system('hdiutil unflatten -quiet "%s"' % dmg_file) - ret = os.system('%s -a %s -o "%s"' % - (options.rez, tmp_file, dmg_file)) - os.system('hdiutil flatten -quiet "%s"' % dmg_file) - if options.compression is not None: - os.system('cp %s %s.temp.dmg' % (dmg_file, dmg_file)) - os.remove(dmg_file) - if options.compression == "bz2": - os.system('hdiutil convert %s.temp.dmg -format UDBZ -o %s' % - (dmg_file, dmg_file)) - elif options.compression == "gz": - os.system('hdiutil convert %s.temp.dmg -format ' % dmg_file + - 'UDZO -imagekey zlib-devel=9 -o %s' % dmg_file) - os.remove('%s.temp.dmg' % dmg_file) - if ret == 0: - print("Successfully added license to '%s'" % dmg_file) - else: - print("Failed to add license to '%s'" % dmg_file) - - -if __name__ == '__main__': - parser = optparse.OptionParser() - parser.set_usage("""%prog [OPTIONS] - This program adds a software license agreement to a DMG file. - It requires Xcode and either a plain ascii text - or a with the RTF contents. - - See --help for more details.""") - parser.add_option( - '--rez', - '-r', - action='store', - default='/Applications/Xcode.app/Contents/Developer/Tools/Rez', - help='The path to the Rez tool. Defaults to %default' - ) - parser.add_option( - '--compression', - '-c', - action='store', - choices=['bz2', 'gz'], - default=None, - help='Optionally compress dmg using specified compression type. ' - 'Choices are bz2 and gz.' - ) - options, args = parser.parse_args() - cond = len(args) != 2 - if not os.path.exists(options.rez): - print('Failed to find Rez at "%s"!\n' % options.rez) - cond = True - if cond: - parser.print_usage() - sys.exit(1) - main(options, args) diff --git a/pkg/mac/dmg.DS_Store b/pkg/mac/dmg.DS_Store new file mode 100644 index 000000000..307376868 Binary files /dev/null and b/pkg/mac/dmg.DS_Store differ diff --git a/pkg/mac/entitlements.plist.in b/pkg/mac/entitlements.plist.in new file mode 100644 index 000000000..b244af228 --- /dev/null +++ b/pkg/mac/entitlements.plist.in @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + %TEAMID%.org.pgadmin.pgadmin4 + com.apple.security.cs.disable-executable-page-protection + + + \ No newline at end of file diff --git a/pkg/mac/framework.conf.in b/pkg/mac/framework.conf.in deleted file mode 100644 index ddbc33623..000000000 --- a/pkg/mac/framework.conf.in +++ /dev/null @@ -1,10 +0,0 @@ -# Copy this file to framework.conf, and edit the values below to reflect your -# environment (versions of Python/Qt used) - -PYTHON_SHORT_VERSION=3.8 -PYTHON_FULL_VERSION=3.8.2 - -QT_SHORT_VERSION=5.14 -QT_FULL_VERSION=5.14.2 - - diff --git a/pkg/mac/pgAdmin4.icns b/pkg/mac/pgAdmin4.icns new file mode 100644 index 000000000..ae6a860e3 Binary files /dev/null and b/pkg/mac/pgAdmin4.icns differ diff --git a/pkg/mac/pgadmin.Info.plist.in b/pkg/mac/pgadmin.Info.plist.in deleted file mode 100644 index fb57ac894..000000000 --- a/pkg/mac/pgadmin.Info.plist.in +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - pgAdmin4 - CFBundleGetInfoString - pgAdmin4 PGADMIN_LONG_VERSION - CFBundleIconFile - pgAdmin4.icns - CFBundleIdentifier - org.postgresql.pgadmin - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleShortVersionString - PGADMIN_SHORT_VERSION - CFBundleSignature - ???? - CFBundleVersion - PGADMIN_LONG_VERSION - CSResourcesFileMapped - - - diff --git a/pkg/redhat/build.sh b/pkg/redhat/build.sh index ca1eb20a6..436fd22be 100755 --- a/pkg/redhat/build.sh +++ b/pkg/redhat/build.sh @@ -26,6 +26,12 @@ _build_runtime _build_docs "redhat" _copy_code +# Get an RPM-compatible version number +RPM_VERSION=${APP_RELEASE}.${APP_REVISION} +if [ ! -z ${APP_SUFFIX} ]; then + RPM_VERSION=${RPM_VERSION}_${APP_SUFFIX} +fi + # # Server package # @@ -46,7 +52,7 @@ cat << EOF > "${BUILDROOT}/server.spec" %undefine __brp_ldconfig Name: ${APP_NAME}-server -Version: ${APP_LONG_VERSION} +Version: ${RPM_VERSION} Release: 1%{?dist} Summary: The core server package for pgAdmin. License: PostgreSQL @@ -84,12 +90,12 @@ cat << EOF > "${BUILDROOT}/desktop.spec" %undefine __brp_ldconfig Name: ${APP_NAME}-desktop -Version: ${APP_LONG_VERSION} +Version: ${RPM_VERSION} Release: 1%{?dist} Summary: The desktop user interface for pgAdmin. License: PostgreSQL URL: https://www.pgadmin.org/ -Requires: ${APP_NAME}-server, qt5-qtbase, qt5-qtbase-gui +Requires: ${APP_NAME}-server, libatomic %description The desktop user interface for pgAdmin. pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world. @@ -99,9 +105,16 @@ The desktop user interface for pgAdmin. pgAdmin is the most popular and feature %install cp -rfa %{pga_build_root}/desktop/* \${RPM_BUILD_ROOT} +%post +/bin/xdg-icon-resource forceupdate + %files /usr/pgadmin4/bin/* -/usr/pgadmin4/share/* +/usr/share/icons/hicolor/128x128/apps/* +/usr/share/icons/hicolor/64x64/apps/* +/usr/share/icons/hicolor/48x48/apps/* +/usr/share/icons/hicolor/32x32/apps/* +/usr/share/icons/hicolor/16x16/apps/* /usr/share/applications/* EOF @@ -124,7 +137,7 @@ cat << EOF > "${BUILDROOT}/web.spec" %undefine __brp_ldconfig Name: ${APP_NAME}-web -Version: ${APP_LONG_VERSION} +Version: ${RPM_VERSION} Release: 1%{?dist} BuildArch: noarch Summary: The web interface for pgAdmin, hosted under Apache HTTPD. @@ -171,7 +184,7 @@ cat << EOF > "${BUILDROOT}/meta.spec" %undefine __brp_ldconfig Name: ${APP_NAME} -Version: ${APP_LONG_VERSION} +Version: ${RPM_VERSION} Release: 1%{?dist} BuildArch: noarch Summary: Installs all required components to run pgAdmin in desktop and web modes. @@ -209,8 +222,8 @@ yumdownloader --downloadonly --destdir=$DISTROOT postgresql13-libs # # Get the results! # -cp ${HOME}/rpmbuild/RPMS/${OS_ARCH}/${APP_NAME}-*${APP_LONG_VERSION}-*.${OS_ARCH}.rpm "${DISTROOT}/" -cp ${HOME}/rpmbuild/RPMS/noarch/${APP_NAME}-*${APP_LONG_VERSION}-*.noarch.rpm "${DISTROOT}/" +cp ${HOME}/rpmbuild/RPMS/${OS_ARCH}/${APP_NAME}-*${RPM_VERSION}-*.${OS_ARCH}.rpm "${DISTROOT}/" +cp ${HOME}/rpmbuild/RPMS/noarch/${APP_NAME}-*${RPM_VERSION}-*.noarch.rpm "${DISTROOT}/" if [ ${OS_VERSION} == 7 ]; then cp ${HOME}/rpmbuild/RPMS/${OS_ARCH}/pgadmin4-python3-mod_wsgi-4.7.1-2.el7.x86_64.rpm "${DISTROOT}/" fi diff --git a/pkg/redhat/setup.sh b/pkg/redhat/setup.sh index ffd3f6546..a44fd1ec3 100755 --- a/pkg/redhat/setup.sh +++ b/pkg/redhat/setup.sh @@ -35,10 +35,10 @@ echo "Installing build pre-requisites..." yum groupinstall -y "Development Tools" if [ ${OS_VERSION} == 7 ]; then - yum install -y expect fakeroot httpd-devel qt5-qtbase-devel postgresql12-devel python3-devel nodejs yarn rpm-build rpm-sign yum-utils krb5-devel + yum install -y expect fakeroot httpd-devel postgresql12-devel python3-devel nodejs yarn rpm-build rpm-sign yum-utils krb5-devel pip3 install sphinx else - yum install -y expect fakeroot qt5-qtbase-devel postgresql12-devel python3-devel python3-sphinx nodejs yarn rpm-build rpm-sign yum-utils krb5-devel + yum install -y expect fakeroot postgresql12-devel python3-devel python3-sphinx nodejs yarn rpm-build rpm-sign yum-utils krb5-devel fi # Setup RPM macros for signing diff --git a/pkg/win32/README.txt b/pkg/win32/README.txt index 87805f7fe..c151a6730 100644 --- a/pkg/win32/README.txt +++ b/pkg/win32/README.txt @@ -5,38 +5,29 @@ a 32bit build. Installing build requirements ============================= -1) Install Qt 5.14.2: https://www.qt.io/download-qt-installer - -Use the MSVC++ 2017 64bit option. - -2) Install Visual Studio 2017 Pro: https://my.visualstudio.com/Downloads?q=Visual%20Studio%202017 +1) Install Visual Studio 2017 Pro: https://my.visualstudio.com/Downloads?q=Visual%20Studio%202017 Choose the Desktop development with C++ option. -3) Install Chocolatey: https://chocolatey.org/install#individual +2) Install Chocolatey: https://chocolatey.org/install#individual -4) Install various command line tools: +3) Install various command line tools: -choco install -y bzip2 cmake diffutils gawk gnuwin32-coreutils.install gzip git html-help-workshop innosetup nodejs-lts python sed strawberryperl wget yarn +choco install -y bzip2 cmake diffutils dotnet3.5 gzip git innosetup nodejs-lts python strawberryperl wget yarn -5) Upgrade pip (this may give a permissions error that can be ignored): +4) Upgrade pip (this may give a permissions error that can be ignored): pip install --upgrade pip -6) Install virtualenv +5) Install virtualenv pip install virtualenv -7) Add the following paths to the system PATH: - -C:\Program Files (x86)\GnuWin32\bin -C:\Program Files (x86)\HTML Help Workshop - Building dependencies ===================== The following steps should be run from a Visual Studio 2017 64bit command -prompt (except where noted). +prompt. 1) Create a directory for the dependencies: @@ -165,9 +156,9 @@ Studio 2017 64bit command prompt. Note that the examples shown below are the defaults for the build system, so if they match your requirements you don't need to set them: -SET "PGADMIN_POSTGRES_DIR=C:\Program Files\PostgreSQL\12" -SET "PGADMIN_PYTHON_DIR=C:\Python38" -SET "PGADMIN_QT_DIR=C:\Qt\5.14.2\msvc2017_64" +SET "PGADMIN_POSTGRES_DIR=C:\Program Files\PostgreSQL\13" +SET "PGADMIN_PYTHON_DIR=C:\Python39" +SET "PGADMIN_KRB5_DIR=C:\jenkins\build64\krb5" SET "PGADMIN_INNOTOOL_DIR=C:\Program Files (x86)\Inno Setup 6" SET "PGADMIN_SIGNTOOL_DIR=C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64" SET "PGADMIN_VCREDIST_DIR=C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Redist\MSVC\14.16.27012" @@ -179,4 +170,4 @@ make If you have a code signing certificate, this will automatically be used if found in the Windows Certificate Store to sign the installer. -3) Find the completed installer in the dist/ subdirectory of your source tree. \ No newline at end of file +3) Find the completed installer in the dist/ subdirectory of your source tree. diff --git a/pkg/win32/installer.iss.in b/pkg/win32/installer.iss.in index 28d38b237..cd002cd22 100644 --- a/pkg/win32/installer.iss.in +++ b/pkg/win32/installer.iss.in @@ -33,6 +33,7 @@ ChangesEnvironment=yes ;UninstallFilesDir={app}\{#MyAppVersion} ArchitecturesInstallIn64BitMode={#MyAppArchitecturesMode} AllowNoIcons=yes +WizardImageFile=sidebar.bmp [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" @@ -288,7 +289,7 @@ begin end; // This function would be called during upgrade mode -// In upgrade mode - delete venv/* for example +// In upgrade mode - delete python/* for example procedure DelFolder(Path: string); var FindRec: TFindRec; @@ -340,7 +341,7 @@ begin if (IsUpgradeMode) then begin DelWebfolder(ExpandConstant('{app}\web')); - DelFolder(ExpandConstant('{app}\venv')); + DelFolder(ExpandConstant('{app}\python')); end; end; end; diff --git a/pkg/win32/sidebar.bmp b/pkg/win32/sidebar.bmp new file mode 100644 index 000000000..50f2dfcad Binary files /dev/null and b/pkg/win32/sidebar.bmp differ diff --git a/requirements.txt b/requirements.txt index 9be79a0e8..03c39950c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,6 +15,7 @@ # ignored when building a PIP Wheel. ############################################################################## blinker==1.4 +cheroot==8.5.1 Flask==1.0.2 Werkzeug>=0.15.0 Flask-Gravatar==0.5.0 @@ -38,8 +39,8 @@ psycopg2>=2.8 python-dateutil>=2.8.0 SQLAlchemy>=1.3.13 Flask-Security-Too>=3.0.0,<4.0.0 -bcrypt<=3.1.7 -cryptography<=3.0 +bcrypt>=3.1.7 +cryptography>=3.0 sshtunnel>=0.1.5 ldap3>=2.5.1 Flask-BabelEx>=0.9.4 diff --git a/runtime/.eslintignore b/runtime/.eslintignore new file mode 100644 index 000000000..676a4f03f --- /dev/null +++ b/runtime/.eslintignore @@ -0,0 +1,6 @@ +generated +node_modules +vendor +templates/ +templates\ +ycache diff --git a/runtime/.eslintrc.js b/runtime/.eslintrc.js new file mode 100644 index 000000000..7b68f2d1b --- /dev/null +++ b/runtime/.eslintrc.js @@ -0,0 +1,53 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2021, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +module.exports = { + 'env': { + 'browser': true, + 'es6': true, + 'amd': true, + 'jasmine': true, + }, + 'extends': [ + 'eslint:recommended', + ], + 'parserOptions': { + 'ecmaVersion': 2018, + "sourceType": "module", + }, + 'globals': { + '_': true, + 'module': true, + 'process': true, + 'nw': true, + 'platform': true + }, + 'rules': { + 'indent': [ + 'error', + 2 + ], + 'linebreak-style': 0, + 'quotes': [ + 'error', + 'single' + ], + 'semi': [ + 'error', + 'always' + ], + 'comma-dangle': [ + 'error', + 'always-multiline' + ], + 'no-console': ["error", { allow: ["warn", "error"] }], + // We need to exclude below for RegEx case + "no-useless-escape": 0, + }, +}; diff --git a/runtime/.gitignore b/runtime/.gitignore index c89cef663..f9a262068 100644 --- a/runtime/.gitignore +++ b/runtime/.gitignore @@ -1,12 +1 @@ -.qmake.cache -.qmake.stash -Makefile -moc_*.cpp -moc_*.h -pgAdmin4 -pgAdmin4.app/ -pgAdmin4.pro.user* -qrc_breeze.cpp -qrc_pgAdmin4.cpp -ui_*.h -object_script.* +dev_config.json \ No newline at end of file diff --git a/runtime/ConfigWindow.cpp b/runtime/ConfigWindow.cpp deleted file mode 100644 index d0426c8e9..000000000 --- a/runtime/ConfigWindow.cpp +++ /dev/null @@ -1,136 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// ConfigWindow.h - Configuration window -// -////////////////////////////////////////////////////////////////////////// - -#include "pgAdmin4.h" -#include "ConfigWindow.h" -#include "ui_ConfigWindow.h" - -#include -#include -#include - -ConfigWindow::ConfigWindow(QWidget *parent) : - QDialog(parent) -{ - initConfigWindow(); -} - -void ConfigWindow::initConfigWindow() -{ - ui = new Ui::ConfigWindow; - ui->setupUi(this); - - m_needRestart = false; - - setConfigValues(); -} - -void ConfigWindow::setConfigValues() -{ - QSettings settings; - - ui->browserCommandLineEdit->setText(settings.value("BrowserCommand").toString()); - - if(settings.value("FixedPort").toBool()) - { - ui->chkFixedPort->setCheckState(Qt::Checked); - ui->spinPortNumber->setEnabled(true); - } - else - { - ui->chkFixedPort->setCheckState(Qt::Unchecked); - ui->spinPortNumber->setEnabled(false); - } - - ui->spinPortNumber->setValue(settings.value("PortNumber").toInt()); - - if (settings.value("OpenTabAtStartup", true).toBool()) - { - ui->chkOpenTabAtStartup->setCheckState(Qt::Checked); - } - else - { - ui->chkOpenTabAtStartup->setCheckState(Qt::Unchecked); - } - - ui->pythonPathLineEdit->setText(settings.value("PythonPath").toString()); - ui->applicationPathLineEdit->setText(settings.value("ApplicationPath").toString()); -} - -void ConfigWindow::on_buttonBox_accepted() -{ - QSettings settings; - - // Save the settings, and return true if a restart is required, otherwise false. - QString browsercommand = ui->browserCommandLineEdit->text(); - bool fixedport = ui->chkFixedPort->isChecked(); - int portnumber = ui->spinPortNumber->value(); - bool opentabatstartup = ui->chkOpenTabAtStartup->isChecked(); - QString pythonpath = ui->pythonPathLineEdit->text(); - QString applicationpath = ui->applicationPathLineEdit->text(); - - if (fixedport && (settings.value("FixedPort").toBool() != fixedport || - settings.value("PortNumber").toInt() != portnumber) && isPortInUse(portnumber)) - { - QString error = QString(QWidget::tr("The specified fixed port is already in use. Please provide any other valid port.")); - QMessageBox::critical(Q_NULLPTR, QString(QWidget::tr("Fatal Error")), error); - } - else - { - m_needRestart = (settings.value("FixedPort").toBool() != fixedport || - settings.value("PortNumber").toInt() != portnumber || - settings.value("PythonPath").toString() != pythonpath || - settings.value("ApplicationPath").toString() != applicationpath); - - settings.setValue("BrowserCommand", browsercommand); - settings.setValue("FixedPort", fixedport); - settings.setValue("PortNumber", portnumber); - settings.setValue("OpenTabAtStartup", opentabatstartup); - settings.setValue("PythonPath", pythonpath); - settings.setValue("ApplicationPath", applicationpath); - - settings.sync(); - } - - emit accepted(m_needRestart); - emit closing(true); - - this->close(); -} - -void ConfigWindow::on_buttonBox_rejected() -{ - emit closing(false); - this->close(); -} - -void ConfigWindow::on_chkFixedPort_stateChanged(int state) -{ - if (state == Qt::Checked) - ui->spinPortNumber->setEnabled(true); - else - ui->spinPortNumber->setEnabled(false); -} - -bool ConfigWindow::isPortInUse(const quint16 port) const -{ - QTcpSocket socket; - - // Bind the socket on the specified port. - socket.bind(port, QTcpSocket::DontShareAddress); - - // Returns the host port number of the local socket if available; otherwise returns 0 - quint16 tmpPort = socket.localPort(); - if (tmpPort == 0) - return true; - - return false; -} diff --git a/runtime/ConfigWindow.h b/runtime/ConfigWindow.h deleted file mode 100644 index c76adc624..000000000 --- a/runtime/ConfigWindow.h +++ /dev/null @@ -1,46 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// ConfigWindow.h - Configuration window -// -////////////////////////////////////////////////////////////////////////// - -#ifndef CONFIGWINDOW_H -#define CONFIGWINDOW_H - -#include - -namespace Ui { -class ConfigWindow; -} - -class ConfigWindow : public QDialog -{ - Q_OBJECT - -public: - explicit ConfigWindow(QWidget *parent = Q_NULLPTR); - void setConfigValues(); - -signals: - void accepted(bool needRestart); - void closing(bool accepted); - -private slots: - void on_buttonBox_accepted(); - void on_buttonBox_rejected(); - void on_chkFixedPort_stateChanged(int state); - -private: - Ui::ConfigWindow *ui; - bool m_needRestart; - - void initConfigWindow(); - bool isPortInUse(const quint16 port) const; -}; - -#endif // CONFIGWINDOW_H diff --git a/runtime/ConfigWindow.ui b/runtime/ConfigWindow.ui deleted file mode 100644 index 84ece8f22..000000000 --- a/runtime/ConfigWindow.ui +++ /dev/null @@ -1,652 +0,0 @@ - - - ConfigWindow - - - - 0 - 0 - 800 - 415 - - - - - 0 - 0 - - - - - 800 - 415 - - - - pgAdmin 4 Configuration - - - - - - 0 - - - - Runtime - - - - - - QLayout::SetMaximumSize - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Enter a command line to be used to start the browser. If blank, the system default browser will be used. %URL% will be replaced with the appropriate URL when executing the browser. - - - true - - - 4 - - - - - - - QLayout::SetMaximumSize - - - - - - 0 - 0 - - - - - 250 - 0 - - - - - 16777215 - 16777215 - - - - Browser Command - - - - - - - /usr/bin/firefox %URL% - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - By default the runtime uses a random port number to ensure it can always run successfully. If you need to use a predictable port number, you can set one here. Note that if the port is already in use, the application will be unable to start. - - - true - - - - - - - - - - 0 - 0 - - - - - 250 - 0 - - - - - 16777215 - 16777215 - - - - Fixed Port Number? - - - - - - - - 0 - 0 - - - - - - - true - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - - - - - Port number - - - - - - - false - - - - 0 - 0 - - - - 1 - - - 65535 - - - 5050 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - By default, when the pgAdmin server is started a browser tab will be automatically opened to display the user interface. Un-check this option to run the server without automatically opening the browser. - - - true - - - - - - - - - - 250 - 0 - - - - Open a Browser Window/Tab at Startup? - - - - - - - Qt::RightToLeft - - - - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - Python - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 13 - - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - The options below are intended for expert users only, and may not behave as expected as they modify fixed search paths and are not alternate values. Modify with care! - - - true - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 17 - 13 - - - - - - - - - - - - - 0 - 0 - - - - - 250 - 0 - - - - Qt::LeftToRight - - - Python Path - - - true - - - 0 - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 0 - 0 - - - - - - - - - - - - /usr/pgadmin4/lib/python3.8;/usr/pgadmin4/lib/python3.8/site-packages - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Enter a PYTHONPATH if desired. Path elements should be semi-colon delimited. - - - Qt::AutoText - - - true - - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 13 - - - - - - - - - - - - - 0 - 0 - - - - - 250 - 0 - - - - Application Path - - - Qt::PlainText - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 0 - 0 - - - - - - - - - - - - /usr/pgadmin4/web - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Enter the path to the directory containing pgAdmin.py if desired. - - - false - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - true - - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 60 - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - ConfigWindow - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - ConfigWindow - reject() - - - 316 - 260 - - - 286 - 274 - - - - - chkFixedPort - stateChanged(int) - ConfigWindow - on_chkFixedPort_stateChanged(int) - - - 202 - 213 - - - 365 - 149 - - - - - - on_chkFixedPort_stateChanged(int) - - diff --git a/runtime/FloatingWindow.cpp b/runtime/FloatingWindow.cpp deleted file mode 100644 index bfccf89c8..000000000 --- a/runtime/FloatingWindow.cpp +++ /dev/null @@ -1,147 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// FloatingWindow.cpp - For GNOME 3.26 and above floating window will be used. -// -//////////////////////////////////////////////////////////////////////////// - -#include "pgAdmin4.h" -#include "FloatingWindow.h" -#include "ui_FloatingWindow.h" - -#include -#include - - -FloatingWindow::FloatingWindow(QWidget *parent) : - QMainWindow(parent) -{ -} - - -bool FloatingWindow::Init() -{ - ui = new Ui::FloatingWindow; - ui->setupUi(this); - - // Creating Menu - createMenu(); - - // Setup the icon itself. For convenience, we'll also use it for the dialogue. -#ifdef Q_OS_MAC - QIcon icon(":pgAdmin4-mac.png"); -#else - QIcon icon(":pgAdmin4.png"); -#endif - - setWindowIcon(icon); - setWindowTitle(tr("pgAdmin")); - setFixedSize(300, 230); - setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowMinimizeButtonHint); - return true; -} - - -// Create the menu -void FloatingWindow::createMenu() -{ - createActions(); - - m_floatingWindowMenu = menuBar()->addMenu(tr("&pgAdmin 4")); - m_floatingWindowMenu->addAction(m_newAction); - m_floatingWindowMenu->addAction(m_copyUrlAction); - m_floatingWindowMenu->addSeparator(); - m_floatingWindowMenu->addAction(m_configAction); - m_floatingWindowMenu->addAction(m_logAction); - m_floatingWindowMenu->addSeparator(); - m_floatingWindowMenu->addAction(m_quitAction); -} - - -// Create the menu actions -void FloatingWindow::createActions() -{ - m_newAction = new QAction(tr("&New pgAdmin 4 window..."), this); - m_newAction->setEnabled(false); - connect(m_newAction, SIGNAL(triggered()), m_menuActions, SLOT(onNew())); - - m_copyUrlAction = new QAction(tr("&Copy server URL"), this); - m_copyUrlAction->setEnabled(false); - connect(m_copyUrlAction, SIGNAL(triggered()), m_menuActions, SLOT(onCopyUrl())); - - m_configAction = new QAction(tr("C&onfigure..."), this); - m_configAction->setEnabled(false); - connect(m_configAction, SIGNAL(triggered()), m_menuActions, SLOT(onConfig())); - - m_logAction = new QAction(tr("&View log..."), this); - m_logAction->setEnabled(false); - connect(m_logAction, SIGNAL(triggered()), m_menuActions, SLOT(onLog())); - - m_quitAction = new QAction(tr("&Shut down server"), this); - m_quitAction->setEnabled(false); - connect(m_quitAction, SIGNAL(triggered()), m_menuActions, SLOT(onQuit())); -} - - -void FloatingWindow::enablePostStartOptions() -{ - if (m_newAction != Q_NULLPTR) - m_newAction->setEnabled(true); - - if (m_copyUrlAction != Q_NULLPTR) - m_copyUrlAction->setEnabled(true); - - if (m_configAction != Q_NULLPTR) - m_configAction->setEnabled(true); - - if (m_logAction != Q_NULLPTR) - m_logAction->setEnabled(true); - - if (m_quitAction != Q_NULLPTR) - m_quitAction->setEnabled(true); -} - -void FloatingWindow::setMenuActions(MenuActions * menuActions) -{ - m_menuActions = menuActions; -} - -// Enable the View Log option -void FloatingWindow::enableViewLogOption() -{ - if (m_logAction != Q_NULLPTR) - m_logAction->setEnabled(true); -} - -// Disable the View Log option -void FloatingWindow::disableViewLogOption() -{ - if (m_logAction != Q_NULLPTR) - m_logAction->setEnabled(false); -} - -// Enable the configure option -void FloatingWindow::enableConfigOption() -{ - if (m_configAction != Q_NULLPTR) - m_configAction->setEnabled(true); -} - -// Disable the configure option -void FloatingWindow::disableConfigOption() -{ - if (m_configAction != Q_NULLPTR) - m_configAction->setEnabled(false); -} - -void FloatingWindow::closeEvent(QCloseEvent * event) -{ - // Emit the signal to shut down the python server. - emit shutdownSignal(m_menuActions->getAppServerUrl()); - event->accept(); - exit(0); -} diff --git a/runtime/FloatingWindow.h b/runtime/FloatingWindow.h deleted file mode 100644 index 0bcc5d96c..000000000 --- a/runtime/FloatingWindow.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// FloatingWindow.h - For GNOME 3.26 and above floating window will be used. -// -//////////////////////////////////////////////////////////////////////////// - -#ifndef FLOATINGWINDOW_H -#define FLOATINGWINDOW_H - -#include "MenuActions.h" - -#include - -namespace Ui { -class FloatingWindow; -} - -class FloatingWindow : public QMainWindow -{ - Q_OBJECT - -public: - explicit FloatingWindow(QWidget *parent = Q_NULLPTR); - - bool Init(); - void enablePostStartOptions(); - void enableViewLogOption(); - void disableViewLogOption(); - void enableConfigOption(); - void disableConfigOption(); - void setMenuActions(MenuActions * menuActions); - -private: - Ui::FloatingWindow *ui; - - void createMenu(); - void createActions(); - void closeEvent(QCloseEvent * event); - - QAction *m_newAction = Q_NULLPTR; - QAction *m_copyUrlAction = Q_NULLPTR; - QAction *m_configAction = Q_NULLPTR; - QAction *m_logAction = Q_NULLPTR; - QAction *m_quitAction = Q_NULLPTR; - - QMenu *m_floatingWindowMenu = Q_NULLPTR; - MenuActions *m_menuActions = Q_NULLPTR; - -signals: - void shutdownSignal(QUrl); -}; - -#endif // FLOATINGWINDOW_H diff --git a/runtime/FloatingWindow.ui b/runtime/FloatingWindow.ui deleted file mode 100644 index edb285a71..000000000 --- a/runtime/FloatingWindow.ui +++ /dev/null @@ -1,155 +0,0 @@ - - - FloatingWindow - - - - 0 - 0 - 300 - 230 - - - - - 0 - 0 - - - - pgAdmin 4 - - - - - - 10 - 10 - 281 - 201 - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 100 - 100 - - - - - 100 - 100 - - - - border-image:url(":pgAdmin4.png"); - - - - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::LeftToRight - - - Note: Installing a system tray plugin will prevent this window being shown. - - - Qt::AutoText - - - Qt::AlignCenter - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - diff --git a/runtime/Info.plist b/runtime/Info.plist deleted file mode 100644 index d9c4a940e..000000000 --- a/runtime/Info.plist +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - pgAdmin 4 - CFBundleShortVersionString - 4.30.0 - CFBundleVersion - 4.30.0 - LSMinimumSystemVersion - 10.10 - NSHumanReadableCopyright - Copyright (C) 2013 - 2021, The pgAdmin Development Team - CFBundleIconFile - @ICON@ - CFBundlePackageType - APPL - CFBundleGetInfoString - pgAdmin 4 - PostgreSQL Tools - CFBundleSignature - @TYPEINFO@ - CFBundleExecutable - @EXECUTABLE@ - CFBundleIdentifier - org.pgadmin.@EXECUTABLE@ - NSPrincipalClass - NSApplication - LSUIElement - 1 - - diff --git a/runtime/LogWindow.cpp b/runtime/LogWindow.cpp deleted file mode 100644 index 0ae0b08c5..000000000 --- a/runtime/LogWindow.cpp +++ /dev/null @@ -1,103 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// LogWindow.cpp - Log viewer window -// -////////////////////////////////////////////////////////////////////////// - -#include "pgAdmin4.h" -#include "LogWindow.h" -#include "ui_LogWindow.h" - -#include -#include - -#include - -LogWindow::LogWindow(QWidget *parent) : - QDialog(parent) -{ - initLogWindow(); -} - -void LogWindow::initLogWindow() -{ - ui = new Ui::LogWindow; - ui->setupUi(this); -} - -void LogWindow::LoadLog() -{ - int startupLines; - int serverLines; - - ui->lblStatus->setText(tr("Loading logfiles...")); - - ui->lblStartupLog->setText(tr("Startup Log (%1):").arg(g_startupLogFile)); - ui->lblServerLog->setText(tr("Server Log (%1):").arg(g_serverLogFile)); - - startupLines = this->readLog(g_startupLogFile, ui->textStartupLog); - serverLines = this->readLog(g_serverLogFile, ui->textServerLog); - - ui->lblStatus->setText(QString(tr("Loaded startup log (%1 lines) and server log (%2 lines).")).arg(startupLines).arg(serverLines)); -} - - -void LogWindow::reload() -{ - this->LoadLog(); -} - - -// Read the logfile -int LogWindow::readLog(QString logFile, QPlainTextEdit *logWidget) -{ - FILE *log; - char *buffer; - long len = 0; - int i; - int lines = 0; - - // Look busy! - QApplication::setOverrideCursor(Qt::WaitCursor); - this->setDisabled(true); - QCoreApplication::processEvents( QEventLoop::AllEvents, 100 ); - - logWidget->clear(); - - // Attempt to open the file - log = fopen(logFile.toUtf8().data(), "r"); - if (log == Q_NULLPTR) - { - logWidget->setPlainText(QString(tr("The log file (%1) could not be opened.")).arg(g_serverLogFile)); - this->setDisabled(false); - QApplication::restoreOverrideCursor(); - return 0; - } - - // Get the file size, and read the data - fseek(log, 0, SEEK_END); - len = ftell(log); - rewind(log); - buffer = static_cast(malloc((len + 1) * sizeof(char))); - - for (i = 0; i < len; i++) { - if (fread(buffer + i, 1, 1, log) > 0 && buffer[i] == '\n') - lines++; - } - - buffer[i] = 0; - - fclose(log); - logWidget->setPlainText(buffer); - - // And... relax - this->setDisabled(false); - QApplication::restoreOverrideCursor(); - - return lines; -} diff --git a/runtime/LogWindow.h b/runtime/LogWindow.h deleted file mode 100644 index 61da46852..000000000 --- a/runtime/LogWindow.h +++ /dev/null @@ -1,40 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// LogWindow.h - Log viewer window -// -////////////////////////////////////////////////////////////////////////// - -#ifndef LOGWINDOW_H -#define LOGWINDOW_H - -#include -#include - -namespace Ui { -class LogWindow; -} - -class LogWindow : public QDialog -{ - Q_OBJECT - -public: - explicit LogWindow(QWidget *parent = Q_NULLPTR); - void LoadLog(); - -private slots: - void reload(); - -private: - Ui::LogWindow *ui; - - void initLogWindow(); - int readLog(QString logFile, QPlainTextEdit *logWidget); -}; - -#endif // LOGWINDOW_H diff --git a/runtime/LogWindow.ui b/runtime/LogWindow.ui deleted file mode 100644 index b2466fab7..000000000 --- a/runtime/LogWindow.ui +++ /dev/null @@ -1,138 +0,0 @@ - - - LogWindow - - - - 0 - 0 - 800 - 500 - - - - pgAdmin 4 Log - - - - - - Startup Log: - - - - - - - - Courier - - - - true - - - - - - false - - - - - - - Server Log: - - - - - - - - Courier - - - - true - - - - - - false - - - - - - - - - Reload - - - - - - - - 0 - 0 - - - - - - - - - - - Close - - - - - - - - - - - btnReload - clicked() - LogWindow - reload() - - - 53 - 471 - - - 399 - 249 - - - - - btnClose - clicked() - LogWindow - close() - - - 731 - 471 - - - 399 - 249 - - - - - - reload() - - diff --git a/runtime/Logger.cpp b/runtime/Logger.cpp deleted file mode 100644 index 7cd42210b..000000000 --- a/runtime/Logger.cpp +++ /dev/null @@ -1,63 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// Logger.cpp - Logger Utility -// -////////////////////////////////////////////////////////////////////////// - -#include "pgAdmin4.h" -#include "Logger.h" - -#include -#include -#include - -Logger* Logger::m_pThis = Q_NULLPTR; -QFile* Logger::m_Logfile = Q_NULLPTR; - -Logger::Logger() -{ -} - -Logger::~Logger() -{ -} - -Logger* Logger::GetLogger() -{ - if (m_pThis == Q_NULLPTR) - { - m_pThis = new Logger(); - m_Logfile = new QFile; - m_Logfile->setFileName(g_startupLogFile); - m_Logfile->open(QIODevice::WriteOnly | QIODevice::Text); - m_Logfile->setPermissions(QFile::ReadOwner|QFile::WriteOwner); - } - - return m_pThis; -} - -void Logger::Log(const QString& sMessage) const -{ - QString text = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss: ") + sMessage + "\n"; - if (m_Logfile != Q_NULLPTR) - { - QTextStream out(m_Logfile); - out << text; - } -} - -void Logger::ReleaseLogger() -{ - if (m_pThis != Q_NULLPTR) - { - if(m_Logfile != Q_NULLPTR) - m_Logfile->close(); - delete m_pThis; - m_pThis = Q_NULLPTR; - } -} diff --git a/runtime/Logger.h b/runtime/Logger.h deleted file mode 100644 index 6b2ceaa85..000000000 --- a/runtime/Logger.h +++ /dev/null @@ -1,33 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// Logger.h - Logger Utility -// -////////////////////////////////////////////////////////////////////////// - -#ifndef LOGGER_H -#define LOGGER_H - -#include -#include - -class Logger : public QObject -{ -public: - static Logger* GetLogger(); - static void ReleaseLogger(); - void Log(const QString& sMessage) const; - -private: - Logger(); - virtual ~Logger(); - - static Logger* m_pThis; - static QFile *m_Logfile; -}; - -#endif // LOGGER_H diff --git a/runtime/MenuActions.cpp b/runtime/MenuActions.cpp deleted file mode 100644 index 57b124c65..000000000 --- a/runtime/MenuActions.cpp +++ /dev/null @@ -1,118 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// MenuActions.cpp - Common file for menu actions. -// -////////////////////////////////////////////////////////////////////////// - -#include "pgAdmin4.h" -#include "MenuActions.h" - -#include -#include -#include -#include -#include -#include -#include - -MenuActions::MenuActions() -{ -} - -void MenuActions::setAppServerUrl(QString appServerUrl) -{ - m_appServerUrl = appServerUrl; -} - - -// Create a new application browser window on user request -void MenuActions::onNew() const -{ - QSettings settings; - QString cmd = settings.value("BrowserCommand").toString(); - - if (!cmd.isEmpty()) - { - cmd.replace("%URL%", m_appServerUrl); - QProcess::startDetached(cmd); - } - else - { - if (!QDesktopServices::openUrl(m_appServerUrl)) - { - QString error(QWidget::tr("Failed to open the system default web browser. Is one installed?.")); - QMessageBox::critical(Q_NULLPTR, QString(QWidget::tr("Fatal Error")), error); - - exit(1); - } - } -} - - -// Copy the application server URL to the clipboard -void MenuActions::onCopyUrl() const -{ - QClipboard *clipboard = QApplication::clipboard(); - clipboard->setText(m_appServerUrl); -} - - -// Show the config dialogue -void MenuActions::onConfig() -{ - if (!m_configWindow) - m_configWindow = new ConfigWindow(); - - m_configWindow->setConfigValues(); - m_configWindow->show(); - m_configWindow->raise(); - m_configWindow->activateWindow(); - connect(m_configWindow, SIGNAL(accepted(bool)), this, SLOT(onConfigDone(bool))); -} - - -void MenuActions::onConfigDone(bool needRestart) const -{ - if (needRestart && QMessageBox::Yes == QMessageBox::question(Q_NULLPTR, - tr("Shut down server?"), - tr("The pgAdmin 4 server must be restarted for changes to take effect. Do you want to shut down the server now?"), - QMessageBox::Yes | QMessageBox::No)) - { - exit(0); - } -} - - -// Show the log window -void MenuActions::onLog() -{ - QSettings settings; - - if (!m_logWindow) - m_logWindow = new LogWindow(); - - m_logWindow->show(); - m_logWindow->raise(); - m_logWindow->activateWindow(); - - QCoreApplication::processEvents(QEventLoop::AllEvents, 100); - - m_logWindow->LoadLog(); -} - - -// Exit -void MenuActions::onQuit() -{ - if (QMessageBox::Yes == QMessageBox::question(Q_NULLPTR, tr("Shut down server?"), tr("Are you sure you want to shut down the pgAdmin 4 server?"), QMessageBox::Yes | QMessageBox::No)) - { - // Emit the signal to shut down the python server. - emit shutdownSignal(m_appServerUrl); - QApplication::quit(); - } -} diff --git a/runtime/MenuActions.h b/runtime/MenuActions.h deleted file mode 100644 index 52d07c617..000000000 --- a/runtime/MenuActions.h +++ /dev/null @@ -1,46 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// MenuActions.h - Common file for menu actions. -// -////////////////////////////////////////////////////////////////////////// - -#ifndef MENUACTIONS_H -#define MENUACTIONS_H - -#include "LogWindow.h" -#include "ConfigWindow.h" - -class MenuActions: public QObject -{ - Q_OBJECT -public: - MenuActions(); - - void setAppServerUrl(QString appServerUrl); - QString getAppServerUrl() const { return m_appServerUrl; } - -private: - QString m_appServerUrl = ""; - LogWindow *m_logWindow = Q_NULLPTR; - ConfigWindow *m_configWindow = Q_NULLPTR; - -public slots: - void onConfigDone(bool needRestart) const; - -protected slots: - void onNew() const; - void onCopyUrl() const; - void onConfig(); - void onLog(); - void onQuit(); - -signals: - void shutdownSignal(QUrl); -}; - -#endif // MENUACTIONS_H diff --git a/runtime/Runtime.cpp b/runtime/Runtime.cpp deleted file mode 100644 index 7572872e0..000000000 --- a/runtime/Runtime.cpp +++ /dev/null @@ -1,660 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// Runtime.cpp - Core of the runtime -// -////////////////////////////////////////////////////////////////////////// - -#include "pgAdmin4.h" -#include "Runtime.h" -#include "Server.h" -#include "TrayIcon.h" -#include "MenuActions.h" -#include "ConfigWindow.h" -#include "FloatingWindow.h" -#include "Logger.h" - -#ifdef Q_OS_MAC -#include "macos.h" -#endif - -// Must be before QT -#include - -#include -#include -#include -#include -#include - - -Runtime::Runtime() -{ - -} - - -bool Runtime::go(int argc, char *argv[]) -{ - // Before starting main application, need to set 'QT_X11_NO_MITSHM=1' - // to make the runtime work with IBM PPC machines. -#if defined (Q_OS_LINUX) - QByteArray val("1"); - qputenv("QT_X11_NO_MITSHM", val); -#endif - - // Create the QT application - QApplication app(argc, argv); - app.setQuitOnLastWindowClosed(false); - - // Setup look n feel - setupStyling(&app); - - // Setup the settings management - QCoreApplication::setOrganizationName("pgadmin"); - QCoreApplication::setOrganizationDomain("pgadmin.org"); - QCoreApplication::setApplicationName("pgadmin4"); - - QSettings settings; - - // Interlock - if (alreadyRunning()) - exit(0); - - // Proxy config - configureProxy(); - - // Display the spash screen - m_splash = displaySplash(&app); - - // Generate a random key to authenticate the client to the server - QString key = QUuid::createUuid().toString(); - key = key.mid(1, key.length() - 2); - - // Create Menu Actions - MenuActions *menuActions = new MenuActions(); - - // Create the control object (tray icon or floating window - m_splash->showMessage(QString(QWidget::tr("Checking for system tray...")), Qt::AlignBottom | Qt::AlignCenter); - - if (QSystemTrayIcon::isSystemTrayAvailable()) - m_trayIcon = createTrayIcon(menuActions); - else - m_floatingWindow = createFloatingWindow(menuActions); - - // Fire up the app server - const Server *server = startServerLoop(key); - - // Ensure we'll cleanup - QObject::connect(server, SIGNAL(finished()), server, SLOT(deleteLater())); - atexit(cleanup); - - // Generate the app server URL - QString url = QString("http://127.0.0.1:%1/?key=%2").arg(m_port).arg(key); - Logger::GetLogger()->Log(QString(QWidget::tr("Application Server URL: %1")).arg(url)); - - // Check the server is running - checkServer(url); - - // Stash the URL for any duplicate processes to open - createAddressFile(url); - - // Go! - menuActions->setAppServerUrl(url); - - // Enable the shutdown server menu as server started successfully. - if (m_trayIcon != Q_NULLPTR) - m_trayIcon->enablePostStartOptions(); - if (m_floatingWindow != Q_NULLPTR) - m_floatingWindow->enablePostStartOptions(); - - // Open the browser if needed - if (settings.value("OpenTabAtStartup", true).toBool()) - openBrowserTab(url); - - // Make sure the server is shutdown if the server is quit by the user - QObject::connect(menuActions, SIGNAL(shutdownSignal(QUrl)), server, SLOT(shutdown(QUrl))); - - // Final cleanup - m_splash->finish(Q_NULLPTR); - - if (m_floatingWindow != Q_NULLPTR) - m_floatingWindow->show(); - - Logger::GetLogger()->Log("Everything works fine, successfully started pgAdmin4."); - Logger::ReleaseLogger(); - return app.exec(); -} - - -// Setup the styling -void Runtime::setupStyling(QApplication *app) const -{ - // Setup the styling -#ifndef Q_OS_LINUX - QFile stylesheet; - -#ifdef Q_OS_WIN32 - QSettings registry("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", QSettings::Registry64Format); - if (!registry.value("AppsUseLightTheme", true).toBool()) - { - qDebug( "Windows Dark Mode..." ); - stylesheet.setFileName(":/qdarkstyle/style.qss"); - stylesheet.open(QFile::ReadOnly | QFile::Text); - QTextStream stream(&stylesheet); - app->setStyleSheet(stream.readAll()); - } -#endif - -#ifdef Q_OS_MAC - if (IsDarkMode()) - { - qDebug( "macOS Dark Mode..."); - stylesheet.setFileName(":/qdarkstyle/style.qss"); - stylesheet.open(QFile::ReadOnly | QFile::Text); - QTextStream stream(&stylesheet); - app->setStyleSheet(stream.readAll()); - } -#endif -#endif - - // Set high DPI pixmap to display icons clear on Qt widget. - QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); -} - -// Check if we're already running. If we are, open a new browser tab. -bool Runtime::alreadyRunning() -{ - // Create a system-wide semaphore keyed by app name, exe hash and the username - // to ensure instances are unique to the user and path - QString userName = qgetenv("USER"); // *nix - if (userName.isEmpty()) - userName = qgetenv("USERNAME"); // Windows - - QString semaName = QString("pgadmin4-%1-%2-sema").arg(userName).arg(getExeHash()); - QString shmemName = QString("pgadmin4-%1-%2-shmem").arg(userName).arg(getExeHash()); - qDebug() << "Semaphore name:" << semaName; - qDebug() << "Shared memory segment name:" << shmemName; - - QSystemSemaphore sema(semaName, 1); - sema.acquire(); - -#ifndef Q_OS_WIN32 - // We may need to clean up stale shmem segments on *nix. Attaching and detaching - // should remove the segment if it is orphaned. - QSharedMemory stale_shmem(shmemName); - if (stale_shmem.attach()) - stale_shmem.detach(); -#endif - - m_shmem = new QSharedMemory(shmemName); - bool is_running; - if (m_shmem->attach()) - is_running = true; - else - { - m_shmem->create(1); - is_running = false; - } - sema.release(); - - if (is_running) - { - QFile addressFile(g_addressFile); - addressFile.open(QIODevice::ReadOnly | QIODevice::Text); - QTextStream in(&addressFile); - QString url = in.readLine(); - - qDebug() << "Already running. Opening browser tab to: " << url << "and exiting."; - openBrowserTab(url); - return true; - } - - return false; -} - - -void Runtime::configureProxy() const -{ - // In windows and linux, it is required to set application level proxy - // because socket bind logic to find free port gives socket creation error - // when system proxy is configured. We are also setting - // "setUseSystemConfiguration"=true to use the system proxy which will - // override this application level proxy. As this bug is fixed in Qt 5.9 so - // need to set application proxy for Qt version < 5.9. - // -#if defined (Q_OS_WIN) && QT_VERSION <= 0x050800 - // Give dummy URL required to find proxy server configured in windows. - QNetworkProxyQuery proxyQuery(QUrl("https://www.pgadmin.org")); - QNetworkProxy l_proxy; - QList listOfProxies = QNetworkProxyFactory::systemProxyForQuery(proxyQuery); - - if (listOfProxies.size()) - { - l_proxy = listOfProxies[0]; - - // If host name is not empty means proxy server is configured. - if (!l_proxy.hostName().isEmpty()) { - QNetworkProxy::setApplicationProxy(QNetworkProxy()); - } - } -#endif - -#if defined (Q_OS_LINUX) && QT_VERSION <= 0x050800 - QByteArray proxy_env; - proxy_env = qgetenv("http_proxy"); - // If http_proxy environment is defined in linux then proxy server is configured. - if (!proxy_env.isEmpty()) { - QNetworkProxy::setApplicationProxy(QNetworkProxy()); - } -#endif -} - - -// Display the splash screen -QSplashScreen * Runtime::displaySplash(QApplication *app) -{ - QSplashScreen *splash = new QSplashScreen(); - splash->setPixmap(QPixmap(":/splash.png")); - splash->setWindowFlags(splash->windowFlags() | Qt::WindowStaysOnTopHint); - splash->show(); - app->processEvents(QEventLoop::AllEvents); - - return splash; -} - - -// Get the port number we're going to use -quint16 Runtime::getPort() const -{ - quint16 port = 0L; - QSettings settings; - - if (settings.value("FixedPort", false).toBool()) - { - // Use the fixed port number - port = settings.value("PortNumber", 5050).toUInt(); - } - else - { - // Find an unused port number. Essentially, we're just reserving one - // here that Flask will use when we start up the server. - QTcpSocket socket; - -#if QT_VERSION >= 0x050900 - socket.setProxy(QNetworkProxy::NoProxy); -#endif - - socket.bind(0, QTcpSocket::ShareAddress); - port = socket.localPort(); - } - - return port; -} - - -// Create a tray icon -TrayIcon * Runtime::createTrayIcon(MenuActions *menuActions) -{ - TrayIcon *trayIcon = Q_NULLPTR; - - m_splash->showMessage(QString(QWidget::tr("Checking for system tray...")), Qt::AlignBottom | Qt::AlignCenter); - Logger::GetLogger()->Log("Checking for system tray..."); - - // Start the tray service - trayIcon = new TrayIcon(); - - // Set the MenuActions object to connect to slot - if (trayIcon != Q_NULLPTR) - trayIcon->setMenuActions(menuActions); - - trayIcon->Init(); - - return trayIcon; -} - - -// Create a floating window -FloatingWindow * Runtime::createFloatingWindow(MenuActions *menuActions) -{ - FloatingWindow *floatingWindow = Q_NULLPTR; - - m_splash->showMessage(QString(QWidget::tr("System tray not found, creating floating window...")), Qt::AlignBottom | Qt::AlignCenter); - Logger::GetLogger()->Log("System tray not found, creating floating window..."); - floatingWindow = new FloatingWindow(); - if (floatingWindow == Q_NULLPTR) - { - QString error = QString(QWidget::tr("Unable to initialize either a tray icon or floating window.")); - QMessageBox::critical(Q_NULLPTR, QString(QWidget::tr("Fatal Error")), error); - Logger::GetLogger()->Log(error); - Logger::ReleaseLogger(); - exit(1); - } - - // Set the MenuActions object to connect to slot - floatingWindow->setMenuActions(menuActions); - floatingWindow->Init(); - - return floatingWindow; -} - - -void Runtime::openConfigureWindow(const QString errorMsg) -{ - m_splash->finish(Q_NULLPTR); - - qDebug() << errorMsg; - QMessageBox::critical(Q_NULLPTR, QString(QWidget::tr("Fatal Error")), errorMsg); - Logger::GetLogger()->Log(errorMsg); - - // Allow the user to tweak the configuration if needed - m_configDone = false; - QSettings settings; - bool oldFixedPort = settings.value("FixedPort", false).toBool(); - - - ConfigWindow *dlg = new ConfigWindow(); - dlg->setAttribute(Qt::WA_DeleteOnClose); - dlg->show(); - dlg->raise(); - dlg->activateWindow(); - QObject::connect(dlg, SIGNAL(closing(bool)), this, SLOT(onConfigDone(bool))); - - // Wait for configuration to be completed - while (!m_configDone) - delay(100); - - // Read the value of port again if user has changed. - bool newFixedPort = settings.value("FixedPort", false).toBool(); - quint16 newPort = settings.value("PortNumber").toUInt(); - - // User hasn't changed the value of fixed port check box - // only change the value of the port - if (oldFixedPort == newFixedPort && newFixedPort && m_port != newPort) - m_port = newPort; - // User has selected the fixed port and it's old value is random port, - // so port needs to be updated. - else if (oldFixedPort != newFixedPort && newFixedPort) - m_port = newPort; - // User has deselect the fixed port and it's old value is fixed port, - // so we will have to get the random port - else if (oldFixedPort != newFixedPort && !newFixedPort) - m_port = getPort(); -} - -// Server startup loop -Server * Runtime::startServerLoop(QString key) -{ - bool done = false; - Server *server; - - // Get the port number to use - m_port = getPort(); - - while (!done) - { - server = startServer(key); - if (server == NULL) - { - Logger::ReleaseLogger(); - QApplication::quit(); - } - - // Check for server startup errors - if (server->isFinished() || server->getError().length() > 0) - { - QString error = QString(QWidget::tr("An error occurred initialising the pgAdmin 4 server:\n\n%1")).arg(server->getError()); - - delete server; - - // Enable the View Log option for diagnostics - if (m_floatingWindow) - m_floatingWindow->enableViewLogOption(); - if (m_trayIcon) - m_trayIcon->enableViewLogOption(); - - // Open the configuration window - openConfigureWindow(error); - - // Disable the View Log option again - if (m_floatingWindow) - m_floatingWindow->disableViewLogOption(); - if (m_trayIcon) - m_trayIcon->disableViewLogOption(); - } - else - { - // Startup appears successful - done = true; - } - } - - return server; -} - - -// Slot called when re-configuration is done. -void Runtime::onConfigDone(bool accepted) -{ - if (accepted) - m_configDone = true; - else - exit(0); -} - - -// Start the server -Server * Runtime::startServer(QString key) -{ - Server *server; - - m_splash->showMessage(QString(QWidget::tr("Starting pgAdmin4 server...")), Qt::AlignBottom | Qt::AlignCenter); - Logger::GetLogger()->Log("Starting pgAdmin4 server..."); - - QString msg = QString(QWidget::tr("Creating server object, port:%1, key:%2, logfile:%3")).arg(m_port).arg(key).arg(g_serverLogFile); - Logger::GetLogger()->Log(msg); - server = new Server(this, m_port, key, g_serverLogFile); - - Logger::GetLogger()->Log("Initializing server..."); - if (!server->Init()) - { - m_splash->finish(Q_NULLPTR); - - qDebug() << server->getError(); - - QString error = QString(QWidget::tr("An error occurred initialising the pgAdmin 4 server:\n\n%1")).arg(server->getError()); - QMessageBox::critical(Q_NULLPTR, QString(QWidget::tr("Fatal Error")), error); - - Logger::GetLogger()->Log(error); - Logger::ReleaseLogger(); - - exit(1); - } - - Logger::GetLogger()->Log("Server initialized, starting server thread..."); - server->start(); - - // This is a hack to give the server a chance to start and potentially fail. As - // the Python interpreter is a synchronous call, we can't check for proper startup - // easily in a more robust way - we have to rely on a clean startup not returning. - // It should always fail pretty quickly, and take longer to start if it succeeds, so - // we don't really get a visible delay here. - delay(1000); - - return server; -} - - -// Check the server is running properly -void Runtime::checkServer(QString url) -{ - // Read the server connection timeout from the registry or set the default timeout. - QSettings settings; - int timeout = settings.value("ConnectionTimeout", 90).toInt(); - - // Now the server should be up, we'll attempt to connect and get a response. - // We'll retry in a loop a few time before aborting if necessary. - - QTime endTime = QTime::currentTime().addSecs(timeout); - QTime midTime1 = QTime::currentTime().addSecs(timeout/3); - QTime midTime2 = QTime::currentTime().addSecs(timeout*2/3); - bool alive = false; - bool enableOptions = false; - - Logger::GetLogger()->Log("The server should be up. Attempting to connect and get a response."); - while(QTime::currentTime() <= endTime) - { - alive = pingServer(QUrl(url)); - - if (alive) - { - break; - } - - if(QTime::currentTime() >= midTime1) - { - if (m_floatingWindow && !enableOptions) - { - m_floatingWindow->enableViewLogOption(); - m_floatingWindow->enableConfigOption(); - enableOptions = true; - } - - if (m_trayIcon && !enableOptions) - { - m_trayIcon->enableViewLogOption(); - m_trayIcon->enableConfigOption(); - enableOptions = true; - } - - if(QTime::currentTime() < midTime2) { - m_splash->showMessage(QString(QWidget::tr("Taking longer than usual...")), Qt::AlignBottom | Qt::AlignCenter); - } - else - { - m_splash->showMessage(QString(QWidget::tr("Almost there...")), Qt::AlignBottom | Qt::AlignCenter); - } - } - - delay(200); - } - - // Attempt to connect one more time in case of a long network timeout while looping - Logger::GetLogger()->Log("Attempt to connect one more time in case of a long network timeout while looping"); - if (!alive && !pingServer(QUrl(url))) - { - m_splash->finish(Q_NULLPTR); - QString error(QWidget::tr("The pgAdmin 4 server could not be contacted.")); - QMessageBox::critical(Q_NULLPTR, QString(QWidget::tr("Fatal Error")), error); - - Logger::ReleaseLogger(); - exit(1); - } -} - - -// Create the address file -void Runtime::createAddressFile(QString url) const -{ - QFile addressFile(g_addressFile); - if (addressFile.open(QIODevice::WriteOnly)) - { - addressFile.setPermissions(QFile::ReadOwner|QFile::WriteOwner); - QTextStream out(&addressFile); - out << url << endl; - } -} - - -// Open a browser tab -void Runtime::openBrowserTab(QString url) const -{ - QSettings settings; - QString cmd = settings.value("BrowserCommand").toString(); - - if (!cmd.isEmpty()) - { - cmd.replace("%URL%", url); - QProcess::startDetached(cmd); - } - else - { - if (!QDesktopServices::openUrl(url)) - { - QString error(QWidget::tr("Failed to open the system default web browser. Is one installed?.")); - QMessageBox::critical(Q_NULLPTR, QString(QWidget::tr("Fatal Error")), error); - - Logger::GetLogger()->Log(error); - Logger::ReleaseLogger(); - exit(1); - } - } -} - - -// Make a request to the Python API server -QString Runtime::serverRequest(QUrl url, QString path) -{ - QNetworkAccessManager manager; - QEventLoop loop; - QNetworkReply *reply; - QVariant redirectUrl; - - - url.setPath(path); - QString requestUrl = url.toString(); - - do - { - reply = manager.get(QNetworkRequest(url)); - QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); - loop.exec(); - - redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); - url = redirectUrl.toUrl(); - - if (!redirectUrl.isNull()) - delete reply; - - } while (!redirectUrl.isNull()); - - if (reply->error() != QNetworkReply::NoError) - { - qDebug() << "Failed to connect to the server:" << reply->errorString() << "- request URL:" << requestUrl << "."; - return QString(); - } - - QString response = reply->readAll(); - qDebug() << "Server response:" << response << "- request URL:" << requestUrl << "."; - - return response; -} - - -// Ping the application server to see if it's alive -bool Runtime::pingServer(QUrl url) -{ - return serverRequest(url, "/misc/ping") == "PING"; -} - - -// Shutdown the application server -bool Runtime::shutdownServer(QUrl url) -{ - return serverRequest(url, "/misc/shutdown") == "SHUTDOWN"; -} - - -void Runtime::delay(int milliseconds) const -{ - QTime endTime = QTime::currentTime().addMSecs(milliseconds); - while(QTime::currentTime() < endTime) - { - QCoreApplication::processEvents(QEventLoop::AllEvents, 100); - } -} - diff --git a/runtime/Runtime.h b/runtime/Runtime.h deleted file mode 100644 index c9d54a567..000000000 --- a/runtime/Runtime.h +++ /dev/null @@ -1,69 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// Runtime.h - Core of the runtime -// -////////////////////////////////////////////////////////////////////////// - -#ifndef RUNTIME_H -#define RUNTIME_H - -// Include the Python header here as it needs to appear before any QT -// headers anywhere in the app. -#ifdef __MINGW32__ -#include -#endif -#include - -#include "TrayIcon.h" -#include "MenuActions.h" -#include "FloatingWindow.h" - -// QT headers -#include - -class Server; - -class Runtime: public QObject -{ - Q_OBJECT -public: - Runtime(); - - bool alreadyRunning(); - bool go(int argc, char *argv[]); - void delay(int milliseconds) const; - bool shutdownServer(QUrl url); - -private: - QSharedMemory *m_shmem; - bool m_configDone; - FloatingWindow *m_floatingWindow = Q_NULLPTR; - TrayIcon *m_trayIcon = Q_NULLPTR; - QSplashScreen *m_splash = Q_NULLPTR; - quint16 m_port = 0; - - void setupStyling(QApplication *app) const; - void configureProxy() const; - QSplashScreen *displaySplash(QApplication *app); - quint16 getPort() const; - TrayIcon *createTrayIcon(MenuActions *menuActions); - FloatingWindow *createFloatingWindow(MenuActions *menuActions); - Server *startServerLoop(QString key); - Server *startServer(QString key); - void checkServer(QString url); - void createAddressFile(QString url) const; - void openBrowserTab(QString url) const; - QString serverRequest(QUrl url, QString path); - bool pingServer(QUrl url); - void openConfigureWindow(const QString errorMsg); - -private slots: - void onConfigDone(bool accepted); -}; - -#endif // RUNTIME_H diff --git a/runtime/Server.cpp b/runtime/Server.cpp deleted file mode 100644 index c56a7b4e7..000000000 --- a/runtime/Server.cpp +++ /dev/null @@ -1,363 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// Server.cpp - Thread in which the web server will run. -// -////////////////////////////////////////////////////////////////////////// - -#include "pgAdmin4.h" - -// Must be before QT -#include - -#include "Server.h" -#include "Logger.h" - -// QT headers -#include -#include -#include -#include -#include -#include - - -static void add_to_path(QString &python_path, QString path, bool prepend=false) -{ - if (!python_path.contains(path)) - { - if (!prepend) - { -#if defined(Q_OS_WIN) - if (!python_path.isEmpty() && !python_path.endsWith(";")) - python_path.append(";"); -#else - if (!python_path.isEmpty() && !python_path.endsWith(":")) - python_path.append(":"); -#endif - - python_path.append(path); - } - else - { -#if defined(Q_OS_WIN) - if (!python_path.isEmpty() && !python_path.startsWith(";")) - python_path.prepend(";"); -#else - if (!python_path.isEmpty() && !python_path.startsWith(":")) - python_path.prepend(":"); -#endif - - python_path.prepend(path); - } - } -} - -Server::Server(Runtime *runtime, quint16 port, QString key, QString logFileName): - m_runtime(runtime), - m_port(port), - m_key(key), - m_logFileName(logFileName) -{ - // Initialise Python - Py_NoSiteFlag=1; - Py_NoUserSiteDirectory=1; - Py_DontWriteBytecodeFlag=1; - - // Python3 requires conversion of char * to wchar_t *, so... - const char *appName = QString("pgAdmin 4").toUtf8(); - const size_t cSize = strlen(appName)+1; - m_wcAppName = new wchar_t[cSize]; - mbstowcs (m_wcAppName, appName, cSize); - Py_SetProgramName(m_wcAppName); - - // Setup the search path - QSettings settings; - QString python_path = settings.value("PythonPath").toString(); - - // Get the application directory - QString app_dir = QCoreApplication::applicationDirPath(); - QString path_env = qgetenv("PATH"); - QString pythonHome; - QStringList path_list; - int i; - -#ifdef Q_OS_MAC - // In the case we're running in a release appbundle, we need to ensure the - // bundled virtual env is included in the Python path. We include it at the - // end, so expert users can override the path, but we do not save it, because - // if users move the app bundle, we'll end up with dead entries - - // Build (and canonicalise) the virtual environment path - QFileInfo venvBinPath(app_dir + "/../Resources/venv/bin"); - QFileInfo venvLibPath(app_dir + "/../Resources/venv/lib/python"); - QFileInfo venvDynLibPath(app_dir + "/../Resources/venv/lib/python/lib-dynload"); - QFileInfo venvSitePackagesPath(app_dir + "/../Resources/venv/lib/python/site-packages"); - QFileInfo venvPath(app_dir + "/../Resources/venv"); - - // Prepend the bin directory to the path - add_to_path(path_env, venvBinPath.canonicalFilePath(), true); - // Append the path, if it's not already there - add_to_path(python_path, venvLibPath.canonicalFilePath()); - add_to_path(python_path, venvDynLibPath.canonicalFilePath()); - add_to_path(python_path, venvSitePackagesPath.canonicalFilePath()); - add_to_path(pythonHome, venvPath.canonicalFilePath()); -#elif defined(Q_OS_WIN) - - // In the case we're running in a release application, we need to ensure the - // bundled virtual env is included in the Python path. We include it at the - // end, so expert users can override the path, but we do not save it. - - // Build (and canonicalise) the virtual environment path - QFileInfo venvBinPath(app_dir + "/../venv"); - QFileInfo venvLibPath(app_dir + "/../venv/Lib"); - QFileInfo venvDLLsPath(app_dir + "/../venv/DLLs"); - QFileInfo venvSitePackagesPath(app_dir + "/../venv/Lib/site-packages"); - QFileInfo venvPath(app_dir + "/../venv"); - - // Prepend the bin directory to the path - add_to_path(path_env, venvBinPath.canonicalFilePath(), true); - // Append paths, if they're not already there - add_to_path(python_path, venvLibPath.canonicalFilePath()); - add_to_path(python_path, venvDLLsPath.canonicalFilePath()); - add_to_path(python_path, venvSitePackagesPath.canonicalFilePath()); - add_to_path(pythonHome, venvPath.canonicalFilePath()); -#else - // Build (and canonicalise) the virtual environment path - QFileInfo venvBinPath(app_dir + "/../venv/bin"); - QFileInfo venvLibPath(app_dir + "/../venv/lib/python"); - QFileInfo venvDynLibPath(app_dir + "/../venv/lib/python/lib-dynload"); - QFileInfo venvSitePackagesPath(app_dir + "/../venv/lib/python/site-packages"); - QFileInfo venvPath(app_dir + "/../venv"); - - // Prepend the bin directory to the path - add_to_path(path_env, venvBinPath.canonicalFilePath(), true); - // Append the path, if it's not already there - add_to_path(python_path, venvLibPath.canonicalFilePath()); - add_to_path(python_path, venvDynLibPath.canonicalFilePath()); - add_to_path(python_path, venvSitePackagesPath.canonicalFilePath()); - add_to_path(pythonHome, venvPath.canonicalFilePath()); -#endif - - qputenv("PATH", path_env.toUtf8().data()); - - if (python_path.length() > 0) - { - // Split the path setting into individual entries - path_list = python_path.split(";", QString::SkipEmptyParts); - python_path = QString(); - - // Add new additional path elements - for (i = path_list.size() - 1; i >= 0 ; --i) - { - python_path.append(path_list.at(i)); - if (i > 0) - { -#if defined(Q_OS_WIN) - python_path.append(";"); -#else - python_path.append(":"); -#endif - } - } - qputenv("PYTHONPATH", python_path.toUtf8().data()); - } - - qDebug() << "Python path: " << python_path - << "\nPython Home: " << pythonHome; - - Logger::GetLogger()->Log(QString("Python Path: %1").arg(python_path)); - Logger::GetLogger()->Log(QString("Python Home: %1").arg(pythonHome)); - - if (!pythonHome.isEmpty()) - { - const char *python_home = pythonHome.toUtf8().data(); - const size_t home_size = strlen(python_home) + 1; - m_wcPythonHome = new wchar_t[home_size]; - mbstowcs (m_wcPythonHome, python_home, home_size); - - Py_SetPythonHome(m_wcPythonHome); - } - - Logger::GetLogger()->Log("Initializing Python..."); - Py_Initialize(); - Logger::GetLogger()->Log("Python initialized."); - - // Get the current path - PyObject* sysPath = PySys_GetObject(const_cast("path")); - if (sysPath != Q_NULLPTR) - { - // Add new additional path elements - Logger::GetLogger()->Log("Adding new additional path elements"); - for (i = path_list.size() - 1; i >= 0 ; --i) - { - PyList_Append(sysPath, PyUnicode_DecodeFSDefault(path_list.at(i).toUtf8().data())); - } - } - else - Logger::GetLogger()->Log("Unable to get the current path."); - - // Redirect stderr - Logger::GetLogger()->Log("Redirecting stderr..."); - PyObject *sys = PyImport_ImportModule("sys"); - if (sys != Q_NULLPTR) - { - PyObject *err = Q_NULLPTR; - FILE *log = Q_NULLPTR; - -#if defined(Q_OS_WIN) - char *logFile = m_logFileName.toUtf8().data(); - size_t fileSize = strlen(logFile) + 1; - wchar_t * wcLogFileName = new wchar_t[fileSize]; - mbstowcs (wcLogFileName, logFile, fileSize); - - log = _wfopen(wcLogFileName, (wchar_t *)"w"); -#else - log = fopen(m_logFileName.toUtf8().data(), const_cast("w")); -#endif - if (log != Q_NULLPTR) - { - int fd = fileno(log); - err = PyFile_FromFd(fd, Q_NULLPTR, const_cast("w"), -1, Q_NULLPTR, Q_NULLPTR, Q_NULLPTR, 0); - } - else - Logger::GetLogger()->Log(QString("Failed to open log file: %1").arg(m_logFileName)); - -#if defined(Q_OS_WIN) - if (wcLogFileName != NULL) - { - delete wcLogFileName; - wcLogFileName = NULL; - } -#endif - QFile(m_logFileName).setPermissions(QFile::ReadOwner|QFile::WriteOwner); - if (err != Q_NULLPTR) - { - PyObject_SetAttrString(sys, "stderr", err); - Logger::GetLogger()->Log("stderr redirected successfully."); - } - else - Logger::GetLogger()->Log(QString("Failed to get the file pointer of: %1 ").arg(m_logFileName)); - } - else - Logger::GetLogger()->Log("Failed to import 'sys' module."); -} - -Server::~Server() -{ - if (m_wcAppName) - delete m_wcAppName; - - if (m_wcPythonHome) - delete m_wcPythonHome; - - // Shutdown Python - Py_Finalize(); -} - -bool Server::Init() -{ - QSettings settings; - - // Find the webapp - QStringList paths; - paths.append("../web/"); // Linux source tree - paths.append("../../web/"); // Windows source tree - paths.append("../../../../web/"); // Mac source tree (in a dev env) -#ifdef Q_OS_MAC - paths.append("../Resources/web/"); // Mac source tree (in a release app bundle) -#endif - paths.append(settings.value("ApplicationPath").toString()); // System configured value - paths.append(""); // Should be last! - - for (int i = 0; i < paths.size(); ++i) - { - QDir dir; - - if (paths[i].startsWith('/')) - dir.setPath(paths[i]); - else - dir.setPath(QCoreApplication::applicationDirPath() + "/" + paths[i]); - - m_appfile = dir.canonicalPath() + "/pgAdmin4.py"; - - if (QFile::exists(m_appfile)) - { - qDebug() << "Webapp path: " << m_appfile; - Logger::GetLogger()->Log(QString("Webapp Path: %1").arg(m_appfile)); - break; - } - } - - if (!QFile::exists(m_appfile)) - { - Logger::GetLogger()->Log("Failed to locate pgAdmin4.py, terminating server thread."); - setError(tr("Failed to locate pgAdmin4.py, terminating server thread.")); - return false; - } - - return true; -} - -void Server::run() -{ - // Open the application code and run it. - Logger::GetLogger()->Log("Open the application code and run it."); - FILE *cp = fopen(m_appfile.toUtf8().data(), "r"); - if (!cp) - { - Logger::GetLogger()->Log(QString(tr("Failed to open the application file: %1, server thread exiting.")).arg(m_appfile)); - setError(QString(tr("Failed to open the application file: %1, server thread exiting.")).arg(m_appfile)); - return; - } - - // Set the port number and key, and force SERVER_MODE off. - Logger::GetLogger()->Log("Set the port number, key and force SERVER_MODE off"); - PyRun_SimpleString(QString("PGADMIN_INT_PORT = %1").arg(m_port).toLatin1()); - PyRun_SimpleString(QString("PGADMIN_INT_KEY = '%1'").arg(m_key).toLatin1()); - PyRun_SimpleString(QString("SERVER_MODE = False").toLatin1()); - - // Run the app! - QByteArray m_appfile_utf8 = m_appfile.toUtf8(); - - /* - * Untrusted search path vulnerability in the PySys_SetArgv API function in Python 2.6 and earlier, and possibly later - * versions, prepends an empty string to sys.path when the argv[0] argument does not contain a path separator, - * which might allow local users to execute arbitrary code via a Trojan horse Python file in the current working directory. - * Here we have to set arguments explicitly to python interpreter. Check more details in 'PySys_SetArgv' documentation. - */ - const char *appName = m_appfile_utf8.data(); - const size_t cSize = strlen(appName)+1; - wchar_t* wcAppName = new wchar_t[cSize]; - mbstowcs (wcAppName, appName, cSize); - wchar_t* n_argv[] = { wcAppName }; - PySys_SetArgv(1, n_argv); - - Logger::GetLogger()->Log("PyRun_SimpleFile launching application server..."); - if (PyRun_SimpleFile(cp, m_appfile_utf8.data()) != 0) - { - Logger::GetLogger()->Log("Failed to launch the application server, server thread exiting."); - setError(tr("Failed to launch the application server, server thread exiting.")); - } - - fclose(cp); -} - -void Server::shutdown(QUrl url) -{ - if (!m_runtime->shutdownServer(url)) - setError(tr("Failed to shut down application server thread.")); - - QThread::quit(); - QThread::wait(); - while(!this->isFinished()) - { - Logger::GetLogger()->Log("Waiting for server to shut down."); - m_runtime->delay(250); - } -} - diff --git a/runtime/Server.h b/runtime/Server.h deleted file mode 100644 index 198b3ba53..000000000 --- a/runtime/Server.h +++ /dev/null @@ -1,56 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// Server.h - Thread in which the web server will run. -// -////////////////////////////////////////////////////////////////////////// - -#ifndef SERVER_H -#define SERVER_H - -#include "Runtime.h" - -#include -#include - -class Server : public QThread -{ - Q_OBJECT - -public: - Server(Runtime *runtime, quint16 port, QString key, QString logFileName); - ~Server(); - - bool Init(); - QString getError() const { return m_error; } - -public slots: - void shutdown(QUrl url); - -protected: - void run(); - -private: - void setError(QString error) { m_error = error; } - - QString m_appfile; - QString m_error; - - Runtime *m_runtime; - quint16 m_port; - QString m_key; - QString m_logFileName; - - // Application name in UTF-8 for Python - wchar_t *m_wcAppName = Q_NULLPTR; - - // PythonHome for Python - wchar_t *m_wcPythonHome = Q_NULLPTR; -}; - -#endif // SERVER_H - diff --git a/runtime/TrayIcon.cpp b/runtime/TrayIcon.cpp deleted file mode 100644 index 47e894d24..000000000 --- a/runtime/TrayIcon.cpp +++ /dev/null @@ -1,143 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// TrayIcon.cpp - Manages the tray icon -// -////////////////////////////////////////////////////////////////////////// - -#include "pgAdmin4.h" -#include "TrayIcon.h" - -#include - - -TrayIcon::TrayIcon() -{ -} - - -void TrayIcon::Init() -{ - createTrayIcon(); - - if (m_trayIcon) - m_trayIcon->show(); -} - - -// Create the tray icon -void TrayIcon::createTrayIcon() -{ - createActions(); - - if (m_trayIconMenu) - { - delete m_trayIconMenu; - m_trayIconMenu = Q_NULLPTR; - } - - m_trayIconMenu = new QMenu(this); - m_trayIconMenu->addAction(m_newAction); - m_trayIconMenu->addAction(m_copyUrlAction); - m_trayIconMenu->addSeparator(); - m_trayIconMenu->addAction(m_configAction); - m_trayIconMenu->addAction(m_logAction); - m_trayIconMenu->addSeparator(); - m_trayIconMenu->addAction(m_quitAction); - - if (!m_trayIcon) - m_trayIcon = new QSystemTrayIcon(this); - - m_trayIcon->setContextMenu(m_trayIconMenu); - - // Setup the icon itself. For convenience, we'll also use it for the dialogue. -#ifdef Q_OS_MAC - QIcon icon(":pgAdmin4-mac.png"); -#else - QIcon icon(":pgAdmin4.png"); -#endif - - m_trayIcon->setIcon(icon); - setWindowIcon(icon); -} - - -// Create the menu actions -void TrayIcon::createActions() -{ - m_newAction = new QAction(tr("&New pgAdmin 4 window..."), this); - m_newAction->setEnabled(false); - connect(m_newAction, SIGNAL(triggered()), m_menuActions, SLOT(onNew())); - - m_copyUrlAction = new QAction(tr("&Copy server URL"), this); - m_copyUrlAction->setEnabled(false); - connect(m_copyUrlAction, SIGNAL(triggered()), m_menuActions, SLOT(onCopyUrl())); - - m_configAction = new QAction(tr("&Configure..."), this); - m_configAction->setEnabled(false); - connect(m_configAction, SIGNAL(triggered()), m_menuActions, SLOT(onConfig())); - - m_logAction = new QAction(tr("&View log..."), this); - m_logAction->setEnabled(false); - connect(m_logAction, SIGNAL(triggered()), m_menuActions, SLOT(onLog())); - - m_quitAction = new QAction(tr("&Shut down server"), this); - m_quitAction->setEnabled(false); - connect(m_quitAction, SIGNAL(triggered()), m_menuActions, SLOT(onQuit())); -} - - -void TrayIcon::enablePostStartOptions() -{ - if (m_newAction != Q_NULLPTR) - m_newAction->setEnabled(true); - - if (m_copyUrlAction != Q_NULLPTR) - m_copyUrlAction->setEnabled(true); - - if (m_configAction != Q_NULLPTR) - m_configAction->setEnabled(true); - - if (m_logAction != Q_NULLPTR) - m_logAction->setEnabled(true); - - if (m_quitAction != Q_NULLPTR) - m_quitAction->setEnabled(true); -} - -// Enable the View Log option -void TrayIcon::enableViewLogOption() -{ - if (m_logAction != Q_NULLPTR) - m_logAction->setEnabled(true); -} - -// Disable the View Log option -void TrayIcon::disableViewLogOption() -{ - if (m_logAction != Q_NULLPTR) - m_logAction->setEnabled(false); -} - -// Enable the configure option -void TrayIcon::enableConfigOption() -{ - if (m_configAction != Q_NULLPTR) - m_configAction->setEnabled(true); -} - -// Disable the configure option -void TrayIcon::disableConfigOption() -{ - if (m_configAction != Q_NULLPTR) - m_configAction->setEnabled(false); -} - -void TrayIcon::setMenuActions(MenuActions * menuActions) -{ - m_menuActions = menuActions; -} diff --git a/runtime/TrayIcon.h b/runtime/TrayIcon.h deleted file mode 100644 index 389d1e710..000000000 --- a/runtime/TrayIcon.h +++ /dev/null @@ -1,51 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// TrayIcon.h - Manages the tray icon -// -////////////////////////////////////////////////////////////////////////// - -#ifndef TRAYICON_H -#define TRAYICON_H - -#include "MenuActions.h" - -#include -#include - -class TrayIcon : public QWidget -{ - Q_OBJECT - -public: - TrayIcon(); - - void Init(); - void enablePostStartOptions(); - void enableViewLogOption(); - void disableViewLogOption(); - void enableConfigOption(); - void disableConfigOption(); - void setMenuActions(MenuActions * menuActions); - -private: - void createTrayIcon(); - void createActions(); - - QAction *m_newAction = Q_NULLPTR; - QAction *m_copyUrlAction = Q_NULLPTR; - QAction *m_configAction = Q_NULLPTR; - QAction *m_logAction = Q_NULLPTR; - QAction *m_quitAction = Q_NULLPTR; - - QSystemTrayIcon *m_trayIcon = Q_NULLPTR; - QMenu *m_trayIconMenu = Q_NULLPTR; - - MenuActions *m_menuActions = Q_NULLPTR; -}; - -#endif // TRAYICON_H diff --git a/runtime/pgAdmin4.png b/runtime/assets/pgAdmin4.png similarity index 100% rename from runtime/pgAdmin4.png rename to runtime/assets/pgAdmin4.png diff --git a/runtime/assets/welcome_logo.svg b/runtime/assets/welcome_logo.svg new file mode 100644 index 000000000..a90323cd7 --- /dev/null +++ b/runtime/assets/welcome_logo.svg @@ -0,0 +1 @@ +pgAdmin_PostgreSQL \ No newline at end of file diff --git a/runtime/breeze.qrc b/runtime/breeze.qrc deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/branch_closed-on.svg b/runtime/dark/branch_closed-on.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/branch_closed.svg b/runtime/dark/branch_closed.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/branch_open-on.svg b/runtime/dark/branch_open-on.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/branch_open.svg b/runtime/dark/branch_open.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/checkbox_checked.svg b/runtime/dark/checkbox_checked.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/checkbox_checked_disabled.svg b/runtime/dark/checkbox_checked_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/checkbox_indeterminate.svg b/runtime/dark/checkbox_indeterminate.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/checkbox_indeterminate_disabled.svg b/runtime/dark/checkbox_indeterminate_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/checkbox_unchecked.svg b/runtime/dark/checkbox_unchecked.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/checkbox_unchecked_disabled.svg b/runtime/dark/checkbox_unchecked_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/close-hover.svg b/runtime/dark/close-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/close-pressed.svg b/runtime/dark/close-pressed.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/close.svg b/runtime/dark/close.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/down_arrow-hover.svg b/runtime/dark/down_arrow-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/down_arrow.svg b/runtime/dark/down_arrow.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/down_arrow_disabled.svg b/runtime/dark/down_arrow_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/hmovetoolbar.svg b/runtime/dark/hmovetoolbar.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/hsepartoolbar.svg b/runtime/dark/hsepartoolbar.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/left_arrow.svg b/runtime/dark/left_arrow.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/left_arrow_disabled.svg b/runtime/dark/left_arrow_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/radio_checked.svg b/runtime/dark/radio_checked.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/radio_checked_disabled.svg b/runtime/dark/radio_checked_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/radio_unchecked.svg b/runtime/dark/radio_unchecked.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/radio_unchecked_disabled.svg b/runtime/dark/radio_unchecked_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/right_arrow.svg b/runtime/dark/right_arrow.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/right_arrow_disabled.svg b/runtime/dark/right_arrow_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/sizegrip.svg b/runtime/dark/sizegrip.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/spinup_disabled.svg b/runtime/dark/spinup_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/stylesheet-branch-end-closed.svg b/runtime/dark/stylesheet-branch-end-closed.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/stylesheet-branch-end-open.svg b/runtime/dark/stylesheet-branch-end-open.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/stylesheet-branch-end.svg b/runtime/dark/stylesheet-branch-end.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/stylesheet-branch-more.svg b/runtime/dark/stylesheet-branch-more.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/stylesheet-vline.svg b/runtime/dark/stylesheet-vline.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/transparent.svg b/runtime/dark/transparent.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/undock-hover.svg b/runtime/dark/undock-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/undock.svg b/runtime/dark/undock.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/up_arrow-hover.svg b/runtime/dark/up_arrow-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/up_arrow.svg b/runtime/dark/up_arrow.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/up_arrow_disabled.svg b/runtime/dark/up_arrow_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/vmovetoolbar.svg b/runtime/dark/vmovetoolbar.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dark/vsepartoolbars.svg b/runtime/dark/vsepartoolbars.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/dev_config.json.in b/runtime/dev_config.json.in new file mode 100644 index 000000000..48ee6ea51 --- /dev/null +++ b/runtime/dev_config.json.in @@ -0,0 +1,4 @@ +{ + "pythonPath": "C:/Python38/python.exe", + "pgadminFile": "../web/pgAdmin4.py" +} \ No newline at end of file diff --git a/runtime/light/branch_closed-on.svg b/runtime/light/branch_closed-on.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/branch_closed.svg b/runtime/light/branch_closed.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/branch_open-on.svg b/runtime/light/branch_open-on.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/branch_open.svg b/runtime/light/branch_open.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/checkbox_checked-hover.svg b/runtime/light/checkbox_checked-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/checkbox_checked.svg b/runtime/light/checkbox_checked.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/checkbox_checked_disabled.svg b/runtime/light/checkbox_checked_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/checkbox_indeterminate-hover.svg b/runtime/light/checkbox_indeterminate-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/checkbox_indeterminate.svg b/runtime/light/checkbox_indeterminate.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/checkbox_indeterminate_disabled.svg b/runtime/light/checkbox_indeterminate_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/checkbox_unchecked-hover.svg b/runtime/light/checkbox_unchecked-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/checkbox_unchecked_disabled.svg b/runtime/light/checkbox_unchecked_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/close-hover.svg b/runtime/light/close-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/close-pressed.svg b/runtime/light/close-pressed.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/close.svg b/runtime/light/close.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/down_arrow-hover.svg b/runtime/light/down_arrow-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/down_arrow.svg b/runtime/light/down_arrow.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/down_arrow_disabled.svg b/runtime/light/down_arrow_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/hmovetoolbar.svg b/runtime/light/hmovetoolbar.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/hsepartoolbar.svg b/runtime/light/hsepartoolbar.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/left_arrow.svg b/runtime/light/left_arrow.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/left_arrow_disabled.svg b/runtime/light/left_arrow_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/radio_checked-hover.svg b/runtime/light/radio_checked-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/radio_checked.svg b/runtime/light/radio_checked.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/radio_checked_disabled.svg b/runtime/light/radio_checked_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/radio_unchecked-hover.svg b/runtime/light/radio_unchecked-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/radio_unchecked_disabled.svg b/runtime/light/radio_unchecked_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/right_arrow.svg b/runtime/light/right_arrow.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/right_arrow_disabled.svg b/runtime/light/right_arrow_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/sizegrip.svg b/runtime/light/sizegrip.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/spinup_disabled.svg b/runtime/light/spinup_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/stylesheet-branch-end-closed.svg b/runtime/light/stylesheet-branch-end-closed.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/stylesheet-branch-end-open.svg b/runtime/light/stylesheet-branch-end-open.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/stylesheet-branch-end.svg b/runtime/light/stylesheet-branch-end.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/stylesheet-branch-more.svg b/runtime/light/stylesheet-branch-more.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/stylesheet-vline.svg b/runtime/light/stylesheet-vline.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/transparent.svg b/runtime/light/transparent.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/undock-hover.svg b/runtime/light/undock-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/undock.svg b/runtime/light/undock.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/up_arrow-hover.svg b/runtime/light/up_arrow-hover.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/up_arrow.svg b/runtime/light/up_arrow.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/up_arrow_disabled.svg b/runtime/light/up_arrow_disabled.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/vmovetoolbar.svg b/runtime/light/vmovetoolbar.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/light/vsepartoolbars.svg b/runtime/light/vsepartoolbars.svg deleted file mode 100644 index e69de29bb..000000000 diff --git a/runtime/macos.h b/runtime/macos.h deleted file mode 100644 index 2ed4f8843..000000000 --- a/runtime/macos.h +++ /dev/null @@ -1,17 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// macos.h - macOS-specific Objective-C/C++ functions -// -////////////////////////////////////////////////////////////////////////// - -#ifndef MACOS_H -#define MACOS_H - -bool IsDarkMode(); - -#endif // MACOS_H diff --git a/runtime/macos.mm b/runtime/macos.mm deleted file mode 100644 index b40ea10e1..000000000 --- a/runtime/macos.mm +++ /dev/null @@ -1,27 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// macos.mm - macOS-specific Objective-C/C++ functions -// -////////////////////////////////////////////////////////////////////////// - -#import -#import - -// Detect if we're running in Dark mode -bool IsDarkMode() { -#ifdef __MAC_10_14 - if (@available(macOS 10.14, *)) { - NSString *interfaceStyle = [NSUserDefaults.standardUserDefaults valueForKey:@"AppleInterfaceStyle"]; - return [interfaceStyle isEqualToString:@"Dark"]; - } else { - return NO; - } -#else - return NO; -#endif -} diff --git a/runtime/package.json b/runtime/package.json new file mode 100644 index 000000000..bdc024b18 --- /dev/null +++ b/runtime/package.json @@ -0,0 +1,31 @@ +{ + "name": "pgadmin4", + "description": "pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world.", + "main": "src/html/pgadmin.html", + "repository": "https://github.com/postgres/pgadmin4.git", + "author": "pgAdmin Development Team (https://www.pgadmin.org/)", + "license": "PostgreSQL", + "chromium-args": "--disable-popup-blocking", + "window": { + "width": 440, + "height": 170, + "toolbar": false, + "fullscreen": false, + "frame": false, + "show": true, + "position": "center", + "always-on-top": true, + "icon": "assets/pgAdmin4.png" + }, + "dependencies": { + "axios": "^0.21.0", + "bootstrap": "^4.5.3" + }, + "devDependencies": { + "eslint": "^6.3.0", + "nw": "^0.50.2" + }, + "scripts": { + "linter": "yarn eslint --no-eslintrc -c .eslintrc.js --ext .js ." + } +} diff --git a/runtime/pgAdmin4-mac.png b/runtime/pgAdmin4-mac.png deleted file mode 100644 index 0fa06be14..000000000 Binary files a/runtime/pgAdmin4-mac.png and /dev/null differ diff --git a/runtime/pgAdmin4.cpp b/runtime/pgAdmin4.cpp deleted file mode 100644 index b6b0527f2..000000000 --- a/runtime/pgAdmin4.cpp +++ /dev/null @@ -1,50 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// pgAdmin4.cpp - Main application entry point -// -////////////////////////////////////////////////////////////////////////// - -#include "pgAdmin4.h" -#include "Runtime.h" - -#include - -// Global vars for caching and avoing shutdown issues -const QString g_startupLogFile = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + ("/pgadmin4.startup.log"); -const QString g_serverLogFile = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + (QString("/pgadmin4.%1.log").arg(getExeHash())); -const QString g_addressFile = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + (QString("/pgadmin4.%1.addr").arg(getExeHash())); - -int main(int argc, char * argv[]) -{ - // Make sure we can create logs etc. - QDir workdir; - workdir.mkpath(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)); - - // Let's rock... - Runtime *runtime = new Runtime(); - return runtime->go(argc, argv); -} - -// Cleanup the address and log files -void cleanup() -{ - qDebug() << "Removing:" << g_addressFile; - QFile addrFile(g_addressFile); - addrFile.remove(); - - qDebug() << "Removing:" << g_serverLogFile; - QFile logFile(g_serverLogFile); - logFile.remove(); -} - - -// Get a hash of the executable name and path -QString getExeHash() -{ - return QString(QCryptographicHash::hash(QCoreApplication::applicationFilePath().toUtf8(),QCryptographicHash::Md5).toHex()); -} diff --git a/runtime/pgAdmin4.h b/runtime/pgAdmin4.h deleted file mode 100644 index 5305e45c7..000000000 --- a/runtime/pgAdmin4.h +++ /dev/null @@ -1,29 +0,0 @@ -////////////////////////////////////////////////////////////////////////// -// -// pgAdmin 4 - PostgreSQL Tools -// -// Copyright (C) 2013 - 2021, The pgAdmin Development Team -// This software is released under the PostgreSQL Licence -// -// pgAdmin4.h - Main application header -// -////////////////////////////////////////////////////////////////////////// - -#ifndef PGADMIN4_H -#define PGADMIN4_H - -// QT headers -#include - -// Global function prototypes -int main(int argc, char * argv[]); - -extern const QString g_startupLogFile; -extern const QString g_serverLogFile; -extern const QString g_addressFile; - -QString getExeHash(); - -void cleanup(); - -#endif // PGADMIN4_H diff --git a/runtime/pgAdmin4.icns b/runtime/pgAdmin4.icns deleted file mode 100644 index bcfc86811..000000000 Binary files a/runtime/pgAdmin4.icns and /dev/null differ diff --git a/runtime/pgAdmin4.ico b/runtime/pgAdmin4.ico deleted file mode 100644 index 3fcebafdc..000000000 Binary files a/runtime/pgAdmin4.ico and /dev/null differ diff --git a/runtime/pgAdmin4.pro b/runtime/pgAdmin4.pro deleted file mode 100644 index bf327e0e8..000000000 --- a/runtime/pgAdmin4.pro +++ /dev/null @@ -1,131 +0,0 @@ -VERSION = 4.30.0.0 -QMAKE_TARGET_COMPANY = "The pgAdmin Development Team" -QMAKE_TARGET_PRODUCT = "pgAdmin 4" -QMAKE_TARGET_DESCRIPTION = "pgAdmin 4 Desktop Runtime" -QMAKE_TARGET_COPYRIGHT = "Copyright (C) 2013 - 2021, The pgAdmin Development Team" - -message(==================================) -message(Configuring the pgAdmin 4 runtime.) -message(==================================) - -# Check for a suitable Qt version -!greaterThan(QT_MAJOR_VERSION, 4) { - error("pgAdmin 4 cannot be built with Qt $${QT_VERSION}. Use Qt 5.0 or newer.") -} -message(Qt version: $${QT_VERSION}) - -# Configure QT modules for the appropriate version of QT -QT += network widgets - -win32 { - RC_ICONS += pgAdmin4.ico -} - -# Environment settings for the build -QMAKE_CFLAGS += $$(PGADMIN_CFLAGS) -QMAKE_CXXFLAGS += $$(PGADMIN_CXXFLAGS) -QMAKE_LFLAGS += $$(PGADMIN_LDFLAGS) - -# Figure out where/what Python looks like and that it's suitable -PYTHON_DIR = $$(PGADMIN_PYTHON_DIR) - -equals(PYTHON_DIR, "") { - error(The PGADMIN_PYTHON_DIR environment variable is not set. Please set it to a directory path under which Python 3.4 or later has been installed and try again.) -} - -win32 { - message(Platform: Windows) - PYTHON_EXE = $${PYTHON_DIR}\python.exe -} else { - macx { - message(Platform: macOS) - } else { - message(Platform: Linux) - } - PYTHON_EXE = $${PYTHON_DIR}/bin/python3 -} - -!exists($$PYTHON_EXE) { - error(The Python executable ($$PYTHON_EXE) could not be found. Please ensure the PGADMIN_PYTHON_DIR environment variable is correctly set.) -} -message(Python executable: $$PYTHON_EXE) - -PYTHON_VERSION = $$system($$PYTHON_EXE -c \"import sys; print(\'%s.%s\' % (sys.version_info[0], sys.version_info[1]))\") -PYTHON_SHORT_VERSION = $$system($$PYTHON_EXE -c \"import sys; print(\'%s%s\' % (sys.version_info[0], sys.version_info[1]))\") -PYTHON_MAJOR_VERSION = $$system($$PYTHON_EXE -c \"import sys; print(sys.version_info[0])\") -message(Python version: $$PYTHON_VERSION ($$PYTHON_SHORT_VERSION)) - -lessThan(PYTHON_SHORT_VERSION, 34) { - error(Python 3.4 or later is required to build pgAdmin.) -} - -# Configure for the platform -win32 { - INCLUDEPATH = $${PYTHON_DIR}\include - message(Include path: $$INCLUDEPATH) - - LIBS += -L"$${PYTHON_DIR}\libs" -lpython$${PYTHON_SHORT_VERSION} - message(LIBS: $$LIBS) -} -else { - # Find the best matching python-config (there may be more than one) - exists($PYTHON_DIR/bin/python$${PYTHON_VERSION}-config) { - PYTHON_CONFIG = $$PYTHON_DIR/bin/python$${PYTHON_VERSION}-config - } else: exists($${PYTHON_DIR}/bin/python$${PYTHON_MAJOR_VERSION}-config) { - PYTHON_CONFIG = $${PYTHON_DIR}/bin/python$${PYTHON_MAJOR_VERSION}-config - } else: exists($${PYTHON_DIR}/bin/python-config) { - PYTHON_CONFIG = $${PYTHON_DIR}/bin/python-config - } else { - error(No suitable python-config could be found in $${PYTHON_DIR}/bin.) - } - message(Python config: $$PYTHON_CONFIG) - - PYTHON_EMBED = $$system($$PYTHON_CONFIG --help 2>&1 | grep -o \'\\-\\-embed\') - - QMAKE_CXXFLAGS += $$system($$PYTHON_CONFIG --includes) - message(CXXFLAGS: $$QMAKE_CXXFLAGS) - - QMAKE_LFLAGS += $$system($$PYTHON_CONFIG --ldflags) - message(LDFLAGS: $$QMAKE_LFLAGS) - - LIBS += $$system($$PYTHON_CONFIG --libs $$PYTHON_EMBED) - message(LIBS: $$LIBS) -} - -# Source code -HEADERS = Server.h \ - Runtime.h \ - pgAdmin4.h \ - ConfigWindow.h \ - TrayIcon.h \ - LogWindow.h \ - MenuActions.h \ - FloatingWindow.h \ - Logger.h - -SOURCES = pgAdmin4.cpp \ - Runtime.cpp \ - Server.cpp \ - ConfigWindow.cpp \ - TrayIcon.cpp \ - LogWindow.cpp \ - MenuActions.cpp \ - FloatingWindow.cpp \ - Logger.cpp - -FORMS = ConfigWindow.ui \ - LogWindow.ui \ - FloatingWindow.ui - -ICON = pgAdmin4.icns - -QMAKE_INFO_PLIST = Info.plist - -RESOURCES += pgadmin4.qrc \ - qdarkstyle/style.qrc - -macx { - HEADERS += macos.h - OBJECTIVE_SOURCES = macos.mm -} - diff --git a/runtime/pgAdmin4.qrc b/runtime/pgAdmin4.qrc deleted file mode 100644 index 6bf9dbdbe..000000000 --- a/runtime/pgAdmin4.qrc +++ /dev/null @@ -1,8 +0,0 @@ - - - pgAdmin4.ico - splash.png - pgAdmin4.png - pgAdmin4-mac.png - - diff --git a/runtime/pgAdmin4.rc b/runtime/pgAdmin4.rc deleted file mode 100644 index fdd46100c..000000000 --- a/runtime/pgAdmin4.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "pgAdmin4.ico" diff --git a/runtime/qdarkstyle/rc/arrow_down.png b/runtime/qdarkstyle/rc/arrow_down.png deleted file mode 100644 index c4e6894ba..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_down.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_down@2x.png b/runtime/qdarkstyle/rc/arrow_down@2x.png deleted file mode 100644 index bb8cbed0d..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_down@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_down_disabled.png b/runtime/qdarkstyle/rc/arrow_down_disabled.png deleted file mode 100644 index aa1d06c08..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_down_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_down_disabled@2x.png b/runtime/qdarkstyle/rc/arrow_down_disabled@2x.png deleted file mode 100644 index 86bf434b8..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_down_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_down_focus.png b/runtime/qdarkstyle/rc/arrow_down_focus.png deleted file mode 100644 index 1c42ee8f6..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_down_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_down_focus@2x.png b/runtime/qdarkstyle/rc/arrow_down_focus@2x.png deleted file mode 100644 index 7374637c5..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_down_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_down_pressed.png b/runtime/qdarkstyle/rc/arrow_down_pressed.png deleted file mode 100644 index 8139ee3e8..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_down_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_down_pressed@2x.png b/runtime/qdarkstyle/rc/arrow_down_pressed@2x.png deleted file mode 100644 index 5e9d225ff..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_down_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_left.png b/runtime/qdarkstyle/rc/arrow_left.png deleted file mode 100644 index ef929fdf0..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_left.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_left@2x.png b/runtime/qdarkstyle/rc/arrow_left@2x.png deleted file mode 100644 index c8923d6f4..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_left@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_left_disabled.png b/runtime/qdarkstyle/rc/arrow_left_disabled.png deleted file mode 100644 index 9c69561a7..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_left_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_left_disabled@2x.png b/runtime/qdarkstyle/rc/arrow_left_disabled@2x.png deleted file mode 100644 index e52114312..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_left_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_left_focus.png b/runtime/qdarkstyle/rc/arrow_left_focus.png deleted file mode 100644 index a1f070455..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_left_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_left_focus@2x.png b/runtime/qdarkstyle/rc/arrow_left_focus@2x.png deleted file mode 100644 index c4267e856..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_left_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_left_pressed.png b/runtime/qdarkstyle/rc/arrow_left_pressed.png deleted file mode 100644 index bd706cbdd..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_left_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_left_pressed@2x.png b/runtime/qdarkstyle/rc/arrow_left_pressed@2x.png deleted file mode 100644 index 341b2e541..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_left_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_right.png b/runtime/qdarkstyle/rc/arrow_right.png deleted file mode 100644 index 4f3388505..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_right.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_right@2x.png b/runtime/qdarkstyle/rc/arrow_right@2x.png deleted file mode 100644 index 94b260965..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_right@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_right_disabled.png b/runtime/qdarkstyle/rc/arrow_right_disabled.png deleted file mode 100644 index 0fbc6b04c..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_right_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_right_disabled@2x.png b/runtime/qdarkstyle/rc/arrow_right_disabled@2x.png deleted file mode 100644 index 8e9272a5b..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_right_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_right_focus.png b/runtime/qdarkstyle/rc/arrow_right_focus.png deleted file mode 100644 index 764940945..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_right_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_right_focus@2x.png b/runtime/qdarkstyle/rc/arrow_right_focus@2x.png deleted file mode 100644 index 6d52b5fa3..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_right_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_right_pressed.png b/runtime/qdarkstyle/rc/arrow_right_pressed.png deleted file mode 100644 index a5f04522a..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_right_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_right_pressed@2x.png b/runtime/qdarkstyle/rc/arrow_right_pressed@2x.png deleted file mode 100644 index 6f6a8130c..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_right_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_up.png b/runtime/qdarkstyle/rc/arrow_up.png deleted file mode 100644 index 61d7574a4..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_up.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_up@2x.png b/runtime/qdarkstyle/rc/arrow_up@2x.png deleted file mode 100644 index d711fae16..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_up@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_up_disabled.png b/runtime/qdarkstyle/rc/arrow_up_disabled.png deleted file mode 100644 index 18e8ecd8d..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_up_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_up_disabled@2x.png b/runtime/qdarkstyle/rc/arrow_up_disabled@2x.png deleted file mode 100644 index fb4defb52..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_up_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_up_focus.png b/runtime/qdarkstyle/rc/arrow_up_focus.png deleted file mode 100644 index a7acd9b66..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_up_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_up_focus@2x.png b/runtime/qdarkstyle/rc/arrow_up_focus@2x.png deleted file mode 100644 index 9cd982a1d..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_up_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_up_pressed.png b/runtime/qdarkstyle/rc/arrow_up_pressed.png deleted file mode 100644 index 390a80e21..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_up_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/arrow_up_pressed@2x.png b/runtime/qdarkstyle/rc/arrow_up_pressed@2x.png deleted file mode 100644 index dd352cff3..000000000 Binary files a/runtime/qdarkstyle/rc/arrow_up_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/base_icon.png b/runtime/qdarkstyle/rc/base_icon.png deleted file mode 100644 index 37a6158cc..000000000 Binary files a/runtime/qdarkstyle/rc/base_icon.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/base_icon@2x.png b/runtime/qdarkstyle/rc/base_icon@2x.png deleted file mode 100644 index e6e5cb916..000000000 Binary files a/runtime/qdarkstyle/rc/base_icon@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/base_icon_disabled.png b/runtime/qdarkstyle/rc/base_icon_disabled.png deleted file mode 100644 index 37a6158cc..000000000 Binary files a/runtime/qdarkstyle/rc/base_icon_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/base_icon_disabled@2x.png b/runtime/qdarkstyle/rc/base_icon_disabled@2x.png deleted file mode 100644 index e6e5cb916..000000000 Binary files a/runtime/qdarkstyle/rc/base_icon_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/base_icon_focus.png b/runtime/qdarkstyle/rc/base_icon_focus.png deleted file mode 100644 index 37a6158cc..000000000 Binary files a/runtime/qdarkstyle/rc/base_icon_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/base_icon_focus@2x.png b/runtime/qdarkstyle/rc/base_icon_focus@2x.png deleted file mode 100644 index e6e5cb916..000000000 Binary files a/runtime/qdarkstyle/rc/base_icon_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/base_icon_pressed.png b/runtime/qdarkstyle/rc/base_icon_pressed.png deleted file mode 100644 index 37a6158cc..000000000 Binary files a/runtime/qdarkstyle/rc/base_icon_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/base_icon_pressed@2x.png b/runtime/qdarkstyle/rc/base_icon_pressed@2x.png deleted file mode 100644 index e6e5cb916..000000000 Binary files a/runtime/qdarkstyle/rc/base_icon_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_closed.png b/runtime/qdarkstyle/rc/branch_closed.png deleted file mode 100644 index 53e2c51f5..000000000 Binary files a/runtime/qdarkstyle/rc/branch_closed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_closed@2x.png b/runtime/qdarkstyle/rc/branch_closed@2x.png deleted file mode 100644 index 06cdefa5f..000000000 Binary files a/runtime/qdarkstyle/rc/branch_closed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_closed_disabled.png b/runtime/qdarkstyle/rc/branch_closed_disabled.png deleted file mode 100644 index 5106a1438..000000000 Binary files a/runtime/qdarkstyle/rc/branch_closed_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_closed_disabled@2x.png b/runtime/qdarkstyle/rc/branch_closed_disabled@2x.png deleted file mode 100644 index 180bae9e6..000000000 Binary files a/runtime/qdarkstyle/rc/branch_closed_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_closed_focus.png b/runtime/qdarkstyle/rc/branch_closed_focus.png deleted file mode 100644 index c227f9f71..000000000 Binary files a/runtime/qdarkstyle/rc/branch_closed_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_closed_focus@2x.png b/runtime/qdarkstyle/rc/branch_closed_focus@2x.png deleted file mode 100644 index ad23d0d33..000000000 Binary files a/runtime/qdarkstyle/rc/branch_closed_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_closed_pressed.png b/runtime/qdarkstyle/rc/branch_closed_pressed.png deleted file mode 100644 index 90845a81f..000000000 Binary files a/runtime/qdarkstyle/rc/branch_closed_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_closed_pressed@2x.png b/runtime/qdarkstyle/rc/branch_closed_pressed@2x.png deleted file mode 100644 index 60aaeb7fb..000000000 Binary files a/runtime/qdarkstyle/rc/branch_closed_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_end.png b/runtime/qdarkstyle/rc/branch_end.png deleted file mode 100644 index 08b5559b2..000000000 Binary files a/runtime/qdarkstyle/rc/branch_end.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_end@2x.png b/runtime/qdarkstyle/rc/branch_end@2x.png deleted file mode 100644 index ae6dbe991..000000000 Binary files a/runtime/qdarkstyle/rc/branch_end@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_end_disabled.png b/runtime/qdarkstyle/rc/branch_end_disabled.png deleted file mode 100644 index 027a8894a..000000000 Binary files a/runtime/qdarkstyle/rc/branch_end_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_end_disabled@2x.png b/runtime/qdarkstyle/rc/branch_end_disabled@2x.png deleted file mode 100644 index 43c1b0c76..000000000 Binary files a/runtime/qdarkstyle/rc/branch_end_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_end_focus.png b/runtime/qdarkstyle/rc/branch_end_focus.png deleted file mode 100644 index fdb3160bb..000000000 Binary files a/runtime/qdarkstyle/rc/branch_end_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_end_focus@2x.png b/runtime/qdarkstyle/rc/branch_end_focus@2x.png deleted file mode 100644 index 3ca890449..000000000 Binary files a/runtime/qdarkstyle/rc/branch_end_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_end_pressed.png b/runtime/qdarkstyle/rc/branch_end_pressed.png deleted file mode 100644 index 1c2432dd4..000000000 Binary files a/runtime/qdarkstyle/rc/branch_end_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_end_pressed@2x.png b/runtime/qdarkstyle/rc/branch_end_pressed@2x.png deleted file mode 100644 index af0f8fa5a..000000000 Binary files a/runtime/qdarkstyle/rc/branch_end_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_line.png b/runtime/qdarkstyle/rc/branch_line.png deleted file mode 100644 index a3a564e44..000000000 Binary files a/runtime/qdarkstyle/rc/branch_line.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_line@2x.png b/runtime/qdarkstyle/rc/branch_line@2x.png deleted file mode 100644 index 1dbf71fc7..000000000 Binary files a/runtime/qdarkstyle/rc/branch_line@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_line_disabled.png b/runtime/qdarkstyle/rc/branch_line_disabled.png deleted file mode 100644 index ecc7e6d93..000000000 Binary files a/runtime/qdarkstyle/rc/branch_line_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_line_disabled@2x.png b/runtime/qdarkstyle/rc/branch_line_disabled@2x.png deleted file mode 100644 index adc6446c9..000000000 Binary files a/runtime/qdarkstyle/rc/branch_line_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_line_focus.png b/runtime/qdarkstyle/rc/branch_line_focus.png deleted file mode 100644 index 0037f175a..000000000 Binary files a/runtime/qdarkstyle/rc/branch_line_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_line_focus@2x.png b/runtime/qdarkstyle/rc/branch_line_focus@2x.png deleted file mode 100644 index cb257a914..000000000 Binary files a/runtime/qdarkstyle/rc/branch_line_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_line_pressed.png b/runtime/qdarkstyle/rc/branch_line_pressed.png deleted file mode 100644 index 2d0856527..000000000 Binary files a/runtime/qdarkstyle/rc/branch_line_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_line_pressed@2x.png b/runtime/qdarkstyle/rc/branch_line_pressed@2x.png deleted file mode 100644 index 803708fb4..000000000 Binary files a/runtime/qdarkstyle/rc/branch_line_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_more.png b/runtime/qdarkstyle/rc/branch_more.png deleted file mode 100644 index 31b6cee87..000000000 Binary files a/runtime/qdarkstyle/rc/branch_more.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_more@2x.png b/runtime/qdarkstyle/rc/branch_more@2x.png deleted file mode 100644 index f1f7a67f1..000000000 Binary files a/runtime/qdarkstyle/rc/branch_more@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_more_disabled.png b/runtime/qdarkstyle/rc/branch_more_disabled.png deleted file mode 100644 index d4b604905..000000000 Binary files a/runtime/qdarkstyle/rc/branch_more_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_more_disabled@2x.png b/runtime/qdarkstyle/rc/branch_more_disabled@2x.png deleted file mode 100644 index 3ef752108..000000000 Binary files a/runtime/qdarkstyle/rc/branch_more_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_more_focus.png b/runtime/qdarkstyle/rc/branch_more_focus.png deleted file mode 100644 index 943c13d0b..000000000 Binary files a/runtime/qdarkstyle/rc/branch_more_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_more_focus@2x.png b/runtime/qdarkstyle/rc/branch_more_focus@2x.png deleted file mode 100644 index 9f53ef1fa..000000000 Binary files a/runtime/qdarkstyle/rc/branch_more_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_more_pressed.png b/runtime/qdarkstyle/rc/branch_more_pressed.png deleted file mode 100644 index 9037ed3b3..000000000 Binary files a/runtime/qdarkstyle/rc/branch_more_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_more_pressed@2x.png b/runtime/qdarkstyle/rc/branch_more_pressed@2x.png deleted file mode 100644 index 675d52c76..000000000 Binary files a/runtime/qdarkstyle/rc/branch_more_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_open.png b/runtime/qdarkstyle/rc/branch_open.png deleted file mode 100644 index 0861d0bc7..000000000 Binary files a/runtime/qdarkstyle/rc/branch_open.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_open@2x.png b/runtime/qdarkstyle/rc/branch_open@2x.png deleted file mode 100644 index 8850f7367..000000000 Binary files a/runtime/qdarkstyle/rc/branch_open@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_open_disabled.png b/runtime/qdarkstyle/rc/branch_open_disabled.png deleted file mode 100644 index b6c80243b..000000000 Binary files a/runtime/qdarkstyle/rc/branch_open_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_open_disabled@2x.png b/runtime/qdarkstyle/rc/branch_open_disabled@2x.png deleted file mode 100644 index 15ce9f265..000000000 Binary files a/runtime/qdarkstyle/rc/branch_open_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_open_focus.png b/runtime/qdarkstyle/rc/branch_open_focus.png deleted file mode 100644 index eadb0962a..000000000 Binary files a/runtime/qdarkstyle/rc/branch_open_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_open_focus@2x.png b/runtime/qdarkstyle/rc/branch_open_focus@2x.png deleted file mode 100644 index 7dfcbbe8a..000000000 Binary files a/runtime/qdarkstyle/rc/branch_open_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_open_pressed.png b/runtime/qdarkstyle/rc/branch_open_pressed.png deleted file mode 100644 index 2b22e8d08..000000000 Binary files a/runtime/qdarkstyle/rc/branch_open_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/branch_open_pressed@2x.png b/runtime/qdarkstyle/rc/branch_open_pressed@2x.png deleted file mode 100644 index 269a0cbee..000000000 Binary files a/runtime/qdarkstyle/rc/branch_open_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_checked.png b/runtime/qdarkstyle/rc/checkbox_checked.png deleted file mode 100644 index e7ed08081..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_checked.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_checked@2x.png b/runtime/qdarkstyle/rc/checkbox_checked@2x.png deleted file mode 100644 index 35f2ade58..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_checked@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_checked_disabled.png b/runtime/qdarkstyle/rc/checkbox_checked_disabled.png deleted file mode 100644 index 512b0a3e4..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_checked_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_checked_disabled@2x.png b/runtime/qdarkstyle/rc/checkbox_checked_disabled@2x.png deleted file mode 100644 index 557383ec8..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_checked_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_checked_focus.png b/runtime/qdarkstyle/rc/checkbox_checked_focus.png deleted file mode 100644 index 0b90412f2..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_checked_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_checked_focus@2x.png b/runtime/qdarkstyle/rc/checkbox_checked_focus@2x.png deleted file mode 100644 index 7aee03cbb..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_checked_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_checked_pressed.png b/runtime/qdarkstyle/rc/checkbox_checked_pressed.png deleted file mode 100644 index 3d4c869b7..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_checked_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_checked_pressed@2x.png b/runtime/qdarkstyle/rc/checkbox_checked_pressed@2x.png deleted file mode 100644 index bfbc14b94..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_checked_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_indeterminate.png b/runtime/qdarkstyle/rc/checkbox_indeterminate.png deleted file mode 100644 index c21ab99bf..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_indeterminate.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_indeterminate@2x.png b/runtime/qdarkstyle/rc/checkbox_indeterminate@2x.png deleted file mode 100644 index 2fc29cee6..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_indeterminate@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_indeterminate_disabled.png b/runtime/qdarkstyle/rc/checkbox_indeterminate_disabled.png deleted file mode 100644 index 1d3c21492..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_indeterminate_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_indeterminate_disabled@2x.png b/runtime/qdarkstyle/rc/checkbox_indeterminate_disabled@2x.png deleted file mode 100644 index bb8e7a747..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_indeterminate_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_indeterminate_focus.png b/runtime/qdarkstyle/rc/checkbox_indeterminate_focus.png deleted file mode 100644 index 13ca4a7a4..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_indeterminate_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_indeterminate_focus@2x.png b/runtime/qdarkstyle/rc/checkbox_indeterminate_focus@2x.png deleted file mode 100644 index 3907eb8d4..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_indeterminate_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_indeterminate_pressed.png b/runtime/qdarkstyle/rc/checkbox_indeterminate_pressed.png deleted file mode 100644 index 12f83ceba..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_indeterminate_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_indeterminate_pressed@2x.png b/runtime/qdarkstyle/rc/checkbox_indeterminate_pressed@2x.png deleted file mode 100644 index 5ff4f6629..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_indeterminate_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_unchecked.png b/runtime/qdarkstyle/rc/checkbox_unchecked.png deleted file mode 100644 index e2da452fa..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_unchecked.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_unchecked@2x.png b/runtime/qdarkstyle/rc/checkbox_unchecked@2x.png deleted file mode 100644 index 3732d5406..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_unchecked@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_unchecked_disabled.png b/runtime/qdarkstyle/rc/checkbox_unchecked_disabled.png deleted file mode 100644 index c2e30c690..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_unchecked_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_unchecked_disabled@2x.png b/runtime/qdarkstyle/rc/checkbox_unchecked_disabled@2x.png deleted file mode 100644 index c4bddb6eb..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_unchecked_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_unchecked_focus.png b/runtime/qdarkstyle/rc/checkbox_unchecked_focus.png deleted file mode 100644 index c57f04d9f..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_unchecked_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_unchecked_focus@2x.png b/runtime/qdarkstyle/rc/checkbox_unchecked_focus@2x.png deleted file mode 100644 index 1776ad048..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_unchecked_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_unchecked_pressed.png b/runtime/qdarkstyle/rc/checkbox_unchecked_pressed.png deleted file mode 100644 index be41236e1..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_unchecked_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/checkbox_unchecked_pressed@2x.png b/runtime/qdarkstyle/rc/checkbox_unchecked_pressed@2x.png deleted file mode 100644 index b1ad7c72f..000000000 Binary files a/runtime/qdarkstyle/rc/checkbox_unchecked_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_horizontal.png b/runtime/qdarkstyle/rc/line_horizontal.png deleted file mode 100644 index 11bc5c003..000000000 Binary files a/runtime/qdarkstyle/rc/line_horizontal.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_horizontal@2x.png b/runtime/qdarkstyle/rc/line_horizontal@2x.png deleted file mode 100644 index c229ac963..000000000 Binary files a/runtime/qdarkstyle/rc/line_horizontal@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_horizontal_disabled.png b/runtime/qdarkstyle/rc/line_horizontal_disabled.png deleted file mode 100644 index 204df8058..000000000 Binary files a/runtime/qdarkstyle/rc/line_horizontal_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_horizontal_disabled@2x.png b/runtime/qdarkstyle/rc/line_horizontal_disabled@2x.png deleted file mode 100644 index a4713c565..000000000 Binary files a/runtime/qdarkstyle/rc/line_horizontal_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_horizontal_focus.png b/runtime/qdarkstyle/rc/line_horizontal_focus.png deleted file mode 100644 index ecda0c10b..000000000 Binary files a/runtime/qdarkstyle/rc/line_horizontal_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_horizontal_focus@2x.png b/runtime/qdarkstyle/rc/line_horizontal_focus@2x.png deleted file mode 100644 index 84397efdb..000000000 Binary files a/runtime/qdarkstyle/rc/line_horizontal_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_horizontal_pressed.png b/runtime/qdarkstyle/rc/line_horizontal_pressed.png deleted file mode 100644 index fd5d864ca..000000000 Binary files a/runtime/qdarkstyle/rc/line_horizontal_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_horizontal_pressed@2x.png b/runtime/qdarkstyle/rc/line_horizontal_pressed@2x.png deleted file mode 100644 index 140552e4f..000000000 Binary files a/runtime/qdarkstyle/rc/line_horizontal_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_vertical.png b/runtime/qdarkstyle/rc/line_vertical.png deleted file mode 100644 index a3a564e44..000000000 Binary files a/runtime/qdarkstyle/rc/line_vertical.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_vertical@2x.png b/runtime/qdarkstyle/rc/line_vertical@2x.png deleted file mode 100644 index 1dbf71fc7..000000000 Binary files a/runtime/qdarkstyle/rc/line_vertical@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_vertical_disabled.png b/runtime/qdarkstyle/rc/line_vertical_disabled.png deleted file mode 100644 index ecc7e6d93..000000000 Binary files a/runtime/qdarkstyle/rc/line_vertical_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_vertical_disabled@2x.png b/runtime/qdarkstyle/rc/line_vertical_disabled@2x.png deleted file mode 100644 index adc6446c9..000000000 Binary files a/runtime/qdarkstyle/rc/line_vertical_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_vertical_focus.png b/runtime/qdarkstyle/rc/line_vertical_focus.png deleted file mode 100644 index 0037f175a..000000000 Binary files a/runtime/qdarkstyle/rc/line_vertical_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_vertical_focus@2x.png b/runtime/qdarkstyle/rc/line_vertical_focus@2x.png deleted file mode 100644 index cb257a914..000000000 Binary files a/runtime/qdarkstyle/rc/line_vertical_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_vertical_pressed.png b/runtime/qdarkstyle/rc/line_vertical_pressed.png deleted file mode 100644 index 2d0856527..000000000 Binary files a/runtime/qdarkstyle/rc/line_vertical_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/line_vertical_pressed@2x.png b/runtime/qdarkstyle/rc/line_vertical_pressed@2x.png deleted file mode 100644 index 803708fb4..000000000 Binary files a/runtime/qdarkstyle/rc/line_vertical_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_checked.png b/runtime/qdarkstyle/rc/radio_checked.png deleted file mode 100644 index 6f1fd6ca6..000000000 Binary files a/runtime/qdarkstyle/rc/radio_checked.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_checked@2x.png b/runtime/qdarkstyle/rc/radio_checked@2x.png deleted file mode 100644 index 228ffdbf2..000000000 Binary files a/runtime/qdarkstyle/rc/radio_checked@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_checked_disabled.png b/runtime/qdarkstyle/rc/radio_checked_disabled.png deleted file mode 100644 index 27788530d..000000000 Binary files a/runtime/qdarkstyle/rc/radio_checked_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_checked_disabled@2x.png b/runtime/qdarkstyle/rc/radio_checked_disabled@2x.png deleted file mode 100644 index 930bfaf70..000000000 Binary files a/runtime/qdarkstyle/rc/radio_checked_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_checked_focus.png b/runtime/qdarkstyle/rc/radio_checked_focus.png deleted file mode 100644 index ca8e8bc9a..000000000 Binary files a/runtime/qdarkstyle/rc/radio_checked_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_checked_focus@2x.png b/runtime/qdarkstyle/rc/radio_checked_focus@2x.png deleted file mode 100644 index aa0f1152b..000000000 Binary files a/runtime/qdarkstyle/rc/radio_checked_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_checked_pressed.png b/runtime/qdarkstyle/rc/radio_checked_pressed.png deleted file mode 100644 index 6e391a0ff..000000000 Binary files a/runtime/qdarkstyle/rc/radio_checked_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_checked_pressed@2x.png b/runtime/qdarkstyle/rc/radio_checked_pressed@2x.png deleted file mode 100644 index 0512731ae..000000000 Binary files a/runtime/qdarkstyle/rc/radio_checked_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_unchecked.png b/runtime/qdarkstyle/rc/radio_unchecked.png deleted file mode 100644 index 763306bdc..000000000 Binary files a/runtime/qdarkstyle/rc/radio_unchecked.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_unchecked@2x.png b/runtime/qdarkstyle/rc/radio_unchecked@2x.png deleted file mode 100644 index 28b6a0784..000000000 Binary files a/runtime/qdarkstyle/rc/radio_unchecked@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_unchecked_disabled.png b/runtime/qdarkstyle/rc/radio_unchecked_disabled.png deleted file mode 100644 index fc0b12f78..000000000 Binary files a/runtime/qdarkstyle/rc/radio_unchecked_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_unchecked_disabled@2x.png b/runtime/qdarkstyle/rc/radio_unchecked_disabled@2x.png deleted file mode 100644 index d31f2b4b9..000000000 Binary files a/runtime/qdarkstyle/rc/radio_unchecked_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_unchecked_focus.png b/runtime/qdarkstyle/rc/radio_unchecked_focus.png deleted file mode 100644 index 9c87b01e4..000000000 Binary files a/runtime/qdarkstyle/rc/radio_unchecked_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_unchecked_focus@2x.png b/runtime/qdarkstyle/rc/radio_unchecked_focus@2x.png deleted file mode 100644 index 4b4c7321d..000000000 Binary files a/runtime/qdarkstyle/rc/radio_unchecked_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_unchecked_pressed.png b/runtime/qdarkstyle/rc/radio_unchecked_pressed.png deleted file mode 100644 index 709e31633..000000000 Binary files a/runtime/qdarkstyle/rc/radio_unchecked_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/radio_unchecked_pressed@2x.png b/runtime/qdarkstyle/rc/radio_unchecked_pressed@2x.png deleted file mode 100644 index b014de5f0..000000000 Binary files a/runtime/qdarkstyle/rc/radio_unchecked_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_horizontal.png b/runtime/qdarkstyle/rc/toolbar_move_horizontal.png deleted file mode 100644 index 012ea2dfb..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_horizontal.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_horizontal@2x.png b/runtime/qdarkstyle/rc/toolbar_move_horizontal@2x.png deleted file mode 100644 index 520c34f98..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_horizontal@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_horizontal_disabled.png b/runtime/qdarkstyle/rc/toolbar_move_horizontal_disabled.png deleted file mode 100644 index 1f91df98f..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_horizontal_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_horizontal_disabled@2x.png b/runtime/qdarkstyle/rc/toolbar_move_horizontal_disabled@2x.png deleted file mode 100644 index 738008f92..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_horizontal_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_horizontal_focus.png b/runtime/qdarkstyle/rc/toolbar_move_horizontal_focus.png deleted file mode 100644 index 999b3c7d8..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_horizontal_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_horizontal_focus@2x.png b/runtime/qdarkstyle/rc/toolbar_move_horizontal_focus@2x.png deleted file mode 100644 index f8e40b7d1..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_horizontal_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_horizontal_pressed.png b/runtime/qdarkstyle/rc/toolbar_move_horizontal_pressed.png deleted file mode 100644 index c31b69deb..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_horizontal_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_horizontal_pressed@2x.png b/runtime/qdarkstyle/rc/toolbar_move_horizontal_pressed@2x.png deleted file mode 100644 index 2f4cb41c7..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_horizontal_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_vertical.png b/runtime/qdarkstyle/rc/toolbar_move_vertical.png deleted file mode 100644 index 16473bfd8..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_vertical.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_vertical@2x.png b/runtime/qdarkstyle/rc/toolbar_move_vertical@2x.png deleted file mode 100644 index 90a5caee3..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_vertical@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_vertical_disabled.png b/runtime/qdarkstyle/rc/toolbar_move_vertical_disabled.png deleted file mode 100644 index 2d240edb5..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_vertical_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_vertical_disabled@2x.png b/runtime/qdarkstyle/rc/toolbar_move_vertical_disabled@2x.png deleted file mode 100644 index fd1df30f1..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_vertical_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_vertical_focus.png b/runtime/qdarkstyle/rc/toolbar_move_vertical_focus.png deleted file mode 100644 index 58cda1f80..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_vertical_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_vertical_focus@2x.png b/runtime/qdarkstyle/rc/toolbar_move_vertical_focus@2x.png deleted file mode 100644 index 9222b4fd8..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_vertical_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_vertical_pressed.png b/runtime/qdarkstyle/rc/toolbar_move_vertical_pressed.png deleted file mode 100644 index e7d641926..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_vertical_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_move_vertical_pressed@2x.png b/runtime/qdarkstyle/rc/toolbar_move_vertical_pressed@2x.png deleted file mode 100644 index 9c438faf4..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_move_vertical_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_horizontal.png b/runtime/qdarkstyle/rc/toolbar_separator_horizontal.png deleted file mode 100644 index 3c0acbdcc..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_horizontal.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_horizontal@2x.png b/runtime/qdarkstyle/rc/toolbar_separator_horizontal@2x.png deleted file mode 100644 index fb4e24c88..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_horizontal@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_disabled.png b/runtime/qdarkstyle/rc/toolbar_separator_horizontal_disabled.png deleted file mode 100644 index 32f7e8ca6..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_disabled@2x.png b/runtime/qdarkstyle/rc/toolbar_separator_horizontal_disabled@2x.png deleted file mode 100644 index f7bec188b..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_focus.png b/runtime/qdarkstyle/rc/toolbar_separator_horizontal_focus.png deleted file mode 100644 index 91c19d65c..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_focus@2x.png b/runtime/qdarkstyle/rc/toolbar_separator_horizontal_focus@2x.png deleted file mode 100644 index c4829918d..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_pressed.png b/runtime/qdarkstyle/rc/toolbar_separator_horizontal_pressed.png deleted file mode 100644 index 7a7f91737..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_pressed@2x.png b/runtime/qdarkstyle/rc/toolbar_separator_horizontal_pressed@2x.png deleted file mode 100644 index d65773b48..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_horizontal_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_vertical.png b/runtime/qdarkstyle/rc/toolbar_separator_vertical.png deleted file mode 100644 index 4dde3f37f..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_vertical.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_vertical@2x.png b/runtime/qdarkstyle/rc/toolbar_separator_vertical@2x.png deleted file mode 100644 index fe97c0de3..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_vertical@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_vertical_disabled.png b/runtime/qdarkstyle/rc/toolbar_separator_vertical_disabled.png deleted file mode 100644 index 7426ae2de..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_vertical_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_vertical_disabled@2x.png b/runtime/qdarkstyle/rc/toolbar_separator_vertical_disabled@2x.png deleted file mode 100644 index 7acc6d33e..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_vertical_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_vertical_focus.png b/runtime/qdarkstyle/rc/toolbar_separator_vertical_focus.png deleted file mode 100644 index 6e3c12143..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_vertical_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_vertical_focus@2x.png b/runtime/qdarkstyle/rc/toolbar_separator_vertical_focus@2x.png deleted file mode 100644 index cac3a56c2..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_vertical_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_vertical_pressed.png b/runtime/qdarkstyle/rc/toolbar_separator_vertical_pressed.png deleted file mode 100644 index b777784b8..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_vertical_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/toolbar_separator_vertical_pressed@2x.png b/runtime/qdarkstyle/rc/toolbar_separator_vertical_pressed@2x.png deleted file mode 100644 index 7ed878fd3..000000000 Binary files a/runtime/qdarkstyle/rc/toolbar_separator_vertical_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/transparent.png b/runtime/qdarkstyle/rc/transparent.png deleted file mode 100644 index 8b241c4a4..000000000 Binary files a/runtime/qdarkstyle/rc/transparent.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/transparent@2x.png b/runtime/qdarkstyle/rc/transparent@2x.png deleted file mode 100644 index 2c3df7a5e..000000000 Binary files a/runtime/qdarkstyle/rc/transparent@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/transparent_disabled.png b/runtime/qdarkstyle/rc/transparent_disabled.png deleted file mode 100644 index 8b241c4a4..000000000 Binary files a/runtime/qdarkstyle/rc/transparent_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/transparent_disabled@2x.png b/runtime/qdarkstyle/rc/transparent_disabled@2x.png deleted file mode 100644 index 2c3df7a5e..000000000 Binary files a/runtime/qdarkstyle/rc/transparent_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/transparent_focus.png b/runtime/qdarkstyle/rc/transparent_focus.png deleted file mode 100644 index 8b241c4a4..000000000 Binary files a/runtime/qdarkstyle/rc/transparent_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/transparent_focus@2x.png b/runtime/qdarkstyle/rc/transparent_focus@2x.png deleted file mode 100644 index 2c3df7a5e..000000000 Binary files a/runtime/qdarkstyle/rc/transparent_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/transparent_pressed.png b/runtime/qdarkstyle/rc/transparent_pressed.png deleted file mode 100644 index 8b241c4a4..000000000 Binary files a/runtime/qdarkstyle/rc/transparent_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/transparent_pressed@2x.png b/runtime/qdarkstyle/rc/transparent_pressed@2x.png deleted file mode 100644 index 2c3df7a5e..000000000 Binary files a/runtime/qdarkstyle/rc/transparent_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_close.png b/runtime/qdarkstyle/rc/window_close.png deleted file mode 100644 index 6f55c3ae7..000000000 Binary files a/runtime/qdarkstyle/rc/window_close.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_close@2x.png b/runtime/qdarkstyle/rc/window_close@2x.png deleted file mode 100644 index ff644f2e8..000000000 Binary files a/runtime/qdarkstyle/rc/window_close@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_close_disabled.png b/runtime/qdarkstyle/rc/window_close_disabled.png deleted file mode 100644 index 22694e31d..000000000 Binary files a/runtime/qdarkstyle/rc/window_close_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_close_disabled@2x.png b/runtime/qdarkstyle/rc/window_close_disabled@2x.png deleted file mode 100644 index ebc97db70..000000000 Binary files a/runtime/qdarkstyle/rc/window_close_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_close_focus.png b/runtime/qdarkstyle/rc/window_close_focus.png deleted file mode 100644 index f017eda31..000000000 Binary files a/runtime/qdarkstyle/rc/window_close_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_close_focus@2x.png b/runtime/qdarkstyle/rc/window_close_focus@2x.png deleted file mode 100644 index 5a354d796..000000000 Binary files a/runtime/qdarkstyle/rc/window_close_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_close_pressed.png b/runtime/qdarkstyle/rc/window_close_pressed.png deleted file mode 100644 index 04b922dd0..000000000 Binary files a/runtime/qdarkstyle/rc/window_close_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_close_pressed@2x.png b/runtime/qdarkstyle/rc/window_close_pressed@2x.png deleted file mode 100644 index 58c0bf592..000000000 Binary files a/runtime/qdarkstyle/rc/window_close_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_grip.png b/runtime/qdarkstyle/rc/window_grip.png deleted file mode 100644 index 0528049bb..000000000 Binary files a/runtime/qdarkstyle/rc/window_grip.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_grip@2x.png b/runtime/qdarkstyle/rc/window_grip@2x.png deleted file mode 100644 index 1ca1b073c..000000000 Binary files a/runtime/qdarkstyle/rc/window_grip@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_grip_disabled.png b/runtime/qdarkstyle/rc/window_grip_disabled.png deleted file mode 100644 index 15f55c056..000000000 Binary files a/runtime/qdarkstyle/rc/window_grip_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_grip_disabled@2x.png b/runtime/qdarkstyle/rc/window_grip_disabled@2x.png deleted file mode 100644 index 33a4588e8..000000000 Binary files a/runtime/qdarkstyle/rc/window_grip_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_grip_focus.png b/runtime/qdarkstyle/rc/window_grip_focus.png deleted file mode 100644 index 06e76c31f..000000000 Binary files a/runtime/qdarkstyle/rc/window_grip_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_grip_focus@2x.png b/runtime/qdarkstyle/rc/window_grip_focus@2x.png deleted file mode 100644 index 58c2d06e4..000000000 Binary files a/runtime/qdarkstyle/rc/window_grip_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_grip_pressed.png b/runtime/qdarkstyle/rc/window_grip_pressed.png deleted file mode 100644 index b3a566cdb..000000000 Binary files a/runtime/qdarkstyle/rc/window_grip_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_grip_pressed@2x.png b/runtime/qdarkstyle/rc/window_grip_pressed@2x.png deleted file mode 100644 index e9da94049..000000000 Binary files a/runtime/qdarkstyle/rc/window_grip_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_minimize.png b/runtime/qdarkstyle/rc/window_minimize.png deleted file mode 100644 index f60981615..000000000 Binary files a/runtime/qdarkstyle/rc/window_minimize.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_minimize@2x.png b/runtime/qdarkstyle/rc/window_minimize@2x.png deleted file mode 100644 index 30f728f02..000000000 Binary files a/runtime/qdarkstyle/rc/window_minimize@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_minimize_disabled.png b/runtime/qdarkstyle/rc/window_minimize_disabled.png deleted file mode 100644 index 29db1c9b1..000000000 Binary files a/runtime/qdarkstyle/rc/window_minimize_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_minimize_disabled@2x.png b/runtime/qdarkstyle/rc/window_minimize_disabled@2x.png deleted file mode 100644 index 1572ca2fe..000000000 Binary files a/runtime/qdarkstyle/rc/window_minimize_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_minimize_focus.png b/runtime/qdarkstyle/rc/window_minimize_focus.png deleted file mode 100644 index cb592f598..000000000 Binary files a/runtime/qdarkstyle/rc/window_minimize_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_minimize_focus@2x.png b/runtime/qdarkstyle/rc/window_minimize_focus@2x.png deleted file mode 100644 index 6f6465169..000000000 Binary files a/runtime/qdarkstyle/rc/window_minimize_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_minimize_pressed.png b/runtime/qdarkstyle/rc/window_minimize_pressed.png deleted file mode 100644 index 6962440ac..000000000 Binary files a/runtime/qdarkstyle/rc/window_minimize_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_minimize_pressed@2x.png b/runtime/qdarkstyle/rc/window_minimize_pressed@2x.png deleted file mode 100644 index cb028272b..000000000 Binary files a/runtime/qdarkstyle/rc/window_minimize_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_undock.png b/runtime/qdarkstyle/rc/window_undock.png deleted file mode 100644 index 616da991a..000000000 Binary files a/runtime/qdarkstyle/rc/window_undock.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_undock@2x.png b/runtime/qdarkstyle/rc/window_undock@2x.png deleted file mode 100644 index 511036bf2..000000000 Binary files a/runtime/qdarkstyle/rc/window_undock@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_undock_disabled.png b/runtime/qdarkstyle/rc/window_undock_disabled.png deleted file mode 100644 index a2b3d25b2..000000000 Binary files a/runtime/qdarkstyle/rc/window_undock_disabled.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_undock_disabled@2x.png b/runtime/qdarkstyle/rc/window_undock_disabled@2x.png deleted file mode 100644 index 638ec8104..000000000 Binary files a/runtime/qdarkstyle/rc/window_undock_disabled@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_undock_focus.png b/runtime/qdarkstyle/rc/window_undock_focus.png deleted file mode 100644 index ae6dc4a60..000000000 Binary files a/runtime/qdarkstyle/rc/window_undock_focus.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_undock_focus@2x.png b/runtime/qdarkstyle/rc/window_undock_focus@2x.png deleted file mode 100644 index d06dd1eac..000000000 Binary files a/runtime/qdarkstyle/rc/window_undock_focus@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_undock_pressed.png b/runtime/qdarkstyle/rc/window_undock_pressed.png deleted file mode 100644 index e9142ded2..000000000 Binary files a/runtime/qdarkstyle/rc/window_undock_pressed.png and /dev/null differ diff --git a/runtime/qdarkstyle/rc/window_undock_pressed@2x.png b/runtime/qdarkstyle/rc/window_undock_pressed@2x.png deleted file mode 100644 index a597420f3..000000000 Binary files a/runtime/qdarkstyle/rc/window_undock_pressed@2x.png and /dev/null differ diff --git a/runtime/qdarkstyle/style.qrc b/runtime/qdarkstyle/style.qrc deleted file mode 100644 index e301854e2..000000000 --- a/runtime/qdarkstyle/style.qrc +++ /dev/null @@ -1,216 +0,0 @@ - - - - rc/arrow_down.png - rc/arrow_down@2x.png - rc/arrow_down_disabled.png - rc/arrow_down_disabled@2x.png - rc/arrow_down_focus.png - rc/arrow_down_focus@2x.png - rc/arrow_down_pressed.png - rc/arrow_down_pressed@2x.png - rc/arrow_left.png - rc/arrow_left@2x.png - rc/arrow_left_disabled.png - rc/arrow_left_disabled@2x.png - rc/arrow_left_focus.png - rc/arrow_left_focus@2x.png - rc/arrow_left_pressed.png - rc/arrow_left_pressed@2x.png - rc/arrow_right.png - rc/arrow_right@2x.png - rc/arrow_right_disabled.png - rc/arrow_right_disabled@2x.png - rc/arrow_right_focus.png - rc/arrow_right_focus@2x.png - rc/arrow_right_pressed.png - rc/arrow_right_pressed@2x.png - rc/arrow_up.png - rc/arrow_up@2x.png - rc/arrow_up_disabled.png - rc/arrow_up_disabled@2x.png - rc/arrow_up_focus.png - rc/arrow_up_focus@2x.png - rc/arrow_up_pressed.png - rc/arrow_up_pressed@2x.png - rc/base_icon.png - rc/base_icon@2x.png - rc/base_icon_disabled.png - rc/base_icon_disabled@2x.png - rc/base_icon_focus.png - rc/base_icon_focus@2x.png - rc/base_icon_pressed.png - rc/base_icon_pressed@2x.png - rc/branch_closed.png - rc/branch_closed@2x.png - rc/branch_closed_disabled.png - rc/branch_closed_disabled@2x.png - rc/branch_closed_focus.png - rc/branch_closed_focus@2x.png - rc/branch_closed_pressed.png - rc/branch_closed_pressed@2x.png - rc/branch_end.png - rc/branch_end@2x.png - rc/branch_end_disabled.png - rc/branch_end_disabled@2x.png - rc/branch_end_focus.png - rc/branch_end_focus@2x.png - rc/branch_end_pressed.png - rc/branch_end_pressed@2x.png - rc/branch_line.png - rc/branch_line@2x.png - rc/branch_line_disabled.png - rc/branch_line_disabled@2x.png - rc/branch_line_focus.png - rc/branch_line_focus@2x.png - rc/branch_line_pressed.png - rc/branch_line_pressed@2x.png - rc/branch_more.png - rc/branch_more@2x.png - rc/branch_more_disabled.png - rc/branch_more_disabled@2x.png - rc/branch_more_focus.png - rc/branch_more_focus@2x.png - rc/branch_more_pressed.png - rc/branch_more_pressed@2x.png - rc/branch_open.png - rc/branch_open@2x.png - rc/branch_open_disabled.png - rc/branch_open_disabled@2x.png - rc/branch_open_focus.png - rc/branch_open_focus@2x.png - rc/branch_open_pressed.png - rc/branch_open_pressed@2x.png - rc/checkbox_checked.png - rc/checkbox_checked@2x.png - rc/checkbox_checked_disabled.png - rc/checkbox_checked_disabled@2x.png - rc/checkbox_checked_focus.png - rc/checkbox_checked_focus@2x.png - rc/checkbox_checked_pressed.png - rc/checkbox_checked_pressed@2x.png - rc/checkbox_indeterminate.png - rc/checkbox_indeterminate@2x.png - rc/checkbox_indeterminate_disabled.png - rc/checkbox_indeterminate_disabled@2x.png - rc/checkbox_indeterminate_focus.png - rc/checkbox_indeterminate_focus@2x.png - rc/checkbox_indeterminate_pressed.png - rc/checkbox_indeterminate_pressed@2x.png - rc/checkbox_unchecked.png - rc/checkbox_unchecked@2x.png - rc/checkbox_unchecked_disabled.png - rc/checkbox_unchecked_disabled@2x.png - rc/checkbox_unchecked_focus.png - rc/checkbox_unchecked_focus@2x.png - rc/checkbox_unchecked_pressed.png - rc/checkbox_unchecked_pressed@2x.png - rc/line_horizontal.png - rc/line_horizontal@2x.png - rc/line_horizontal_disabled.png - rc/line_horizontal_disabled@2x.png - rc/line_horizontal_focus.png - rc/line_horizontal_focus@2x.png - rc/line_horizontal_pressed.png - rc/line_horizontal_pressed@2x.png - rc/line_vertical.png - rc/line_vertical@2x.png - rc/line_vertical_disabled.png - rc/line_vertical_disabled@2x.png - rc/line_vertical_focus.png - rc/line_vertical_focus@2x.png - rc/line_vertical_pressed.png - rc/line_vertical_pressed@2x.png - rc/radio_checked.png - rc/radio_checked@2x.png - rc/radio_checked_disabled.png - rc/radio_checked_disabled@2x.png - rc/radio_checked_focus.png - rc/radio_checked_focus@2x.png - rc/radio_checked_pressed.png - rc/radio_checked_pressed@2x.png - rc/radio_unchecked.png - rc/radio_unchecked@2x.png - rc/radio_unchecked_disabled.png - rc/radio_unchecked_disabled@2x.png - rc/radio_unchecked_focus.png - rc/radio_unchecked_focus@2x.png - rc/radio_unchecked_pressed.png - rc/radio_unchecked_pressed@2x.png - rc/toolbar_move_horizontal.png - rc/toolbar_move_horizontal@2x.png - rc/toolbar_move_horizontal_disabled.png - rc/toolbar_move_horizontal_disabled@2x.png - rc/toolbar_move_horizontal_focus.png - rc/toolbar_move_horizontal_focus@2x.png - rc/toolbar_move_horizontal_pressed.png - rc/toolbar_move_horizontal_pressed@2x.png - rc/toolbar_move_vertical.png - rc/toolbar_move_vertical@2x.png - rc/toolbar_move_vertical_disabled.png - rc/toolbar_move_vertical_disabled@2x.png - rc/toolbar_move_vertical_focus.png - rc/toolbar_move_vertical_focus@2x.png - rc/toolbar_move_vertical_pressed.png - rc/toolbar_move_vertical_pressed@2x.png - rc/toolbar_separator_horizontal.png - rc/toolbar_separator_horizontal@2x.png - rc/toolbar_separator_horizontal_disabled.png - rc/toolbar_separator_horizontal_disabled@2x.png - rc/toolbar_separator_horizontal_focus.png - rc/toolbar_separator_horizontal_focus@2x.png - rc/toolbar_separator_horizontal_pressed.png - rc/toolbar_separator_horizontal_pressed@2x.png - rc/toolbar_separator_vertical.png - rc/toolbar_separator_vertical@2x.png - rc/toolbar_separator_vertical_disabled.png - rc/toolbar_separator_vertical_disabled@2x.png - rc/toolbar_separator_vertical_focus.png - rc/toolbar_separator_vertical_focus@2x.png - rc/toolbar_separator_vertical_pressed.png - rc/toolbar_separator_vertical_pressed@2x.png - rc/transparent.png - rc/transparent@2x.png - rc/transparent_disabled.png - rc/transparent_disabled@2x.png - rc/transparent_focus.png - rc/transparent_focus@2x.png - rc/transparent_pressed.png - rc/transparent_pressed@2x.png - rc/window_close.png - rc/window_close@2x.png - rc/window_close_disabled.png - rc/window_close_disabled@2x.png - rc/window_close_focus.png - rc/window_close_focus@2x.png - rc/window_close_pressed.png - rc/window_close_pressed@2x.png - rc/window_grip.png - rc/window_grip@2x.png - rc/window_grip_disabled.png - rc/window_grip_disabled@2x.png - rc/window_grip_focus.png - rc/window_grip_focus@2x.png - rc/window_grip_pressed.png - rc/window_grip_pressed@2x.png - rc/window_minimize.png - rc/window_minimize@2x.png - rc/window_minimize_disabled.png - rc/window_minimize_disabled@2x.png - rc/window_minimize_focus.png - rc/window_minimize_focus@2x.png - rc/window_minimize_pressed.png - rc/window_minimize_pressed@2x.png - rc/window_undock.png - rc/window_undock@2x.png - rc/window_undock_disabled.png - rc/window_undock_disabled@2x.png - rc/window_undock_focus.png - rc/window_undock_focus@2x.png - rc/window_undock_pressed.png - rc/window_undock_pressed@2x.png - - - style.qss - - diff --git a/runtime/qdarkstyle/style.qss b/runtime/qdarkstyle/style.qss deleted file mode 100644 index be645c907..000000000 --- a/runtime/qdarkstyle/style.qss +++ /dev/null @@ -1,2175 +0,0 @@ -/* --------------------------------------------------------------------------- - - Created by the qtsass compiler v0.1.1 - - The definitions are in the "qdarkstyle.qss._styles.scss" module - - WARNING! All changes made in this file will be lost! - ---------------------------------------------------------------------------- */ -/* QDarkStyleSheet ----------------------------------------------------------- - -This is the main style sheet, the palette has nine colors. - -It is based on three selecting colors, three greyish (background) colors -plus three whitish (foreground) colors. Each set of widgets of the same -type have a header like this: - - ------------------ - GroupName -------- - ------------------ - -And each widget is separated with a header like this: - - QWidgetName ------ - -This makes more easy to find and change some css field. The basic -configuration is described bellow. - - BACKGROUND ----------- - - Light (unpressed) - Normal (border, disabled, pressed, checked, toolbars, menus) - Dark (background) - - FOREGROUND ----------- - - Light (texts/labels) - Normal (not used yet) - Dark (disabled texts) - - SELECTION ------------ - - Light (selection/hover/active) - Normal (selected) - Dark (selected disabled) - -If a stranger configuration is required because of a bugfix or anything -else, keep the comment on the line above so nobody changes it, including the -issue number. - -*/ -/* - -See Qt documentation: - - - https://doc.qt.io/qt-5/stylesheet.html - - https://doc.qt.io/qt-5/stylesheet-reference.html - - https://doc.qt.io/qt-5/stylesheet-examples.html - ---------------------------------------------------------------------------- */ -/* QWidget ---------------------------------------------------------------- - ---------------------------------------------------------------------------- */ -QWidget { - background-color: #19232D; - border: 0px solid #32414B; - padding: 0px; - color: #F0F0F0; - selection-background-color: #1464A0; - selection-color: #F0F0F0; -} - -QWidget:disabled { - background-color: #19232D; - color: #787878; - selection-background-color: #14506E; - selection-color: #787878; -} - -QWidget::item:selected { - background-color: #1464A0; -} - -QWidget::item:hover { - background-color: #148CD2; - color: #32414B; -} - -/* QMainWindow ------------------------------------------------------------ - -This adjusts the splitter in the dock widget, not qsplitter -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmainwindow - ---------------------------------------------------------------------------- */ -QMainWindow::separator { - background-color: #32414B; - border: 0px solid #19232D; - spacing: 0px; - padding: 2px; -} - -QMainWindow::separator:hover { - background-color: #505F69; - border: 0px solid #148CD2; -} - -QMainWindow::separator:horizontal { - width: 5px; - margin-top: 2px; - margin-bottom: 2px; - image: url(":/qss_icons/rc/toolbar_separator_vertical.png"); -} - -QMainWindow::separator:vertical { - height: 5px; - margin-left: 2px; - margin-right: 2px; - image: url(":/qss_icons/rc/toolbar_separator_horizontal.png"); -} - -/* QToolTip --------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtooltip - ---------------------------------------------------------------------------- */ -QToolTip { - background-color: #148CD2; - border: 1px solid #19232D; - color: #19232D; - /* Remove padding, for fix combo box tooltip */ - padding: 0px; - /* Remove opacity, fix #174 - may need to use RGBA */ -} - -/* QStatusBar ------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qstatusbar - ---------------------------------------------------------------------------- */ -QStatusBar { - border: 1px solid #32414B; - /* Fixes Spyder #9120, #9121 */ - background: #32414B; - /* Fixes #205, white vertical borders separating items */ -} - -QStatusBar::item { - border: none; -} - -QStatusBar QToolTip { - background-color: #148CD2; - border: 1px solid #19232D; - color: #19232D; - /* Remove padding, for fix combo box tooltip */ - padding: 0px; - /* Reducing transparency to read better */ - opacity: 230; -} - -QStatusBar QLabel { - /* Fixes Spyder #9120, #9121 */ - background: transparent; -} - -/* QCheckBox -------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcheckbox - ---------------------------------------------------------------------------- */ -QCheckBox { - background-color: #19232D; - color: #F0F0F0; - spacing: 4px; - outline: none; - padding-top: 4px; - padding-bottom: 4px; -} - -QCheckBox:focus { - border: none; -} - -QCheckBox QWidget:disabled { - background-color: #19232D; - color: #787878; -} - -QCheckBox::indicator { - margin-left: 4px; - height: 16px; - width: 16px; -} - -QCheckBox::indicator:unchecked { - image: url(":/qss_icons/rc/checkbox_unchecked.png"); -} - -QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked:pressed { - border: none; - image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); -} - -QCheckBox::indicator:unchecked:disabled { - image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); -} - -QCheckBox::indicator:checked { - image: url(":/qss_icons/rc/checkbox_checked.png"); -} - -QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed { - border: none; - image: url(":/qss_icons/rc/checkbox_checked_focus.png"); -} - -QCheckBox::indicator:checked:disabled { - image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); -} - -QCheckBox::indicator:indeterminate { - image: url(":/qss_icons/rc/checkbox_indeterminate.png"); -} - -QCheckBox::indicator:indeterminate:disabled { - image: url(":/qss_icons/rc/checkbox_indeterminate_disabled.png"); -} - -QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed { - image: url(":/qss_icons/rc/checkbox_indeterminate_focus.png"); -} - -/* QGroupBox -------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox - ---------------------------------------------------------------------------- */ -QGroupBox { - font-weight: bold; - border: 1px solid #32414B; - border-radius: 4px; - padding: 4px; - margin-top: 16px; -} - -QGroupBox::title { - subcontrol-origin: margin; - subcontrol-position: top left; - left: 3px; - padding-left: 3px; - padding-right: 5px; - padding-top: 8px; - padding-bottom: 16px; -} - -QGroupBox::indicator { - margin-left: 2px; - height: 16px; - width: 16px; -} - -QGroupBox::indicator:unchecked { - border: none; - image: url(":/qss_icons/rc/checkbox_unchecked.png"); -} - -QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { - border: none; - image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); -} - -QGroupBox::indicator:unchecked:disabled { - image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); -} - -QGroupBox::indicator:checked { - border: none; - image: url(":/qss_icons/rc/checkbox_checked.png"); -} - -QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { - border: none; - image: url(":/qss_icons/rc/checkbox_checked_focus.png"); -} - -QGroupBox::indicator:checked:disabled { - image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); -} - -/* QRadioButton ----------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qradiobutton - ---------------------------------------------------------------------------- */ -QRadioButton { - background-color: #19232D; - color: #F0F0F0; - spacing: 4px; - padding: 0px; - border: none; - outline: none; -} - -QRadioButton:focus { - border: none; -} - -QRadioButton:disabled { - background-color: #19232D; - color: #787878; - border: none; - outline: none; -} - -QRadioButton QWidget { - background-color: #19232D; - color: #F0F0F0; - spacing: 0px; - padding: 0px; - outline: none; - border: none; -} - -QRadioButton::indicator { - border: none; - outline: none; - margin-left: 4px; - height: 16px; - width: 16px; -} - -QRadioButton::indicator:unchecked { - image: url(":/qss_icons/rc/radio_unchecked.png"); -} - -QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:focus, QRadioButton::indicator:unchecked:pressed { - border: none; - outline: none; - image: url(":/qss_icons/rc/radio_unchecked_focus.png"); -} - -QRadioButton::indicator:unchecked:disabled { - image: url(":/qss_icons/rc/radio_unchecked_disabled.png"); -} - -QRadioButton::indicator:checked { - border: none; - outline: none; - image: url(":/qss_icons/rc/radio_checked.png"); -} - -QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { - border: none; - outline: none; - image: url(":/qss_icons/rc/radio_checked_focus.png"); -} - -QRadioButton::indicator:checked:disabled { - outline: none; - image: url(":/qss_icons/rc/radio_checked_disabled.png"); -} - -/* QMenuBar --------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenubar - ---------------------------------------------------------------------------- */ -QMenuBar { - background-color: #32414B; - padding: 2px; - border: 1px solid #19232D; - color: #F0F0F0; -} - -QMenuBar:focus { - border: 1px solid #148CD2; -} - -QMenuBar::item { - background: transparent; - padding: 4px; -} - -QMenuBar::item:selected { - padding: 4px; - background: transparent; - border: 0px solid #32414B; -} - -QMenuBar::item:pressed { - padding: 4px; - border: 0px solid #32414B; - background-color: #148CD2; - color: #F0F0F0; - margin-bottom: 0px; - padding-bottom: 0px; -} - -/* QMenu ------------------------------------------------------------------ - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenu - ---------------------------------------------------------------------------- */ -QMenu { - border: 0px solid #32414B; - color: #F0F0F0; - margin: 0px; -} - -QMenu::separator { - height: 1px; - background-color: #505F69; - color: #F0F0F0; -} - -QMenu::icon { - margin: 0px; - padding-left: 8px; -} - -QMenu::item { - background-color: #32414B; - padding: 4px 24px 4px 24px; - /* Reserve space for selection border */ - border: 1px transparent #32414B; -} - -QMenu::item:selected { - color: #F0F0F0; -} - -QMenu::indicator { - width: 12px; - height: 12px; - padding-left: 6px; - /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ - /* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ -} - -QMenu::indicator:non-exclusive:unchecked { - image: url(":/qss_icons/rc/checkbox_unchecked.png"); -} - -QMenu::indicator:non-exclusive:unchecked:selected { - image: url(":/qss_icons/rc/checkbox_unchecked_disabled.png"); -} - -QMenu::indicator:non-exclusive:checked { - image: url(":/qss_icons/rc/checkbox_checked.png"); -} - -QMenu::indicator:non-exclusive:checked:selected { - image: url(":/qss_icons/rc/checkbox_checked_disabled.png"); -} - -QMenu::indicator:exclusive:unchecked { - image: url(":/qss_icons/rc/radio_unchecked.png"); -} - -QMenu::indicator:exclusive:unchecked:selected { - image: url(":/qss_icons/rc/radio_unchecked_disabled.png"); -} - -QMenu::indicator:exclusive:checked { - image: url(":/qss_icons/rc/radio_checked.png"); -} - -QMenu::indicator:exclusive:checked:selected { - image: url(":/qss_icons/rc/radio_checked_disabled.png"); -} - -QMenu::right-arrow { - margin: 5px; - image: url(":/qss_icons/rc/arrow_right.png"); - height: 12px; - width: 12px; -} - -/* QAbstractItemView ------------------------------------------------------ - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox - ---------------------------------------------------------------------------- */ -QAbstractItemView { - alternate-background-color: #19232D; - color: #F0F0F0; - border: 1px solid #32414B; - border-radius: 4px; -} - -QAbstractItemView QLineEdit { - padding: 2px; -} - -/* QAbstractScrollArea ---------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea - ---------------------------------------------------------------------------- */ -QAbstractScrollArea { - background-color: #19232D; - border: 1px solid #32414B; - border-radius: 4px; - padding: 2px; - /* fix #159 */ - min-height: 1.25em; - /* fix #159 */ - color: #F0F0F0; -} - -QAbstractScrollArea:disabled { - color: #787878; -} - -/* QScrollArea ------------------------------------------------------------ - ---------------------------------------------------------------------------- */ -QScrollArea QWidget QWidget:disabled { - background-color: #19232D; -} - -/* QScrollBar ------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qscrollbar - ---------------------------------------------------------------------------- */ -QScrollBar:horizontal { - height: 16px; - margin: 2px 16px 2px 16px; - border: 1px solid #32414B; - border-radius: 4px; - background-color: #19232D; -} - -QScrollBar:vertical { - background-color: #19232D; - width: 16px; - margin: 16px 2px 16px 2px; - border: 1px solid #32414B; - border-radius: 4px; -} - -QScrollBar::handle:horizontal { - background-color: #787878; - border: 1px solid #32414B; - border-radius: 4px; - min-width: 8px; -} - -QScrollBar::handle:horizontal:hover { - background-color: #148CD2; - border: 1px solid #148CD2; - border-radius: 4px; - min-width: 8px; -} - -QScrollBar::handle:horizontal:focus { - border: 1px solid #1464A0; -} - -QScrollBar::handle:vertical { - background-color: #787878; - border: 1px solid #32414B; - min-height: 8px; - border-radius: 4px; -} - -QScrollBar::handle:vertical:hover { - background-color: #148CD2; - border: 1px solid #148CD2; - border-radius: 4px; - min-height: 8px; -} - -QScrollBar::handle:vertical:focus { - border: 1px solid #1464A0; -} - -QScrollBar::add-line:horizontal { - margin: 0px 0px 0px 0px; - border-image: url(":/qss_icons/rc/arrow_right_disabled.png"); - height: 12px; - width: 12px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { - border-image: url(":/qss_icons/rc/arrow_right.png"); - height: 12px; - width: 12px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::add-line:vertical { - margin: 3px 0px 3px 0px; - border-image: url(":/qss_icons/rc/arrow_down_disabled.png"); - height: 12px; - width: 12px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { - border-image: url(":/qss_icons/rc/arrow_down.png"); - height: 12px; - width: 12px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal { - margin: 0px 3px 0px 3px; - border-image: url(":/qss_icons/rc/arrow_left_disabled.png"); - height: 12px; - width: 12px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { - border-image: url(":/qss_icons/rc/arrow_left.png"); - height: 12px; - width: 12px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:vertical { - margin: 3px 0px 3px 0px; - border-image: url(":/qss_icons/rc/arrow_up_disabled.png"); - height: 12px; - width: 12px; - subcontrol-position: top; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { - border-image: url(":/qss_icons/rc/arrow_up.png"); - height: 12px; - width: 12px; - subcontrol-position: top; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { - background: none; -} - -QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { - background: none; -} - -QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { - background: none; -} - -QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { - background: none; -} - -/* QTextEdit -------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-specific-widgets - ---------------------------------------------------------------------------- */ -QTextEdit { - background-color: #19232D; - color: #F0F0F0; - border-radius: 4px; - border: 1px solid #32414B; -} - -QTextEdit:hover { - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QTextEdit:focus { - border: 1px solid #1464A0; -} - -QTextEdit:selected { - background: #1464A0; - color: #32414B; -} - -/* QPlainTextEdit --------------------------------------------------------- - ---------------------------------------------------------------------------- */ -QPlainTextEdit { - background-color: #19232D; - color: #F0F0F0; - border-radius: 4px; - border: 1px solid #32414B; -} - -QPlainTextEdit:hover { - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QPlainTextEdit:focus { - border: 1px solid #1464A0; -} - -QPlainTextEdit:selected { - background: #1464A0; - color: #32414B; -} - -/* QSizeGrip -------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsizegrip - ---------------------------------------------------------------------------- */ -QSizeGrip { - background: transparent; - width: 12px; - height: 12px; - image: url(":/qss_icons/rc/window_grip.png"); -} - -/* QStackedWidget --------------------------------------------------------- - ---------------------------------------------------------------------------- */ -QStackedWidget { - padding: 2px; - border: 1px solid #32414B; - border: 1px solid #19232D; -} - -/* QToolBar --------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbar - ---------------------------------------------------------------------------- */ -QToolBar { - background-color: #32414B; - border-bottom: 1px solid #19232D; - padding: 2px; - font-weight: bold; - spacing: 2px; -} - -QToolBar QToolButton { - background-color: #32414B; - border: 1px solid #32414B; -} - -QToolBar QToolButton:hover { - border: 1px solid #148CD2; -} - -QToolBar QToolButton:checked { - border: 1px solid #19232D; - background-color: #19232D; -} - -QToolBar QToolButton:checked:hover { - border: 1px solid #148CD2; -} - -QToolBar::handle:horizontal { - width: 16px; - image: url(":/qss_icons/rc/toolbar_move_horizontal.png"); -} - -QToolBar::handle:vertical { - height: 16px; - image: url(":/qss_icons/rc/toolbar_move_vertical.png"); -} - -QToolBar::separator:horizontal { - width: 16px; - image: url(":/qss_icons/rc/toolbar_separator_horizontal.png"); -} - -QToolBar::separator:vertical { - height: 16px; - image: url(":/qss_icons/rc/toolbar_separator_vertical.png"); -} - -QToolButton#qt_toolbar_ext_button { - background: #32414B; - border: 0px; - color: #F0F0F0; - image: url(":/qss_icons/rc/arrow_right.png"); -} - -/* QAbstractSpinBox ------------------------------------------------------- - ---------------------------------------------------------------------------- */ -QAbstractSpinBox { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - /* This fixes 103, 111 */ - padding-top: 2px; - /* This fixes 103, 111 */ - padding-bottom: 2px; - padding-left: 4px; - padding-right: 4px; - border-radius: 4px; - /* min-width: 5px; removed to fix 109 */ -} - -QAbstractSpinBox:up-button { - background-color: transparent #19232D; - subcontrol-origin: border; - subcontrol-position: top right; - border-left: 1px solid #32414B; - border-bottom: 1px solid #32414B; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - margin: 1px; - width: 12px; - margin-bottom: -1px; -} - -QAbstractSpinBox::up-arrow, QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off { - image: url(":/qss_icons/rc/arrow_up_disabled.png"); - height: 8px; - width: 8px; -} - -QAbstractSpinBox::up-arrow:hover { - image: url(":/qss_icons/rc/arrow_up.png"); -} - -QAbstractSpinBox:down-button { - background-color: transparent #19232D; - subcontrol-origin: border; - subcontrol-position: bottom right; - border-left: 1px solid #32414B; - border-top: 1px solid #32414B; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - margin: 1px; - width: 12px; - margin-top: -1px; -} - -QAbstractSpinBox::down-arrow, QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off { - image: url(":/qss_icons/rc/arrow_down_disabled.png"); - height: 8px; - width: 8px; -} - -QAbstractSpinBox::down-arrow:hover { - image: url(":/qss_icons/rc/arrow_down.png"); -} - -QAbstractSpinBox:hover { - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QAbstractSpinBox:focus { - border: 1px solid #1464A0; -} - -QAbstractSpinBox:selected { - background: #1464A0; - color: #32414B; -} - -/* ------------------------------------------------------------------------ */ -/* DISPLAYS --------------------------------------------------------------- */ -/* ------------------------------------------------------------------------ */ -/* QLabel ----------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe - ---------------------------------------------------------------------------- */ -QLabel { - background-color: #19232D; - border: 0px solid #32414B; - padding: 2px; - margin: 0px; - color: #F0F0F0; -} - -QLabel:disabled { - background-color: #19232D; - border: 0px solid #32414B; - color: #787878; -} - -/* QTextBrowser ----------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea - ---------------------------------------------------------------------------- */ -QTextBrowser { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; -} - -QTextBrowser:disabled { - background-color: #19232D; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; -} - -QTextBrowser:hover, QTextBrowser:!hover, QTextBrowser:selected, QTextBrowser:pressed { - border: 1px solid #32414B; -} - -/* QGraphicsView ---------------------------------------------------------- - ---------------------------------------------------------------------------- */ -QGraphicsView { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; -} - -QGraphicsView:disabled { - background-color: #19232D; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; -} - -QGraphicsView:hover, QGraphicsView:!hover, QGraphicsView:selected, QGraphicsView:pressed { - border: 1px solid #32414B; -} - -/* QCalendarWidget -------------------------------------------------------- - ---------------------------------------------------------------------------- */ -QCalendarWidget { - border: 1px solid #32414B; - border-radius: 4px; -} - -QCalendarWidget:disabled { - background-color: #19232D; - color: #787878; -} - -/* QLCDNumber ------------------------------------------------------------- - ---------------------------------------------------------------------------- */ -QLCDNumber { - background-color: #19232D; - color: #F0F0F0; -} - -QLCDNumber:disabled { - background-color: #19232D; - color: #787878; -} - -/* QProgressBar ----------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qprogressbar - ---------------------------------------------------------------------------- */ -QProgressBar { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; - text-align: center; -} - -QProgressBar:disabled { - background-color: #19232D; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; - text-align: center; -} - -QProgressBar::chunk { - background-color: #1464A0; - color: #19232D; - border-radius: 4px; -} - -QProgressBar::chunk:disabled { - background-color: #14506E; - color: #787878; - border-radius: 4px; -} - -/* ------------------------------------------------------------------------ */ -/* BUTTONS ---------------------------------------------------------------- */ -/* ------------------------------------------------------------------------ */ -/* QPushButton ------------------------------------------------------------ - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qpushbutton - ---------------------------------------------------------------------------- */ -QPushButton { - background-color: #505F69; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; - padding: 3px; - outline: none; - /* Issue #194 - Special case of QPushButton inside dialogs, for better UI */ - min-width: 80px; -} - -QPushButton:disabled { - background-color: #32414B; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; - padding: 3px; -} - -QPushButton:checked { - background-color: #32414B; - border: 1px solid #32414B; - border-radius: 4px; - padding: 3px; - outline: none; -} - -QPushButton:checked:disabled { - background-color: #19232D; - border: 1px solid #32414B; - color: #787878; - border-radius: 4px; - padding: 3px; - outline: none; -} - -QPushButton:checked:selected { - background: #1464A0; - color: #32414B; -} - -QPushButton::menu-indicator { - subcontrol-origin: padding; - subcontrol-position: bottom right; - bottom: 4px; -} - -QPushButton:pressed { - background-color: #19232D; - border: 1px solid #19232D; -} - -QPushButton:pressed:hover { - border: 1px solid #148CD2; -} - -QPushButton:hover { - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QPushButton:selected { - background: #1464A0; - color: #32414B; -} - -QPushButton:hover { - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QPushButton:focus { - border: 1px solid #1464A0; -} - -/* QToolButton ------------------------------------------------------------ - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbutton - ---------------------------------------------------------------------------- */ -QToolButton { - background-color: transparent; - border: 1px solid transparent; - border-radius: 4px; - margin: 0px; - padding: 2px; - /* The subcontrols below are used only in the DelayedPopup mode */ - /* The subcontrols below are used only in the MenuButtonPopup mode */ - /* The subcontrol below is used only in the InstantPopup or DelayedPopup mode */ -} - -QToolButton:checked { - background-color: transparent; - border: 1px solid #1464A0; -} - -QToolButton:checked:disabled { - border: 1px solid #14506E; -} - -QToolButton:pressed { - margin: 1px; - background-color: transparent; - border: 1px solid #1464A0; -} - -QToolButton:disabled { - border: none; -} - -QToolButton:hover { - border: 1px solid #148CD2; -} - -QToolButton[popupMode="0"] { - /* Only for DelayedPopup */ - padding-right: 2px; -} - -QToolButton[popupMode="1"] { - /* Only for MenuButtonPopup */ - padding-right: 20px; -} - -QToolButton[popupMode="1"]::menu-button { - border: none; -} - -QToolButton[popupMode="1"]::menu-button:hover { - border: none; - border-left: 1px solid #148CD2; - border-radius: 0; -} - -QToolButton[popupMode="2"] { - /* Only for InstantPopup */ - padding-right: 2px; -} - -QToolButton::menu-button { - padding: 2px; - border-radius: 4px; - border: 1px solid #32414B; - width: 12px; - outline: none; -} - -QToolButton::menu-button:hover { - border: 1px solid #148CD2; -} - -QToolButton::menu-button:checked:hover { - border: 1px solid #148CD2; -} - -QToolButton::menu-indicator { - image: url(":/qss_icons/rc/arrow_down.png"); - height: 8px; - width: 8px; - top: 0; - /* Exclude a shift for better image */ - left: -2px; - /* Shift it a bit */ -} - -QToolButton::menu-arrow { - image: url(":/qss_icons/rc/arrow_down.png"); - height: 8px; - width: 8px; -} - -QToolButton::menu-arrow:hover { - image: url(":/qss_icons/rc/arrow_down_focus.png"); -} - -/* QCommandLinkButton ----------------------------------------------------- - ---------------------------------------------------------------------------- */ -QCommandLinkButton { - background-color: transparent; - border: 1px solid #32414B; - color: #F0F0F0; - border-radius: 4px; - padding: 0px; - margin: 0px; -} - -QCommandLinkButton:disabled { - background-color: transparent; - color: #787878; -} - -/* ------------------------------------------------------------------------ */ -/* INPUTS - NO FIELDS ----------------------------------------------------- */ -/* ------------------------------------------------------------------------ */ -/* QComboBox -------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox - ---------------------------------------------------------------------------- */ -QComboBox { - border: 1px solid #32414B; - border-radius: 4px; - selection-background-color: #1464A0; - padding-left: 4px; - padding-right: 36px; - /* 4 + 16*2 See scrollbar size */ - /* Fixes #103, #111 */ - min-height: 1.5em; - /* padding-top: 2px; removed to fix #132 */ - /* padding-bottom: 2px; removed to fix #132 */ - /* min-width: 75px; removed to fix #109 */ - /* Needed to remove indicator - fix #132 */ -} - -QComboBox QAbstractItemView { - border: 1px solid #32414B; - border-radius: 0; - background-color: #19232D; - selection-background-color: #1464A0; -} - -QComboBox QAbstractItemView:hover { - background-color: #19232D; - color: #F0F0F0; -} - -QComboBox QAbstractItemView:selected { - background: #1464A0; - color: #32414B; -} - -QComboBox QAbstractItemView:alternate { - background: #19232D; -} - -QComboBox:disabled { - background-color: #19232D; - color: #787878; -} - -QComboBox:hover { - border: 1px solid #148CD2; -} - -QComboBox:focus { - border: 1px solid #1464A0; -} - -QComboBox:on { - selection-background-color: #1464A0; -} - -QComboBox::indicator { - border: none; - border-radius: 0; - background-color: transparent; - selection-background-color: transparent; - color: transparent; - selection-color: transparent; - /* Needed to remove indicator - fix #132 */ -} - -QComboBox::indicator:alternate { - background: #19232D; -} - -QComboBox::item:alternate { - background: #19232D; -} - -QComboBox::item:checked { - font-weight: bold; -} - -QComboBox::item:selected { - border: 0px solid transparent; -} - -QComboBox::drop-down { - subcontrol-origin: padding; - subcontrol-position: top right; - width: 12px; - border-left: 1px solid #32414B; -} - -QComboBox::down-arrow { - image: url(":/qss_icons/rc/arrow_down_disabled.png"); - height: 8px; - width: 8px; -} - -QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { - image: url(":/qss_icons/rc/arrow_down.png"); -} - -/* QSlider ---------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qslider - ---------------------------------------------------------------------------- */ -QSlider:disabled { - background: #19232D; -} - -QSlider:focus { - border: none; -} - -QSlider::groove:horizontal { - background: #32414B; - border: 1px solid #32414B; - height: 4px; - margin: 0px; - border-radius: 4px; -} - -QSlider::groove:vertical { - background: #32414B; - border: 1px solid #32414B; - width: 4px; - margin: 0px; - border-radius: 4px; -} - -QSlider::add-page:vertical { - background: #1464A0; - border: 1px solid #32414B; - width: 4px; - margin: 0px; - border-radius: 4px; -} - -QSlider::add-page:vertical :disabled { - background: #14506E; -} - -QSlider::sub-page:horizontal { - background: #1464A0; - border: 1px solid #32414B; - height: 4px; - margin: 0px; - border-radius: 4px; -} - -QSlider::sub-page:horizontal:disabled { - background: #14506E; -} - -QSlider::handle:horizontal { - background: #787878; - border: 1px solid #32414B; - width: 8px; - height: 8px; - margin: -8px 0px; - border-radius: 4px; -} - -QSlider::handle:horizontal:hover { - background: #148CD2; - border: 1px solid #148CD2; -} - -QSlider::handle:horizontal:focus { - border: 1px solid #1464A0; -} - -QSlider::handle:vertical { - background: #787878; - border: 1px solid #32414B; - width: 8px; - height: 8px; - margin: 0 -8px; - border-radius: 4px; -} - -QSlider::handle:vertical:hover { - background: #148CD2; - border: 1px solid #148CD2; -} - -QSlider::handle:vertical:focus { - border: 1px solid #1464A0; -} - -/* QLineEdit -------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlineedit - ---------------------------------------------------------------------------- */ -QLineEdit { - background-color: #19232D; - padding-top: 2px; - /* This QLineEdit fix 103, 111 */ - padding-bottom: 2px; - /* This QLineEdit fix 103, 111 */ - padding-left: 4px; - padding-right: 4px; - border-style: solid; - border: 1px solid #32414B; - border-radius: 4px; - color: #F0F0F0; -} - -QLineEdit:disabled { - background-color: #19232D; - color: #787878; -} - -QLineEdit:hover { - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QLineEdit:focus { - border: 1px solid #1464A0; -} - -QLineEdit:selected { - background-color: #1464A0; - color: #32414B; -} - -/* QTabWiget -------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar - ---------------------------------------------------------------------------- */ -QTabWidget { - padding: 2px; - selection-background-color: #32414B; -} - -QTabWidget QWidget { - /* Fixes #189 */ - border-radius: 4px; -} - -QTabWidget::pane { - border: 1px solid #32414B; - border-radius: 4px; - margin: 0px; - /* Fixes double border inside pane with pyqt5 */ - padding: 0px; -} - -QTabWidget::pane:selected { - background-color: #32414B; - border: 1px solid #1464A0; -} - -/* QTabBar ---------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar - ---------------------------------------------------------------------------- */ -QTabBar { - qproperty-drawBase: 0; - border-radius: 4px; - margin: 0px; - padding: 2px; - border: 0; - /* left: 5px; move to the right by 5px - removed for fix */ -} - -QTabBar::close-button { - border: 0; - margin: 2px; - padding: 2px; - image: url(":/qss_icons/rc/window_close.png"); -} - -QTabBar::close-button:hover { - image: url(":/qss_icons/rc/window_close_focus.png"); -} - -QTabBar::close-button:pressed { - image: url(":/qss_icons/rc/window_close_pressed.png"); -} - -/* QTabBar::tab - selected ------------------------------------------------ - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar - ---------------------------------------------------------------------------- */ -QTabBar::tab { - /* !selected and disabled ----------------------------------------- */ - /* selected ------------------------------------------------------- */ -} - -QTabBar::tab:top:selected:disabled { - border-bottom: 3px solid #14506E; - color: #787878; - background-color: #32414B; -} - -QTabBar::tab:bottom:selected:disabled { - border-top: 3px solid #14506E; - color: #787878; - background-color: #32414B; -} - -QTabBar::tab:left:selected:disabled { - border-right: 3px solid #14506E; - color: #787878; - background-color: #32414B; -} - -QTabBar::tab:right:selected:disabled { - border-left: 3px solid #14506E; - color: #787878; - background-color: #32414B; -} - -QTabBar::tab:top:!selected:disabled { - border-bottom: 3px solid #19232D; - color: #787878; - background-color: #19232D; -} - -QTabBar::tab:bottom:!selected:disabled { - border-top: 3px solid #19232D; - color: #787878; - background-color: #19232D; -} - -QTabBar::tab:left:!selected:disabled { - border-right: 3px solid #19232D; - color: #787878; - background-color: #19232D; -} - -QTabBar::tab:right:!selected:disabled { - border-left: 3px solid #19232D; - color: #787878; - background-color: #19232D; -} - -QTabBar::tab:top:!selected { - border-bottom: 2px solid #19232D; - margin-top: 2px; -} - -QTabBar::tab:bottom:!selected { - border-top: 2px solid #19232D; - margin-bottom: 3px; -} - -QTabBar::tab:left:!selected { - border-left: 2px solid #19232D; - margin-right: 2px; -} - -QTabBar::tab:right:!selected { - border-right: 2px solid #19232D; - margin-left: 2px; -} - -QTabBar::tab:top { - background-color: #32414B; - color: #F0F0F0; - margin-left: 2px; - padding-left: 4px; - padding-right: 4px; - padding-top: 2px; - padding-bottom: 2px; - min-width: 5px; - border-bottom: 3px solid #32414B; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} - -QTabBar::tab:top:selected { - background-color: #505F69; - color: #F0F0F0; - border-bottom: 3px solid #1464A0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} - -QTabBar::tab:top:!selected:hover { - border: 1px solid #148CD2; - border-bottom: 3px solid #148CD2; - /* Fixes spyder-ide/spyder#9766 */ - padding-left: 4px; - padding-right: 4px; -} - -QTabBar::tab:bottom { - color: #F0F0F0; - border-top: 3px solid #32414B; - background-color: #32414B; - margin-left: 2px; - padding-left: 4px; - padding-right: 4px; - padding-top: 2px; - padding-bottom: 2px; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; - min-width: 5px; -} - -QTabBar::tab:bottom:selected { - color: #F0F0F0; - background-color: #505F69; - border-top: 3px solid #1464A0; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} - -QTabBar::tab:bottom:!selected:hover { - border: 1px solid #148CD2; - border-top: 3px solid #148CD2; - /* Fixes spyder-ide/spyder#9766 */ - padding-left: 4px; - padding-right: 4px; -} - -QTabBar::tab:left { - color: #F0F0F0; - background-color: #32414B; - margin-top: 2px; - padding-left: 2px; - padding-right: 2px; - padding-top: 4px; - padding-bottom: 4px; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - min-height: 5px; -} - -QTabBar::tab:left:selected { - color: #F0F0F0; - background-color: #505F69; - border-right: 3px solid #1464A0; -} - -QTabBar::tab:left:!selected:hover { - border: 1px solid #148CD2; - border-right: 3px solid #148CD2; - padding: 0px; -} - -QTabBar::tab:right { - color: #F0F0F0; - background-color: #32414B; - margin-top: 2px; - padding-left: 2px; - padding-right: 2px; - padding-top: 4px; - padding-bottom: 4px; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - min-height: 5px; -} - -QTabBar::tab:right:selected { - color: #F0F0F0; - background-color: #505F69; - border-left: 3px solid #1464A0; -} - -QTabBar::tab:right:!selected:hover { - border: 1px solid #148CD2; - border-left: 3px solid #148CD2; - padding: 0px; -} - -QTabBar QToolButton { - /* Fixes #136 */ - background-color: #32414B; - height: 12px; - width: 12px; -} - -QTabBar QToolButton:pressed { - background-color: #32414B; -} - -QTabBar QToolButton:pressed:hover { - border: 1px solid #148CD2; -} - -QTabBar QToolButton::left-arrow:enabled { - image: url(":/qss_icons/rc/arrow_left.png"); -} - -QTabBar QToolButton::left-arrow:disabled { - image: url(":/qss_icons/rc/arrow_left_disabled.png"); -} - -QTabBar QToolButton::right-arrow:enabled { - image: url(":/qss_icons/rc/arrow_right.png"); -} - -QTabBar QToolButton::right-arrow:disabled { - image: url(":/qss_icons/rc/arrow_right_disabled.png"); -} - -/* QDockWiget ------------------------------------------------------------- - ---------------------------------------------------------------------------- */ -QDockWidget { - outline: 1px solid #32414B; - background-color: #19232D; - border: 1px solid #32414B; - border-radius: 4px; - titlebar-close-icon: url(":/qss_icons/rc/window_close.png"); - titlebar-normal-icon: url(":/qss_icons/rc/window_undock.png"); -} - -QDockWidget::title { - /* Better size for title bar */ - padding: 6px; - spacing: 4px; - border: none; - background-color: #32414B; -} - -QDockWidget::close-button { - background-color: #32414B; - border-radius: 4px; - border: none; -} - -QDockWidget::close-button:hover { - image: url(":/qss_icons/rc/window_close_focus.png"); -} - -QDockWidget::close-button:pressed { - image: url(":/qss_icons/rc/window_close_pressed.png"); -} - -QDockWidget::float-button { - background-color: #32414B; - border-radius: 4px; - border: none; -} - -QDockWidget::float-button:hover { - image: url(":/qss_icons/rc/window_undock_focus.png"); -} - -QDockWidget::float-button:pressed { - image: url(":/qss_icons/rc/window_undock_pressed.png"); -} - -/* QTreeView QListView QTableView ----------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtreeview -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlistview -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtableview - ---------------------------------------------------------------------------- */ -QTreeView:branch:selected, QTreeView:branch:hover { - background: url(":/qss_icons/rc/transparent.png"); -} - -QTreeView:branch:has-siblings:!adjoins-item { - border-image: url(":/qss_icons/rc/branch_line.png") 0; -} - -QTreeView:branch:has-siblings:adjoins-item { - border-image: url(":/qss_icons/rc/branch_more.png") 0; -} - -QTreeView:branch:!has-children:!has-siblings:adjoins-item { - border-image: url(":/qss_icons/rc/branch_end.png") 0; -} - -QTreeView:branch:has-children:!has-siblings:closed, QTreeView:branch:closed:has-children:has-siblings { - border-image: none; - image: url(":/qss_icons/rc/branch_closed.png"); -} - -QTreeView:branch:open:has-children:!has-siblings, QTreeView:branch:open:has-children:has-siblings { - border-image: none; - image: url(":/qss_icons/rc/branch_open.png"); -} - -QTreeView:branch:has-children:!has-siblings:closed:hover, QTreeView:branch:closed:has-children:has-siblings:hover { - image: url(":/qss_icons/rc/branch_closed_focus.png"); -} - -QTreeView:branch:open:has-children:!has-siblings:hover, QTreeView:branch:open:has-children:has-siblings:hover { - image: url(":/qss_icons/rc/branch_open_focus.png"); -} - -QTreeView::indicator:checked, -QListView::indicator:checked { - image: url(":/qss_icons/rc/checkbox_checked.png"); -} - -QTreeView::indicator:checked:hover, QTreeView::indicator:checked:focus, QTreeView::indicator:checked:pressed, -QListView::indicator:checked:hover, -QListView::indicator:checked:focus, -QListView::indicator:checked:pressed { - image: url(":/qss_icons/rc/checkbox_checked_focus.png"); -} - -QTreeView::indicator:unchecked, -QListView::indicator:unchecked { - image: url(":/qss_icons/rc/checkbox_unchecked.png"); -} - -QTreeView::indicator:unchecked:hover, QTreeView::indicator:unchecked:focus, QTreeView::indicator:unchecked:pressed, -QListView::indicator:unchecked:hover, -QListView::indicator:unchecked:focus, -QListView::indicator:unchecked:pressed { - image: url(":/qss_icons/rc/checkbox_unchecked_focus.png"); -} - -QTreeView::indicator:indeterminate, -QListView::indicator:indeterminate { - image: url(":/qss_icons/rc/checkbox_indeterminate.png"); -} - -QTreeView::indicator:indeterminate:hover, QTreeView::indicator:indeterminate:focus, QTreeView::indicator:indeterminate:pressed, -QListView::indicator:indeterminate:hover, -QListView::indicator:indeterminate:focus, -QListView::indicator:indeterminate:pressed { - image: url(":/qss_icons/rc/checkbox_indeterminate_focus.png"); -} - -QTreeView, -QListView, -QTableView, -QColumnView { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - gridline-color: #32414B; - border-radius: 4px; -} - -QTreeView:disabled, -QListView:disabled, -QTableView:disabled, -QColumnView:disabled { - background-color: #19232D; - color: #787878; -} - -QTreeView:selected, -QListView:selected, -QTableView:selected, -QColumnView:selected { - background-color: #1464A0; - color: #32414B; -} - -QTreeView:hover, -QListView:hover, -QTableView:hover, -QColumnView:hover { - background-color: #19232D; - border: 1px solid #148CD2; -} - -QTreeView::item:pressed, -QListView::item:pressed, -QTableView::item:pressed, -QColumnView::item:pressed { - background-color: #1464A0; -} - -QTreeView::item:selected:hover, -QListView::item:selected:hover, -QTableView::item:selected:hover, -QColumnView::item:selected:hover { - background: #1464A0; - color: #19232D; -} - -QTreeView::item:selected:active, -QListView::item:selected:active, -QTableView::item:selected:active, -QColumnView::item:selected:active { - background-color: #1464A0; -} - -QTreeView::item:!selected:hover, -QListView::item:!selected:hover, -QTableView::item:!selected:hover, -QColumnView::item:!selected:hover { - outline: 0; - color: #148CD2; - background-color: #32414B; -} - -QTableCornerButton::section { - background-color: #19232D; - border: 1px transparent #32414B; - border-radius: 0px; -} - -/* QHeaderView ------------------------------------------------------------ - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qheaderview - ---------------------------------------------------------------------------- */ -QHeaderView { - background-color: #32414B; - border: 0px transparent #32414B; - padding: 0px; - margin: 0px; - border-radius: 0px; -} - -QHeaderView:disabled { - background-color: #32414B; - border: 1px transparent #32414B; - padding: 2px; -} - -QHeaderView::section { - background-color: #32414B; - color: #F0F0F0; - padding: 2px; - border-radius: 0px; - text-align: left; -} - -QHeaderView::section:checked { - color: #F0F0F0; - background-color: #1464A0; -} - -QHeaderView::section:checked:disabled { - color: #787878; - background-color: #14506E; -} - -QHeaderView::section::horizontal { - padding-left: 4px; - padding-right: 4px; - border-left: 1px solid #19232D; -} - -QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { - border-left: 1px solid #32414B; -} - -QHeaderView::section::horizontal:disabled { - color: #787878; -} - -QHeaderView::section::vertical { - padding-left: 4px; - padding-right: 4px; - border-top: 1px solid #19232D; -} - -QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { - border-top: 1px solid #32414B; -} - -QHeaderView::section::vertical:disabled { - color: #787878; -} - -QHeaderView::down-arrow { - /* Those settings (border/width/height/background-color) solve bug */ - /* transparent arrow background and size */ - background-color: #32414B; - border: none; - height: 12px; - width: 12px; - padding-left: 2px; - padding-right: 2px; - image: url(":/qss_icons/rc/arrow_down.png"); -} - -QHeaderView::up-arrow { - background-color: #32414B; - border: none; - height: 12px; - width: 12px; - padding-left: 2px; - padding-right: 2px; - image: url(":/qss_icons/rc/arrow_up.png"); -} - -/* QToolBox -------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbox - ---------------------------------------------------------------------------- */ -QToolBox { - padding: 0px; - border: 0px; - border: 1px solid #32414B; -} - -QToolBox:selected { - padding: 0px; - border: 2px solid #1464A0; -} - -QToolBox::tab { - background-color: #19232D; - border: 1px solid #32414B; - color: #F0F0F0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -QToolBox::tab:disabled { - color: #787878; -} - -QToolBox::tab:selected { - background-color: #505F69; - border-bottom: 2px solid #1464A0; -} - -QToolBox::tab:selected:disabled { - background-color: #32414B; - border-bottom: 2px solid #14506E; -} - -QToolBox::tab:!selected { - background-color: #32414B; - border-bottom: 2px solid #32414B; -} - -QToolBox::tab:!selected:disabled { - background-color: #19232D; -} - -QToolBox::tab:hover { - border-color: #148CD2; - border-bottom: 2px solid #148CD2; -} - -QToolBox QScrollArea QWidget QWidget { - padding: 0px; - border: 0px; - background-color: #19232D; -} - -/* QFrame ----------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe -https://doc.qt.io/qt-5/qframe.html#-prop -https://doc.qt.io/qt-5/qframe.html#details -https://stackoverflow.com/questions/14581498/qt-stylesheet-for-hline-vline-color - ---------------------------------------------------------------------------- */ -/* (dot) .QFrame fix #141, #126, #123 */ -.QFrame { - border-radius: 4px; - border: 1px solid #32414B; - /* No frame */ - /* HLine */ - /* HLine */ -} - -.QFrame[frameShape="0"] { - border-radius: 4px; - border: 1px transparent #32414B; -} - -.QFrame[frameShape="4"] { - max-height: 2px; - border: none; - background-color: #32414B; -} - -.QFrame[frameShape="5"] { - max-width: 2px; - border: none; - background-color: #32414B; -} - -/* QSplitter -------------------------------------------------------------- - -https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsplitter - ---------------------------------------------------------------------------- */ -QSplitter { - background-color: #32414B; - spacing: 0px; - padding: 0px; - margin: 0px; -} - -QSplitter::handle { - background-color: #32414B; - border: 0px solid #19232D; - spacing: 0px; - padding: 1px; - margin: 0px; -} - -QSplitter::handle:hover { - background-color: #787878; -} - -QSplitter::handle:horizontal { - width: 5px; - image: url(":/qss_icons/rc/line_vertical.png"); -} - -QSplitter::handle:vertical { - height: 5px; - image: url(":/qss_icons/rc/line_horizontal.png"); -} - -/* QDateEdit, QDateTimeEdit ----------------------------------------------- - ---------------------------------------------------------------------------- */ -QDateEdit, QDateTimeEdit { - selection-background-color: #1464A0; - border-style: solid; - border: 1px solid #32414B; - border-radius: 4px; - /* This fixes 103, 111 */ - padding-top: 2px; - /* This fixes 103, 111 */ - padding-bottom: 2px; - padding-left: 4px; - padding-right: 4px; - min-width: 10px; -} - -QDateEdit:on, QDateTimeEdit:on { - selection-background-color: #1464A0; -} - -QDateEdit::drop-down, QDateTimeEdit::drop-down { - subcontrol-origin: padding; - subcontrol-position: top right; - width: 12px; - border-left: 1px solid #32414B; -} - -QDateEdit::down-arrow, QDateTimeEdit::down-arrow { - image: url(":/qss_icons/rc/arrow_down_disabled.png"); - height: 8px; - width: 8px; -} - -QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus, QDateTimeEdit::down-arrow:on, QDateTimeEdit::down-arrow:hover, QDateTimeEdit::down-arrow:focus { - image: url(":/qss_icons/rc/arrow_down.png"); -} - -QDateEdit QAbstractItemView, QDateTimeEdit QAbstractItemView { - background-color: #19232D; - border-radius: 4px; - border: 1px solid #32414B; - selection-background-color: #1464A0; -} - -/* QAbstractView ---------------------------------------------------------- - ---------------------------------------------------------------------------- */ -QAbstractView:hover { - border: 1px solid #148CD2; - color: #F0F0F0; -} - -QAbstractView:selected { - background: #1464A0; - color: #32414B; -} - -/* PlotWidget ------------------------------------------------------------- - ---------------------------------------------------------------------------- */ -PlotWidget { - /* Fix cut labels in plots #134 */ - padding: 0px; -} diff --git a/runtime/splash.png b/runtime/splash.png deleted file mode 100755 index 83fcbe76b..000000000 Binary files a/runtime/splash.png and /dev/null differ diff --git a/runtime/src/css/pgadmin-desktop.css b/runtime/src/css/pgadmin-desktop.css new file mode 100644 index 000000000..3ca224fe6 --- /dev/null +++ b/runtime/src/css/pgadmin-desktop.css @@ -0,0 +1,44 @@ +@import "../../node_modules/bootstrap/dist/css/bootstrap.css"; + +.card { + margin: 0.25rem !important; +} + +#status-text { + font-size: medium; + align-self: center; +} + +#server_log_label { + font-weight: 500; +} + +.btn-primary { + color: #fff; + background-color: #326690; + border-color: #326690; + } + .btn-primary:hover { + color: #fff; + background-color: #285274; + border-color: #254b6a; + } + .btn-primary:focus, .btn-primary.focus { + color: #fff; + background-color: #285274; + border-color: #254b6a; + box-shadow: 0 0 0 0 rgba(81, 125, 161, 0.5); + } + .btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #326690; + border-color: #326690; + } + .btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #254b6a; + border-color: #224461; + } + .btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0 rgba(81, 125, 161, 0.5); + } diff --git a/runtime/src/html/configure.html b/runtime/src/html/configure.html new file mode 100644 index 000000000..5c5ef84ee --- /dev/null +++ b/runtime/src/html/configure.html @@ -0,0 +1,60 @@ + + + + + + + pgAdmin 4 Configuration + + + + +
+
Fixed Port
+
+
+ +
+
+
+ + +
+
+ + +
+
+
+
+
+
Connection Timeout
+
+
+ +
+
+
+ + + +
+
+
+
+
+
+
+ +
+
+ + + diff --git a/runtime/src/html/pgadmin.html b/runtime/src/html/pgadmin.html new file mode 100644 index 000000000..62c7dc8c8 --- /dev/null +++ b/runtime/src/html/pgadmin.html @@ -0,0 +1,42 @@ + + + + pgAdmin 4 + + + + +
+ +
+ + + + diff --git a/runtime/src/html/server_error.html b/runtime/src/html/server_error.html new file mode 100644 index 000000000..85bc0c048 --- /dev/null +++ b/runtime/src/html/server_error.html @@ -0,0 +1,31 @@ + + + + + + + Fatal Error + + + + +
+
+ + +
+
+
+
+ +
+
+
+ + + diff --git a/runtime/src/html/view_log.html b/runtime/src/html/view_log.html new file mode 100644 index 000000000..64740b08c --- /dev/null +++ b/runtime/src/html/view_log.html @@ -0,0 +1,31 @@ + + + + + + + pgAdmin 4 Log + + + + +
+
+ + +
+
+
+
+ +
+
+
+ + + diff --git a/runtime/src/js/configure.js b/runtime/src/js/configure.js new file mode 100644 index 000000000..adb78ff5a --- /dev/null +++ b/runtime/src/js/configure.js @@ -0,0 +1,91 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2021, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +const misc = require('../js/misc.js'); + +// Get the window object of view log window +var gui = require('nw.gui'); +var configWindow = gui.Window.get(); + +function checkConfiguration() { + if (document.getElementById('fixedPortCheck').checked) { + var fixedPort = parseInt(document.getElementById('portNo').value); + // get the available TCP port + misc.getAvailablePort(fixedPort) + .then(() => { + saveConfiguration(); + }) + .catch(() => { + alert('The specified fixed port is already in use. Please provide any other valid port.'); + }); + } else { + saveConfiguration(); + } +} + +function saveConfiguration() { + misc.ConfigureStore.set('fixedPort', document.getElementById('fixedPortCheck').checked); + misc.ConfigureStore.set('portNo', parseInt(document.getElementById('portNo').value)); + misc.ConfigureStore.set('connectionTimeout', parseInt(document.getElementById('timeOut').value)); + + misc.ConfigureStore.saveConfig(); + + document.getElementById('status-text').innerHTML = 'Configuration Saved'; + + if (confirm('The pgAdmin 4 must be restarted for changes to take effect.\n\n Do you want to quit the application?') == true) { + misc.cleanupAndQuitApp(); + } + configWindow.close(); +} + +function onCheckChange() { + if (this.checked) { + document.getElementById('portNo').removeAttribute('disabled'); + } else { + document.getElementById('portNo').setAttribute('disabled', 'disabled'); + } + + // Enable/Disable Save button + enableDisableSaveButton(); +} + +function enableDisableSaveButton() { + var configData = misc.ConfigureStore.getConfigData(); + + if (configData['fixedPort'] != document.getElementById('fixedPortCheck').checked || + configData['portNo'] != document.getElementById('portNo').value || + configData['connectionTimeout'] != document.getElementById('timeOut').value) { + document.getElementById('btnSave').removeAttribute('disabled'); + } else { + document.getElementById('btnSave').setAttribute('disabled', 'disabled'); + } +} + +configWindow.on('loaded', function() { + document.getElementById('status-text').innerHTML = ''; + // Get the config data from the file. + var configData = misc.ConfigureStore.getConfigData(); + + // Set the GUI value as per configuration. + if (configData['fixedPort']) { + document.getElementById('fixedPortCheck').checked = true; + document.getElementById('portNo').disabled = false; + } else { + document.getElementById('fixedPortCheck').checked = false; + document.getElementById('portNo').disabled = true; + } + document.getElementById('portNo').value = configData['portNo']; + document.getElementById('timeOut').value = configData['connectionTimeout']; + + // Add event listeners + document.getElementById('btnSave').addEventListener('click', checkConfiguration); + document.getElementById('fixedPortCheck').addEventListener('change', onCheckChange); + document.getElementById('portNo').addEventListener('change', enableDisableSaveButton); + document.getElementById('timeOut').addEventListener('change', enableDisableSaveButton); +}); diff --git a/runtime/src/js/misc.js b/runtime/src/js/misc.js new file mode 100644 index 000000000..7a5c18dfa --- /dev/null +++ b/runtime/src/js/misc.js @@ -0,0 +1,316 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2021, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +const fs = require('fs'); +const path = require('path'); +const net = require('net'); +const {platform, homedir} = require('os'); +var pgadminServerProcess = null; +var pgAdminWindowObject = null; + +// This function is used to check whether directory is present or not +// if not present then create it recursively +const createDir = (dirName) => { + if (!fs.existsSync(dirName)) { + fs.mkdirSync(dirName, {recursive: true}); + } +}; + +// This function is used to get the python executable path +// based on the platform. Use this for deployment. +const getPythonPath = () => { + var pythonPath = ''; + switch (platform()) { + case 'win32': + pythonPath = '../python/python.exe'; + break; + case 'darwin': + pythonPath = '../../Frameworks/Python.framework/Versions/Current/bin/python3'; + break; + case 'linux': + pythonPath = '../venv/bin/python3'; + break; + default: + if (platform().startsWith('win')) { + pythonPath = '../python/python.exe'; + } else { + pythonPath = '../venv/bin/python3'; + } + } + + return pythonPath; +}; + +// This function is used to get the [roaming] app data path +// based on the platform. Use this for config etc. +const getAppDataPath = () => { + var appDataPath = ''; + switch (platform()) { + case 'win32': + appDataPath = path.join(process.env.APPDATA, 'pgadmin'); + break; + case 'darwin': + appDataPath = path.join(homedir(), 'Library', 'Preferences', 'pgadmin'); + break; + case 'linux': + if ('XDG_CONFIG_HOME' in process.env) { + appDataPath = path.join(process.env.XDG_CONFIG_HOME, 'pgadmin'); + } else { + appDataPath = path.join(homedir(), '.config', 'pgadmin'); + } + break; + default: + if (platform().startsWith('win')) { + appDataPath = path.join(process.env.APPDATA, 'pgadmin'); + } else { + if ('XDG_CONFIG_HOME' in process.env) { + appDataPath = path.join(process.env.XDG_CONFIG_HOME, 'pgadmin'); + } else { + appDataPath = path.join(homedir(), '.config', 'pgadmin'); + } + } + } + + // Create directory if not exists + createDir(appDataPath); + + return appDataPath; +}; + +// This function is used to get the [local] app data path +// based on the platform. Use this for logs etc. +const getLocalAppDataPath = () => { + var localAppDataPath = ''; + switch (platform()) { + case 'win32': + localAppDataPath = path.join(process.env.LOCALAPPDATA, 'pgadmin'); + break; + case 'darwin': + localAppDataPath = path.join(homedir(), 'Library', 'Application Support', 'pgadmin'); + break; + case 'linux': + if ('XDG_DATA_HOME' in process.env) { + localAppDataPath = path.join(process.env.XDG_DATA_HOME, 'pgadmin'); + } else { + localAppDataPath = path.join(homedir(), '.local', 'share', 'pgadmin'); + } + break; + default: + if (platform().startsWith('win')) { + localAppDataPath = path.join(process.env.LOCALAPPDATA, 'pgadmin'); + } else { + if ('XDG_DATA_HOME' in process.env) { + localAppDataPath = path.join(process.env.XDG_DATA_HOME, 'pgadmin'); + } else { + localAppDataPath = path.join(homedir(), '.local', 'share', 'pgadmin'); + } + } + } + + // Create directory if not exists + createDir(localAppDataPath); + + return localAppDataPath; +}; + +// This function is used to get the random available TCP port +// if fixedPort is set to 0. Else check whether port is in used or not. +const getAvailablePort = (fixedPort) => { + return new Promise(function(resolve, reject) { + const server = net.createServer(); + + server.listen(fixedPort, '127.0.0.1'); + + server.on('error', (e) => { + reject(e.code); + }); + + server.on('listening', () => { + var serverPort = server.address().port; + server.close(); + resolve(serverPort); + }); + }); +}; + +// Get the app data folder path +const currentTime = (new Date()).getTime(); +const serverLogFile = path.join(getLocalAppDataPath(), 'pgadmin4.' + currentTime.toString() + '.log'); +const configFileName = path.join(getAppDataPath(), 'runtime_config.json'); +const DEFAULT_CONFIG_DATA = {'fixedPort': false, 'portNo': 5050, 'connectionTimeout': 90, 'windowWidth': 1300, 'windowHeight': 900}; + +// This function is used to read the file and return the content +const readServerLog = () => { + var data = null; + + if (fs.existsSync(serverLogFile)) { + data = fs.readFileSync(serverLogFile, 'utf8'); + } else { + var errMsg = 'Unable to read file ' + serverLogFile + ' not found.'; + console.warn(errMsg); + return errMsg; + } + + return data; +}; + +// This function is used to write the data into the log file +const writeServerLog = (data) => { + data = data + '\n'; + if (fs.existsSync(serverLogFile)) { + fs.writeFileSync(serverLogFile, data, {flag: 'a+'}); + } else { + fs.writeFileSync(serverLogFile, data, {flag: 'w'}); + } +}; + +// This function is used to remove the log file +const removeLogFile = () => { + if (fs.existsSync(serverLogFile)) { + fs.rmSync(serverLogFile); + } +}; + +// This function used to set the object of pgAdmin server process. +const setProcessObject = (processObject) => { + pgadminServerProcess = processObject; +}; + +// This function used to set the object of pgAdmin window. +const setPgAdminWindowObject = (windowObject) => { + pgAdminWindowObject = windowObject; +}; + +// This function is used to get the server log file. +const getServerLogFile = () => { + return serverLogFile; +}; + +// This function is used to get the runtime config file. +const getRunTimeConfigFile = () => { + return configFileName; +}; + +// This function is used to kill the server process, remove the log files +// and quit the application. +const cleanupAndQuitApp = () => { + // Remove the server log file on exit + removeLogFile(); + + // Killing pgAdmin4 server process if application quits + if (pgadminServerProcess != null) { + try { + process.kill(pgadminServerProcess.pid); + } + catch (e) { + console.warn('Failed to kill server process.'); + } + } + + if (pgAdminWindowObject != null) { + // Close the window. + pgAdminWindowObject.close(true); + + // Remove all the cookies. + pgAdminWindowObject.cookies.getAll({}, function(cookies) { + try { + cookies.forEach(function(cookie) { + pgAdminWindowObject.cookies.remove({url: 'http://' + cookie.domain, name: cookie.name}); + }); + } catch (error) { + console.warn('Failed to remove cookies.'); + } finally { + pgAdminWindowObject = null; + // Quit Application + nw.App.quit(); + } + }); + } else { + // Quit Application + nw.App.quit(); + } +}; + +var ConfigureStore = { + fileName: configFileName, + jsonData: {}, + + init: function() { + if (!this.readConfig()){ + this.jsonData = DEFAULT_CONFIG_DATA; + this.saveConfig(); + } + }, + + // This function is used to write configuration data + saveConfig: function() { + fs.writeFileSync(this.fileName, JSON.stringify(this.jsonData, null, 4), {flag: 'w'}); + }, + + // This function is used to read the configuration data + readConfig: function() { + if (fs.existsSync(this.fileName)) { + try { + this.jsonData = JSON.parse(fs.readFileSync(this.fileName)); + } catch (error) { + /* If the file is not present or invalid JSON data in file */ + this.jsonData = {}; + } + } else { + var errMsg = 'Unable to read file ' + this.fileName + ' not found.'; + console.warn(errMsg); + return false; + } + + return true; + }, + + getConfigData: function() { + return this.jsonData; + }, + + get: function(key, if_not_value) { + if(this.jsonData[key] != undefined) { + return this.jsonData[key]; + } else { + return if_not_value; + } + }, + + set: function(key, value) { + if(typeof key === 'object'){ + this.jsonData = { + ...this.jsonData, + ...key, + }; + } else { + if(value === '' || value == null || typeof(value) == 'undefined') { + if(this.jsonData[key] != undefined) { + delete this.jsonData[key]; + } + } else { + this.jsonData[key] = value; + } + } + }, +}; + + +module.exports = { + readServerLog: readServerLog, + writeServerLog: writeServerLog, + getAvailablePort: getAvailablePort, + getPythonPath: getPythonPath, + setProcessObject: setProcessObject, + cleanupAndQuitApp: cleanupAndQuitApp, + getServerLogFile: getServerLogFile, + getRunTimeConfigFile: getRunTimeConfigFile, + setPgAdminWindowObject: setPgAdminWindowObject, + ConfigureStore: ConfigureStore, +}; diff --git a/runtime/src/js/pgadmin.js b/runtime/src/js/pgadmin.js new file mode 100644 index 000000000..80c80533f --- /dev/null +++ b/runtime/src/js/pgadmin.js @@ -0,0 +1,300 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2021, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const misc = require('../js/misc.js'); +const spawn = require('child_process').spawn; + +var pgadminServerProcess = null; +var startPageUrl = null; +var serverCheckUrl = null; + +var serverPort = 5050; + +// Paths to the rest of the app +var pythonPath = misc.getPythonPath(); +var pgadminFile = '../web/pgAdmin4.py'; +var configFile = '../web/config.py'; + +// Override the paths above, if a developer needs to +if (fs.existsSync('dev_config.json')) { + try { + var dev_config = JSON.parse(fs.readFileSync('dev_config.json')); + pythonPath = dev_config['pythonPath']; + pgadminFile = dev_config['pgadminFile']; + } catch (error) { + // Meh. + } +} + +// This function is used to create UUID +function createUUID() { + var dt = new Date().getTime(); + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = (dt + Math.random()*16)%16 | 0; + dt = Math.floor(dt/16); + return (c=='x' ? r :(r&0x3|0x8)).toString(16); + }); + + return uuid; +} + +// This functions is used to start the pgAdmin4 server by spawning a +// separate process. +function startDesktopMode() { + // Return if pgadmin server process is already spawned + // Added check for debugging purpose. + if (pgadminServerProcess != null) + return; + + var UUID = createUUID(); + // Set the environment variable so that pgAdmn 4 server + // start listening on that port. + process.env.PGADMIN_INT_PORT = serverPort; + process.env.PGADMIN_INT_KEY = UUID; + process.env.PGADMIN_SERVER_MODE = 'OFF'; + + // Start Page URL + startPageUrl = 'http://127.0.0.1:' + serverPort + '/?key=' + UUID; + serverCheckUrl = 'http://127.0.0.1:' + serverPort + '/misc/ping?key=' + UUID; + + document.getElementById('loader-text-status').innerHTML = 'Starting pgAdmin 4...'; + + // Write Python Path, pgAdmin file path and command in log file. + var command = path.resolve(pythonPath) + ' ' + path.resolve(pgadminFile); + misc.writeServerLog('Python Path: "' + path.resolve(pythonPath) + '"'); + misc.writeServerLog('Runtime Config File: "' + path.resolve(misc.getRunTimeConfigFile()) + '"'); + misc.writeServerLog('pgAdmin Config File: "' + path.resolve(configFile) + '"'); + misc.writeServerLog('Webapp Path: "' + path.resolve(pgadminFile) + '"'); + misc.writeServerLog('pgAdmin Command: "' + command + '"'); + + // Spawn the process to start pgAdmin4 server. + pgadminServerProcess = spawn(pythonPath, [pgadminFile]); + pgadminServerProcess.on('error', function(err) { + // Log the error into the log file if process failed to launch + misc.writeServerLog('Failed to lauch pgAdmin4 with below error:'); + misc.writeServerLog(err); + }); + + pgadminServerProcess.stdout.setEncoding('utf8'); + pgadminServerProcess.stdout.on('data', (chunk) => { + misc.writeServerLog(chunk); + }); + + pgadminServerProcess.stderr.setEncoding('utf8'); + pgadminServerProcess.stderr.on('data', (chunk) => { + if (chunk.indexOf('Runtime Open Configuration') > -1) { + // Create and launch new window and open pgAdmin url + nw.Window.open('src/html/configure.html', { + 'frame': true, + 'width': 600, + 'height': 420, + 'position': 'center', + 'resizable': false, + 'focus': true, + 'show': true, + }); + } else if (chunk.indexOf('Runtime Open View Log') > -1) { + // Create and launch new window and open pgAdmin url + nw.Window.open('src/html/view_log.html', { + 'frame': true, + 'width': 790, + 'height': 425, + 'position': 'center', + 'resizable': false, + 'focus': true, + 'show': true, + }); + } else { + misc.writeServerLog(chunk); + } + }); + + // This function is used to ping the pgAdmin4 server whether it + // it is started or not. + function pingServer() { + return axios.get(serverCheckUrl); + } + + var connectionTimeout = misc.ConfigureStore.get('connectionTimeout', 90) * 1000; + var currentTime = (new Date).getTime(); + var endTime = currentTime + connectionTimeout; + var midTime1 = currentTime + (connectionTimeout/2); + var midTime2 = currentTime + (connectionTimeout*2/3); + var pingInProgress = false; + + // ping pgAdmin server every 1 second. + var intervalID = setInterval(function() { + // If ping request is already send and response is not + // received no need to send another request. + if (pingInProgress) + return; + + pingServer().then(() => { + pingInProgress = false; + document.getElementById('loader-text-status').innerHTML = 'pgAdmin 4 started'; + // Set the pgAdmin process object to misc + misc.setProcessObject(pgadminServerProcess); + + clearInterval(intervalID); + launchPgAdminWindow(); + }).catch(() => { + pingInProgress = false; + var curTime = (new Date).getTime(); + // if the connection timeout has lapsed then throw an error + // and stop pinging the server. + if (curTime >= endTime) { + clearInterval(intervalID); + splashWindow.hide(); + + nw.Window.open('src/html/server_error.html', { + 'frame': true, + 'width': 790, + 'height': 430, + 'position': 'center', + 'resizable': false, + 'focus': true, + 'show': true, + }); + } + + if (curTime > midTime1) { + if(curTime < midTime2) { + document.getElementById('loader-text-status').innerHTML = 'Taking longer than usual...'; + } else { + document.getElementById('loader-text-status').innerHTML = 'Almost there...'; + } + } else { + document.getElementById('loader-text-status').innerHTML = 'Waiting for pgAdmin 4 to start...'; + } + }); + + pingInProgress = true; + }, 1000); +} + +// This function is used to hide the splash screen and create/launch +// new window to render pgAdmin4 page. +function launchPgAdminWindow() { + // Create and launch new window and open pgAdmin url + misc.writeServerLog('Application Server URL: ' + startPageUrl); + var winWidth = misc.ConfigureStore.get('windowWidth', 1300); + var winHeight = misc.ConfigureStore.get('windowHeight', 900); + + nw.Window.open(startPageUrl, { + 'icon': '../../assets/pgAdmin4.png', + 'frame': true, + 'width': winWidth, + 'height': winHeight, + 'position': 'center', + 'resizable': true, + 'min_width': 400, + 'min_height': 200, + 'focus': true, + 'show': false, + }, (pgadminWindow)=> { + // Set pgAdmin4 Windows Object + misc.setPgAdminWindowObject(pgadminWindow); + + pgadminWindow.on('close', function() { + misc.cleanupAndQuitApp(); + }); + + // set up handler for new-win-policy event. + // Set the width and height for the new window. + pgadminWindow.on('new-win-policy', function(frame, url, policy) { + policy.setNewWindowManifest({ + 'icon': '../../assets/pgAdmin4.png', + 'frame': true, + 'width': winWidth, + 'height': winHeight, + 'position': 'center', + }); + }); + + pgadminWindow.on('loaded', function() { + // Hide the splash screen + splashWindow.hide(); + + /* Make the new window opener to null as it is + * nothing but a splash screen. We will have to make it null, + * so that open in new browser tab will work. + */ + pgadminWindow.window.opener = null; + + // Show new window + pgadminWindow.show(); + pgadminWindow.focus(); + }); + + pgadminWindow.on('resize', function(width, height) { + // Set the width and height for the new window on resize. + pgadminWindow.on('new-win-policy', function(frame, url, policy) { + policy.setNewWindowManifest({ + 'icon': '../../assets/pgAdmin4.png', + 'frame': true, + 'width': width, + 'height': height, + 'position': 'center', + }); + }); + + misc.ConfigureStore.set('windowWidth', width); + misc.ConfigureStore.set('windowHeight', height); + misc.ConfigureStore.saveConfig(); + }); + }); +} + +// Get the gui object of NW.js +var gui = require('nw.gui'); +var splashWindow = gui.Window.get(); + +// Always clear the cache before starting the application. +nw.App.clearCache(); + +// Create Mac Builtin Menu +if (platform() == 'darwin') { + var macMenu = new gui.Menu({type: 'menubar'}); + macMenu.createMacBuiltin('pgAdmin 4'); + gui.Window.get().menu = macMenu; +} + +splashWindow.on('loaded', function() { + // Initialize the ConfigureStore + misc.ConfigureStore.init(); + + var fixedPortCheck = misc.ConfigureStore.get('fixedPort', false); + if (fixedPortCheck) { + serverPort = misc.ConfigureStore.get('portNo'); + //Start the pgAdmin in Desktop mode. + startDesktopMode(); + } else { + // get the available TCP port by sending port no to 0. + misc.getAvailablePort(0) + .then((pythonApplicationPort) => { + serverPort = pythonApplicationPort; + //Start the pgAdmin in Desktop mode. + startDesktopMode(); + }) + .catch((errCode) => { + if (fixedPortCheck && errCode == 'EADDRINUSE') { + alert('The specified fixed port is already in use. Please provide any other valid port.'); + } else { + alert(errCode); + } + }); + } +}); + +splashWindow.on('close', function() { + misc.cleanupAndQuitApp(); +}); diff --git a/runtime/src/js/server_error.js b/runtime/src/js/server_error.js new file mode 100644 index 000000000..23db962c5 --- /dev/null +++ b/runtime/src/js/server_error.js @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2021, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +const misc = require('../js/misc.js'); + +// Get the window object of server error window +var gui = require('nw.gui'); +var errorWindow = gui.Window.get(); + +errorWindow.on('loaded', function() { + document.getElementById('server_error_label').innerHTML = 'The pgAdmin 4 server could not be contacted:'; + document.getElementById('server_error_log').innerHTML = misc.readServerLog(); + document.getElementById('btnConfigure').addEventListener('click', function() { + nw.Window.open('src/html/configure.html', { + 'frame': true, + 'width': 600, + 'height': 420, + 'position': 'center', + 'resizable': false, + 'focus': true, + 'show': true, + }); + }); +}); + +errorWindow.on('close', function() { + misc.cleanupAndQuitApp(); +}); diff --git a/runtime/src/js/view_log.js b/runtime/src/js/view_log.js new file mode 100644 index 000000000..bc89b6810 --- /dev/null +++ b/runtime/src/js/view_log.js @@ -0,0 +1,27 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2021, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +const misc = require('../js/misc.js'); + +// Get the window object of view log window +var gui = require('nw.gui'); +var logWindow = gui.Window.get(); + +logWindow.on('loaded', function() { + document.getElementById('status-text').innerHTML = ''; + document.getElementById('server_log_label').innerHTML = 'Server Log: ' + '(' + misc.getServerLogFile() + ')'; + document.getElementById('server_log').innerHTML = misc.readServerLog(); + document.getElementById('btnReload').addEventListener('click', function() { + document.getElementById('server_log').innerHTML = 'Loading logs...'; + setTimeout(function() { + document.getElementById('server_log').innerHTML = misc.readServerLog(); + }, 500); + document.getElementById('status-text').innerHTML = 'Logs reloaded successfully'; + }); +}); diff --git a/runtime/yarn.lock b/runtime/yarn.lock new file mode 100644 index 000000000..9d48cf43b --- /dev/null +++ b/runtime/yarn.lock @@ -0,0 +1,1550 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +acorn-jsx@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ajv@^6.10.0, ajv@^6.10.2: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +axios@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.0.tgz#26df088803a2350dff2c27f96fef99fe49442aca" + integrity sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw== + dependencies: + follow-redirects "^1.10.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bl@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" + integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bootstrap@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.3.tgz#c6a72b355aaf323920be800246a6e4ef30997fe6" + integrity sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer@^5.2.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caw@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" + integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== + dependencies: + get-proxy "^2.0.0" + isurl "^1.0.0-alpha5" + tunnel-agent "^0.6.0" + url-to-options "^1.0.1" + +chalk@^2.0.0, chalk@^2.1.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@~1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.8.1: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +config-chain@^1.1.11: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +debug@^4.0.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" + integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== + dependencies: + file-type "^5.2.0" + is-stream "^1.1.0" + tar-stream "^1.5.2" + +decompress-tarbz2@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" + integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== + dependencies: + decompress-tar "^4.1.0" + file-type "^6.1.0" + is-stream "^1.1.0" + seek-bzip "^1.0.5" + unbzip2-stream "^1.0.9" + +decompress-targz@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" + integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== + dependencies: + decompress-tar "^4.1.1" + file-type "^5.2.0" + is-stream "^1.1.0" + +decompress-unzip@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" + integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= + dependencies: + file-type "^3.8.0" + get-stream "^2.2.0" + pify "^2.3.0" + yauzl "^2.4.2" + +decompress@^4.0.0, decompress@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" + integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== + dependencies: + decompress-tar "^4.0.0" + decompress-tarbz2 "^4.0.0" + decompress-targz "^4.0.0" + decompress-unzip "^4.0.1" + graceful-fs "^4.1.10" + make-dir "^1.0.0" + pify "^2.3.0" + strip-dirs "^2.0.0" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +download@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/download/-/download-5.0.3.tgz#63537f977f99266a30eb8a2a2fbd1f20b8000f7a" + integrity sha1-Y1N/l3+ZJmow64oqL70fILgAD3o= + dependencies: + caw "^2.0.0" + decompress "^4.0.0" + filenamify "^2.0.0" + get-stream "^3.0.0" + got "^6.3.0" + mkdirp "^0.5.1" + pify "^2.3.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.0.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" + integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@^6.3.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" + integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.3" + eslint-visitor-keys "^1.1.0" + espree "^6.1.2" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^7.0.0" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.3" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" + integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== + dependencies: + acorn "^7.1.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-exists@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-exists/-/file-exists-2.0.0.tgz#a24150665150e62d55bc5449281d88d2b0810dca" + integrity sha1-okFQZlFQ5i1VvFRJKB2I0rCBDco= + +file-type@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= + +file-type@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" + integrity sha1-LdvqfHP/42No365J3DOMBYwritY= + +file-type@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" + integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= + +filenamify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" + integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +follow-redirects@^1.10.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" + integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-proxy@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" + integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== + dependencies: + npm-conf "^1.1.0" + +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +glob-parent@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +got@^6.3.0: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.10: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@^7.0.0: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-natural-number@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" + integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= + +is-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lodash@^4.17.14, lodash@^4.17.19: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +npm-conf@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nw@^0.50.2: + version "0.50.2" + resolved "https://registry.yarnpkg.com/nw/-/nw-0.50.2.tgz#9947e7aa0d8f7fa6e4bca2c262ea7605db1ab507" + integrity sha512-5Y3VDaRooA7C/aSm6Bm4lOM4cg+rceS7OTlrfiQFNiop2/b6ip7OIpRVKPmeOzQ2/M+pKJqzEZLnVdeLl/wWFg== + dependencies: + chalk "~1.1.3" + decompress "^4.2.0" + download "^5.0.3" + file-exists "^2.0.0" + merge "^1.2.0" + progress "^2.0.3" + rimraf "^2.2.8" + semver "^5.1.0" + yargs "^3.2.1" + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0, progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +readable-stream@^2.3.0, readable-stream@^2.3.5: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@^2.2.8: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +rxjs@^6.6.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +seek-bzip@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" + integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ== + dependencies: + commander "^2.8.1" + +semver@^5.1.0, semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.1.2: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-dirs@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" + integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== + dependencies: + is-natural-number "^4.0.1" + +strip-json-comments@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-outer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tar-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through@^2.3.6, through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + dependencies: + escape-string-regexp "^1.0.2" + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +unbzip2-stream@^1.0.9: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +uri-js@^4.2.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + dependencies: + punycode "^2.1.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +v8-compile-cache@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +yargs@^3.2.1: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + +yauzl@^2.4.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" diff --git a/tools/dependency_inventory.py b/tools/dependency_inventory.py index 5128148f3..7f8353992 100644 --- a/tools/dependency_inventory.py +++ b/tools/dependency_inventory.py @@ -135,13 +135,18 @@ def get_python_deps(): print_summary(count) -def get_js_deps(): +def get_js_deps(is_runtime=False, hardcoded_deps=0): # Get the path to package.json file - web_dir = os.path.realpath(os.path.dirname(os.path.abspath(__file__)) + - "/../web/") + if is_runtime: + web_dir = os.path.realpath(os.path.dirname( + os.path.abspath(__file__)) + "/../runtime/") + else: + web_dir = os.path.realpath(os.path.dirname( + os.path.abspath(__file__)) + "/../web/") # Build the Yarn command - cmd = ["yarn", "--cwd", web_dir, "licenses", "list", "--json"] + cmd = ["yarn", "--cwd", web_dir, "licenses", "list", "--json", + "--production=true"] # Run the command process = Popen(cmd, stdout=PIPE) @@ -173,28 +178,34 @@ def get_js_deps(): print_row(name, version, licence, url) - print_summary(len(modules)) + deps = len(modules) + if hardcoded_deps > 0: + deps = deps + hardcoded_deps + + print_summary(deps) def dump_header(): print_title("pgAdmin 4 Dependency Inventory") print(textwrap.fill( - "pgAdmin 4 is built on C++, Python and Javascript, and is " - "dependent on various third party libraries. These are " + "pgAdmin 4 is built on Python, Javascript and NW.js (node-webkit), " + "and is dependent on various third party libraries. These are " "automatically compiled from the system, requirements.txt " "and packages.json and listed below.", width=79) + "\n") -def dump_cplusplus(): - print_title("C++ Dependencies") +def dump_runtime(): + print_title("Runtime Dependencies") print_table_header() - print_row("QT", "5+", "LGPL v2.1/3", "https://www.qt.io/") - print_row("QDarkStyleSheet", "2.8.1", "MIT (code), CC BY 4.0 (images)", - "https://github.com/ColinDuquesnoy/QDarkStyleSheet") - print_row("Python", "3.4+", "PSF", "https://www.python.org/") - print_summary(3) + print_row("Python", "3.6+", "PSF", "https://www.python.org/") + print_row("nw", "0.50.2", "MIT", + "git://github.com/nwjs/npm-installer.git") + + # Make sure to change the count of hardcoded_deps if we will + # manually add some more dependencies in future. + get_js_deps(is_runtime=True, hardcoded_deps=2) def dump_python(): @@ -213,6 +224,6 @@ def dump_js(): # Let's do this thing! dump_header() -dump_cplusplus() +dump_runtime() dump_python() dump_js() diff --git a/web/config.py b/web/config.py index 36e04730c..8fd8b0391 100644 --- a/web/config.py +++ b/web/config.py @@ -40,13 +40,10 @@ APP_ICON = 'pg-icon' # If you change any of APP_RELEASE, APP_REVISION or APP_SUFFIX, then you # must also change APP_VERSION_INT to match. # -# Any changes made here must also be made in runtime/pgAdmin4.pro and -# runtime/Info.plist -# # Application version number components -APP_RELEASE = 4 -APP_REVISION = 30 +APP_RELEASE = 5 +APP_REVISION = 0 # Application version suffix, e.g. 'beta1', 'dev'. Usually an empty string # for GA releases. @@ -55,7 +52,7 @@ APP_SUFFIX = '' # Numeric application version for upgrade checks. Should be in the format: # [X]XYYZZ, where X is the release version, Y is the revision, with a leading # zero if needed, and Z represents the suffix, with a leading zero if needed -APP_VERSION_INT = 43000 +APP_VERSION_INT = 50000 # DO NOT CHANGE! # The application version string, constructed from the components @@ -65,7 +62,6 @@ else: APP_VERSION = '%s.%s-%s' % (APP_RELEASE, APP_REVISION, APP_SUFFIX) # Copyright string for display in the app -# Any changes made here must also be made in runtime/pgAdmin4.pro APP_COPYRIGHT = 'Copyright (C) 2013 - 2021, The pgAdmin Development Team' ########################################################################## diff --git a/web/pgAdmin4.py b/web/pgAdmin4.py index 1cbb14095..f027050f5 100644 --- a/web/pgAdmin4.py +++ b/web/pgAdmin4.py @@ -13,6 +13,7 @@ to start a web server.""" import sys +from cheroot.wsgi import Server as CherootServer if sys.version_info < (3, 4): raise RuntimeError('This application must be run under Python 3.4 ' @@ -27,8 +28,11 @@ if sys.path[0] != os.path.dirname(os.path.realpath(__file__)): sys.path.insert(0, os.path.dirname(os.path.realpath(__file__))) # Grab the SERVER_MODE if it's been set by the runtime -if 'SERVER_MODE' in globals(): - builtins.SERVER_MODE = globals()['SERVER_MODE'] +if 'PGADMIN_SERVER_MODE' in os.environ: + if os.environ['PGADMIN_SERVER_MODE'] == 'OFF': + builtins.SERVER_MODE = False + else: + builtins.SERVER_MODE = True else: builtins.SERVER_MODE = None @@ -106,18 +110,15 @@ else: # runtime if we're running in desktop mode, otherwise we'll just use the # Flask default. app.PGADMIN_RUNTIME = False +app.logger.debug( + 'Server mode: %s, config server mode: %s', + SERVER_MODE, config.SERVER_MODE +) config.EFFECTIVE_SERVER_PORT = None -if 'PGADMIN_INT_PORT' in globals(): - app.logger.debug( - 'Running under the desktop runtime, port: %s', - globals()['PGADMIN_INT_PORT'] - ) - config.EFFECTIVE_SERVER_PORT = int(globals()['PGADMIN_INT_PORT']) - app.PGADMIN_RUNTIME = True -elif 'PGADMIN_INT_PORT' in os.environ: +if 'PGADMIN_INT_PORT' in os.environ: port = os.environ['PGADMIN_INT_PORT'] app.logger.debug( - 'Not running under the desktop runtime, port: %s', + 'Running under the desktop runtime, port: %s', port ) config.EFFECTIVE_SERVER_PORT = int(port) @@ -129,9 +130,10 @@ else: config.EFFECTIVE_SERVER_PORT = config.DEFAULT_SERVER_PORT # Set the key if appropriate -if 'PGADMIN_INT_KEY' in globals(): - app.PGADMIN_INT_KEY = globals()['PGADMIN_INT_KEY'] +if 'PGADMIN_INT_KEY' in os.environ: + app.PGADMIN_INT_KEY = os.environ['PGADMIN_INT_KEY'] app.logger.debug("Desktop security key: %s" % app.PGADMIN_INT_KEY) + app.PGADMIN_RUNTIME = True else: app.PGADMIN_INT_KEY = '' @@ -172,7 +174,7 @@ def main(): ) sys.stdout.flush() else: - # For unknown reason the Qt runtime does not pass the environment + # For unknown reason the runtime does not pass the environment # variables (i.e. PYTHONHOME, and PYTHONPATH), to the Python # sub-processes, leading to failures executing background processes. # @@ -192,15 +194,30 @@ def main(): # Reference: # https://github.com/pallets/werkzeug/issues/220#issuecomment-11176538 try: - app.run( - host=config.DEFAULT_SERVER, - port=config.EFFECTIVE_SERVER_PORT, - use_reloader=( - (not app.PGADMIN_RUNTIME) and app.debug and - os.environ.get("WERKZEUG_RUN_MAIN") is not None - ), - threaded=config.THREADED_MODE - ) + if config.DEBUG: + app.run( + host=config.DEFAULT_SERVER, + port=config.EFFECTIVE_SERVER_PORT, + use_reloader=( + (not app.PGADMIN_RUNTIME) and app.debug and + os.environ.get("WERKZEUG_RUN_MAIN") is not None + ), + threaded=config.THREADED_MODE + ) + else: + # Can use cheroot instead of flask dev server when not in debug + # 10 is default thread count in CherootServer + num_threads = 10 if config.THREADED_MODE else 1 + prod_server = CherootServer( + (config.DEFAULT_SERVER, config.EFFECTIVE_SERVER_PORT), + wsgi_app=app, + numthreads=num_threads, + server_name=config.APP_NAME) + try: + print("Using production server...") + prod_server.start() + except KeyboardInterrupt: + prod_server.stop() except IOError: app.logger.error("Error starting the app server: %s", sys.exc_info()) diff --git a/web/pgadmin/browser/__init__.py b/web/pgadmin/browser/__init__.py index c7013698c..856b7a43f 100644 --- a/web/pgadmin/browser/__init__.py +++ b/web/pgadmin/browser/__init__.py @@ -236,7 +236,7 @@ class BrowserModule(PgAdminModule): return scripts def get_own_menuitems(self): - return { + menus = { 'file_items': [ MenuItem( name='mnu_locklayout', @@ -269,6 +269,32 @@ class BrowserModule(PgAdminModule): ] } + # We need 'Configure...' and 'View log...' Menu only in runtime. + if current_app.PGADMIN_RUNTIME: + menus['file_items'].append( + MenuItem( + name='mnu_runtime', + module=PGADMIN_BROWSER, + label=gettext('Runtime'), + priority=999, + menu_items=[MenuItem( + name='mnu_configure_runtime', + module=PGADMIN_BROWSER, + callback='mnu_configure_runtime', + priority=0, + label=gettext('Configure...') + ), MenuItem( + name='mnu_viewlog_runtime', + module=PGADMIN_BROWSER, + callback='mnu_viewlog_runtime', + priority=1, + label=gettext('View log...') + )] + ) + ) + + return menus + def register_preferences(self): register_browser_preferences(self) @@ -281,8 +307,8 @@ class BrowserModule(PgAdminModule): 'browser.check_master_password', 'browser.set_master_password', 'browser.reset_master_password', - 'browser.lock_layout' - ] + 'browser.lock_layout', + 'browser.signal_runtime'] blueprint = BrowserModule(MODULE_NAME, __name__) @@ -990,6 +1016,28 @@ def lock_layout(): return make_json_response() +@blueprint.route("/signal_runtime", endpoint="signal_runtime", + methods=["POST"]) +def signal_runtime(): + data = None + + if hasattr(request.data, 'decode'): + data = request.data.decode('utf-8') + + if data != '': + data = json.loads(data) + + # Add Info Handler to current app just to send signal to runtime + tmp_handler = logging.StreamHandler() + tmp_handler.setLevel(logging.INFO) + current_app.logger.addHandler(tmp_handler) + # Send signal to runtime + current_app.logger.info(data['command']) + # Remove the temporary handler + current_app.logger.removeHandler(tmp_handler) + + return make_json_response() + # Only register route if SECURITY_CHANGEABLE is set to True # We can't access app context here so cannot # use app.config['SECURITY_CHANGEABLE'] diff --git a/web/pgadmin/browser/static/js/browser.js b/web/pgadmin/browser/static/js/browser.js index a2b880991..475412bf7 100644 --- a/web/pgadmin/browser/static/js/browser.js +++ b/web/pgadmin/browser/static/js/browser.js @@ -16,7 +16,7 @@ define('pgadmin.browser', [ 'wcdocker', 'jquery.contextmenu', 'jquery.aciplugin', 'jquery.acitree', 'pgadmin.browser.preferences', 'pgadmin.browser.messages', 'pgadmin.browser.menu', 'pgadmin.browser.panel', 'pgadmin.browser.layout', - 'pgadmin.browser.error', 'pgadmin.browser.frame', + 'pgadmin.browser.runtime', 'pgadmin.browser.error', 'pgadmin.browser.frame', 'pgadmin.browser.node', 'pgadmin.browser.collection', 'pgadmin.browser.activity', 'sources/codemirror/addon/fold/pgadmin-sqlfoldcode', 'pgadmin.browser.keyboard', 'sources/tree/pgadmin_tree_save_state','jquery.acisortable', 'jquery.acifragment', diff --git a/web/pgadmin/browser/static/js/runtime.js b/web/pgadmin/browser/static/js/runtime.js new file mode 100644 index 000000000..4acc4005c --- /dev/null +++ b/web/pgadmin/browser/static/js/runtime.js @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import pgAdmin from 'sources/pgadmin'; +import url_for from 'sources/url_for'; +import $ from 'jquery'; +import * as Alertify from 'pgadmin.alertifyjs'; +import gettext from 'sources/gettext'; + +const pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {}; + +_.extend(pgBrowser, { + // This function is used to send signal to runtime. + send_signal_to_runtime: function(cmd_string) { + $.ajax({ + url: url_for('browser.signal_runtime'), + method: 'POST', + contentType: 'application/json', + data: JSON.stringify({ + 'command': cmd_string, + }), + }).fail(function(xhr, error) { + Alertify.pgNotifier(error, xhr, gettext('Failed to send signal to runtime.')); + }); + }, + + // This function is callback function when 'Configure...' menu is clicked. + mnu_configure_runtime: function() { + this.send_signal_to_runtime('Runtime Open Configuration'); + }, + + // This function is callback function when 'View log...' menu is clicked. + mnu_viewlog_runtime: function() { + this.send_signal_to_runtime('Runtime Open View Log'); + }, +}); + +export {pgBrowser}; diff --git a/web/webpack.shim.js b/web/webpack.shim.js index 7d25a2d56..cc3b76a92 100644 --- a/web/webpack.shim.js +++ b/web/webpack.shim.js @@ -182,6 +182,7 @@ var webpackShimConfig = { 'pgadmin.browser.frame': path.join(__dirname, './pgadmin/browser/static/js/frame'), 'pgadmin.browser.keyboard': path.join(__dirname, './pgadmin/browser/static/js/keyboard'), 'pgadmin.browser.layout': path.join(__dirname, './pgadmin/browser/static/js/layout'), + 'pgadmin.browser.runtime': path.join(__dirname, './pgadmin/browser/static/js/runtime'), 'pgadmin.browser.preferences': path.join(__dirname, './pgadmin/browser/static/js/preferences'), 'pgadmin.browser.menu': path.join(__dirname, './pgadmin/browser/static/js/menu'), 'pgadmin.browser.activity': path.join(__dirname, './pgadmin/browser/static/js/activity'),