diff --git a/.eslintrc.js b/.eslintrc.js index 96d1e063..8162d791 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,6 +4,7 @@ module.exports = { browser: true, jquery: true, mocha: true, + jasmine: true, }, globals: { // defined in server.js @@ -23,6 +24,9 @@ module.exports = { angular: false, noty: false, layerUtils: false, + + // Angular mocks + inject: false, }, rules: { 'no-console': 'off', diff --git a/.mocharc.js b/.mocharc.js new file mode 100644 index 00000000..1e460fd0 --- /dev/null +++ b/.mocharc.js @@ -0,0 +1,5 @@ +module.exports = { + "no-colors": true, + "spec": 'test/server/**/*.js', + "timeout": 10000, +}; diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 00000000..7b2fd6c3 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,88 @@ +module.exports = function (config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'], + + // list of files / patterns to load in the browser + files: [ + 'node_modules/jquery/dist/jquery.min.js', + 'node_modules/jquery-validation/dist/jquery.validate.min.js', + 'node_modules/components-jqueryui/jquery-ui.min.js', + 'node_modules/bootstrap/dist/js/bootstrap.min.js', + 'node_modules/angular/angular.min.js', + 'node_modules/angular-sanitize/angular-sanitize.min.js', + 'node_modules/angular-draganddrop/angular-draganddrop.min.js', + 'node_modules/angular-route/angular-route.min.js', + 'node_modules/noty/js/noty/packaged/jquery.noty.packaged.min.js', + 'node_modules/angular-uuid2/dist/angular-uuid2.min.js', + 'node_modules/angular-vs-repeat/src/angular-vs-repeat.min.js', + 'node_modules/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js', + 'node_modules/moment/min/moment.min.js', + 'node_modules/angular-bootstrap-datetimepicker/src/js/datetimepicker.js', + 'node_modules/numeral/min/numeral.min.js', + 'node_modules/angular-ui-tree/dist/angular-ui-tree.min.js', + 'node_modules/angular-file-saver/dist/angular-file-saver.bundle.min.js', + 'node_modules/angular-ui-bootstrap/ui-bootstrap-tpls.min.js', + 'node_modules/angular-ui-sortable/dist/sortable.min.js', + 'node_modules/ui-select/dist/select.min.js', + 'node_modules/angular-loading-overlay/dist/angular-loading-overlay.js', + 'node_modules/angular-xeditable/dist/js/xeditable.min.js', + 'node_modules/ng-file-upload/dist/ng-file-upload-shim.min.js', + 'node_modules/ng-file-upload/dist/ng-file-upload.min.js', + 'node_modules/angular-bootstrap-colorpicker/js/bootstrap-colorpicker-module.min.js', + 'node_modules/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js', + 'node_modules/angular-gettext/dist/angular-gettext.min.js', + 'node_modules/cynteka-pivot-table-jquery/dist/jquery.cy-pivot.min.js', + 'public/js/webapp.js', + 'public/js/core/core.module.js', + 'public/js/data-sources/data-sources.module.js', + 'public/js/**/*.js', + 'node_modules/angular-mocks/angular-mocks.js', + 'test/client/**/*.js', + ], + + // list of files / patterns to exclude + exclude: [ + ], + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + // web server port + port: 9876, + + // enable / disable colors in the output (reporters and logs) + colors: true, + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: false, + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['jsdom'], + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: true, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity + }); +}; diff --git a/package-lock.json b/package-lock.json index e87748b8..4d2a674b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -334,6 +334,12 @@ "@types/unist": "*" } }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -385,6 +391,12 @@ } } }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, "addressparser": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz", @@ -399,6 +411,12 @@ "printj": "~1.1.0" } }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -529,6 +547,12 @@ "resolved": "https://registry.npmjs.org/angular-loading-overlay/-/angular-loading-overlay-0.3.1.tgz", "integrity": "sha1-be79ECyXc8T7uBfwLdBIFQ4yClE=" }, + "angular-mocks": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.5.11.tgz", + "integrity": "sha1-oOHdDqVf137np1fXVTbF6WTIb4E=", + "dev": true + }, "angular-route": { "version": "1.5.11", "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.5.11.tgz", @@ -571,6 +595,12 @@ "angular": "~1.x" } }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", @@ -605,6 +635,27 @@ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "append-field": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", @@ -651,6 +702,12 @@ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, "array-filter": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", @@ -705,6 +762,12 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -748,6 +811,18 @@ "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz", "integrity": "sha1-bJ7csRztTw3S8tQNsNSaEJwIiqs=" }, + "async-each": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.2.tgz", + "integrity": "sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg==", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -876,6 +951,12 @@ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, "bail": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", @@ -942,6 +1023,18 @@ } } }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, "base64url": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/base64url/-/base64url-1.0.6.tgz", @@ -966,6 +1059,15 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, "big-number": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/big-number/-/big-number-0.3.1.tgz", @@ -986,6 +1088,12 @@ "underscore": "~1.6.0" } }, + "binary-extensions": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", + "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", + "dev": true + }, "binary-search": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.4.tgz", @@ -1035,6 +1143,12 @@ } } }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, "blob-tmp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/blob-tmp/-/blob-tmp-1.0.0.tgz", @@ -1139,6 +1253,12 @@ } } }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -1161,11 +1281,33 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-0.4.23.tgz", "integrity": "sha1-5louPHUH/63kEJvHV1p25Q+NqRU=" }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, "buffer-from": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", @@ -1277,6 +1419,12 @@ "callsites": "^0.2.0" } }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, "callsites": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", @@ -1437,6 +1585,37 @@ "lodash": "^3.2.0" } }, + "chokidar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", + "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.0" + }, + "dependencies": { + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", @@ -1621,6 +1800,12 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, "codepage": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.3.8.tgz", @@ -1733,11 +1918,23 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==" }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, "components-jqueryui": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/components-jqueryui/-/components-jqueryui-1.12.1.tgz", @@ -1784,6 +1981,56 @@ "os-homedir": "1.0.2" } }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + } + } + }, "connect-mongo": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-2.0.1.tgz", @@ -2029,6 +2276,21 @@ } } }, + "cssom": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "dev": true + }, + "cssstyle": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", + "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, "ctype": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", @@ -2043,6 +2305,12 @@ "array-find-index": "^1.0.1" } }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", @@ -2069,6 +2337,17 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, "datauri": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/datauri/-/datauri-1.1.0.tgz", @@ -2091,6 +2370,12 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" }, + "date-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz", + "integrity": "sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==", + "dev": true + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2277,6 +2562,12 @@ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, "dicer": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", @@ -2332,6 +2623,18 @@ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", @@ -2353,6 +2656,15 @@ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, "domhandler": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", @@ -2496,6 +2808,84 @@ } } }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", @@ -2558,6 +2948,34 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, "eslint": { "version": "4.19.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", @@ -2909,6 +3327,48 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, "execall": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", @@ -3481,6 +3941,23 @@ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=" }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } + } + }, "flat-cache": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", @@ -3555,10 +4032,36 @@ "resolved": "https://registry.npmjs.org/fn-args/-/fn-args-3.0.0.tgz", "integrity": "sha1-31w4Be1B7Ds4pyqr45DPlJPsCEw=" }, - "font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "dev": true, + "requires": { + "debug": "^3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" }, "for-in": { "version": "1.0.2", @@ -3627,11 +4130,559 @@ "universalify": "^0.1.0" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3666,6 +4717,12 @@ "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.4.2.tgz", "integrity": "sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==" }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -3686,6 +4743,15 @@ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -4383,6 +5449,29 @@ "ansi-regex": "^2.0.0" } }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -4472,6 +5561,15 @@ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", "dev": true }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, "html-tags": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", @@ -4765,6 +5863,17 @@ "statuses": ">= 1.4.0 < 2" } }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -4881,6 +5990,12 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4966,6 +6081,12 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -5022,6 +6143,15 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -5244,6 +6374,12 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, "is-supported-regexp-flag": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", @@ -5305,6 +6441,15 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5320,6 +6465,12 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "jasmine-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.3.0.tgz", + "integrity": "sha512-3/xSmG/d35hf80BEN66Y6g9Ca5l/Isdeg/j6zvbTYlTzeKinzmaTM4p9am5kYqOmE05D7s1t8FGjzdSnbUbceA==", + "dev": true + }, "java": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/java/-/java-0.9.1.tgz", @@ -5447,26 +6598,203 @@ } } }, - "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsPlumb": { - "version": "github:jsplumb/jsplumb#6b949c96311280cc74820e4e2cb3dbc780b91853", - "from": "github:jsplumb/jsplumb#1.7.6" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsPlumb": { + "version": "github:jsplumb/jsplumb#6b949c96311280cc74820e4e2cb3dbc780b91853", + "from": "github:jsplumb/jsplumb#1.7.6" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsdom": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.0.0.tgz", + "integrity": "sha512-/VkyPmdtbwqpJSkwDx3YyJ3U1oawYNB/h5z8vTUZGAzjtu2OHTeFRfnJqyMHsJ5Cyes23trOmvUpM1GfHH1leA==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^6.0.4", + "acorn-globals": "^4.3.0", + "array-equal": "^1.0.0", + "cssom": "^0.3.4", + "cssstyle": "^1.1.1", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.0", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.0.9", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "saxes": "^3.1.5", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.5.0", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^6.1.2", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", + "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true + }, + "mime-types": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "dev": true, + "requires": { + "mime-db": "~1.38.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -5725,6 +7053,109 @@ "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" }, + "karma": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.0.1.tgz", + "integrity": "sha512-ind+4s03BqIXas7ZmraV3/kc5+mnqwCd+VDX1FndS6jxbt03kQKX2vXrWxNLuCjVYmhMwOZosAEKMM0a2q7w7A==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^2.3.2", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.11", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + }, + "dependencies": { + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "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" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "log4js": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.0.2.tgz", + "integrity": "sha512-KE7HjiieVDPPdveA3bJZSuu0n8chMkFl8mIoisBFxwEJ9FmXe4YzNuiqSwYUiR1K8q8/5/8Yd6AClENY1RA9ww==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^3.1.0", + "flatted": "^2.0.0", + "rfdc": "^1.1.2", + "streamroller": "^1.0.1" + } + }, + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jsdom-launcher": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/karma-jsdom-launcher/-/karma-jsdom-launcher-7.1.0.tgz", + "integrity": "sha512-/t7rRaBB5adGJqk8/s2uuVBpHfO6obGY9gvNtY8yFWEhH7VLX+TC1Q+ADqxNuiyOV6bKObMMYkogbA/xIbbURw==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -5813,6 +7244,15 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -6063,6 +7503,12 @@ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, "lodash.template": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", @@ -6196,6 +7642,15 @@ "jquery-mousewheel": ">=3.0.6" } }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -6254,6 +7709,25 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "mem": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz", + "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz", + "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==", + "dev": true + } + } + }, "memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", @@ -6520,72 +7994,239 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mocha": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.0.2.tgz", + "integrity": "sha512-RtTJsmmToGyeTznSOMoM6TPEk1A84FQaHIciKrRqARZx+B5ccJ5tXlmJzEKGBxZdqk9UjpRsesZTUkZmR5YnuQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "findup-sync": "2.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.12.0", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.4", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "12.0.5", + "yargs-parser": "11.1.1", + "yargs-unparser": "1.5.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", + "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "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" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ms": "2.0.0" + "ansi-regex": "^3.0.0" } }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { - "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" + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -7000,6 +8641,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-environment-flags": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.4.tgz", + "integrity": "sha512-M9rwCnWVLW7PX+NUWe3ejEdiLYinRpsEre9hMkU/6NS4h+EEulYaDH1gCEZ2gyXsmw+RXYDaV2JkkTNcsPDJ0Q==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, "node-releases": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.8.tgz", @@ -7225,6 +8875,12 @@ "validate-npm-package-license": "^3.0.1" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -7328,6 +8984,15 @@ } } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", @@ -7352,6 +9017,12 @@ "resolved": "http://registry.npmjs.org/numeral/-/numeral-1.5.6.tgz", "integrity": "sha1-ODHbloRRuc9q/5v5WSXx7443sz8=" }, + "nwsapi": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.1.tgz", + "integrity": "sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg==", + "dev": true + }, "oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -7367,6 +9038,12 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-1.0.0.tgz", "integrity": "sha1-5l3Idm07R7S4MHRlyDEdoDCwcKY=" }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -7401,6 +9078,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -7412,6 +9101,16 @@ "isobject": "^3.0.0" } }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", @@ -7527,12 +9226,29 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -7541,6 +9257,18 @@ "p-reduce": "^1.0.0" } }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", + "dev": true + }, "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", @@ -7653,6 +9381,21 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, "parserlib": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-1.1.1.tgz", @@ -7660,6 +9403,15 @@ "dev": true, "optional": true }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -7934,6 +9686,12 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, "pofile": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.0.11.tgz", @@ -8392,11 +10150,38 @@ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.7.tgz", "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM=" }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + } + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -8472,6 +10257,55 @@ "string_decoder": "~0.10.x" } }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -8644,6 +10478,46 @@ } } }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -8678,6 +10552,12 @@ } } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "resolve": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", @@ -8720,6 +10600,12 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "rfdc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", + "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -8825,6 +10711,15 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.3.tgz", "integrity": "sha1-N3NxSg2RV8qqcwKXHvpcbc2lUtY=" }, + "saxes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", + "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", + "dev": true, + "requires": { + "xmlchars": "^1.3.1" + } + }, "scandirectory": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/scandirectory/-/scandirectory-2.5.0.tgz", @@ -8897,6 +10792,12 @@ "send": "0.16.2" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -9113,6 +11014,67 @@ "hoek": "4.x.x" } }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -9281,12 +11243,59 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, "stream-consume": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", "dev": true }, + "streamroller": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.3.tgz", + "integrity": "sha512-P7z9NwP51EltdZ81otaGAN3ob+/F88USJE546joNq7bqRNTe6jc74fTBDyynxP4qpIfKlt/CesEYicuMzI0yJg==", + "dev": true, + "requires": { + "async": "^2.6.1", + "date-format": "^2.0.0", + "debug": "^3.1.0", + "fs-extra": "^7.0.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, "streamsearch": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", @@ -9362,6 +11371,12 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -9865,6 +11880,12 @@ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", "dev": true }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", @@ -10074,6 +12095,12 @@ "os-tmpdir": "~1.0.2" } }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -10120,6 +12147,23 @@ "punycode": "^1.4.1" } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -10256,6 +12300,12 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -10449,6 +12499,12 @@ } } }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -10482,6 +12538,16 @@ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10677,6 +12743,26 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "w3c-xmlserializer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.0.1.tgz", + "integrity": "sha512-XZGI1OH/OLQr/NaJhhPmzhngwcAnZDLytsvXnRmlYeRkmbb0I7sqFFA22erq4WQR0sUu17ZSQOAV9mFwCqKRNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, "watchr": { "version": "2.4.13", "resolved": "https://registry.npmjs.org/watchr/-/watchr-2.4.13.tgz", @@ -10798,6 +12884,49 @@ } } }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", @@ -10806,6 +12935,48 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", @@ -10850,6 +13021,38 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -10864,6 +13067,15 @@ "mkdirp": "^0.5.1" } }, + "ws": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.0.tgz", + "integrity": "sha512-deZYUNlt2O4buFCa3t5bKLf8A7FPP/TVjwOeVNpw818Ma5nk4MLXls2eoEGS39o8119QIYxTrTDoPQ5B/gTD6w==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, "x-is-string": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", @@ -10876,6 +13088,12 @@ "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "xml2js": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", @@ -10884,6 +13102,18 @@ "sax": "0.5.x" } }, + "xmlchars": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", + "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", @@ -10894,6 +13124,12 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", @@ -10926,6 +13162,152 @@ "dev": true } } + }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", + "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true } } } diff --git a/package.json b/package.json index bd7ffdf8..65e4b270 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "ui-select": "^0.19.8" }, "devDependencies": { + "angular-mocks": "^1.5.11", "chai": "^4.1.2", "chai-http": "^4.0.0", "del": "^3.0.0", @@ -80,16 +81,23 @@ "gulp-concat": "^2.6.1", "gulp-decomment": "^0.2.0", "htmlhint": "^0.11.0", + "jasmine-core": "^3.3.0", + "jsdom": "^14.0.0", + "karma": "^4.0.1", + "karma-jasmine": "^2.0.1", + "karma-jsdom-launcher": "^7.1.0", "merge-stream": "^1.0.1", - "mocha": "^5.1.1", + "mocha": "^6.0.2", "npm-run-all": "^4.1.5", "stylelint": "^9.10.1", "stylelint-config-standard": "^18.2.0" }, "scripts": { "start": "node server.js", - "test": "mocha", + "test": "run-s -s -c test:*", "posttest": "run-s -s -c lint:*", + "test:server": "mocha", + "test:client": "karma start", "lint:js": "eslint .", "lint:css": "stylelint public/css", "lint:html": "htmlhint" diff --git a/public/js/core/api.js b/public/js/core/api.js new file mode 100644 index 00000000..c1c86592 --- /dev/null +++ b/public/js/core/api.js @@ -0,0 +1,39 @@ +(function () { + 'use strict'; + + angular.module('app.core').factory('api', api); + + api.$inject = ['connection']; + + function api (connection) { + const service = { + getDataSources: getDataSources, + getEntitiesSchema: getEntitiesSchema, + getSqlQuerySchema: getSqlQuerySchema, + }; + + return service; + + function getDataSources (params) { + return connection.get('/api/data-sources/find-all', params); + } + + function getEntitiesSchema (dataSourceID, entity) { + var params = { + datasourceID: dataSourceID, + entity: entity, + }; + + return connection.get('/api/data-sources/getEntitySchema', params); + } + + function getSqlQuerySchema (dataSourceID, collection) { + var params = { + datasourceID: dataSourceID, + collection: collection, + }; + + return connection.get('/api/data-sources/getsqlQuerySchema', params); + } + } +})(); diff --git a/public/js/services.js b/public/js/core/connection.js similarity index 55% rename from public/js/services.js rename to public/js/core/connection.js index 12f48544..edd82b0b 100644 --- a/public/js/services.js +++ b/public/js/core/connection.js @@ -1,23 +1,24 @@ -angular.module('myApp.services', []) - .value('version', '0.1'); - -angular.module('app').service('Constants', function () { - var constants = { - DEBUGMODE: false, - }; - - return constants; -}) - .service('connection', function ($http, Constants) { - this.get = function (url, params, done, options) { +(function () { + 'use strict'; + + angular.module('app.core').factory('connection', connection); + + connection.$inject = ['$http']; + + function connection ($http) { + const service = { + get: get, + post: post, + }; + + return service; + + function get (url, params, options) { options = { - showLoader: (options && typeof options.showLoader !== 'undefined') ? options.showLoader : true, showMsg: (options && typeof options.showMsg !== 'undefined') ? options.showMsg : true }; - if (options.showLoader) $('#loader-overlay').show(); - - const p = $http.get(url, {params: params}) + return $http.get(url, {params: params}) .then(response => { const data = response.data; @@ -34,24 +35,13 @@ angular.module('app').service('Constants', function () { noty({text: 'Error', timeout: 5000, type: 'error'}); throw new Error(response.statusText); - }) - .finally(() => { - if (options.showLoader) $('#loader-overlay').hide(); }); + } - if (typeof done !== 'undefined') { - p.then(data => done(data)); - } else { - return p; - } - }; - - this.post = function (url, data, done) { + function post (url, data) { if (typeof data._id !== 'undefined') data.id = data._id; - $('#loader-overlay').show(); - - const p = $http.post(url, data) + return $http.post(url, data) .then(response => { const data = response.data; @@ -66,20 +56,9 @@ angular.module('app').service('Constants', function () { return data; }, response => { noty({text: 'Error', timeout: 5000, type: 'error'}); - console.log(response); throw new Error(response.statusText); - }) - .finally(() => { - $('#loader-overlay').hide(); }); - - if (typeof done !== 'undefined') { - p.then(data => done(data)); - } else { - return p; - } - }; - - return this; - }); + } + } +})(); diff --git a/public/js/core/core.module.js b/public/js/core/core.module.js new file mode 100644 index 00000000..60a65f75 --- /dev/null +++ b/public/js/core/core.module.js @@ -0,0 +1,5 @@ +(function () { + 'use strict'; + + angular.module('app.core', []); +})(); diff --git a/public/js/core/pager.js b/public/js/core/pager.js new file mode 100644 index 00000000..14376bb7 --- /dev/null +++ b/public/js/core/pager.js @@ -0,0 +1,54 @@ +(function () { + 'use strict'; + + angular.module('app.core').factory('pager', pager); + + pager.$inject = []; + + function pager () { + const service = { + getPager: getPager, + }; + + return service; + + function getPager (currentPage, totalPages) { + // default to first page + currentPage = parseFloat(currentPage) || 1; + + var startPage, endPage; + if (totalPages <= 10) { + // less than 10 total pages so show all + startPage = 1; + endPage = totalPages; + } else { + // more than 10 total pages so calculate start and end pages + if (currentPage <= 6) { + startPage = 1; + endPage = 10; + } else if (currentPage + 4 >= totalPages) { + startPage = totalPages - 9; + endPage = totalPages; + } else { + startPage = currentPage - 5; + endPage = currentPage + 4; + } + } + + // create an array of pages to ng-repeat in the pager control + var pages = []; + var i = startPage; + while (i < endPage + 1) { + pages.push(i); + i++; + } + + // return object with all pager properties required by the view + return { + currentPage: currentPage, + totalPages: totalPages, + pages: pages + }; + } + } +})(); diff --git a/public/js/dashboardv2/controller.js b/public/js/dashboardv2/controller.js index a0a6fc2f..ffc3be0b 100644 --- a/public/js/dashboardv2/controller.js +++ b/public/js/dashboardv2/controller.js @@ -1,7 +1,7 @@ angular.module('app').controller('dashBoardv2Ctrl', function ($scope, $location, $q, reportService, connection, $routeParams, reportModel, c3Charts, uuid2, colors, htmlWidgets, dashboardv2Model, grid, bsLoadingOverlayService, $timeout, - $rootScope, PagerService, gettextCatalog, usersModel + $rootScope, pager, gettextCatalog, usersModel ) { usersModel.getUserObjects().then(userObjects => { $scope.userObjects = userObjects; @@ -225,7 +225,7 @@ angular.module('app').controller('dashBoardv2Ctrl', function ($scope, $location, $scope.dashboardID = $routeParams.dashboardID; - connection.get('/api/dashboardsv2/get/' + $scope.dashboardID, {id: $scope.dashboardID}, function (data) { + connection.get('/api/dashboardsv2/get/' + $scope.dashboardID, {id: $scope.dashboardID}).then(function (data) { $scope.selectedDashboard = data.item; if (!$scope.selectedDashboard.containers) { $scope.selectedDashboard.containers = []; } @@ -292,7 +292,7 @@ angular.module('app').controller('dashBoardv2Ctrl', function ($scope, $location, $scope.dashboards = data; $scope.page = data.page; $scope.pages = data.pages; - $scope.pager = PagerService.GetPager($scope.dashboards.items.length, data.page, 10, data.pages); + $scope.pager = pager.getPager(data.page, data.pages); }); }; @@ -774,13 +774,13 @@ angular.module('app').controller('dashBoardv2Ctrl', function ($scope, $location, $scope.selectedDashboard.html = previewContainer.html(); if ($scope.mode === 'add') { - connection.post('/api/dashboardsv2/create', dashboard, function (data) { + connection.post('/api/dashboardsv2/create', dashboard).then(function (data) { if (data.result === 1) { } }); } else { - connection.post('/api/dashboardsv2/update/' + dashboard._id, dashboard, function (result) { + connection.post('/api/dashboardsv2/update/' + dashboard._id, dashboard).then(function (result) { if (result.result === 1) { } @@ -859,14 +859,14 @@ angular.module('app').controller('dashBoardv2Ctrl', function ($scope, $location, }; $scope.unPublish = function () { - connection.post('/api/dashboardsv2/unpublish', {_id: $scope.selectedDashboard._id}, function (data) { + connection.post('/api/dashboardsv2/unpublish', {_id: $scope.selectedDashboard._id}).then(function (data) { $scope.selectedDashboard.isPublic = false; $('#publishModal').modal('hide'); }); }; $scope.selectThisFolder = function (folderID) { - connection.post('/api/dashboardsv2/publish-page', {_id: $scope.selectedDashboard._id, parentFolder: folderID}, function (data) { + connection.post('/api/dashboardsv2/publish-page', {_id: $scope.selectedDashboard._id, parentFolder: folderID}).then(function (data) { $scope.selectedDashboard.parentFolder = folderID; $scope.selectedDashboard.isPublic = true; $('#publishModal').modal('hide'); @@ -896,7 +896,7 @@ angular.module('app').controller('dashBoardv2Ctrl', function ($scope, $location, }; $scope.deleteConfirmed = function (dashboardID) { - connection.post('/api/dashboardsv2/delete/' + dashboardID, {id: dashboardID}, function (result) { + connection.post('/api/dashboardsv2/delete/' + dashboardID, {id: dashboardID}).then(function (result) { if (result.result === 1) { $('#deleteModal').modal('hide'); diff --git a/public/js/dashboardv2/model.js b/public/js/dashboardv2/model.js index 4c34d6cc..6e2ef7f0 100644 --- a/public/js/dashboardv2/model.js +++ b/public/js/dashboardv2/model.js @@ -2,14 +2,14 @@ angular.module('app').service('dashboardv2Model', function ($http, $q, connection, reportService) { this.getDashBoard = function (dashboardID, isLinked, done) { - connection.get('/api/dashboardsv2/get/' + dashboardID, {id: dashboardID, linked: isLinked}, function (data) { + connection.get('/api/dashboardsv2/get/' + dashboardID, {id: dashboardID, linked: isLinked}).then(function (data) { done(data.item); }); }; this.getDashboards = function (params, done) { params = params || {}; - connection.get('/api/dashboardsv2/find-all', params, function (data) { + connection.get('/api/dashboardsv2/find-all', params).then(function (data) { done(data); }); }; @@ -42,7 +42,7 @@ angular.module('app').service('dashboardv2Model', function ($http, $q, connectio } this.pushReport2Dashboard = function (dashboardID) { - connection.get('/api/dashboardsv2/get/' + dashboardID, {id: dashboardID, linked: false}, function (data) { + connection.get('/api/dashboardsv2/get/' + dashboardID, {id: dashboardID, linked: false}).then(function (data) { var selectedDashboard = data.item; var qstructure = reportService.getReport(); qstructure.reportName = 'report_' + (selectedDashboard.reports.length + 1); diff --git a/public/js/data-source/controller.js b/public/js/data-source/controller.js deleted file mode 100644 index d3b6e036..00000000 --- a/public/js/data-source/controller.js +++ /dev/null @@ -1,384 +0,0 @@ -/* global jsPlumb: false */ - -angular.module('app').controller('dataSourceCtrl', function ($scope, connection, $routeParams, dataSourceNameModal, datasourceModel, $timeout, PagerService, $http, Constants, gettextCatalog) { - $scope.activeForm = 'partials/data-source/source_wizard_index.html'; - $scope.selectedCollections = []; - $scope.pager = {}; - - if ($routeParams.extra === 'intro') { - $timeout(function () { $scope.showIntro(); }, 1000); - } - - $scope.IntroOptions = { - // IF width > 300 then you will face problems with mobile devices in responsive mode - steps: [ - { - element: '#parentIntro', - html: '

' + - gettextCatalog.getString('Data sources') + - '

' + - gettextCatalog.getString('Data sources are connections to the databases you are going to generate reports for.') + - '
' + - gettextCatalog.getString('Create and manage here the connections to databases that holds the data you want to be able to create reports using Urungi.') + - '
' + - gettextCatalog.getString('At least one data source must be defined, unless you do not define some data source you and your users will not be able to create reports.') + - '
', - width: '500px', - objectArea: false, - verticalAlign: 'top', - height: '250px' - }, - { - element: '#newDataSourceBtn', - html: '

' + - gettextCatalog.getString('New datasource') + - '

' + - gettextCatalog.getString('Click here to create a new datasource.') + - '
', - width: '300px', - height: '150px', - areaColor: 'transparent', - horizontalAlign: 'right', - areaLineColor: '#fff' - }, - { - element: '#datasourceList', - html: '

' + - gettextCatalog.getString('List of data sources') + - '

' + - gettextCatalog.getString('Here all the data sources (database connections) will be listed.') + - '
' + - gettextCatalog.getString('You can edit the connection details for every data source, delete a data source or activate/deactivate a datasource.') + - '
', - width: '300px', - areaColor: 'transparent', - areaLineColor: '#fff', - verticalAlign: 'top', - height: '180px' - - }, - { - element: '#datasourceListItem', - html: '

' + - gettextCatalog.getString('Data source') + - '

' + - gettextCatalog.getString('This is one data source.') + - '
', - width: '300px', - areaColor: 'transparent', - areaLineColor: '#72A230', - height: '180px' - - }, - { - element: '#datasourceListItemName', - html: '

' + - gettextCatalog.getString('Data source name & type') + - '

' + - gettextCatalog.getString('The name for the data source and the type of connection (end database).') + - '
' + - gettextCatalog.getString('You can setup the name you want for data sources.') + - '
', - width: '300px', - areaColor: 'transparent', - areaLineColor: '#fff', - height: '180px' - - }, - { - element: '#datasourceListItemDetails', - html: '

' + - gettextCatalog.getString('Data source connection details') + - '

' + - gettextCatalog.getString('The main connection details for the data source.') + - '
', - width: '300px', - areaColor: 'transparent', - areaLineColor: '#fff', - height: '180px' - - }, - { - element: '#parentIntro', - html: '

' + - gettextCatalog.getString('Next Step') + - '

' + - gettextCatalog.getString('Layers') + - '


' + - gettextCatalog.getString('Layers') + - '(semantic layers)' + - gettextCatalog.getString(' allow your users to access and understand your data without any knowledge of SQL or how the database is structured in tables and fields...') + - '

' + - gettextCatalog.getString('Go to layers and continue tour') + - '
', - width: '500px', - objectArea: false, - verticalAlign: 'top', - height: '250px' - } - ] - }; - - init(); - - function init () { - if ($routeParams.newDataSource) { - if ($routeParams.newDataSource === 'true') { - $scope._dataSource = {}; - $scope._dataSource.connection = {}; - $scope._dataSource.packetSize = 500; - $scope._dataSource.status = 1; - $scope._dataSource.type = 'MySQL'; - - $scope.mode = 'add'; - } - } else { - if ($routeParams.dataSourceID) { - connection.get('/api/data-sources/find-one', {id: $routeParams.dataSourceID}, function (data) { - $scope._dataSource = data.item; - }); - }; - } - }; - - $scope.save = function () { - if ($scope.mode === 'add') { - var data = $scope._dataSource; - connection.post('/api/data-sources/create', data, function (data) { - window.history.back(); - }); - } else { - connection.post('/api/data-sources/update/' + $scope._dataSource._id, $scope._dataSource, function (result) { - if (result.result === 1) { - window.history.back(); - } - }); - } - }; - - $scope.upload = function (file) { - if (file) { - $scope._dataSource.connection.file = file.name; - - var fd = new FormData(); - - fd.append('file', file); - - $http.post('/api/data-sources/upload-config-file', fd, { - transformRequest: angular.identity, - headers: {'Content-Type': undefined} - }) - .success(angular.bind(this, function (data, status, headers, config) { - if (data.result === 1) { - $scope.fileUploadSuccess = true; - $scope.fileUploadMessage = 'File uploaded successfully'; - } else { - $scope.fileUploadSuccess = false; - $scope.fileUploadMessage = 'File upload failed [' + data.msg + ']'; - } - })) - .error(function (data, status) { - $scope.fileUploadSuccess = false; - $scope.fileUploadMessage = 'File upload failed [' + data.msg + ']'; - }); - } - }; - - $scope.enableTestConnection = function () { - if (!$scope._dataSource) { - return false; - } - - if ($scope._dataSource.type !== 'BIGQUERY' && - // ($scope._dataSource.connection.host && $scope._dataSource.connection.port && $scope._dataSource.connection.database) - ($scope._dataSource.connection.host && $scope._dataSource.connection.database) - ) { return true; } - - if ($scope._dataSource.type === 'BIGQUERY' && - ($scope._dataSource.connection.database && $scope._dataSource.connection.file && $scope.fileUploadSuccess) - ) { return true; } - - return false; - }; - - $scope.doTestConnection = function () { - $scope.testConnection = {}; - var data = {}; - $scope.testingConnection = true; - data.type = $scope._dataSource.type; - data.host = $scope._dataSource.connection.host; - data.port = $scope._dataSource.connection.port; - data.database = $scope._dataSource.connection.database; - data.userName = $scope._dataSource.connection.userName; - data.password = $scope._dataSource.connection.password; - - if ($scope._dataSource.connection.file) data.file = $scope._dataSource.connection.file; - - console.log('calling'); - connection.post('/api/data-sources/testConnection', data, function (result) { - console.log(result); - if (result.result === 1) { - $scope.testConnection = {result: 1, message: 'Successful database connection.'}; - $scope.testingConnection = false; - } else { - $scope.testConnection = {result: 0, message: 'Database connection failed.', errorMessage: result.msg}; - $scope.testingConnection = false; - } - }); - }; - - $scope.getDataSources = function (page, search, fields) { - var params = {}; - - params.page = (page) || 1; - - if (search) { - $scope.search = search; - } else if (page === 1) { - $scope.search = ''; - } - if ($scope.search) { - params.search = $scope.search; - } - - if (fields) params.fields = fields; - - datasourceModel.getDataSources(params, function (data) { - $scope.items = data.items; - $scope.page = data.page; - $scope.pages = data.pages; - $scope.pager = PagerService.GetPager($scope.items.length, data.page, 10, data.pages); - }); - }; - - $scope.elementTypes = [ - {name: 'String', value: 'string'}, - {name: 'Number', value: 'number'}, - {name: 'Object', value: 'object'}, - {name: 'Date', value: 'date'}, - {name: 'Array', value: 'array'}, - {name: 'Boolean', value: 'boolean'} - ]; - - $scope.edit = function () { - if ($routeParams.dataSourceID) { - connection.get('/api/data-sources/find-one', {id: $routeParams.dataSourceID}, function (data) { - $scope._dataSource = data.item; - - connection.post('/api/data-sources/testMongoConnection', $scope._dataSource.connection, function (result) { - var collections = []; - - for (var i in result.items) { - collections.push(result.items[i].name); - } - - var params = { - host: $scope._dataSource.connection.host, - port: $scope._dataSource.connection.port, - database: $scope._dataSource.connection.database, - collections: collections - }; - - $scope.loadingNewCollections = true; - - connection.post('/api/data-sources/getMongoSchemas', params, function (result) { - $scope.schemas = []; - - for (const i in result.items) { - var found = false; - - if (!found) { - result.items[i].isNew = true; - - for (const e in result.items[i].elements) { - result.items[i].elements[e].isNew = true; - } - - $scope.schemas.push(result.items[i]); - } - } - - $scope.loadingNewCollections = false; - }); - }); - }); - } - }; -}); - -angular.module('app').directive('postRender', [ '$timeout', function ($timeout) { - var def = { - restrict: 'A', - terminal: true, - transclude: true, - link: function (scope, element, attrs) { - $timeout(scope.redraw, 0); // Calling a scoped method - } - }; - return def; -}]); - -// directives link user interactions with $scope behaviours -// now we extend html with
, we can define a template <> to replace it with "proper" html, or we can -// replace it with something more sophisticated, e.g. setting jsPlumb arguments and attach it to a double-click -// event -angular.module('app').directive('plumbItem', function () { - return { - replace: true, - controller: 'PlumbCtrl', - link: function (scope, element, attrs) { - jsPlumb.makeTarget(element, { - anchor: 'Continuous', - maxConnections: 2, - }); - jsPlumb.draggable(element, { - containment: 'parent' - }); - - // this should actually done by a AngularJS template and subsequently a controller attached to the dbl-click event - element.bind('dblclick', function (e) { - jsPlumb.detachAllConnections($(this)); - $(this).remove(); - // stop event propagation, so it does not directly generate a new state - e.stopPropagation(); - // we need the scope of the parent, here assuming is part of the - scope.$parent.removeState(attrs.identifier); - scope.$parent.$digest(); - }); - } - }; -}); - -// -// This directive should allow an element to be dragged onto the main canvas. Then after it is dropped, it should be -// painted again on its original position, and the full module should be displayed on the dragged to location. -// -angular.module('app').directive('plumbMenuItem', function () { - return { - replace: true, - controller: 'PlumbCtrl', - link: function (scope, element, attrs) { - jsPlumb.draggable(element, { - containment: element.parent().parent() - }); - } - }; -}); - -angular.module('app').directive('plumbConnect', function () { - return { - replace: true, - link: function (scope, element, attrs) { - jsPlumb.makeSource(element, { - parent: $(element).parent(), - // anchor: 'Continuous', - paintStyle: { - strokeStyle: '#225588', - fillStyle: 'transparent', - radius: 7, - lineWidth: 2 - }, - }); - } - }; -}); diff --git a/public/js/data-source/model.js b/public/js/data-source/model.js deleted file mode 100644 index c5c0f603..00000000 --- a/public/js/data-source/model.js +++ /dev/null @@ -1,29 +0,0 @@ -angular.module('app').service('datasourceModel', function ($http, $q, $filter, connection) { - this.getDataSources = function (params, done) { - connection.get('/api/data-sources/find-all', params, done); - }; - - this.getEntitiesSchema = function (datasourceID, entity, done) { - var data = {}; - data.datasourceID = datasourceID; - data.entity = entity; - - connection.get('/api/data-sources/getEntitySchema', data, function (result) { - if (result.result === 1) { - done(result); - } - }); - }; - - this.getSqlQuerySchema = function (datasourceID, collection, done) { - var data = {}; - data.datasourceID = datasourceID; - data.collection = collection; - - connection.get('/api/data-sources/getsqlQuerySchema', data, function (result) { - if (result.result === 1) { - done(result); - } - }); - }; -}); diff --git a/public/js/data-source/services/dataSourceNameModal.js b/public/js/data-source/services/dataSourceNameModal.js deleted file mode 100644 index 7f67cb74..00000000 --- a/public/js/data-source/services/dataSourceNameModal.js +++ /dev/null @@ -1,48 +0,0 @@ -angular.module('app').service('dataSourceNameModal', ['$modal', function ($modal) { - var modalDefaults = { - backdrop: true, - keyboard: true, - modalFade: true, - templateUrl: '/partials/data-source/dataSourceName.html', - windowClass: 'in dataSourceName_modal_window' - }; - - var modalOptions = { - closeButtonText: 'Cancel', - actionButtonText: 'Save', - headerText: 'Data Source', - bodyText: '' - }; - - this.showModal = function (customModalDefaults, customModalOptions) { - if (!customModalDefaults) customModalDefaults = {}; - customModalDefaults.backdrop = 'static'; - return this.show(customModalDefaults, customModalOptions); - }; - - this.show = function (customModalDefaults, customModalOptions) { - // Create temp objects to work with since we're in a singleton service - var tempModalDefaults = {}; - var tempModalOptions = {}; - - // Map angular-ui modal custom defaults to modal defaults defined in service - angular.extend(tempModalDefaults, modalDefaults, customModalDefaults); - - // Map modal.html $scope custom properties to defaults defined in service - angular.extend(tempModalOptions, modalOptions, customModalOptions); - - if (!tempModalDefaults.controller) { - tempModalDefaults.controller = function ($scope, $modalInstance) { - $scope.modalOptions = tempModalOptions; - $scope.modalOptions.ok = function (result) { - $modalInstance.close(result); - }; - $scope.modalOptions.close = function (result) { - $modalInstance.dismiss('cancel'); - }; - }; - } - - return $modal.open(tempModalDefaults).result; - }; -}]); diff --git a/public/js/data-sources/data-sources-edit.controller.js b/public/js/data-sources/data-sources-edit.controller.js new file mode 100644 index 00000000..453e8eb1 --- /dev/null +++ b/public/js/data-sources/data-sources-edit.controller.js @@ -0,0 +1,122 @@ +(function () { + 'use strict'; + + angular.module('app.data-sources').controller('DataSourcesEditController', DataSourcesEditController); + + DataSourcesEditController.$inject = ['connection', '$routeParams', '$http']; + + function DataSourcesEditController (connection, $routeParams, $http) { + const vm = this; + + vm._dataSource = null; + vm.doTestConnection = doTestConnection; + vm.enableTestConnection = enableTestConnection; + vm.mode = 'edit'; + vm.save = save; + vm.testConnection = {}; + vm.testingConnection = false; + vm.upload = upload; + + activate(); + + function activate () { + if ($routeParams.dataSourceID === 'new') { + vm._dataSource = {}; + vm._dataSource.connection = {}; + vm._dataSource.packetSize = 500; + vm._dataSource.status = 1; + vm._dataSource.type = 'MySQL'; + + vm.mode = 'add'; + } else { + connection.get('/api/data-sources/find-one', {id: $routeParams.dataSourceID}).then(function (data) { + vm._dataSource = data.item; + }); + } + } + + function save () { + if (vm.mode === 'add') { + var data = vm._dataSource; + connection.post('/api/data-sources/create', data).then(function (data) { + window.history.back(); + }); + } else { + connection.post('/api/data-sources/update/' + vm._dataSource._id, vm._dataSource).then(function (result) { + if (result.result === 1) { + window.history.back(); + } + }); + } + }; + + function doTestConnection () { + vm.testConnection = {}; + var data = {}; + vm.testingConnection = true; + data.type = vm._dataSource.type; + data.host = vm._dataSource.connection.host; + data.port = vm._dataSource.connection.port; + data.database = vm._dataSource.connection.database; + data.userName = vm._dataSource.connection.userName; + data.password = vm._dataSource.connection.password; + + if (vm._dataSource.connection.file) data.file = vm._dataSource.connection.file; + + connection.post('/api/data-sources/testConnection', data).then(function (result) { + console.log(result); + if (result.result === 1) { + vm.testConnection = {result: 1, message: 'Successful database connection.'}; + vm.testingConnection = false; + } else { + vm.testConnection = {result: 0, message: 'Database connection failed.', errorMessage: result.msg}; + vm.testingConnection = false; + } + }); + }; + + function enableTestConnection () { + if (!vm._dataSource) { + return false; + } + + if (vm._dataSource.type !== 'BIGQUERY' && vm._dataSource.connection.host && vm._dataSource.connection.database) { + return true; + } + + if (vm._dataSource.type === 'BIGQUERY' && vm._dataSource.connection.database && vm._dataSource.connection.file && vm.fileUploadSuccess) { + return true; + } + + return false; + }; + + function upload (file) { + if (file) { + vm._dataSource.connection.file = file.name; + + var fd = new FormData(); + + fd.append('file', file); + + $http.post('/api/data-sources/upload-config-file', fd, { + transformRequest: angular.identity, + headers: {'Content-Type': undefined} + }) + .success(angular.bind(this, function (data, status, headers, config) { + if (data.result === 1) { + vm.fileUploadSuccess = true; + vm.fileUploadMessage = 'File uploaded successfully'; + } else { + vm.fileUploadSuccess = false; + vm.fileUploadMessage = 'File upload failed [' + data.msg + ']'; + } + })) + .error(function (data, status) { + vm.fileUploadSuccess = false; + vm.fileUploadMessage = 'File upload failed [' + data.msg + ']'; + }); + } + }; + } +})(); diff --git a/public/js/data-sources/data-sources-list.controller.js b/public/js/data-sources/data-sources-list.controller.js new file mode 100644 index 00000000..656ece26 --- /dev/null +++ b/public/js/data-sources/data-sources-list.controller.js @@ -0,0 +1,158 @@ +(function () { + 'use strict'; + + angular.module('app.data-sources').controller('DataSourcesListController', DataSourcesListController); + + DataSourcesListController.$inject = ['$location', '$timeout', 'connection', 'api', 'pager', 'gettextCatalog']; + + function DataSourcesListController ($location, $timeout, connection, api, pager, gettextCatalog) { + const vm = this; + vm.pager = {}; + vm.IntroOptions = {}; + + activate(); + + function activate () { + vm.IntroOptions = getIntroOptions(); + + if ($location.hash() === 'intro') { + $timeout(function () { vm.showIntro(); }, 1000); + } + } + + function getIntroOptions () { + return { + steps: [ + { + element: '#parentIntro', + html: '

' + + gettextCatalog.getString('Data sources') + + '

' + + gettextCatalog.getString('Data sources are connections to the databases you are going to generate reports for.') + + '
' + + gettextCatalog.getString('Create and manage here the connections to databases that holds the data you want to be able to create reports using Urungi.') + + '
' + + gettextCatalog.getString('At least one data source must be defined, unless you do not define some data source you and your users will not be able to create reports.') + + '
', + width: '500px', + objectArea: false, + verticalAlign: 'top', + height: '250px' + }, + { + element: '#newDataSourceBtn', + html: '

' + + gettextCatalog.getString('New datasource') + + '

' + + gettextCatalog.getString('Click here to create a new datasource.') + + '
', + width: '300px', + height: '150px', + areaColor: 'transparent', + horizontalAlign: 'right', + areaLineColor: '#fff' + }, + { + element: '#datasourceList', + html: '

' + + gettextCatalog.getString('List of data sources') + + '

' + + gettextCatalog.getString('Here all the data sources (database connections) will be listed.') + + '
' + + gettextCatalog.getString('You can edit the connection details for every data source, delete a data source or activate/deactivate a datasource.') + + '
', + width: '300px', + areaColor: 'transparent', + areaLineColor: '#fff', + verticalAlign: 'top', + height: '180px' + + }, + { + element: '#datasourceListItem', + html: '

' + + gettextCatalog.getString('Data source') + + '

' + + gettextCatalog.getString('This is one data source.') + + '
', + width: '300px', + areaColor: 'transparent', + areaLineColor: '#72A230', + height: '180px' + + }, + { + element: '#datasourceListItemName', + html: '

' + + gettextCatalog.getString('Data source name & type') + + '

' + + gettextCatalog.getString('The name for the data source and the type of connection (end database).') + + '
' + + gettextCatalog.getString('You can setup the name you want for data sources.') + + '
', + width: '300px', + areaColor: 'transparent', + areaLineColor: '#fff', + height: '180px' + + }, + { + element: '#datasourceListItemDetails', + html: '

' + + gettextCatalog.getString('Data source connection details') + + '

' + + gettextCatalog.getString('The main connection details for the data source.') + + '
', + width: '300px', + areaColor: 'transparent', + areaLineColor: '#fff', + height: '180px' + + }, + { + element: '#parentIntro', + html: '

' + + gettextCatalog.getString('Next Step') + + '

' + + gettextCatalog.getString('Layers') + + '


' + + gettextCatalog.getString('Layers') + + '(semantic layers)' + + gettextCatalog.getString(' allow your users to access and understand your data without any knowledge of SQL or how the database is structured in tables and fields...') + + '

' + + gettextCatalog.getString('Go to layers and continue tour') + + '
', + width: '500px', + objectArea: false, + verticalAlign: 'top', + height: '250px' + } + ] + }; + } + + vm.getDataSources = function (page, search, fields) { + var params = {}; + + params.page = (page) || 1; + + if (search) { + vm.search = search; + } else if (page === 1) { + vm.search = ''; + } + if (vm.search) { + params.search = vm.search; + } + + if (fields) params.fields = fields; + + return api.getDataSources(params).then(function (data) { + vm.items = data.items; + vm.page = data.page; + vm.pages = data.pages; + vm.pager = pager.getPager(data.page, data.pages); + }); + }; + }; +})(); diff --git a/public/js/data-sources/data-sources.module.js b/public/js/data-sources/data-sources.module.js new file mode 100644 index 00000000..64e100ba --- /dev/null +++ b/public/js/data-sources/data-sources.module.js @@ -0,0 +1,5 @@ +(function () { + 'use strict'; + + angular.module('app.data-sources', ['ngRoute', 'gettext', 'app.core']); +})(); diff --git a/public/js/data-sources/data-sources.routes.js b/public/js/data-sources/data-sources.routes.js new file mode 100644 index 00000000..6823c3b0 --- /dev/null +++ b/public/js/data-sources/data-sources.routes.js @@ -0,0 +1,21 @@ +(function () { + 'use strict'; + + angular.module('app.data-sources').config(configure); + + configure.$inject = ['$routeProvider']; + + function configure ($routeProvider) { + $routeProvider.when('/data-sources', { + templateUrl: 'partials/data-sources/list.html', + controller: 'DataSourcesListController', + controllerAs: 'vm', + }); + + $routeProvider.when('/data-sources/:dataSourceID', { + templateUrl: 'partials/data-sources/edit.html', + controller: 'DataSourcesEditController', + controllerAs: 'vm', + }); + } +})(); diff --git a/public/js/files/service.js b/public/js/files/service.js index 3e532c61..028d5c03 100644 --- a/public/js/files/service.js +++ b/public/js/files/service.js @@ -1,4 +1,4 @@ -angular.module('app').service('fileService', function (connection, Constants) { +angular.module('app').service('fileService', function (connection) { this.getFiles = function () { const params = {}; diff --git a/public/js/home/controller.js b/public/js/home/controller.js index f6ed44ad..fb2207bf 100644 --- a/public/js/home/controller.js +++ b/public/js/home/controller.js @@ -240,7 +240,7 @@ angular.module('app').controller('homeCtrl', ['$scope', '$rootScope', '$sessionS gettextCatalog.getString('Next Step') + ' ' + gettextCatalog.getString('Setup a data source') + - '




' + + '




' + gettextCatalog.getString('Go to data sources and continue tour') + '
', width: '500px', @@ -466,12 +466,12 @@ angular.module('app').controller('homeCtrl', ['$scope', '$rootScope', '$sessionS } } - connection.get('/api/get-user-other-data', {}, function (data) { + connection.get('/api/get-user-other-data', {}).then(function (data) { var user = data.items; $rootScope.user.contextHelp = user.contextHelp; }); - connection.get('/api/get-user-last-executions', {}, function (data) { + connection.get('/api/get-user-last-executions', {}).then(function (data) { $scope.lastExecutions = []; $scope.mostExecutions = []; @@ -493,7 +493,7 @@ angular.module('app').controller('homeCtrl', ['$scope', '$rootScope', '$sessionS $scope.getReports = function (params) { params = params || {}; - connection.get('/api/reports/find-all', params, function (data) { + connection.get('/api/reports/find-all', params).then(function (data) { $scope.reports = data; }); }; @@ -501,13 +501,13 @@ angular.module('app').controller('homeCtrl', ['$scope', '$rootScope', '$sessionS $scope.getDashboards = function (params) { params = params || {}; - connection.get('/api/dashboards/find-all', params, function (data) { + connection.get('/api/dashboards/find-all', params).then(function (data) { $scope.dashboards = data; }); }; $scope.getCounts = function () { - /* connection.get('/api/get-counts', {}, function(data) { + /* connection.get('/api/get-counts', {}).then(function(data) { $rootScope.counts = data; }); */ }; @@ -517,7 +517,7 @@ angular.module('app').controller('homeCtrl', ['$scope', '$rootScope', '$sessionS $scope.userObjects = userObjects; }); - connection.get('/api/get-counts', {}, function (data) { + connection.get('/api/get-counts', {}).then(function (data) { $rootScope.counts = data; getIntraOptions(); }); diff --git a/public/js/layer/controller.js b/public/js/layer/controller.js index 17be9a2c..8205a693 100644 --- a/public/js/layer/controller.js +++ b/public/js/layer/controller.js @@ -1,5 +1,5 @@ /* global jsPlumb: false, $modal: false, bsLoadingOverlayService: false */ -angular.module('app').controller('layerCtrl', function ($scope, $rootScope, connection, $routeParams, datasourceModel, uuid2, $timeout, PagerService, $window, gettextCatalog) { +angular.module('app').controller('layerCtrl', function ($scope, $rootScope, api, connection, $routeParams, uuid2, $timeout, pager, $window, gettextCatalog) { $scope.layerModal = 'partials/layer/layerModal.html'; $scope.datasetModal = 'partials/layer/datasetModal.html'; $scope.sqlModal = 'partials/layer/sqlModal.html'; @@ -178,7 +178,7 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn var data = {layerID: layer._id, status: newStatus}; - connection.post('/api/layers/change-layer-status', data, function (result) { + connection.post('/api/layers/change-layer-status', data).then(function (result) { layer.status = newStatus; }); } @@ -186,7 +186,7 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn $scope.view = function () { if ($routeParams.layerID) { - connection.get('/api/layers/find-one', {id: $routeParams.layerID}, function (data) { + connection.get('/api/layers/find-one', {id: $routeParams.layerID}).then(function (data) { $scope._Layer = data.item; if ($scope._Layer.params) { if ($scope._Layer.params.schema) { @@ -257,12 +257,12 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn if ($scope.mode === 'add') { theLayer.objects = $scope.rootItem.elements; var data = theLayer; - connection.post('/api/layers/create', data, function (data) { + connection.post('/api/layers/create', data).then(function (data) { $scope.items.push(data.item); $('#layerModal').modal('hide'); }); } else { - connection.post('/api/layers/update/' + theLayer._id, theLayer, function (result) { + connection.post('/api/layers/update/' + theLayer._id, theLayer).then(function (result) { if (result.result === 1) { window.history.back(); } @@ -286,11 +286,11 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn if (fields) params.fields = fields; - connection.get('/api/layers/find-all', params, function (data) { + connection.get('/api/layers/find-all', params).then(function (data) { $scope.items = data.items; $scope.page = data.page; $scope.pages = data.pages; - $scope.pager = PagerService.GetPager($scope.items.length, data.page, 10, data.pages); + $scope.pager = pager.getPager(data.page, data.pages); }); }; @@ -301,7 +301,7 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn params.fields = ['name', 'type', 'status', 'statusInfo', 'connection.host', 'connection.port', 'connection.database']; - datasourceModel.getDataSources(params, function (data) { + api.getDataSources(params).then(function (data) { $scope.datasources = data.items; }); }; @@ -366,47 +366,9 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn $scope.selectedEntities.splice(index, 1); } }; - /* - $scope.addToLayer = function () - { - if ($scope.selectedEntities.length > 0) - { - datasourceModel.getEntitiesSchema($scope.selectedDts.id,$scope.selectedEntities,function(result){ - - if (result.result === 1) - { - for (i in result.items) - { - result.items[i].datasourceID = $scope.selectedDts.id; - - for (e in result.items[i].elements) - { - result.items[i].elements[e].datasourceID = $scope.selectedDts.id; - result.items[i].elements[e].collectionID = result.items[i].collectionID; - result.items[i].elements[e].collectionName = result.items[i].collectionName; - } - - if (!$scope._Layer.params) - $scope._Layer.params = {}; - if (!$scope._Layer.params.schema) - $scope._Layer.params.schema = []; - - $scope._Layer.params.schema.push(result.items[i]); - - } - - $('#datasetModal').modal('hide'); - $scope.erDiagramInit(); - - } - }); - } - } - - */ $scope.addSqlToLayer = function () { - datasourceModel.getSqlQuerySchema($scope.selectedDts.id, $scope.temporarySQLCollection, function (result) { + api.getSqlQuerySchema($scope.selectedDts.id, $scope.temporarySQLCollection).then(function (result) { if (result.result !== 1) { $scope.errorToken = result; return; @@ -449,7 +411,7 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn }; $scope.saveSQLChanges = function () { - datasourceModel.getSqlQuerySchema($scope.selectedDts.id, $scope.temporarySQLCollection, function (result) { + api.getSqlQuerySchema($scope.selectedDts.id, $scope.temporarySQLCollection).then(function (result) { if (result.result === 1 && result.items.length > 0) { // The result is an array but I think it never holds more than one element. @@ -1254,31 +1216,6 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn } } - $scope.onElementTypeChange = function (element) { - /* - * An unfinished piece of code for handling array elements (a column can hold an array in some SQL databases) - * Array support on the whole is unfinished, and would be an interesting feature - * - */ - - // var params = { - // datasourceID: element.datasourceID, - // layerID: $scope._Layer._id, - // collectionID: element.collectionID, - // collectionName: element.collectionName, - // elementName: element.elementName, - // defaultAggregation: element.defaultAggregation - // }; - - // if (element.elementType === 'array') { - // connection.get('/api/data-sources/get-element-distinct-values', params, function (data) { - // for (var i in data.items) { - // $scope.addValueToElement(element, data.items[i]['_id'][element.elementName], data.items[i]['_id'][element.elementName]); - // } - // }); - // } - }; - // Drag & drop elements $scope.onDrag = false; $scope.sortableOptions = { @@ -1383,8 +1320,7 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn $scope.getDatasetsForThisDts = function (_id, theDataSource) { if (!theDataSource.loading) { theDataSource.loading = true; - connection.get('/api/data-sources/getEntities', {id: _id}, function (data) { - console.log(data); + connection.get('/api/data-sources/getEntities', {id: _id}).then(function (data) { theDataSource.loading = false; if (data.result === 1) { theDataSource.entities = data.items; @@ -1399,7 +1335,7 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn }; $scope.getFieldsForThisEntity = function (dataSourceID, entity, theEntity) { - datasourceModel.getEntitiesSchema([dataSourceID], entity, function (result) { + api.getEntitiesSchema(dataSourceID, entity).then(function (result) { if (result.result === 1) { theEntity.fields = result.items[0].elements; } @@ -1489,7 +1425,7 @@ angular.module('app').controller('layerCtrl', function ($scope, $rootScope, conn $scope.addDatasetToLayer = function (datasourceID, entity) { if (typeof $scope.selectedDts.id === 'undefined' || $scope.selectedDts.id === datasourceID) { - datasourceModel.getEntitiesSchema(datasourceID, entity, function (result) { + api.getEntitiesSchema(datasourceID, entity).then(function (result) { if (result.result !== 1) { return; } diff --git a/public/js/menu-list/controllers.js b/public/js/menu-list/controllers.js index 8df6d0b9..4a06fe42 100644 --- a/public/js/menu-list/controllers.js +++ b/public/js/menu-list/controllers.js @@ -1,4 +1,4 @@ -angular.module('app').controller('listCtrl', function ($scope, $rootScope, connection, PagerService, $routeParams, $timeout) { +angular.module('app').controller('listCtrl', function ($scope, $rootScope, connection, pager, $routeParams, $timeout) { $scope.init = function () { $scope.nav.page = 1; @@ -81,7 +81,7 @@ angular.module('app').controller('listCtrl', function ($scope, $rootScope, conne $scope.nav.items = result.items; $scope.nav.page = result.page; - $scope.nav.pager = PagerService.GetPager($scope.nav.items.length, result.page, $scope.nav.itemsPerPage, result.pages); + $scope.nav.pager = pager.getPager(result.page, result.pages); }); }; }) diff --git a/public/js/report/controller.js b/public/js/report/controller.js index e9b2fb69..4493428e 100644 --- a/public/js/report/controller.js +++ b/public/js/report/controller.js @@ -1,5 +1,5 @@ angular.module('app').controller('reportCtrl', function ($scope, connection, $compile, reportService, $routeParams, $timeout, $rootScope, bsLoadingOverlayService, c3Charts, - reportModel, widgetsCommon, $location, PagerService, gettextCatalog, usersModel, $q) { + reportModel, widgetsCommon, $location, pager, gettextCatalog, usersModel, $q) { usersModel.getUserObjects().then(userObjects => { $scope.userObjects = userObjects; }); @@ -253,7 +253,7 @@ angular.module('app').controller('reportCtrl', function ($scope, connection, $co // $scope.items = data.items; $scope.navigation.page = data.page; $scope.navigation.pages = data.pages; - $scope.navigation.pager = PagerService.GetPager($scope.reports.length, data.page, 10, data.pages); + $scope.navigation.pager = pager.getPager(data.page, data.pages); }); }; @@ -378,7 +378,7 @@ angular.module('app').controller('reportCtrl', function ($scope, connection, $co $scope.pushToDash = function () { var params = {}; - return connection.get('/api/dashboardsv2/find-all', params, function (data) { + return connection.get('/api/dashboardsv2/find-all', params).then(function (data) { $scope.dashboards = data; $('#dashListModal').modal('show'); }); diff --git a/public/js/roles/controller.js b/public/js/roles/controller.js index 371b6365..6b301f46 100644 --- a/public/js/roles/controller.js +++ b/public/js/roles/controller.js @@ -1,4 +1,4 @@ -angular.module('app').controller('rolesCtrl', function ($scope, connection, $routeParams, uuid2, $rootScope, PagerService) { +angular.module('app').controller('rolesCtrl', function ($scope, connection, $routeParams, uuid2, $rootScope, pager) { $scope.items = []; $scope.roleModal = 'partials/roles/roleModal.html'; $scope.pager = {}; @@ -20,7 +20,7 @@ angular.module('app').controller('rolesCtrl', function ($scope, connection, $rou $scope.view = function (roleID) { if (roleID) { - connection.get('/api/roles/find-one', {id: roleID}, function (data) { + connection.get('/api/roles/find-one', {id: roleID}).then(function (data) { $scope._Role = data.item; $scope.mode = 'edit'; $scope.clearNodes($scope.publicSpace); @@ -35,12 +35,12 @@ angular.module('app').controller('rolesCtrl', function ($scope, connection, $rou if ($scope.mode === 'add') { var data = $scope._Role; - connection.post('/api/roles/create', data, function (data) { + connection.post('/api/roles/create', data).then(function (data) { $scope.items.push(data.item); $('#roleModal').modal('hide'); }); } else { - connection.post('/api/roles/update/' + $scope._Role._id, $scope._Role, function (result) { + connection.post('/api/roles/update/' + $scope._Role._id, $scope._Role).then(function (result) { if (result.result === 1) { $('#roleModal').modal('hide'); } @@ -64,11 +64,11 @@ angular.module('app').controller('rolesCtrl', function ($scope, connection, $rou if (fields) params.fields = fields; - connection.get('/api/roles/find-all', params, function (data) { + connection.get('/api/roles/find-all', params).then(function (data) { $scope.items = data.items; $scope.page = data.page; $scope.pages = data.pages; - $scope.pager = PagerService.GetPager($scope.items.length, data.page, 10, data.pages); + $scope.pager = pager.getPager(data.page, data.pages); }); }; diff --git a/public/js/services/pager.js b/public/js/services/pager.js deleted file mode 100644 index 9b91d7f6..00000000 --- a/public/js/services/pager.js +++ /dev/null @@ -1,58 +0,0 @@ -angular.module('app').service('PagerService', function () { - this.GetPager = function (totalItems, currentPage, pageSize, totalPages) { - // default to first page - currentPage = parseFloat(currentPage) || 1; - - // default page size is 10 - pageSize = pageSize || 10; - - // calculate total pages - // totalPages = totalPages Math.ceil(totalItems / pageSize); - - var startPage, endPage; - if (totalPages <= 10) { - // less than 10 total pages so show all - startPage = 1; - endPage = totalPages; - } else { - // more than 10 total pages so calculate start and end pages - if (currentPage <= 6) { - startPage = 1; - endPage = 10; - } else if (currentPage + 4 >= totalPages) { - startPage = totalPages - 9; - endPage = totalPages; - } else { - startPage = currentPage - 5; - endPage = currentPage + 4; - } - } - - // calculate start and end item indexes - var startIndex = (currentPage - 1) * pageSize; - var endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1); - - // create an array of pages to ng-repeat in the pager control - // var pages = range(startPage, endPage + 1,1); - - var pages = []; - var i = startPage; - while (i < endPage + 1) { - pages.push(i); - i++; - } - - // return object with all pager properties required by the view - return { - totalItems: totalItems, - currentPage: currentPage, - pageSize: pageSize, - totalPages: totalPages, - startPage: startPage, - endPage: endPage, - startIndex: startIndex, - endIndex: endIndex, - pages: pages - }; - }; -}); diff --git a/public/js/spaces/controller.js b/public/js/spaces/controller.js index 1c57c9a2..3d40f646 100644 --- a/public/js/spaces/controller.js +++ b/public/js/spaces/controller.js @@ -139,7 +139,7 @@ angular.module('app').controller('spacesCtrl', function ($scope, $rootScope, con gettextCatalog.getString('Next Step') + ' ' + gettextCatalog.getString('Creating a new data source') + - '




' + + '




' + gettextCatalog.getString('Continue tour') + '', width: '500px', @@ -169,12 +169,11 @@ angular.module('app').controller('spacesCtrl', function ($scope, $rootScope, con }; $scope.save = function () { - connection.post('/api/company/save-public-space', $scope.data) - .then(data => { - if (data.result === 1) { - $rootScope.userObjects = $scope.data; - } - }); + connection.post('/api/company/save-public-space', $scope.data).then(data => { + if (data.result === 1) { + $rootScope.userObjects = $scope.data; + } + }); }; $scope.remove = function (scope) { diff --git a/public/js/users/controller.js b/public/js/users/controller.js index a4723f0a..ea4fcaae 100644 --- a/public/js/users/controller.js +++ b/public/js/users/controller.js @@ -1,4 +1,4 @@ -angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, $q, $filter, $window, $routeParams, $rootScope, PagerService) { +angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, $q, $filter, $window, $routeParams, $rootScope, pager) { $scope.deleteModal = '/partial/private/deleteModal.html'; $scope.changePasswordModal = '/partials/users/changePassword.html'; $scope.page = null; @@ -80,7 +80,7 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, if ($scope._User.pwd1.length >= 8 && $scope._User.pwd1 === $scope._User.pwd2) { isOk = true; } if (isOk) { - connection.post('/api/change-my-password', {pwd1: $scope._User.pwd1, pwd2: $scope._User.pwd2}, function (data) { + connection.post('/api/change-my-password', {pwd1: $scope._User.pwd1, pwd2: $scope._User.pwd2}).then(function (data) { $('#changePasswordModal').modal('hide'); }); } @@ -90,20 +90,20 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, if ($routeParams.userID) { if (!$scope.roles) { loadRoles(); } - connection.get('/api/admin/users/find-one', {id: $routeParams.userID}, function (data) { + connection.get('/api/admin/users/find-one', {id: $routeParams.userID}).then(function (data) { $scope._User = data.item; $scope.mode = 'edit'; }); - connection.get('/api/get-user-counts/' + $routeParams.userID, {userID: $routeParams.userID}, function (data) { + connection.get('/api/get-user-counts/' + $routeParams.userID, {userID: $routeParams.userID}).then(function (data) { $scope.userCounts = data; }); - connection.get('/api/get-user-reports/' + $routeParams.userID, {userID: $routeParams.userID}, function (data) { + connection.get('/api/get-user-reports/' + $routeParams.userID, {userID: $routeParams.userID}).then(function (data) { $scope.userReports = data.items; }); - connection.get('/api/get-user-dashboards/' + $routeParams.userID, {userID: $routeParams.userID}, function (data) { + connection.get('/api/get-user-dashboards/' + $routeParams.userID, {userID: $routeParams.userID}).then(function (data) { $scope.userDashboards = data.items; }); }; @@ -111,12 +111,12 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, $scope.save = function () { if ($scope.mode === 'new') { - connection.post('/api/admin/users/create', $scope._User, function (data) { + connection.post('/api/admin/users/create', $scope._User).then(function (data) { $('#editUserModal').modal('hide'); $scope.users.push($scope._User); }); } else { - connection.post('/api/admin/users/update/' + $scope._User._id, $scope._User, function (data) { + connection.post('/api/admin/users/update/' + $scope._User._id, $scope._User).then(function (data) { $('#editUserModal').modal('hide'); }); } @@ -130,7 +130,7 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, var data = {userID: user._id, status: newStatus}; - connection.post('/api/admin/users/change-user-status', data, function (result) { + connection.post('/api/admin/users/change-user-status', data).then(function (result) { user.status = newStatus; }); } @@ -167,11 +167,11 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, if (fields) params.fields = fields; - connection.get('/api/admin/users/find-all', params, function (data) { + connection.get('/api/admin/users/find-all', params).then(function (data) { $scope.users = data.items; $scope.page = data.page; $scope.pages = data.pages; - $scope.pager = PagerService.GetPager($scope.users.length, data.page, 10, data.pages); + $scope.pager = pager.getPager(data.page, data.pages); }); }; @@ -188,21 +188,11 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, if ($('#users-form').valid()) { data.filters = getFilters(); - connection.post('/api/admin/users/create', data, function (data) { + connection.post('/api/admin/users/create', data).then(function (data) { if (data.result === 1) window.location.hash = '/admin/users'; }); } }; - /* - $scope.editUser = function(data) { - //if ($('#users-form').valid()) { - data.filters = getFilters(); - - connection.post('/api/admin/users/update/'+data._id, data, function(data) { - if (data.result === 1) window.location.hash = '/admin/users'; - }); - //} - }; */ $scope.editUser = function () { $('#editUserModal').modal('show'); @@ -240,13 +230,13 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, $scope.confirmDelete = function (id) { $('#deleteModal').modal('hide'); - connection.post('/api/admin/users/delete/' + $scope.delete_id, {id: $scope.delete_id}, function (data) { + connection.post('/api/admin/users/delete/' + $scope.delete_id, {id: $scope.delete_id}).then(function (data) { $('#' + $scope.delete_id).remove(); }); }; $scope.changeUser = function (data) { - connection.post('/api/login?s=change-user', {userName: data.userName}, function (data) { + connection.post('/api/login?s=change-user', {userName: data.userName}).then(function (data) { $window.location.href = '/home'; }); }; @@ -259,7 +249,7 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, } function loadLanguages (callLater) { - connection.get('/api/admin/languages/find-all', {}, function (data) { + connection.get('/api/admin/languages/find-all', {}).then(function (data) { $scope.languages = []; for (var i in data.items) { $scope.languages.push({name: data.items[i].description, value: data.items[i].language}); } @@ -269,7 +259,7 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, } function loadRoles (callLater) { - connection.get('/api/roles/find-all', {}, function (data) { + connection.get('/api/roles/find-all', {}).then(function (data) { $scope.roles = data.items; var adminRole = {_id: 'WSTADMIN', name: 'Urungi Administrator'}; @@ -280,7 +270,7 @@ angular.module('app').controller('AdminUsersCtrl', function ($scope, connection, } function loadFilters (callLater) { - connection.get('/api/admin/configurations/find-user-filters', {}, function (data) { + connection.get('/api/admin/configurations/find-user-filters', {}).then(function (data) { $scope.filters = data.filters; if (typeof callLater !== 'undefined') { callLater(); } diff --git a/public/js/webapp.js b/public/js/webapp.js index 9a7cfae7..5aab159c 100644 --- a/public/js/webapp.js +++ b/public/js/webapp.js @@ -6,7 +6,7 @@ angular.module('app', [ 'urungi.directives', 'ngSanitize', 'ui.select', 'angularUUID2', 'vs-repeat', 'ui.bootstrap.datetimepicker', 'ui.tree', 'page.block', 'bsLoadingOverlay', 'xeditable', 'intro.help', 'ngFileUpload', 'colorpicker.module', - 'wst.inspector', 'gettext', 'ngFileSaver' + 'wst.inspector', 'gettext', 'ngFileSaver', 'app.core', 'app.data-sources' ]) .config(['$routeProvider', function ($routeProvider) { $routeProvider.otherwise({redirectTo: '/home'}); @@ -78,38 +78,6 @@ angular.module('app', [ controller: 'reportCtrl' }); - // Data sources - - $routeProvider.when('/data-sources', { - templateUrl: 'partials/data-source/list.html', - controller: 'dataSourceCtrl' - }); - - $routeProvider.when('/datasources/:extra', { - templateUrl: 'partials/data-source/list.html', - controller: 'dataSourceCtrl' - }); - - $routeProvider.when('/data-sources/:dataSourceID/', { - templateUrl: 'partials/data-source/edit.html', - controller: 'dataSourceCtrl' - }); - - $routeProvider.when('/data-sources/edit/:dataSourceID/', { - templateUrl: 'partials/data-source/edit.html', - controller: 'dataSourceCtrl' - }); - - $routeProvider.when('/data_sources/new/:newDataSource/', { - templateUrl: 'partials/data-source/edit.html', - controller: 'dataSourceCtrl' - }); - - $routeProvider.when('/datasources/new/:newDataSource/:extra', { - templateUrl: 'partials/data-source/edit.html', - controller: 'dataSourceCtrl' - }); - // layers $routeProvider.when('/layers', { @@ -331,14 +299,14 @@ angular.module('app').run(['$rootScope', '$sessionStorage', 'connection', functi $rootScope.setUserContextHelpViewed = function (contextHelpName) { var params = {}; params.contextHelpName = contextHelpName; - connection.get('/api/set-viewed-context-help', params, function (data) { + connection.get('/api/set-viewed-context-help', params).then(function (data) { $rootScope.user.contextHelp = data.items; }); }; $rootScope.user = $sessionStorage.getObject('user'); if (!$rootScope.user) { - connection.get('/api/get-user-data', {}, function (data) { + connection.get('/api/get-user-data', {}).then(function (data) { if (!data.items.user) { window.location.href = '/login'; return; diff --git a/public/partials/data-source/dataSourceName.html b/public/partials/data-source/dataSourceName.html deleted file mode 100644 index 1e70dea0..00000000 --- a/public/partials/data-source/dataSourceName.html +++ /dev/null @@ -1,18 +0,0 @@ - - - \ No newline at end of file diff --git a/public/partials/data-source/edit.html b/public/partials/data-source/edit.html deleted file mode 100644 index 654b5c0e..00000000 --- a/public/partials/data-source/edit.html +++ /dev/null @@ -1,108 +0,0 @@ -
- Save Datasource - Cancel -
-
- -
- -
-
-
- - -
-
-
-
- - -
-
- -
-
- - -
-
- -
-
- - -
-
- -
-
- - - -
-
- -
-
- - -
- - Select File -
- {{fileUploadMessage}} - {{fileUploadMessage}} -
-
- -
-
- - -
-
- -
-
- - -
-
- -
-
-
- - -
-
-
- -
- Test Connection - -
- {{testConnection.message}} -
-
- {{testConnection.errorMessage}} -
-
-
-
- - - -
- - -
- -
diff --git a/public/partials/data-sources/edit.html b/public/partials/data-sources/edit.html new file mode 100644 index 00000000..7f76a778 --- /dev/null +++ b/public/partials/data-sources/edit.html @@ -0,0 +1,108 @@ +
+ Save Datasource + Cancel +
+
+ +
+ +
+
+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + +
+
+ +
+
+ + +
+ + Select File +
+ {{vm.fileUploadMessage}} + {{vm.fileUploadMessage}} +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+
+ + +
+
+
+ +
+ Test Connection + +
+ {{vm.testConnection.message}} +
+
+ {{vm.testConnection.errorMessage}} +
+
+
+
+ + + +
+ + +
+ +
diff --git a/public/partials/data-source/list.html b/public/partials/data-sources/list.html similarity index 50% rename from public/partials/data-source/list.html rename to public/partials/data-sources/list.html index 138bbdca..b3806de6 100644 --- a/public/partials/data-source/list.html +++ b/public/partials/data-sources/list.html @@ -1,4 +1,4 @@ -
+
@@ -10,12 +10,12 @@

Data sources

- New Data Source + New Data Source
-
- +
+ {{dts.type}}

{{dts.name}}

@@ -28,21 +28,21 @@

-
    -
  • - First + diff --git a/public/partials/files/galleryModal.html b/public/partials/files/galleryModal.html index 6015aced..969e287f 100644 --- a/public/partials/files/galleryModal.html +++ b/public/partials/files/galleryModal.html @@ -70,8 +70,4 @@

- - diff --git a/public/partials/layer/elementModal.html b/public/partials/layer/elementModal.html index 8a13e46c..ecb5a38c 100644 --- a/public/partials/layer/elementModal.html +++ b/public/partials/layer/elementModal.html @@ -82,8 +82,7 @@

- +
diff --git a/public/partials/layer/objectProperties.html b/public/partials/layer/objectProperties.html index 1731aff2..bd39fdd0 100644 --- a/public/partials/layer/objectProperties.html +++ b/public/partials/layer/objectProperties.html @@ -102,7 +102,7 @@
- +
diff --git a/test/client/core/pager.spec.js b/test/client/core/pager.spec.js new file mode 100644 index 00000000..064057b8 --- /dev/null +++ b/test/client/core/pager.spec.js @@ -0,0 +1,22 @@ +describe('pager', function () { + beforeEach(module('app.core')); + + let pager; + + beforeEach(inject(function (_pager_) { + pager = _pager_; + })); + + describe('getPager', function () { + it('should return a list of pages', function () { + let p = pager.getPager(1, 3); + expect(p.pages).toEqual([1, 2, 3]); + + p = pager.getPager(1, 13); + expect(p.pages).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); + + p = pager.getPager(11, 13); + expect(p.pages).toEqual([4, 5, 6, 7, 8, 9, 10, 11, 12, 13]); + }); + }); +}); diff --git a/test/client/data-sources/data-sources-list.controller.spec.js b/test/client/data-sources/data-sources-list.controller.spec.js new file mode 100644 index 00000000..3ebcc630 --- /dev/null +++ b/test/client/data-sources/data-sources-list.controller.spec.js @@ -0,0 +1,60 @@ +describe('DataSourcesListController', function () { + beforeEach(module('app.data-sources')); + + let $controller, $httpBackend; + let vm; + + beforeEach(inject(function (_$controller_, _$httpBackend_) { + $controller = _$controller_; + $httpBackend = _$httpBackend_; + + const $scope = {}; + vm = $controller('DataSourcesListController', { $scope: $scope }); + })); + + afterEach(function () { + $httpBackend.verifyNoOutstandingExpectation(); + $httpBackend.verifyNoOutstandingRequest(); + }); + + describe('intro options', function () { + it('should have a length of 7', function () { + expect(vm.IntroOptions).toBeDefined(); + expect(vm.IntroOptions.steps).toBeDefined(); + expect(vm.IntroOptions.steps.length).toBe(7); + }); + }); + + describe('getDataSources', function () { + it('should populate items', function () { + $httpBackend.expect('GET', '/api/data-sources/find-all?page=1') + .respond(getDataSourcesFindAllResponse()); + vm.getDataSources(); + $httpBackend.flush(); + + expect(vm.items).toBeDefined(); + expect(vm.items.length).toBe(1); + expect(vm.items[0]._id).toBe('fakeid'); + }); + + function getDataSourcesFindAllResponse () { + return { + result: 1, + page: 1, + pages: 1, + items: [ + { + _id: 'fakeid', + connection: { + host: 'localhost', + port: 3306, + database: 'database', + }, + type: 'MySQL', + name: 'Database', + } + ], + }; + } + }); +}); diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index 55df6d5e..00000000 --- a/test/mocha.opts +++ /dev/null @@ -1,3 +0,0 @@ --C ---recursive ---timeout 10000 diff --git a/views/index.ejs b/views/index.ejs index 293e88e0..4865f2aa 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -32,12 +32,14 @@ - + + + + - @@ -49,9 +51,10 @@ - - - + + + +