From f5e2ea47fd1816488987788b3f516a53d543d22a Mon Sep 17 00:00:00 2001 From: Thomas Gilgan Date: Wed, 16 Oct 2019 15:44:22 +0100 Subject: [PATCH] Migrate UI to nortem (#16) * migrate config editor ui to nortem repo --- .gitignore | 45 +- config-editor/config-editor-ui/.editorconfig | 13 + config-editor/config-editor-ui/README.md | 34 +- config-editor/config-editor-ui/angular.json | 131 + config-editor/config-editor-ui/browserslist | 3 + config-editor/config-editor-ui/karma.conf.js | 44 + .../config-editor-ui/npm-shrinkwrap.json | 13749 ++++++++++++++++ config-editor/config-editor-ui/package.json | 77 + .../config-editor-ui/protractor.conf.js | 28 + .../src/app/app-routing/app-routing.module.ts | 23 + .../custom-router-state-serializer.ts | 28 + .../src/app/app-routing/index.ts | 3 + .../src/app/app-routing/router-state-url.ts | 7 + .../config-editor-ui/src/app/app.component.ts | 7 + .../config-editor-ui/src/app/app.module.ts | 212 + .../config-editor-ui/src/app/commons/index.ts | 1 + .../src/app/commons/status-code.ts | 6 + .../change-history.component.html | 11 + .../change-history.component.scss | 39 + .../change-history.component.ts | 26 + .../config-manager.component.html | 65 + .../config-manager.component.scss | 205 + .../config-manager.component.ts | 254 + .../deploy-dialog.component.html | 66 + .../deploy-dialog.component.scss | 41 + .../deploy-dialog/deploy-dialog.component.ts | 131 + .../editor-view/editor-view.component.html | 9 + .../editor-view/editor-view.component.scss | 25 + .../editor-view/editor-view.component.ts | 31 + .../components/editor/editor.component.html | 37 + .../components/editor/editor.component.scss | 79 + .../app/components/editor/editor.component.ts | 292 + .../error-dialog/error-dialog.component.html | 10 + .../error-dialog/error-dialog.component.scss | 17 + .../error-dialog/error-dialog.component.ts | 18 + .../src/app/components/index.ts | 10 + .../init-component/init.component.ts | 90 + .../json-viewer/json-viewer.component.html | 11 + .../json-viewer/json-viewer.component.scss | 15 + .../json-viewer/json-viewer.component.ts | 37 + .../landing-page/landing-page.component.html | 15 + .../landing-page/landing-page.component.scss | 46 + .../landing-page/landing-page.component.ts | 35 + .../components/nav-bar/nav-bar.component.html | 20 + .../components/nav-bar/nav-bar.component.scss | 69 + .../components/nav-bar/nav-bar.component.ts | 38 + .../components/search/search.component.html | 14 + .../components/search/search.component.scss | 32 + .../app/components/search/search.component.ts | 47 + .../side-bar/side-bar.component.html | 11 + .../side-bar/side-bar.component.scss | 24 + .../components/side-bar/side-bar.component.ts | 37 + .../submit-dialog.component.html | 48 + .../submit-dialog.component.scss | 25 + .../submit-dialog/submit-dialog.component.ts | 53 + .../testing-dialog.component.html | 42 + .../testing-dialog.component.scss | 91 + .../testing-dialog.component.ts | 154 + .../tile/config-tile.component.html | 35 + .../tile/config-tile.component.scss | 167 + .../components/tile/config-tile.component.ts | 33 + .../tile/deployment-tile.component.html | 24 + .../tile/deployment-tile.component.ts | 32 + .../src/app/config-loader.service.ts | 345 + .../src/app/config/app-config.service.ts | 59 + .../src/app/config/config.module.ts | 17 + .../src/app/config/editor-config.ts | 4 + .../config-editor-ui/src/app/config/index.ts | 3 + .../app/containers/home/home.component.html | 6 + .../app/containers/home/home.component.scss | 12 + .../src/app/containers/home/home.component.ts | 12 + .../src/app/containers/index.ts | 2 + .../page-not-found.component.scss | 7 + .../page-not-found.component.ts | 9 + .../src/app/core/core.module.ts | 16 + .../config-editor-ui/src/app/core/index.ts | 1 + .../src/app/credentials-interceptor.ts | 14 + .../src/app/editor.service.ts | 91 + .../src/app/guards/config-store.guard.ts | 32 + .../config-editor-ui/src/app/guards/index.ts | 3 + .../src/app/guards/repo.resolver.ts | 25 + .../src/app/guards/view.resolver.ts | 32 + .../src/app/model/config-model.ts | 102 + .../config-editor-ui/src/app/model/index.ts | 7 + .../config-editor-ui/src/app/model/schema.ts | 11 + .../src/app/model/sensor-fields.ts | 12 + .../src/app/model/submit-status.ts | 24 + .../src/app/model/ui-metadata-map.ts | 23 + .../app/ngx-formly/components/array.type.ts | 128 + .../expansion-panel-wrapper.component.ts | 23 + .../form-field-wrapper.component.ts | 138 + .../components/input.type.component.ts | 38 + .../app/ngx-formly/components/null.type.ts | 9 + .../components/object.type.component.ts | 23 + .../components/panel-wrapper.component.ts | 34 + .../components/tabs-wrapper.component.ts | 17 + .../components/tabset.type.component.ts | 19 + .../components/textarea.type.component.ts | 157 + .../ngx-formly/formly-json-schema.service.ts | 328 + .../ngx-formly/util/jsonpointer.functions.ts | 299 + .../app/ngx-formly/util/utility.functions.ts | 34 + .../ngx-formly/util/validator.functions.ts | 76 + .../src/app/pipes/highlight-variables.pipe.ts | 25 + .../config-editor-ui/src/app/pipes/index.ts | 2 + .../src/app/pipes/strip-suffix.pipe.ts | 15 + .../app/popover/hover-popover.directive.ts | 55 + .../src/app/popover/popover-ref.ts | 27 + .../popover/popover-renderer.component.html | 11 + .../popover/popover-renderer.component.scss | 7 + .../app/popover/popover-renderer.component.ts | 28 + .../src/app/popover/popover-service.ts | 77 + .../config-editor-ui/src/app/popup.service.ts | 30 + .../config-editor-ui/src/app/shared/index.ts | 1 + .../src/app/shared/shared.module.ts | 60 + .../src/app/store/editor.actions.ts | 268 + .../src/app/store/editor.effects.ts | 179 + .../src/app/store/editor.reducer.ts | 323 + .../config-editor-ui/src/app/store/index.ts | 159 + .../src/app/store/router-actions.ts | 28 + .../src/app/store/router-effects.ts | 89 + .../src/app/text-diff/format-line.pipe.ts | 19 + .../loader-spinner.component.css | 85 + .../loader-spinner.component.html | 10 + .../loader-spinner.component.ts | 15 + .../ngx-text-diff-container.directive.ts | 15 + .../app/text-diff/ngx-text-diff.component.css | 252 + .../text-diff/ngx-text-diff.component.html | 120 + .../app/text-diff/ngx-text-diff.component.ts | 208 + .../src/app/text-diff/ngx-text-diff.model.ts | 46 + .../src/app/text-diff/ngx-text-diff.module.ts | 16 + .../app/text-diff/ngx-text-diff.service.ts | 227 + .../src/app/text-diff/ngx-text-diff.utils.ts | 2 + .../config-editor-ui/src/assets/.gitkeep | 0 .../config-editor-ui/src/assets/gr.png | Bin 0 -> 5340 bytes .../config-editor-ui/src/assets/grbig.png | Bin 0 -> 19282 bytes .../src/environments/environment.prod.ts | 3 + .../src/environments/environment.ts | 8 + .../config-editor-ui/src/favicon.ico | Bin 0 -> 1150 bytes .../config-editor-ui/src/gr-palette.scss | 32 + config-editor/config-editor-ui/src/index.html | 60 + config-editor/config-editor-ui/src/main.ts | 11 + .../config-editor-ui/src/polyfills.ts | 74 + .../config-editor-ui/src/rxjs.imports.ts | 12 + .../config-editor-ui/src/styles.scss | 39 + .../config-editor-ui/src/testing/index.ts | 2 + .../src/testing/material-stub/index.ts | 1 + .../material-stub/material-stub.module.ts | 55 + .../testing/material-stub/material-stubs.ts | 240 + .../src/testing/ngrx-stubs.ts | 40 + .../src/testing/router-stub/index.ts | 1 + .../testing/router-stub/router-stub.module.ts | 15 + .../src/testing/router-stub/router-stubs.ts | 20 + .../src/testing/testing.module.ts | 15 + .../config-editor-ui/src/tsconfig.app.json | 13 + .../config-editor-ui/src/typings.d.ts | 5 + config-editor/config-editor-ui/tsconfig.json | 29 + config-editor/config-editor-ui/tslint.json | 156 + 157 files changed, 22442 insertions(+), 2 deletions(-) create mode 100644 config-editor/config-editor-ui/.editorconfig create mode 100644 config-editor/config-editor-ui/angular.json create mode 100644 config-editor/config-editor-ui/browserslist create mode 100644 config-editor/config-editor-ui/karma.conf.js create mode 100644 config-editor/config-editor-ui/npm-shrinkwrap.json create mode 100644 config-editor/config-editor-ui/package.json create mode 100644 config-editor/config-editor-ui/protractor.conf.js create mode 100644 config-editor/config-editor-ui/src/app/app-routing/app-routing.module.ts create mode 100644 config-editor/config-editor-ui/src/app/app-routing/custom-router-state-serializer.ts create mode 100644 config-editor/config-editor-ui/src/app/app-routing/index.ts create mode 100644 config-editor/config-editor-ui/src/app/app-routing/router-state-url.ts create mode 100644 config-editor/config-editor-ui/src/app/app.component.ts create mode 100644 config-editor/config-editor-ui/src/app/app.module.ts create mode 100644 config-editor/config-editor-ui/src/app/commons/index.ts create mode 100644 config-editor/config-editor-ui/src/app/commons/status-code.ts create mode 100644 config-editor/config-editor-ui/src/app/components/change-history/change-history.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/change-history/change-history.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/change-history/change-history.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/editor/editor.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/editor/editor.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/editor/editor.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/index.ts create mode 100644 config-editor/config-editor-ui/src/app/components/init-component/init.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/search/search.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/search/search.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/search/search.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/tile/config-tile.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/tile/config-tile.component.scss create mode 100644 config-editor/config-editor-ui/src/app/components/tile/config-tile.component.ts create mode 100644 config-editor/config-editor-ui/src/app/components/tile/deployment-tile.component.html create mode 100644 config-editor/config-editor-ui/src/app/components/tile/deployment-tile.component.ts create mode 100644 config-editor/config-editor-ui/src/app/config-loader.service.ts create mode 100644 config-editor/config-editor-ui/src/app/config/app-config.service.ts create mode 100644 config-editor/config-editor-ui/src/app/config/config.module.ts create mode 100644 config-editor/config-editor-ui/src/app/config/editor-config.ts create mode 100644 config-editor/config-editor-ui/src/app/config/index.ts create mode 100644 config-editor/config-editor-ui/src/app/containers/home/home.component.html create mode 100644 config-editor/config-editor-ui/src/app/containers/home/home.component.scss create mode 100644 config-editor/config-editor-ui/src/app/containers/home/home.component.ts create mode 100644 config-editor/config-editor-ui/src/app/containers/index.ts create mode 100644 config-editor/config-editor-ui/src/app/containers/page-not-found/page-not-found.component.scss create mode 100644 config-editor/config-editor-ui/src/app/containers/page-not-found/page-not-found.component.ts create mode 100644 config-editor/config-editor-ui/src/app/core/core.module.ts create mode 100644 config-editor/config-editor-ui/src/app/core/index.ts create mode 100644 config-editor/config-editor-ui/src/app/credentials-interceptor.ts create mode 100644 config-editor/config-editor-ui/src/app/editor.service.ts create mode 100644 config-editor/config-editor-ui/src/app/guards/config-store.guard.ts create mode 100644 config-editor/config-editor-ui/src/app/guards/index.ts create mode 100644 config-editor/config-editor-ui/src/app/guards/repo.resolver.ts create mode 100644 config-editor/config-editor-ui/src/app/guards/view.resolver.ts create mode 100644 config-editor/config-editor-ui/src/app/model/config-model.ts create mode 100644 config-editor/config-editor-ui/src/app/model/index.ts create mode 100644 config-editor/config-editor-ui/src/app/model/schema.ts create mode 100644 config-editor/config-editor-ui/src/app/model/sensor-fields.ts create mode 100644 config-editor/config-editor-ui/src/app/model/submit-status.ts create mode 100644 config-editor/config-editor-ui/src/app/model/ui-metadata-map.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/array.type.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/expansion-panel-wrapper.component.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/form-field-wrapper.component.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/input.type.component.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/null.type.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/object.type.component.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/panel-wrapper.component.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/tabs-wrapper.component.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/tabset.type.component.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/components/textarea.type.component.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/formly-json-schema.service.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/util/jsonpointer.functions.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/util/utility.functions.ts create mode 100644 config-editor/config-editor-ui/src/app/ngx-formly/util/validator.functions.ts create mode 100644 config-editor/config-editor-ui/src/app/pipes/highlight-variables.pipe.ts create mode 100644 config-editor/config-editor-ui/src/app/pipes/index.ts create mode 100644 config-editor/config-editor-ui/src/app/pipes/strip-suffix.pipe.ts create mode 100644 config-editor/config-editor-ui/src/app/popover/hover-popover.directive.ts create mode 100644 config-editor/config-editor-ui/src/app/popover/popover-ref.ts create mode 100644 config-editor/config-editor-ui/src/app/popover/popover-renderer.component.html create mode 100644 config-editor/config-editor-ui/src/app/popover/popover-renderer.component.scss create mode 100644 config-editor/config-editor-ui/src/app/popover/popover-renderer.component.ts create mode 100644 config-editor/config-editor-ui/src/app/popover/popover-service.ts create mode 100644 config-editor/config-editor-ui/src/app/popup.service.ts create mode 100644 config-editor/config-editor-ui/src/app/shared/index.ts create mode 100644 config-editor/config-editor-ui/src/app/shared/shared.module.ts create mode 100644 config-editor/config-editor-ui/src/app/store/editor.actions.ts create mode 100644 config-editor/config-editor-ui/src/app/store/editor.effects.ts create mode 100644 config-editor/config-editor-ui/src/app/store/editor.reducer.ts create mode 100644 config-editor/config-editor-ui/src/app/store/index.ts create mode 100644 config-editor/config-editor-ui/src/app/store/router-actions.ts create mode 100644 config-editor/config-editor-ui/src/app/store/router-effects.ts create mode 100644 config-editor/config-editor-ui/src/app/text-diff/format-line.pipe.ts create mode 100644 config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.css create mode 100644 config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.html create mode 100644 config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.ts create mode 100644 config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff-container.directive.ts create mode 100644 config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.css create mode 100644 config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.html create mode 100644 config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.ts create mode 100644 config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.model.ts create mode 100644 config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.module.ts create mode 100644 config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.service.ts create mode 100644 config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.utils.ts create mode 100644 config-editor/config-editor-ui/src/assets/.gitkeep create mode 100644 config-editor/config-editor-ui/src/assets/gr.png create mode 100644 config-editor/config-editor-ui/src/assets/grbig.png create mode 100644 config-editor/config-editor-ui/src/environments/environment.prod.ts create mode 100644 config-editor/config-editor-ui/src/environments/environment.ts create mode 100644 config-editor/config-editor-ui/src/favicon.ico create mode 100644 config-editor/config-editor-ui/src/gr-palette.scss create mode 100644 config-editor/config-editor-ui/src/index.html create mode 100644 config-editor/config-editor-ui/src/main.ts create mode 100644 config-editor/config-editor-ui/src/polyfills.ts create mode 100644 config-editor/config-editor-ui/src/rxjs.imports.ts create mode 100644 config-editor/config-editor-ui/src/styles.scss create mode 100644 config-editor/config-editor-ui/src/testing/index.ts create mode 100644 config-editor/config-editor-ui/src/testing/material-stub/index.ts create mode 100644 config-editor/config-editor-ui/src/testing/material-stub/material-stub.module.ts create mode 100644 config-editor/config-editor-ui/src/testing/material-stub/material-stubs.ts create mode 100644 config-editor/config-editor-ui/src/testing/ngrx-stubs.ts create mode 100644 config-editor/config-editor-ui/src/testing/router-stub/index.ts create mode 100644 config-editor/config-editor-ui/src/testing/router-stub/router-stub.module.ts create mode 100644 config-editor/config-editor-ui/src/testing/router-stub/router-stubs.ts create mode 100644 config-editor/config-editor-ui/src/testing/testing.module.ts create mode 100644 config-editor/config-editor-ui/src/tsconfig.app.json create mode 100644 config-editor/config-editor-ui/src/typings.d.ts create mode 100644 config-editor/config-editor-ui/tsconfig.json create mode 100644 config-editor/config-editor-ui/tslint.json diff --git a/.gitignore b/.gitignore index d1ddbabc..29e419d7 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,47 @@ pom.xml.versionsBackup *.pyc #Storm -worker.yaml \ No newline at end of file +worker.yaml + +## Angular + +# compiled output +/dist +/dist-test +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db diff --git a/config-editor/config-editor-ui/.editorconfig b/config-editor/config-editor-ui/.editorconfig new file mode 100644 index 00000000..6e87a003 --- /dev/null +++ b/config-editor/config-editor-ui/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/config-editor/config-editor-ui/README.md b/config-editor/config-editor-ui/README.md index 3796a0ce..c875a547 100644 --- a/config-editor/config-editor-ui/README.md +++ b/config-editor/config-editor-ui/README.md @@ -1 +1,33 @@ -"# config-editor-ui" +# Config Editor UI + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.0.6. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|module`. + +## Install + +If Angular CLI is not installed, follow instructions from: https://confluence.uberit.net/display/DEVGLO/Web+Application+Development (`Installation` section) +Then run `npm install` + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). +Before running the tests make sure you are serving the app via `ng serve`. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/config-editor/config-editor-ui/angular.json b/config-editor/config-editor-ui/angular.json new file mode 100644 index 00000000..35ee452f --- /dev/null +++ b/config-editor/config-editor-ui/angular.json @@ -0,0 +1,131 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ruleeditor": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "tsConfig": "src/tsconfig.app.json", + "polyfills": "src/polyfills.ts", + "assets": [ + { "glob": "**/*", "input": "node_modules/ngx-monaco-editor/assets/monaco", "output": "./assets/monaco/" }, + "src/assets", + "src/favicon.ico", + "src/config.json" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "ruleeditor:build" + }, + "configurations": { + "production": { + "browserTarget": "ruleeditor:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ruleeditor:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "karmaConfig": "./karma.conf.js", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "scripts": [], + "styles": [ + "src/styles.scss" + ], + "assets": [ + "src/assets", + "src/favicon.ico", + "src/config.json" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [] + } + } + } + }, + "ruleeditor-e2e": { + "root": "", + "sourceRoot": "", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "./protractor.conf.js", + "devServerTarget": "ruleeditor:serve" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "e2e/tsconfig.e2e.json" + ], + "exclude": [] + } + } + } + } + }, + "defaultProject": "ruleeditor", + "schematics": { + "@schematics/angular:component": { + "prefix": "re", + "styleext": "scss" + }, + "@schematics/angular:directive": { + "prefix": "re" + } + } +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/browserslist b/config-editor/config-editor-ui/browserslist new file mode 100644 index 00000000..99a0f20b --- /dev/null +++ b/config-editor/config-editor-ui/browserslist @@ -0,0 +1,3 @@ +Firefox ESR # the latest [Firefox ESR] version. +not dead # Don't support outdated browsers +not IE 9-11 # Don't support IE 9 - 11 \ No newline at end of file diff --git a/config-editor/config-editor-ui/karma.conf.js b/config-editor/config-editor-ui/karma.conf.js new file mode 100644 index 00000000..056b4e9b --- /dev/null +++ b/config-editor/config-editor-ui/karma.conf.js @@ -0,0 +1,44 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/0.13/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client:{ + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + files: [ + + ], + preprocessors: { + + }, + mime: { + 'text/x-typescript': ['ts','tsx'] + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: config.angularCli && config.angularCli.codeCoverage + ? ['progress', 'coverage-istanbul'] + : ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/config-editor/config-editor-ui/npm-shrinkwrap.json b/config-editor/config-editor-ui/npm-shrinkwrap.json new file mode 100644 index 00000000..d09570c5 --- /dev/null +++ b/config-editor/config-editor-ui/npm-shrinkwrap.json @@ -0,0 +1,13749 @@ +{ + "name": "rule-editor.ui", + "version": "1.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.803.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/architect/-/architect-0.803.1.tgz", + "integrity": "sha1-mG51XU6ROr9usgDeskekrTP2XuA=", + "requires": { + "@angular-devkit/core": "8.3.1", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.803.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/build-angular/-/build-angular-0.803.1.tgz", + "integrity": "sha1-RZGhX5mIJxasT454g78iJ8vshR0=", + "requires": { + "@angular-devkit/architect": "0.803.1", + "@angular-devkit/build-optimizer": "0.803.1", + "@angular-devkit/build-webpack": "0.803.1", + "@angular-devkit/core": "8.3.1", + "@babel/core": "7.5.5", + "@babel/preset-env": "7.5.5", + "@ngtools/webpack": "8.3.1", + "ajv": "6.10.2", + "autoprefixer": "9.6.1", + "browserslist": "4.6.6", + "cacache": "12.0.2", + "caniuse-lite": "1.0.30000989", + "circular-dependency-plugin": "5.2.0", + "clean-css": "4.2.1", + "copy-webpack-plugin": "5.0.4", + "core-js": "3.2.1", + "file-loader": "4.2.0", + "find-cache-dir": "3.0.0", + "glob": "7.1.4", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.4.0", + "less": "3.9.0", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.2", + "loader-utils": "1.2.3", + "mini-css-extract-plugin": "0.8.0", + "minimatch": "3.0.4", + "open": "6.4.0", + "parse5": "4.0.0", + "postcss": "7.0.17", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "3.1.0", + "rxjs": "6.4.0", + "sass": "1.22.9", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "source-map": "0.7.3", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.13", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "1.0.0", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser": "4.1.4", + "terser-webpack-plugin": "1.4.1", + "tree-kill": "1.2.1", + "webpack": "4.39.2", + "webpack-dev-middleware": "3.7.0", + "webpack-dev-server": "3.8.0", + "webpack-merge": "4.2.1", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.1.0-rc.6", + "worker-farm": "1.7.0", + "worker-plugin": "3.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=", + "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" + } + }, + "core-js": { + "version": "3.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha1-zUHzhTTabMWffbBQ/mcwfemGiwk=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "glob": { + "version": "7.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/glob/-/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "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" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha1-bXhlbj2o14tOwLkG98CO8d/j9gg=" + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/semver/-/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=" + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=" + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha1-MbJKnC5zwt6FBmwP631Edn7VKTI=", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.803.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/build-optimizer/-/build-optimizer-0.803.1.tgz", + "integrity": "sha1-tVLqhfD5W/2IkYuB2/Sn3+OV1hc=", + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "tslib": "1.10.0", + "typescript": "3.5.3", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=" + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha1-w8GflZc/sKYpc/sJ2Q2WHuQ+XIo=" + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.803.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/build-webpack/-/build-webpack-0.803.1.tgz", + "integrity": "sha1-/PJ3Parev8jWK4A2phQ9XIuygcA=", + "requires": { + "@angular-devkit/architect": "0.803.1", + "@angular-devkit/core": "8.3.1", + "rxjs": "6.4.0", + "webpack-merge": "4.2.1" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "8.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/core/-/core-8.3.1.tgz", + "integrity": "sha1-a+UmvZxjUbGqrD6aCD+77s25yEg=", + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=", + "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" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=" + } + } + }, + "@angular-devkit/schematics": { + "version": "8.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/schematics/-/schematics-8.3.1.tgz", + "integrity": "sha1-qjz+VOBHu6Dz635kHnr99t89Mq4=", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.1", + "rxjs": "6.4.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "8.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/core/-/core-8.3.1.tgz", + "integrity": "sha1-a+UmvZxjUbGqrD6aCD+77s25yEg=", + "dev": true, + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=", + "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" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", + "dev": true + } + } + }, + "@angular/animations": { + "version": "8.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/animations/-/animations-8.2.4.tgz", + "integrity": "sha1-B4D5y5ii7D1D2AxCl2QgWXky3DY=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "8.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/cdk/-/cdk-8.1.4.tgz", + "integrity": "sha1-aQZgU/5MvYDO4rt/ojjxyau5Y/w=", + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + } + }, + "@angular/cli": { + "version": "8.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/cli/-/cli-8.3.1.tgz", + "integrity": "sha1-RV4o6bv/viM5dcLOGnQJbeb/hlw=", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.1", + "@angular-devkit/core": "8.3.1", + "@angular-devkit/schematics": "8.3.1", + "@schematics/angular": "8.3.1", + "@schematics/update": "0.803.1", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.5.1", + "npm-package-arg": "6.1.0", + "open": "6.4.0", + "pacote": "9.5.5", + "read-package-tree": "5.3.1", + "semver": "6.3.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.803.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/architect/-/architect-0.803.1.tgz", + "integrity": "sha1-mG51XU6ROr9usgDeskekrTP2XuA=", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.1", + "rxjs": "6.4.0" + } + }, + "@angular-devkit/core": { + "version": "8.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/core/-/core-8.3.1.tgz", + "integrity": "sha1-a+UmvZxjUbGqrD6aCD+77s25yEg=", + "dev": true, + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=", + "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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/semver/-/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", + "dev": true + } + } + }, + "@angular/common": { + "version": "8.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/common/-/common-8.2.4.tgz", + "integrity": "sha1-owCTizJ6EJ6hIpvL9HFYkC03cNk=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "8.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/compiler/-/compiler-8.2.4.tgz", + "integrity": "sha1-dBu1BC171LOvk+3A0m9oMfU2Yn0=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "8.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/compiler-cli/-/compiler-cli-8.2.4.tgz", + "integrity": "sha1-7JGMeNT8Du/4cMkpgfCk4XRH+DY=", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "13.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "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.1" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "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" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/execa/-/execa-1.0.0.tgz", + "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", + "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" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha1-P17WZYPM1vQAtaANtvfoYTY+OI8=", + "dev": true, + "optional": true, + "requires": { + "node-pre-gyp": "^0.12.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 + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": 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 + }, + "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": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "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, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "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.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "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.7.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 + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mem/-/mem-4.3.0.tgz", + "integrity": "sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg=", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha1-qgeniMwxUck5tRMfY1cPDdIAlTc=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pump/-/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/upath/-/upath-1.1.2.tgz", + "integrity": "sha1-PbZYYA7a7sy+bbXmhNZ+6MKs0Gg=", + "dev": true + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha1-p2NNwI+JIJwgSa3aNSVxH7lyZd0=" + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha1-snKc5L/AxYSTlxlRQJnYqRatIwE=", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha1-0mBYUyqgbTZf4JH2ofwGsvfl7KA=", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "8.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/core/-/core-8.2.4.tgz", + "integrity": "sha1-ckVEAdwHyO08ZKh9necFB9aBCxQ=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/flex-layout": { + "version": "8.0.0-beta.26", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/flex-layout/-/flex-layout-8.0.0-beta.26.tgz", + "integrity": "sha1-BYB+Ta63xw2lZTtoH46MDah9Ez4=", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/forms": { + "version": "8.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/forms/-/forms-8.2.4.tgz", + "integrity": "sha1-28nC+0ihfz+6eFPjFa7cN7ga27Q=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/material": { + "version": "8.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/material/-/material-8.1.4.tgz", + "integrity": "sha1-i9p0e7Ajr4zM4sLT6ejcJfBbNgU=", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "8.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/platform-browser/-/platform-browser-8.2.4.tgz", + "integrity": "sha1-zonCOXzpRWmcvouefB0tky9dBPk=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.4.tgz", + "integrity": "sha1-7w04llM+++18bzAdfLm6OnQPPSc=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "8.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular/router/-/router-8.2.4.tgz", + "integrity": "sha1-A1tOjj3gMhTuRraAgXW1HyX260E=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha1-vAeC9tafe31JUxIZaZuYj2aaj50=", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha1-F7JobvDWvFj5Y93daKtml1VYLDA=", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "json5": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/json5/-/json5-2.1.0.tgz", + "integrity": "sha1-56DGLEgoXGKNIKELhcibuAfDKFA=", + "requires": { + "minimist": "^1.2.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + } + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha1-hzp/k2o8iUkbQ1NtEiRbYmZk488=", + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha1-Mj053QtQ4Qx8Bsp9djjmhk2MXDI=", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha1-a2lijf5Ah3mODE7Zjj1Kay+9L18=", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha1-h8H4yhmtVSpzanonscH8+LH/H0M=", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha1-PewywgRvN+CbKMk+sLED/Sol02k=", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha1-U3+hP28WdN90WwwA7I/k6ZaByPY=", + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha1-oM6wFoX3M1XUNgwSR/WCv6/I/1M=", + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha1-g1ctQyDipGVyY3NBE8QoaLZOScM=", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha1-Api18lyMCcUxAtUqxKmPdz6yhQo=", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha1-H7W47ERTqTxDnun+Ou6kqEt2tZA=", + "requires": { + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha1-lggbcRHkhtpNLNlxrRpP4hbMLj0=", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", + "integrity": "sha1-+E/4oJA43Lyh/UNVZhpQCTcWW0o=", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha1-opIMVwKwc8Fd5REGIAqoytIEl9U=", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha1-u7P77phmHFaQNCN8wDlnupm08lA=" + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha1-CqaCT3EAouDonBUnwjk2wVLKs1E=", + "requires": { + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + } + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha1-Nh2AghtvONp1vT8HheziCojF/n8=", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha1-+EzkPfAxIi0rrQaNJibLV5nDS8I=", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha1-Ze65VMjCRb6qToWdphiPOdceWFw=", + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha1-/5SJSjQL549T8GrwOLIFxJ2ZNnc=", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha1-xOABJEV2nigVtVKW6tQ6lYVJ9vo=", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha1-Y5CNKnOUIinR5mhbwqDnMN3jt14=", + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha1-VtETEr2SSPphlZHQJHK+boyzJUA=", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" + } + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha1-AvB3rIgX099Kgy71neZ1Zeccyks=" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha1-somzBmadzkrSCwJSiJoVdoydQX4=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha1-5TIgLbSDhyNpGxCme4zlCeOXxQY=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha1-Vo7MRGxhSK5rJn8CVREwiR4p8xc=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha1-YZOXRPcbp2o65Gte6hilTBbSLlg=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha1-E12B7baKCB5V5W7EhUHs6AZcOPU=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha1-UB/9mCbAuR2iJpByByKsfLHKnHg=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regexpu-core": { + "version": "4.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regexpu-core/-/regexpu-core-4.5.5.tgz", + "integrity": "sha1-qv/mHCr1gmmz5Ra2GnN5A3YyZBE=", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha1-p2NNwI+JIJwgSa3aNSVxH7lyZd0=" + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha1-8eaui32iuulsmTmbhozWyTOiupw=", + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha1-aeHw2zTG9aDPfiszI78VmnbIy38=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha1-acFZ/69JmBIhYa2OvF5tH1XfhhI=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha1-cr0T9v/h0lk4Ep0qGGsR/WKVFHA=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha1-O3o+czUQxX6CC5FCpleayLDfrS4=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha1-qUAT1u2okI3+akd+f57ahWVuz1w=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha1-mur75Nb/xlY7+Pg3IJFijwB3lVA=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha1-iaOEigFmYjtbxIEWS1k2q5R+iH4=", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha1-XTzBHo1d3XUqpkyRSNDbbLef0ZA=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", + "integrity": "sha1-o185XlQCgi8Q0hGfb44EXjY5os4=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + } + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha1-0JQpnZvWgKFKKg7a44MFrWD7Tek=", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/globals/-/globals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=" + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha1-g6ffamWIZbHI9kHVEMbzryICFto=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", + "integrity": "sha1-9sCf3+P5RRb/B0/od9t7ye8FhVo=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha1-NhoUi8lRREMSxpRG127R6o5EUMM=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regexpu-core": { + "version": "4.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regexpu-core/-/regexpu-core-4.5.5.tgz", + "integrity": "sha1-qv/mHCr1gmmz5Ra2GnN5A3YyZBE=", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha1-p2NNwI+JIJwgSa3aNSVxH7lyZd0=" + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha1-8eaui32iuulsmTmbhozWyTOiupw=", + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha1-xdv1EGv4TN9pEiLAl0wSsd+TGFM=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha1-pjhoKJ5bQAf3BU1GSRr1FDV2YAg=", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha1-Amf8c14kyAi6FzhmxsTRRA/DxVY=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha1-4UNhFquwYQwiWQlISHVKxSMJIq0=", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha1-aQNT6B+SZ9rU/Yz9d+r6hqulPqE=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha1-+hCqXFiiy2r88sn/qMtNiz1Imi0=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha1-7wBDXUbaCllhqnKKHS7P8GPk+5E=", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", + "integrity": "sha1-QlEn5gRSMTYIWO6qR6cdde3tenQ=", + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha1-51JmoT75QgLbKgYgl3dW9R1S0kk=", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha1-dnjOdRafCHe46yI1U4wHQmjdAa4=", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.4.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz", + "integrity": "sha1-nSaf0oo3AlgZm0KUc2gTpgu90QY=", + "requires": { + "regexp-tree": "^0.1.6" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha1-GNEgQ4sMye6VpH8scryXaPvtYKU=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha1-xwAh34NAc8ZethO4Z5zEo4HRqfk=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha1-dVbPA/MYvScZ/kySLS2Ai+VXHhY=", + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha1-A+M/ZT9bJcTrVyyYuUhQVbOJ6QU=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha1-Yp3IJRLFXO4BNB+ye9/LIQNUaA8=", + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha1-R5Kvh8mYpJNnWX0H/t8CY20uFjQ=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha1-YzOu4vjW7n4oYVRXKYk0o7RhmPA=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha1-MQOpq+IvdCttQG7NPNSbd0kZtAY=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha1-oeRUtZlVYKnB4NU338FQYf0mh+E=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha1-nSj+p7vOY3+3YSoHUJidgyHUvLA=", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha1-EX0rzsL79ktLWdH5gZiUaC0p8rI=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha1-q0Y0u08U02cov1l4Mis1WHeHlw8=", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regexpu-core": { + "version": "4.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regexpu-core/-/regexpu-core-4.5.5.tgz", + "integrity": "sha1-qv/mHCr1gmmz5Ra2GnN5A3YyZBE=", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha1-p2NNwI+JIJwgSa3aNSVxH7lyZd0=" + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha1-8eaui32iuulsmTmbhozWyTOiupw=", + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "@babel/preset-env": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha1-vEcLU6yqSN9LjbJKVw1tof71PJo=", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha1-9LiNEiVomgj1vDoXSDVFvp5O0jc=", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha1-9mT482jtMpiM1kjan3LVynDxZbs=", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/globals/-/globals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + } + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha1-l7n3KOGCeFkJqkq1YmTwkKAo0Yo=", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + } + } + }, + "@juggle/resize-observer": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@juggle/resize-observer/-/resize-observer-2.3.0.tgz", + "integrity": "sha1-xSizaaKVnkmqaqrOVkDI5HSOkIQ=" + }, + "@materia-ui/ngx-monaco-editor": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/@materia-ui/ngx-monaco-editor/-/ngx-monaco-editor-2.0.2.tgz", + "integrity": "sha1-bTuMT16GK+s68Qb5A1MrQ4bSZ3U=", + "requires": { + "css-element-queries": "^1.0.2", + "monaco-editor": "^0.15.6", + "tslib": "^1.9.0" + } + }, + "@ngrx/effects": { + "version": "8.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@ngrx/effects/-/effects-8.3.0.tgz", + "integrity": "sha1-2Zp3erNS1O/fRWp97DB1FBh7pJY=" + }, + "@ngrx/router-store": { + "version": "8.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@ngrx/router-store/-/router-store-8.3.0.tgz", + "integrity": "sha1-GEYreQGEOzqyEkWf+9bP4rceh+Q=" + }, + "@ngrx/store": { + "version": "8.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@ngrx/store/-/store-8.3.0.tgz", + "integrity": "sha1-8ur0KOyeg3mAHMN+P2v/6Iwq9HI=" + }, + "@ngrx/store-devtools": { + "version": "8.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@ngrx/store-devtools/-/store-devtools-8.3.0.tgz", + "integrity": "sha1-yen1vZ/n4yxgXTqFiI1NqRpYKwI=" + }, + "@ngtools/webpack": { + "version": "8.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@ngtools/webpack/-/webpack-8.3.1.tgz", + "integrity": "sha1-ZUw/qBLSl9BTb0WFSm64c4yEyGQ=", + "requires": { + "@angular-devkit/core": "8.3.1", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.1", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@ngx-formly/core": { + "version": "5.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@ngx-formly/core/-/core-5.4.1.tgz", + "integrity": "sha1-yWSnuSPAop0WMcY3x1zQdhl7o0g=", + "requires": { + "tslib": "^1.7.1" + } + }, + "@ngx-formly/material": { + "version": "5.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@ngx-formly/material/-/material-5.4.1.tgz", + "integrity": "sha1-B02yjrTMrcK87x1bTQaeXPLlt0w=", + "requires": { + "tslib": "^1.9.0" + } + }, + "@schematics/angular": { + "version": "8.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@schematics/angular/-/angular-8.3.1.tgz", + "integrity": "sha1-IRdG5QtFnlOXSiSiAu2XqsX+0NA=", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.1", + "@angular-devkit/schematics": "8.3.1" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "8.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/core/-/core-8.3.1.tgz", + "integrity": "sha1-a+UmvZxjUbGqrD6aCD+77s25yEg=", + "dev": true, + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=", + "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" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", + "dev": true + } + } + }, + "@schematics/update": { + "version": "0.803.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@schematics/update/-/update-0.803.1.tgz", + "integrity": "sha1-nNpH5hZ2/rsbsvfDkGDcMl6LgcQ=", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.1", + "@angular-devkit/schematics": "8.3.1", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.5", + "rxjs": "6.4.0", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "8.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@angular-devkit/core/-/core-8.3.1.tgz", + "integrity": "sha1-a+UmvZxjUbGqrD6aCD+77s25yEg=", + "dev": true, + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=", + "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" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha1-87sP572n+2nerAwW8XtQsLh5BQQ=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/semver/-/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=", + "dev": true + } + } + }, + "@types/dragula": { + "version": "2.1.34", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/@types/dragula/-/dragula-2.1.34.tgz", + "integrity": "sha1-SOz4Ynhg5hee/CIt1TkLN9vULZ0=" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@types/events/-/events-3.0.0.tgz", + "integrity": "sha1-KGLz9Yqaf3w+eNefEw3U1xwlwqc=" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-qlmhxuP7xCHgfM0xqUTDDrpSFXU=", + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "2.8.7", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/@types/jasmine/-/jasmine-2.8.7.tgz", + "integrity": "sha1-P+WDkorgoizdNM7fkw7v/tomAv0=", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=" + }, + "@types/node": { + "version": "10.1.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/@types/node/-/node-10.1.4.tgz", + "integrity": "sha1-YGZR0/iovsCLjLJiFhqrkgn0op0=" + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "2.53.43", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", + "integrity": "sha1-LePXGIGbwgFldUxKWa+36YM/Zwc=", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha1-AHiDYGP/rxdBI0m7o2QIfgrALsk=" + }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha1-vkfBD3g9PW7+FHH/fwQmEb1GSpI=", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha1-UbHF/mV2o0lTv0slPfnw1JDZ41k=", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha1-G6kmopI2E+3OSW/VsC6M6KX0lyE=" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha1-xJ2tIvZFInxe22EL25aX8aq3Ifc=" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha1-/qk+Qphj3V5DOFVfQikjhaZT8gQ=" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha1-mnQP9I4/qjAisd/1RCPfmqKTwl4=", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha1-ugt9Oz9+RzPaYFnJMyJ12GBwJFI=" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha1-3vS5knsBAdyMu9jR7bW3ucguskU=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha1-U3p1Dt31weky83RCBlUckcG5PmE=" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha1-dMpqa8vhnlCjtrRihH5pUD5r/L8=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha1-cSMp2+8kDza/V70ve4+5v0FUQh4=", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha1-BE7es06mefPgTNT9mCTV41dnrhA=", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha1-qL87XY/+mGx8Hjc8y9wqCRXwztw=" + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha1-qL87XY/+mGx8Hjc8y9wqCRXwztw=" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha1-li2hKqWswcExyBxCMpkcgs5W4Bo=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha1-VIQHZsLBAC62TtGr5yCt7XFPmLw=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha1-sk2fa6UDlK8TSfUQr6j/y4pj0mQ=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha1-IVdvDsiLkUJzV7hTY4NmjvfGa40=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha1-4Q7s1ULQ5705T2gnxJ899tTu+4w=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha1-EUu8SB/RDKDiOzVg+oEnSLC65bw=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=" + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha1-53qX+9NFt22DJF7c0X05OxtB+zE=", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "6.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha1-AIdQkRn/pPwKAEHR6TpBfmjLhW4=" + }, + "addressparser": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", + "dev": true, + "optional": true + }, + "adm-zip": { + "version": "0.4.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/adm-zip/-/adm-zip-0.4.4.tgz", + "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha1-2J5ZmfeXh1Z0wH2H8mD8Qeg+jKk=", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha1-oROSTdP6JKC8O3gQjEUMKr7gD2c=", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "6.8.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-6.8.1.tgz", + "integrity": "sha1-CJC5N0KYXr+Jc802XFsjkgzjyyA=", + "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" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" + } + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha1-75FuJxxkrBIXH9g4TqrmsjRYVNo=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "amqplib": { + "version": "0.5.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/amqplib/-/amqplib-0.5.2.tgz", + "integrity": "sha1-0tcxPH/6pNELzx5iUt5FkbbMe2M=", + "dev": true, + "optional": true, + "requires": { + "bitsyntax": "~0.0.4", + "bluebird": "^3.4.6", + "buffer-more-ints": "0.0.2", + "readable-stream": "1.x >=1.1.9", + "safe-buffer": "^5.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=", + "dev": true + }, + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha1-TczbhGw+7hD21k3qZic+q5DDcig=", + "dev": true, + "requires": { + "type-fest": "^0.5.2" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "app-root-path": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/app-root-path/-/app-root-path-2.1.0.tgz", + "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha1-BGpSrlgqIovXL1is++KWfGeHWas=", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=" + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha1-O7xCdd1YTMGxCAm4nU6LY6aednU=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/assert/-/assert-1.5.0.tgz", + "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types": { + "version": "0.11.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ast-types/-/ast-types-0.11.5.tgz", + "integrity": "sha1-mJCCXWYMA8KDOfMV6foKNg4x7Cg=", + "dev": true, + "optional": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha1-ePrtjD0HSrgfIrTphdeehzj3IPg=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" + }, + "autoprefixer": { + "version": "9.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha1-UZZ6AtLSMAuwGGbBYR7INI01Wkc=", + "requires": { + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha1-1NDpudv8p3vwjusKikcVUP454ok=" + }, + "axios": { + "version": "0.15.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/axios/-/axios-0.15.3.tgz", + "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", + "dev": true, + "optional": true, + "requires": { + "follow-redirects": "1.0.0" + }, + "dependencies": { + "follow-redirects": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/follow-redirects/-/follow-redirects-1.0.0.tgz", + "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.2.0" + } + } + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha1-8A9Qe9qjw+P/bn5emNkKesq5b38=", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/base/-/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=" + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bitsyntax": { + "version": "0.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/bitsyntax/-/bitsyntax-0.0.4.tgz", + "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", + "dev": true, + "optional": true, + "requires": { + "buffer-more-ints": "0.0.2" + } + }, + "bl": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/bl/-/bl-1.1.2.tgz", + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.0.5" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha1-gdb9H+E6TA1pV99/kbdemNrEDLI=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/qs/-/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/braces/-/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.6.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha1-bkv0Z83lILydvfN0fa+gNTHOxFM=", + "requires": { + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha1-h/yqOimDWOCt5uRCz86EB0DRrQQ=" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=" + }, + "buffer-more-ints": { + "version": "0.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", + "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "buildmail": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/buildmail/-/buildmail-4.0.1.tgz", + "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=", + "dev": true, + "optional": true, + "requires": { + "addressparser": "1.0.1", + "libbase64": "0.1.0", + "libmime": "3.0.0", + "libqp": "1.1.0", + "nodemailer-fetch": "1.6.0", + "nodemailer-shared": "1.1.0", + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + } + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "12.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha1-jbAyBeNgiaPfaVTGbOklQUQaxGw=", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha1-qNCv1zJR7/u9X+OEp31zADwXpx8=" + }, + "glob": { + "version": "7.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/glob/-/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "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" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha1-bwlSYF0BQMHP2xOO0AV3W5LWewI=" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "requires": { + "glob": "^7.1.3" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "caniuse-lite": { + "version": "1.0.30000989", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha1-uRk+KTzPfkQmxSRRNLjypWwKxLk=" + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha1-/LRwwjlY3vhQgYVr56hukE8YDR0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", + "dev": true + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha1-NW/04rDo5D4yLRijckYLvPOszSY=", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha1-oY8eCyacimpdPIbrKYvrFMPde/Y=" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ=", + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha1-4J28LdPikoRCQD4tRbQc6ga8CpM=" + }, + "circular-json": { + "version": "0.5.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/circular-json/-/circular-json-0.5.5.tgz", + "integrity": "sha1-ZBgu81kELTfNjnZ/yd6Hix6UR9M=", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c=", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codelyzer": { + "version": "4.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/codelyzer/-/codelyzer-4.3.0.tgz", + "integrity": "sha1-a/O6aO/Z1lWkUeyqFKKFIAGkPfs=", + "dev": true, + "requires": { + "app-root-path": "^2.0.1", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.0.3" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha1-SYgbj7pn3xKpa98/VsCqueeRMUc=", + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.16.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/commander/-/commander-2.16.0.tgz", + "integrity": "sha1-8WOQWTmWzrTz7rAgsx14Uo9/ilA=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "compare-versions": { + "version": "3.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/compare-versions/-/compare-versions-3.3.0.tgz", + "integrity": "sha1-r5PqcFqWlD9iKrMJV4ubkFhvOcM=", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha1-bowQihatWDhKl386SCyiC/8vOME=", + "requires": { + "mime-db": ">= 1.40.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.40.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=" + } + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/compression/-/compression-1.7.4.tgz", + "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/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": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/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://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz", + "integrity": "sha1-x4Em9gTiTxlMbsL0OmTiMrXUNlU=", + "requires": { + "cacache": "^11.3.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha1-qNCv1zJR7/u9X+OEp31zADwXpx8=" + }, + "cacache": { + "version": "11.3.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha1-i9Kd+ManGKbr0tAQ2k15cq47utw=", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/glob/-/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "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" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha1-bwlSYF0BQMHP2xOO0AV3W5LWewI=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "requires": { + "yallist": "^3.0.2" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "requires": { + "glob": "^7.1.3" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=" + } + } + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha1-+XJgj/DOrWi4QaFqky0LGDeRgU4=" + }, + "core-js-compat": { + "version": "3.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/core-js-compat/-/core-js-compat-3.2.1.tgz", + "integrity": "sha1-DL28LjhujgDTuF3IHISO/+xbgVA=", + "requires": { + "browserslist": "^4.6.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/semver/-/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=" + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-element-queries": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/css-element-queries/-/css-element-queries-1.1.1.tgz", + "integrity": "sha1-Ep4QTssneqYze3MCy7bVEcLRYzo=" + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha1-dxY+qcINhkG0cH6PGKvfmnjzSDU=", + "dev": true, + "optional": true + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-equal": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/deep-equal/-/deep-equal-1.1.0.tgz", + "integrity": "sha1-MQPN+KttMs9KjfeGVFjyuNM/N0U=", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" + } + } + }, + "deep-freeze-strict": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/deep-freeze-strict/-/deep-freeze-strict-1.1.1.tgz", + "integrity": "sha1-d9BYPKJKab5LvZrC+uQV1VUj5bA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true, + "optional": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs=", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "optional": true, + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true, + "optional": true + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/del/-/del-4.1.1.tgz", + "integrity": "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ=", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s=" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha1-v+Lcomxp85cmWkAJljYCk1oFOss=", + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI=", + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/glob/-/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "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" + } + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha1-kdud5utyaZIJ2IrqTB/VIhysHEk=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=" + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/diff/-/diff-3.5.0.tgz", + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", + "dev": true + }, + "diff-match-patch": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/diff-match-patch/-/diff-match-patch-1.0.4.tgz", + "integrity": "sha1-asS1UjdGN2HE2vDcYD64aRJHRLE=" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=", + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/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" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=" + }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", + "dev": true, + "optional": true + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha1-WSkD9dgLONA3IgVBJk1poZj7NBA=", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.244", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/electron-to-chromium/-/electron-to-chromium-1.3.244.tgz", + "integrity": "sha1-e6VGH6MgqxZUCjGx0N77fsKbFuQ=" + }, + "elliptic": { + "version": "6.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha1-K47UyJG33jIA4UQSpbgkjHr1Bco=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.1.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/engine.io/-/engine.io-3.1.5.tgz", + "integrity": "sha1-Dn751pDrCzVZfx1K0Comyi26OEU=", + "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", + "uws": "~9.14.0", + "ws": "~3.3.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.1.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/engine.io-client/-/engine.io-client-3.1.6.tgz", + "integrity": "sha1-W96xMPi5SlCsXL63JYPnpKBj3f0=", + "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": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha1-TA9M/3mq7su9z96maoI8YIVAkZY=", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha1-Qcfgv9/nSsH/4eV61qXGyfN0Kn8=", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/errno/-/errno-0.1.7.tgz", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha1-nbvdJ8aFbwABQhyhh4LXhr+KYWU=", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha1-3EIhwrFlGHYL2MOaUtjzVvwA7Sk=", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "optional": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=" + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true, + "optional": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", + "requires": { + "estraverse": "^4.1.0" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=" + } + } + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true, + "optional": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha1-CQtNbNvWRe0Qv3UNS1QHlC17oWM=" + }, + "events": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/events/-/events-3.0.0.tgz", + "integrity": "sha1-mgoN+vYok9krh1uPJpjKQRSXPog=" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha1-j7xyyT/NNAiAkLwKTmT0tc7m2NA=", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/execa/-/execa-1.0.0.tgz", + "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", + "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" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "0.1.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/express/-/express-4.17.1.tgz", + "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=", + "requires": { + "mime-db": "1.40.0" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/qs/-/qs-6.7.0.tgz", + "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true, + "optional": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=" + }, + "figures": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/figures/-/figures-3.0.0.tgz", + "integrity": "sha1-dWJ1yWRkYWPMb5GXx6ApXb/QTek=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "4.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/file-loader/-/file-loader-4.2.0.tgz", + "integrity": "sha1-X7Ek0jadcHXXCppavs0S5gqVIV4=", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/schema-utils/-/schema-utils-2.1.0.tgz", + "integrity": "sha1-lANjtrHsQHgAoilRvcwjNjwDk5M=", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", + "dev": true, + "optional": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + } + } + }, + "find-cache-dir": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/find-cache-dir/-/find-cache-dir-3.0.0.tgz", + "integrity": "sha1-zUt92Xtxhbfhfb/i1uQRXuPuuPw=", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha1-G1859rknDtM/nwVMXA+EMEmJ+AE=", + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "requires": { + "find-up": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/semver/-/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=" + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha1-xdWG7zivYJdlC0m8QbVfq7GfNb0=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "follow-redirects": { + "version": "1.5.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/follow-redirects/-/follow-redirects-1.5.1.tgz", + "integrity": "sha1-Z6jxT1ofZ/liwsRkaceersCpApE=", + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-minipass": { + "version": "1.2.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/fs-minipass/-/fs-minipass-1.2.6.tgz", + "integrity": "sha1-LFzDDe2BKCv+ig18fBhT3esQLAc=", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha1-9B3LGvJYKvNpLaNvxVy9jhBBxCY=", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": 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.2", + "bundled": 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, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": 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, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": 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.2", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": 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, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "optional": true + } + } + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true, + "optional": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "optional": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha1-ndlxCgaQClxKW/V6yl2k5S/nZTc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pump/-/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "get-uri": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/get-uri/-/get-uri-2.0.2.tgz", + "integrity": "sha1-XHlecTJvbKEoby/IJXXNK6sq9Xg=", + "dev": true, + "optional": true, + "requires": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "3", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "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" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/globals/-/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=" + }, + "globby": { + "version": "7.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha1-DgOWlf9QyT/CiFV9aW88HcZ3Z1Q=" + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has/-/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha1-d3asYn8+p3JQz8My2rfd9eT10R0=", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hipchat-notifier": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz", + "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=", + "dev": true, + "optional": true, + "requires": { + "lodash": "^4.0.0", + "request": "^2.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha1-ObDhat2bYFvwqe89nar0hDtMrNI=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=", + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo=", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "httpntlm": { + "version": "1.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "dev": true, + "requires": { + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + } + }, + "httpreq": { + "version": "0.4.24", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/httpreq/-/httpreq-0.4.24.tgz", + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", + "dev": true + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha1-UVUpcPoE1yPgTFbQQXjD+SWSu8A=", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=" + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha1-qD5i59JyrA47VRqqgoMaGbafgvg=", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=" + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "dev": true, + "optional": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ini/-/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "dev": true + }, + "inquirer": { + "version": "6.5.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/inquirer/-/inquirer-6.5.1.tgz", + "integrity": "sha1-i/t6WsAtrG/2QaxMX/F9oRL820I=", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", + "dev": true + }, + "string-width": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha1-uoRtHaqXw8WWFVMIBj4HXtHJmv8=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc=", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha1-N9905DCg5HVQ/lSi3v4w2KzZX2U=" + }, + "is-absolute-url": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-absolute-url/-/is-absolute-url-3.0.1.tgz", + "integrity": "sha1-4xXL3LvD1niVMtWRlUrHig5QSfY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ=", + "dev": true, + "optional": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha1-ayEDoojpTvPeXPFdKd2F/Et41lw=", + "dev": true, + "optional": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha1-WsSLNF72dTOb1sekipEhELJBz1I=", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true, + "optional": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "1.3.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": "sha1-TDsF0YwAFtECLgebmNyCxA9IiVQ=", + "dev": true, + "requires": { + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-hook": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-report": "^1.1.4", + "istanbul-lib-source-maps": "^1.2.4", + "istanbul-reports": "^1.3.0", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/async/-/async-2.6.1.tgz", + "integrity": "sha1-skWiPKcZMAROxT+kaqAKPofGphA=", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha1-mVe9WSUrNz+uXFK3tRiOb94qCUk=", + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha1-99jy5CuX43/nlhFMsPnWi146Q0E=" + }, + "istanbul-lib-hook": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz", + "integrity": "sha1-9hTsRSh7Ko/E8H9WYK94dXVgGAU=", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha1-cktLbKzrqGktPx+dByfiecQBr3s=", + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": "sha1-6IbN9QXE672OCZ5DlqkNCijirLU=", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", + "integrity": "sha1-/+a+Tnq4bTYD5CkNVJkLFFBvybE=", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha1-LzIugeHZUgdnWX3KPCCgzOiaNVQ=", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jasmine": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jasmine/-/jasmine-3.1.0.tgz", + "integrity": "sha1-K9Wf1+xuwOistk4J9Fpo7SrRlSo=", + "dev": true, + "requires": { + "glob": "^7.0.6", + "jasmine-core": "~3.1.0" + } + }, + "jasmine-core": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jasmine-core/-/jasmine-core-3.1.0.tgz", + "integrity": "sha1-pHheE11d9lAk38kiSVPfWFvSdmw=", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha1-HWMq7ANBZwrTJPkrqEtLMrNeniI=", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha1-xs7ljrNVA3LfjeuF+tXOZs4B1Z0=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=" + }, + "json-ptr": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/json-ptr/-/json-ptr-1.2.0.tgz", + "integrity": "sha1-5Yj6X5N/Ig9Z9z5/SA+fUqb3kyg=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/json3/-/json3-3.3.3.tgz", + "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/json5/-/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.1.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha1-48KmxtcGrG5gMxQDbUPNQL7v3zc=", + "dev": true, + "requires": { + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "karma": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/karma/-/karma-2.0.4.tgz", + "integrity": "sha1-s5l4X1fpurHTxDhNsz/vTeyK40k=", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.4", + "log4js": "^2.5.3", + "mime": "^1.3.4", + "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.0.4", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.2.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.1.tgz", + "integrity": "sha1-JrlpMX0ZHGqJfHg7T/54McuS5oQ=", + "dev": true, + "requires": { + "istanbul-api": "^1.3.1", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.2.0.tgz", + "integrity": "sha1-3e37QPDAvimS2LE2dYHkZNBHLRU=", + "dev": true + }, + "karma-nunit2-reporter": { + "version": "0.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/karma-nunit2-reporter/-/karma-nunit2-reporter-0.3.0.tgz", + "integrity": "sha1-DMVsPIBbqA0mz0p/4hOo5u8yLd8=", + "dev": true, + "requires": { + "xmlbuilder": "0.4.2" + } + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha1-WFJs7M9+hzDlbv/Zek3o1xKsDWs=", + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/killable/-/killable-1.0.1.tgz", + "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=" + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/less/-/less-3.9.0.tgz", + "integrity": "sha1-t1EcQ/N89X3Iff/ZiD7BISibFHQ=", + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha1-SY3eOmxsT4h0WO6e0/CGoSrRtGY=", + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "optional": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "libbase64": { + "version": "0.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/libbase64/-/libbase64-0.1.0.tgz", + "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", + "dev": true + }, + "libmime": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/libmime/-/libmime-3.0.0.tgz", + "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", + "dev": true, + "requires": { + "iconv-lite": "0.4.15", + "libbase64": "0.1.0", + "libqp": "1.1.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "dev": true + } + } + }, + "libqp": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/libqp/-/libqp-1.1.0.tgz", + "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", + "dev": true + }, + "license-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/license-webpack-plugin/-/license-webpack-plugin-2.1.2.tgz", + "integrity": "sha1-Y/fFcVN6RQ7EfcmPXV/9vKezsU8=", + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha1-G3eTz3JZ6jj7NmHU04syYK+K5Oc=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "log4js": { + "version": "2.11.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/log4js/-/log4js-2.11.0.tgz", + "integrity": "sha1-vzkC7/ZcaSPZzpz70ttUFg40AFo=", + "dev": true, + "requires": { + "amqplib": "^0.5.2", + "axios": "^0.15.3", + "circular-json": "^0.5.4", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "hipchat-notifier": "^1.1.0", + "loggly": "^1.1.0", + "mailgun-js": "^0.18.0", + "nodemailer": "^2.5.0", + "redis": "^2.7.1", + "semver": "^5.5.0", + "slack-node": "~0.2.0", + "streamroller": "0.7.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "loggly": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/loggly/-/loggly-1.1.1.tgz", + "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=", + "dev": true, + "optional": true, + "requires": { + "json-stringify-safe": "5.0.x", + "request": "2.75.x", + "timespan": "2.3.x" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "form-data": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/form-data/-/form-data-2.0.0.tgz", + "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.11" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.75.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/request/-/request-2.75.0.tgz", + "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.0.0", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, + "optional": true + } + } + }, + "loglevel": { + "version": "1.6.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha1-d/LrZL5VpATJ/QStFtV8HW1rEoA=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw=", + "dev": true, + "optional": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha1-NLjSosf+ydm9+ZKaP9gdJx7zW+k=", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "mailcomposer": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/mailcomposer/-/mailcomposer-4.0.1.tgz", + "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=", + "dev": true, + "optional": true, + "requires": { + "buildmail": "4.0.1", + "libmime": "3.0.0" + } + }, + "mailgun-js": { + "version": "0.18.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/mailgun-js/-/mailgun-js-0.18.1.tgz", + "integrity": "sha1-7jmqGNe7WYpc6e3oSvtoHe/IprA=", + "dev": true, + "optional": true, + "requires": { + "async": "~2.6.0", + "debug": "~3.1.0", + "form-data": "~2.3.0", + "inflection": "~1.12.0", + "is-stream": "^1.1.0", + "path-proxy": "~1.0.0", + "promisify-call": "^2.0.2", + "proxy-agent": "~3.0.0", + "tsscmp": "~1.0.0" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/async/-/async-2.6.1.tgz", + "integrity": "sha1-skWiPKcZMAROxT+kaqAKPofGphA=", + "dev": true, + "optional": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/semver/-/semver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=" + } + } + }, + "make-error": { + "version": "1.3.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha1-GZeO1XX56VRdL/jBPjO10Ypn1TU=", + "dev": true + }, + "make-fetch-happen": { + "version": "5.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz", + "integrity": "sha1-qOP+QdNBXdZW/nuOgXLh+0RYs40=", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha1-qNCv1zJR7/u9X+OEp31zADwXpx8=", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha1-vpmruk4b9d9GHNWiwQcfxDJXM5A=", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha1-oY8eCyacimpdPIbrKYvrFMPde/Y=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/glob/-/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "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" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha1-bwlSYF0BQMHP2xOO0AV3W5LWewI=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pump/-/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=", + "dev": true + } + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha1-rSyVdhl8nxq/MI0Hh4Zb2XWj8+Q=" + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "material-design-icons": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/material-design-icons/-/material-design-icons-3.0.1.tgz", + "integrity": "sha1-mnHEh0chjrylHlGmbaaCA4zct78=", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mem/-/mem-4.3.0.tgz", + "integrity": "sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg=", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/mime/-/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=" + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha1-gdQexP5YxxOpatfHI82y0L1NcOE=", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minipass": { + "version": "2.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/minipass/-/minipass-2.5.0.tgz", + "integrity": "sha1-3dsdABl2l4FYoFut/L70p3FhKFc=", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=", + "dev": true + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha1-3SfqYTYkPHyIBoToZyuzpF/ZthQ=", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pump/-/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "monaco-editor": { + "version": "0.15.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/monaco-editor/-/monaco-editor-0.15.6.tgz", + "integrity": "sha1-1js7BvhvgDRk8AOyUmJ8PrSglIM=" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/nan/-/nan-2.10.0.tgz", + "integrity": "sha1-ltDNYQ69WNS03pzAxoKM2pnHVI8=", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha1-rCetpmFn+ohJpq3dg39rGJrSCBw=" + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true, + "optional": true + }, + "ngrx-store-freeze": { + "version": "0.2.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ngrx-store-freeze/-/ngrx-store-freeze-0.2.4.tgz", + "integrity": "sha1-FGaHzffiEkTrkAPH6IPyElhHB2w=", + "dev": true, + "requires": { + "deep-freeze-strict": "^1.1.1" + } + }, + "ngx-mat-select-search": { + "version": "1.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ngx-mat-select-search/-/ngx-mat-select-search-1.3.0.tgz", + "integrity": "sha1-4VaUuGQQ/5kQgWO9WAaKhFLs2sk=", + "requires": { + "tslib": "^1.9.0" + } + }, + "ngx-monaco-editor": { + "version": "7.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ngx-monaco-editor/-/ngx-monaco-editor-7.0.0.tgz", + "integrity": "sha1-PEIlAt71xf8HcaT/UYNS0CFd5pg=", + "requires": { + "tslib": "^1.9.0" + } + }, + "ngx-scrollbar": { + "version": "5.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ngx-scrollbar/-/ngx-scrollbar-5.0.1.tgz", + "integrity": "sha1-mhogJ6/pOEi1ktWvcaBy3EEmue4=", + "requires": { + "tslib": "^1.9.0" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=" + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha1-cljJBGGC3KNFtCCO2pGNrzNpf/c=", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha1-bBUsNFzhHFL0ZcKr2VfoY5zWdN8=" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-releases": { + "version": "1.1.28", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/node-releases/-/node-releases-1.1.28.tgz", + "integrity": "sha1-UDw8cNDkcyuE56qikl+93hBILUo=", + "requires": { + "semver": "^5.3.0" + } + }, + "nodemailer": { + "version": "2.7.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/nodemailer/-/nodemailer-2.7.2.tgz", + "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", + "dev": true, + "optional": true, + "requires": { + "libmime": "3.0.0", + "mailcomposer": "4.0.1", + "nodemailer-direct-transport": "3.3.2", + "nodemailer-shared": "1.1.0", + "nodemailer-smtp-pool": "2.8.2", + "nodemailer-smtp-transport": "2.7.2", + "socks": "1.1.9" + }, + "dependencies": { + "socks": { + "version": "1.1.9", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/socks/-/socks-1.1.9.tgz", + "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", + "dev": true, + "optional": true, + "requires": { + "ip": "^1.1.2", + "smart-buffer": "^1.0.4" + } + } + } + }, + "nodemailer-direct-transport": { + "version": "3.3.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", + "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-fetch": { + "version": "1.6.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", + "dev": true + }, + "nodemailer-shared": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", + "dev": true, + "requires": { + "nodemailer-fetch": "1.6.0" + } + }, + "nodemailer-smtp-pool": { + "version": "2.8.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", + "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-smtp-transport": { + "version": "2.7.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", + "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-wellknown": { + "version": "0.1.10", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", + "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha1-57qarc75YrthJI+RchzZMrP+a90=", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha1-Fa4eJ1ilAn77TCUFVLhac323/ME=", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/npm-packlist/-/npm-packlist-1.4.4.tgz", + "integrity": "sha1-hmIkIzhQrFNLY9Gm52BQCStdL0Q=", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha1-MhEdKpViY4uyyPK/J/fzCSyPrkA=", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-registry-fetch": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", + "integrity": "sha1-XvdYRbYFhVx5ZEclQsJdoXKvhnc=", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=" + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/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.pick": { + "version": "1.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=" + }, + "omit-empty": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/omit-empty/-/omit-empty-1.0.0.tgz", + "integrity": "sha1-gnrR/cVpURu5+z8DipFxp/ENkEA=", + "requires": { + "kind-of": "^6.0.2" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha1-//DzyRYX/mK7UBiWNumayKbfe+U=", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + } + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/open/-/open-6.4.0.tgz", + "integrity": "sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk=", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/opn/-/opn-5.5.0.tgz", + "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "optional": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "original": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/original/-/original-1.0.2.tgz", + "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4=" + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha1-qgeniMwxUck5tRMfY1cPDdIAlTc=", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=" + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=", + "requires": { + "retry": "^0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=" + }, + "pac-proxy-agent": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", + "integrity": "sha1-kNn2cwqw9NJgfc3NTT1kGqJsOJY=", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", + "integrity": "sha1-Lq58+OKoLTRWV2FTmn+XGMVhdlk=", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.1.0", + "socks": "^1.1.10" + } + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha1-auoweH2wqJFwTet4AKcip2FabyY=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, + "pacote": { + "version": "9.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pacote/-/pacote-9.5.5.tgz", + "integrity": "sha1-YzVaOTYUw0JOc1ggw3MeLLvtrus=", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "bluebird": { + "version": "3.5.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha1-qNCv1zJR7/u9X+OEp31zADwXpx8=", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha1-vpmruk4b9d9GHNWiwQcfxDJXM5A=", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "chownr": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha1-oY8eCyacimpdPIbrKYvrFMPde/Y=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/glob/-/glob-7.1.4.tgz", + "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", + "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" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha1-bwlSYF0BQMHP2xOO0AV3W5LWewI=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pump/-/pump-3.0.0.tgz", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/semver/-/semver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "tar": { + "version": "4.4.10", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/tar/-/tar-4.4.10.tgz", + "integrity": "sha1-lGsoELml4LJhQM94vqawsNaJ66E=", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha1-tLBJ4xS+VF486AIjbWzSLNkcPek=", + "dev": true + } + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pako/-/pako-1.0.6.tgz", + "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=" + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha1-N/Zij4I/vesic7TVQENKIvPvH8w=", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha1-xZNByXI/QUxFKXVWTHwApo1YrNI=", + "optional": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/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://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-proxy": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/path-proxy/-/path-proxy-1.0.0.tgz", + "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=", + "dev": true, + "optional": true, + "requires": { + "inflection": "~1.3.0" + }, + "dependencies": { + "inflection": { + "version": "1.3.8", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/inflection/-/inflection-1.3.8.tgz", + "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=", + "dev": true, + "optional": true + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pify/-/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.23", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/portfinder/-/portfinder-1.0.23.tgz", + "integrity": "sha1-iU20vMXa8CtmFFF86JzSGjgia4I=", + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha1-TaG9/1Mi1KCsqrTYfz54JDa60x8=", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha1-z4x6sLXMq1ZJAkU25WX4QZKLcVM=", + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=" + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha1-yE1pK3u3tB3c7ZTuYuirMbQXsAM=", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha1-SCKCwJpCcG0fyaBptz9E7Ag5Hck=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/private/-/private-0.1.8.tgz", + "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/promise/-/promise-7.3.1.tgz", + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "promisify-call": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/promisify-call/-/promisify-call-2.0.4.tgz", + "integrity": "sha1-1IwtRWUszM1SgB3ey9UzptS9X7o=", + "dev": true, + "optional": true, + "requires": { + "with-callback": "^1.0.2" + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha1-A8NlnKGAB7aaUP2Cp+vMUWJhFR8=", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "5.3.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/protractor/-/protractor-5.3.2.tgz", + "integrity": "sha1-uCePMTHZ1S+hFy7Q9/7AMIX74M4=", + "dev": true, + "requires": { + "@types/node": "^6.0.46", + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "~2.53.39", + "blocking-proxy": "^1.0.0", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "^1.0.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "@types/node": { + "version": "6.0.114", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/@types/node/-/node-6.0.114.tgz", + "integrity": "sha1-xCzVZHnzK8FXalyxn4ogjamisFI=", + "dev": true + }, + "adm-zip": { + "version": "0.4.11", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha1-KqVMhMSwGp0PuJuxGYKlHxPj1io=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + } + }, + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/webdriver-manager/-/webdriver-manager-12.1.0.tgz", + "integrity": "sha1-9mAeUt5fDJf8cCTIie6yQW8vHZ0=", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha1-NMvWSi2B9LH9IedvnwbIpFKZ7jQ=", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "proxy-agent": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/proxy-agent/-/proxy-agent-3.0.1.tgz", + "integrity": "sha1-T7e2GxR20P6OOjOE2Q4kYLve0/k=", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "pac-proxy-agent": "^2.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true, + "optional": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true, + "optional": true + }, + "psl": { + "version": "1.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/psl/-/psl-1.3.0.tgz", + "integrity": "sha1-4ev2o7VWT6g3bz2iJ12nbYdcob0=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pump/-/pump-2.0.1.tgz", + "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" + }, + "q": { + "version": "1.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/qs/-/qs-6.5.2.tgz", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha1-YOWl/WSn+L+k0qsu1v30yFutFU4=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "raw-loader": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha1-Xp05mloiLMDeGPQsO8XklndTKz8=", + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/schema-utils/-/schema-utils-2.1.0.tgz", + "integrity": "sha1-lANjtrHsQHgAoilRvcwjNjwDk5M=", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "read-package-json": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/read-package-json/-/read-package-json-2.1.0.tgz", + "integrity": "sha1-49QubDXqWugg2aA6sMcpEhf8UdU=", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha1-oyy2TH8x64pvMe8G+c7fdAaP5jY=", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "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" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha1-jUVAe0+HCg3K68DihnDRjnRRQwk=", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "redis": { + "version": "2.8.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/redis/-/redis-2.8.0.tgz", + "integrity": "sha1-ICKI4/WMSfYHnZevehDhMDrhSwI=", + "dev": true, + "optional": true, + "requires": { + "double-ended-queue": "^2.1.0-0", + "redis-commands": "^1.2.0", + "redis-parser": "^2.6.0" + } + }, + "redis-commands": { + "version": "1.3.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/redis-commands/-/redis-commands-1.3.5.tgz", + "integrity": "sha1-RJWIlBTx6IYmEYCxRC5ylWAtg6I=", + "dev": true, + "optional": true + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=", + "dev": true, + "optional": true + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha1-Z648pXyXKiqhZCsQ/jY/4y1J3Ag=", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=" + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha1-71Hg8OpK1CS3e/fLQfPgFccKPw4=", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha1-Oy/OThq3cywI9mXf2zFHScfd0vs=", + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.12", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regexp-tree/-/regexp-tree-0.1.12.tgz", + "integrity": "sha1-KOqqbmbus1J8FRCKP/dA2eV05CA=" + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha1-azByTjBqJ4M+6xcbZqyIkLo35Bw=", + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.87.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/request/-/request-2.87.0.tgz", + "integrity": "sha1-MvACNc0I1IK00NaNuTqCnA7VdW4=", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "requestretry": { + "version": "1.13.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/requestretry/-/requestretry-1.13.0.tgz", + "integrity": "sha1-IT7BAG7rdQ6LjOVBdig9FajVXZQ=", + "dev": true, + "optional": true, + "requires": { + "extend": "^3.0.0", + "lodash": "^4.15.0", + "request": "^2.74.0", + "when": "^3.7.7" + }, + "dependencies": { + "when": { + "version": "3.7.8", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true, + "optional": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha1-gvHsGaQjrB+9CAsLqwa6NuhKeiY=", + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ret/-/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=" + }, + "retry": { + "version": "0.10.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs/-/rxjs-6.5.2.tgz", + "integrity": "sha1-LjXOgVzUbYTQKiCftOWSHgUdvsc=", + "requires": { + "tslib": "^1.9.0" + } + }, + "rxjs-compat": { + "version": "6.5.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/rxjs-compat/-/rxjs-compat-6.5.2.tgz", + "integrity": "sha1-5GkHCt9iYL2tGV6dSjn0RK4otFg=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + }, + "sass": { + "version": "1.22.9", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/sass/-/sass-1.22.9.tgz", + "integrity": "sha1-QaLtYDgCf1i+K9UEEpNFKinCy4Q=", + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "7.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/sass-loader/-/sass-loader-7.2.0.tgz", + "integrity": "sha1-40EVI5MJ0VslJ8titd/vtiqW/38=", + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.5.0" + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha1-lAWnPDYNRJsjKDmRmobDltN5/Z0=", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha1-K6h6FmLAILiYjJga5iyyoBKY6vw=", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha1-zdfsz8pO12NdR6CL8tXTB0CS4s0=", + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/semver/-/semver-5.5.0.tgz", + "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=" + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha1-vdnAa+3N0v7bjNNSw8Q+6MYTIfM=", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/send/-/send-0.17.1.tgz", + "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "http-errors": { + "version": "1.7.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.1.1.tgz", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + } + } + }, + "serialize-javascript": { + "version": "1.9.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/serialize-javascript/-/serialize-javascript-1.9.0.tgz", + "integrity": "sha1-W3cBnXw7hf6RszrkJMU9y/tmGL0=" + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "dependencies": { + "parseurl": { + "version": "1.3.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=" + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha1-jymBrZJTH1UDWwH7IwdppA4C76M=", + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slack-node": { + "version": "0.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/slack-node/-/slack-node-0.2.0.tgz", + "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=", + "dev": true, + "optional": true, + "requires": { + "requestretry": "^1.2.2" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true, + "optional": true + }, + "smtp-connection": { + "version": "2.12.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/smtp-connection/-/smtp-connection-2.12.0.tgz", + "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", + "dev": true, + "requires": { + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "socket.io": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/socket.io/-/socket.io-2.0.4.tgz", + "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", + "dev": true, + "requires": { + "debug": "~2.6.6", + "engine.io": "~3.1.0", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.0.4", + "socket.io-parser": "~3.1.1" + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.0.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/socket.io-client/-/socket.io-client-2.0.4.tgz", + "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~2.6.4", + "engine.io-client": "~3.1.0", + "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.1.1", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.1.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/socket.io-parser/-/socket.io-parser-3.1.3.tgz", + "integrity": "sha1-7S2l7nnxCVUDbj2kE7/X8eTYbI4=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "has-binary2": "~1.0.2", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha1-2Xa76ACve9IK4IWY1YI5NQiZPA0=", + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha1-EvydbLZj2lc509xftuhofalcsXc=", + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha1-XA6aiWjokSwoZjn96XeosgnyUI4=", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + } + } + }, + "socks": { + "version": "1.1.10", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "dev": true, + "optional": true, + "requires": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", + "integrity": "sha1-WTa/i3B6mTB5xvN9sgkYIb/6ZHM=", + "dev": true, + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" + }, + "dependencies": { + "smart-buffer": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/smart-buffer/-/smart-buffer-4.0.1.tgz", + "integrity": "sha1-B+ocqNTbJOtMrIZTfX0YmVIhrOM=", + "dev": true + }, + "socks": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/socks/-/socks-2.2.1.tgz", + "integrity": "sha1-aK1nizZC+8XZnGTBZbxWHqsCFfk=", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha1-wYsNxuI79m9nkkN1V8VpoR4HInE=", + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/async/-/async-2.6.3.tgz", + "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", + "requires": { + "lodash": "^4.17.14" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=" + } + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha1-cuLMNAlVQ+Q7LGKyxMENSpBU8lk=", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha1-RDXO5Gsaq2K46GEM5g94gJHFHBM=", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha1-4wp08EArrQmAdkDTnpcQkKCM4ek=" + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha1-bxLtHF236k8k67i4m6WMh8CCV/I=", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha1-pRwmdUZY4KPCHb9ZFjvUW6b0R/w=", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha1-aYQKXNwItGOGl9rH2wN/WV1/NqA=", + "requires": { + "chalk": "^2.0.1" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha1-joxGP5HaiZF3h2WHP+TZYNj2Fr0=", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "streamroller": { + "version": "0.7.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha1-odG3z4PTmvsNYwSaWsv5NJO99ks=", + "dev": true, + "requires": { + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "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", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha1-HVKW+RZejiyF0k7uC3yvnsjKH4I=", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/schema-utils/-/schema-utils-2.1.0.tgz", + "integrity": "sha1-lANjtrHsQHgAoilRvcwjNjwDk5M=", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha1-J6cGQgsFo44DjnyssVNXjUUFE8Y=", + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha1-wiaIrtTqs83C3+rLtWFmBWCgCAQ=", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=" + }, + "terser": { + "version": "4.1.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/terser/-/terser-4.1.4.tgz", + "integrity": "sha1-RHi2oIuwlqYeeT/qGkQ0QIurk2w=", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/commander/-/commander-2.20.0.tgz", + "integrity": "sha1-1YuytcHuj4ew00ACfp6U4iLFpCI=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha1-MbJKnC5zwt6FBmwP631Edn7VKTI=", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha1-YbGOQOruW+l+dxzbsQ7RKAiIwrQ=", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true, + "optional": true + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha1-9d9zJFNAewkZHa5z4qjMc/OBqCY=" + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timespan": { + "version": "2.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/timespan/-/timespan-2.3.0.tgz", + "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=", + "dev": true, + "optional": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=" + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", + "requires": { + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha1-U5jzdOLykrncx7LnHjClw7tsdDo=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "ts-node": { + "version": "6.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ts-node/-/ts-node-6.2.0.tgz", + "integrity": "sha1-ZaCuKszjGepP16yNfJ8fkMXaa68=", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha1-1+TdeSRdhUKMTX5IIqeZF5VMooY=" + }, + "tslint": { + "version": "5.10.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tslint/-/tslint-5.10.0.tgz", + "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.12.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "tsscmp": { + "version": "1.0.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tsscmp/-/tsscmp-1.0.5.tgz", + "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=", + "dev": true, + "optional": true + }, + "tsutils": { + "version": "2.27.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tsutils/-/tsutils-2.27.2.tgz", + "integrity": "sha1-YLqIoj1veF7EuJxugXnKybQx8cc=", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha1-1u9CoDVsbNRfSUhcO2KB/BSOSKI=", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "3.5.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha1-yDD2V/k/HqhGgZ6SkJL1/lmD6Xc=" + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha1-n+FTahCmZKZSZqHjzPhf02MCvJw=", + "dev": true + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha1-W0tCbgjROoA2Xg1lesemwexGonc=" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha1-qcxsx85joKMCP8meNBuUQx1AWlc=" + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha1-1rZOUxK/dPfDaOMCSpIhNdvySwM=", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "aws4": { + "version": "1.8.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/debug/-/debug-3.2.6.tgz", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/extend/-/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/request/-/request-2.88.0.tgz", + "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", + "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" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/upath/-/upath-1.1.0.tgz", + "integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha1-qKg1NejACjFuQDpdtKwbm4U64ng=", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/use/-/use-3.1.1.tgz", + "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=" + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/util/-/util-0.11.1.tgz", + "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=" + }, + "uws": { + "version": "9.14.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/uws/-/uws-9.14.0.tgz", + "integrity": "sha1-+sg4a+/DOno3BcvVjcR7Qwyk3ZU=", + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha1-vXbWojMj4sqP+hICjcBFWcdfkBk=" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha1-S8EsLr6KonenHx0/FNaFx7RGzQA=", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", + "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^2.53.35", + "selenium-webdriver": "^2.53.2" + }, + "dependencies": { + "sax": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/sax/-/sax-0.6.1.tgz", + "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", + "dev": true + }, + "selenium-webdriver": { + "version": "2.53.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", + "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", + "dev": true, + "requires": { + "adm-zip": "0.4.4", + "rimraf": "^2.2.8", + "tmp": "0.0.24", + "ws": "^1.0.1", + "xml2js": "0.4.4" + } + }, + "tmp": { + "version": "0.0.24", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/tmp/-/tmp-0.0.24.tgz", + "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "ws": { + "version": "1.1.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ws/-/ws-1.1.5.tgz", + "integrity": "sha1-y9nm514J/F0skAFfIfDECHXg3VE=", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "xml2js": { + "version": "0.4.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/xml2js/-/xml2js-0.4.4.tgz", + "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", + "dev": true, + "requires": { + "sax": "0.6.x", + "xmlbuilder": ">=1.0.0" + } + }, + "xmlbuilder": { + "version": "10.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/xmlbuilder/-/xmlbuilder-10.0.0.tgz", + "integrity": "sha1-xk5S+K4Jf+X9RtHDitqt4HHuG1U=", + "dev": true + } + } + }, + "webpack": { + "version": "4.39.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha1-yapcF3bXwwnRs5EXZPAojIwoFqo=", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=", + "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" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha1-73UdJfTppcijXaYAxf2jWCtcbP8=", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/mime/-/mime-2.4.4.tgz", + "integrity": "sha1-vXuRE1/GsBzePpuuM9ZZtj2IV+U=" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=" + } + } + }, + "webpack-dev-server": { + "version": "3.8.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", + "integrity": "sha1-BsxPwvRAQoUI0Ol3DaH+8Q5e8o0=", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.0", + "killable": "^1.0.1", + "loglevel": "^1.6.3", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.21", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "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.1" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/debug/-/debug-4.1.1.tgz", + "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "requires": { + "ms": "^2.1.1" + } + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha1-P17WZYPM1vQAtaANtvfoYTY+OI8=", + "optional": true, + "requires": { + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": 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, + "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, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": 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, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": 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 + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": 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, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": 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, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": 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, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": 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, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true + } + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=" + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/semver/-/semver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "requires": { + "has-flag": "^3.0.0" + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/upath/-/upath-1.1.2.tgz", + "integrity": "sha1-PbZYYA7a7sy+bbXmhNZ+6MKs0Gg=" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ws/-/ws-6.2.1.tgz", + "integrity": "sha1-RC/fCkftZPWbal2P8TD0dI7VJPs=", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha1-BfWZe2CWR7ZPZrgeO0sQo2jnrRM=", + "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" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=" + } + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha1-XpI8+ALqKs5P1a8dMkc2imM0ibQ=", + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.6", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha1-N/bxJk4es3jkFGWpjagPrXariIY=", + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha1-otTg1PTxFvHmKX66WLBdQwEA6fk=", + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=" + }, + "when": { + "version": "3.6.4", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/which/-/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "with-callback": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/with-callback/-/with-callback-1.0.2.tgz", + "integrity": "sha1-oJYpuakgAo1yFAT7Q1vc/1yRvCE=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true, + "optional": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "3.2.0", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/worker-plugin/-/worker-plugin-3.2.0.tgz", + "integrity": "sha1-3a6fFht2/Lqs+PVOzQN4RFhOQ+c=", + "requires": { + "loader-utils": "^1.1.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/ws/-/ws-3.3.3.tgz", + "integrity": "sha1-8c+E/i1ekB686U767OeF8YeiKPI=", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "0.4.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/xmlbuilder/-/xmlbuilder-0.4.2.tgz", + "integrity": "sha1-F3bWXz/brUcKCNhgTN6xxOVA/4M=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true, + "optional": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha1-h5oIZZc7yp9rq1y987HGfsfTvPQ=", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=" + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://anon.artifactory.vgis.sites.uberit.net:443/api/npm/ext-npm/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.9.1", + "resolved": "https://anon.artifactory.uberit.net:443/api/npm/ext-npm/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha1-43xuXFTBP65N4mtf/o2OkhLabZs=" + } + } +} diff --git a/config-editor/config-editor-ui/package.json b/config-editor/config-editor-ui/package.json new file mode 100644 index 00000000..cb961584 --- /dev/null +++ b/config-editor/config-editor-ui/package.json @@ -0,0 +1,77 @@ +{ + "name": "rule-editor.ui", + "version": "1.1.0", + "license": "MIT", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint --type-check", + "e2e": "ng e2e", + "build-prod": "ng build --prod --progress=false", + "test-once": "ng test --single-run --code-coverage", + "test-with-coverage": "ng test --code-coverage", + "build-test": "webpack --config webpack.test.config.js", + "prebuild-test": "rimraf dist-test", + "component": "ng generate component" + }, + "private": true, + "dependencies": { + "@angular-devkit/build-angular": "^0.803.1", + "@angular/animations": "^8.2.4", + "@angular/cdk": "^8.1.4", + "@angular/common": "^8.2.4", + "@angular/compiler": "^8.2.4", + "@angular/core": "^8.2.4", + "@angular/flex-layout": "^8.0.0-beta.26", + "@angular/forms": "^8.2.4", + "@angular/material": "^8.1.4", + "@angular/platform-browser": "^8.2.4", + "@angular/platform-browser-dynamic": "^8.2.4", + "@angular/router": "^8.2.4", + "@juggle/resize-observer": "^2.3.0", + "@ngrx/effects": "^8.3.0", + "@ngrx/router-store": "^8.3.0", + "@ngrx/store": "^8.3.0", + "@ngrx/store-devtools": "^8.3.0", + "@ngx-formly/core": "^5.4.1", + "@ngx-formly/material": "^5.4.1", + "@types/dragula": "^2.1.34", + "ajv": "^6.8.1", + "core-js": "~2.5.6", + "diff-match-patch": "^1.0.4", + "hammerjs": "^2.0.8", + "json-ptr": "^1.2.0", + "ngx-mat-select-search": "^1.2.3", + "ngx-scrollbar": "^5.0.1", + "omit-empty": "^1.0.0", + "rxjs": "^6.5.2", + "rxjs-compat": "^6.5.2", + "zone.js": "^0.9.1" + }, + "devDependencies": { + "@angular/cli": "^8.3.1", + "@angular/compiler-cli": "^8.2.4", + "@types/jasmine": "2.8.7", + "@types/node": "~10.1.2", + "codelyzer": "~4.3.0", + "jasmine": "^3.1.0", + "jasmine-core": "~3.1.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~2.0.2", + "karma-chrome-launcher": "~2.2.0", + "karma-cli": "~1.0.1", + "karma-coverage-istanbul-reporter": "^2.0.1", + "karma-jasmine": "~1.1.2", + "karma-jasmine-html-reporter": "^1.1.0", + "karma-nunit2-reporter": "^0.3.0", + "material-design-icons": "^3.0.1", + "ngrx-store-freeze": "^0.2.3", + "protractor": "~5.3.2", + "rimraf": "^2.6.1", + "ts-node": "^6.0.5", + "tslint": "~5.10.0", + "typescript": "^3.5.3" + } +} diff --git a/config-editor/config-editor-ui/protractor.conf.js b/config-editor/config-editor-ui/protractor.conf.js new file mode 100644 index 00000000..7ee3b5ee --- /dev/null +++ b/config-editor/config-editor-ui/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/config-editor/config-editor-ui/src/app/app-routing/app-routing.module.ts b/config-editor/config-editor-ui/src/app/app-routing/app-routing.module.ts new file mode 100644 index 00000000..849669b9 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/app-routing/app-routing.module.ts @@ -0,0 +1,23 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { InitComponent } from '@app/components/init-component/init.component'; +import { ViewResolver } from '@app/guards'; + +const appRoutes: Routes = [ + { + component: InitComponent, + path: '**', + resolve: { + message: ViewResolver, + }, + }, +]; + +@NgModule({ + exports: [RouterModule], + imports: [RouterModule.forRoot(appRoutes, { useHash: true })], + providers: [ViewResolver], +}) +export class AppRoutingModule { + constructor() {} +} diff --git a/config-editor/config-editor-ui/src/app/app-routing/custom-router-state-serializer.ts b/config-editor/config-editor-ui/src/app/app-routing/custom-router-state-serializer.ts new file mode 100644 index 00000000..9edf466c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/app-routing/custom-router-state-serializer.ts @@ -0,0 +1,28 @@ +import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { RouterStateUrl } from '@app/app-routing'; +import * as fromRouter from '@ngrx/router-store'; + +/** + * The RouterStateSerializer takes the current RouterStateSnapshot + * and returns any pertinent information needed. The snapshot contains + * all information about the state of the router at the given point in time. + * The entire snapshot is complex and not always needed. In this case, you only + * need the URL and query parameters from the snapshot in the store. Other items could be + * returned such as route parameters and static route data. + * + * source: https://github.com/ngrx/platform/blob/master/docs/router-store/api.md#custom-router-state-serializer + */ +export class CustomRouterStateSerializer implements fromRouter.RouterStateSerializer { + serialize(routerState: RouterStateSnapshot): RouterStateUrl { + const { url } = routerState; + const { queryParams } = routerState.root; + + let state: ActivatedRouteSnapshot = routerState.root; + while (state.firstChild) { + state = state.firstChild; + } + const { params } = state; + + return { url, queryParams, params }; + } +} diff --git a/config-editor/config-editor-ui/src/app/app-routing/index.ts b/config-editor/config-editor-ui/src/app/app-routing/index.ts new file mode 100644 index 00000000..355d661d --- /dev/null +++ b/config-editor/config-editor-ui/src/app/app-routing/index.ts @@ -0,0 +1,3 @@ +export { RouterStateUrl } from './router-state-url'; +export { CustomRouterStateSerializer } from './custom-router-state-serializer'; +export { AppRoutingModule } from './app-routing.module'; diff --git a/config-editor/config-editor-ui/src/app/app-routing/router-state-url.ts b/config-editor/config-editor-ui/src/app/app-routing/router-state-url.ts new file mode 100644 index 00000000..2284f7cb --- /dev/null +++ b/config-editor/config-editor-ui/src/app/app-routing/router-state-url.ts @@ -0,0 +1,7 @@ +import { Params } from '@angular/router'; + +export interface RouterStateUrl { + url: string; + queryParams: Params; + params: Params; +} diff --git a/config-editor/config-editor-ui/src/app/app.component.ts b/config-editor/config-editor-ui/src/app/app.component.ts new file mode 100644 index 00000000..aca6e44c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/app.component.ts @@ -0,0 +1,7 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 're-root', + template: '', +}) +export class AppComponent { } diff --git a/config-editor/config-editor-ui/src/app/app.module.ts b/config-editor/config-editor-ui/src/app/app.module.ts new file mode 100644 index 00000000..97134e15 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/app.module.ts @@ -0,0 +1,212 @@ +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { ScrollingModule } from '@angular/cdk/scrolling'; +import { HashLocationStrategy, LocationStrategy } from '@angular/common'; +import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; +import { APP_INITIALIZER, NgModule } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { GestureConfig } from '@angular/material'; +import { BrowserModule, HAMMER_GESTURE_CONFIG } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { AppRoutingModule, CustomRouterStateSerializer } from '@app/app-routing'; +import { + ConfigManagerComponent, DeployDialogComponent, EditorViewComponent, + ErrorDialogComponent, JsonViewerComponent, LandingPageComponent, NavBarComponent, SearchComponent, SideBarComponent, + SubmitDialogComponent +} from '@app/components'; +import { TestingDialogComponent } from '@app/components/testing-dialog/testing-dialog.component'; +import { ConfigTileComponent } from '@app/components/tile/config-tile.component'; +import { DeploymentTileComponent } from '@app/components/tile/deployment-tile.component'; +import { AppConfigService, ConfigModule } from '@app/config'; +import { HomeComponent, PageNotFoundComponent } from '@app/containers'; +import { CoreModule } from '@app/core'; +import { CredentialsInterceptor } from '@app/credentials-interceptor'; +import { RepoResolver, ViewResolver } from '@app/guards'; +import { StripSuffixPipe } from '@app/pipes'; +import { SharedModule } from '@app/shared'; +import { metaReducers, reducers } from '@app/store'; +import { EditorEffects } from '@app/store/editor.effects'; +import { RouterEffects } from '@app/store/router-effects'; +import { EffectsModule } from '@ngrx/effects'; +import { RouterStateSerializer, StoreRouterConnectingModule } from '@ngrx/router-store'; +import { StoreModule } from '@ngrx/store'; +import { FormlyModule } from '@ngx-formly/core'; +import { environment } from 'environments/environment'; +import 'hammerjs'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search' +import { NgScrollbarModule } from 'ngx-scrollbar'; +import { AppComponent } from './app.component'; +import { ChangeHistoryComponent } from './components/change-history/change-history.component'; +import { EditorComponent } from './components/editor/editor.component'; +import { InitComponent } from './components/init-component/init.component'; +import { ConfigStoreGuard } from './guards/config-store.guard'; +import { ArrayTypeComponent } from './ngx-formly/components/array.type'; +import { ExpansionPanelWrapperComponent } from './ngx-formly/components/expansion-panel-wrapper.component'; +import { FormFieldWrapperComponent } from './ngx-formly/components/form-field-wrapper.component'; +import { InputTypeComponent } from './ngx-formly/components/input.type.component'; +import { NullTypeComponent } from './ngx-formly/components/null.type'; +import { ObjectTypeComponent } from './ngx-formly/components/object.type.component'; +import { PanelWrapperComponent } from './ngx-formly/components/panel-wrapper.component'; +import { TabsWrapperComponent } from './ngx-formly/components/tabs-wrapper.component'; +import { TabsetTypeComponent } from './ngx-formly/components/tabset.type.component'; +import { TextAreaTypeComponent } from './ngx-formly/components/textarea.type.component'; +import { HighlightVariablesPipe } from './pipes'; +import { HoverPopoverDirective } from './popover/hover-popover.directive'; +import { PopoverRendererComponent } from './popover/popover-renderer.component'; +import { PopoverService } from './popover/popover-service'; +import { PopupService } from './popup.service'; +import { NgxTextDiffModule } from './text-diff/ngx-text-diff.module'; + +import {FormlyMaterialModule} from '@ngx-formly/material'; + +export function configServiceFactory(config: AppConfigService) { + return () => config.loadConfig(); +} + +export function uiMetadataServiceFactory(config: AppConfigService) { + return () => config.loadUiMetadata(); +} + +const PROD_PROVIDERS = [ + { provide: APP_INITIALIZER, useFactory: configServiceFactory, deps: [AppConfigService], multi: true }, + { provide: APP_INITIALIZER, useFactory: uiMetadataServiceFactory, deps: [AppConfigService], multi: true }, + { provide: HTTP_INTERCEPTORS, useClass: CredentialsInterceptor, multi: true }, +]; + +const DEV_PROVIDERS = [...PROD_PROVIDERS]; + +@NgModule({ + bootstrap: [AppComponent], + declarations: [ + AppComponent, + HomeComponent, + PageNotFoundComponent, + ErrorDialogComponent, + SideBarComponent, + EditorViewComponent, + NavBarComponent, + JsonViewerComponent, + ConfigManagerComponent, + StripSuffixPipe, + DeployDialogComponent, + SubmitDialogComponent, + LandingPageComponent, + SearchComponent, + TestingDialogComponent, + ConfigTileComponent, + DeploymentTileComponent, + InitComponent, + EditorComponent, + ChangeHistoryComponent, + PopoverRendererComponent, + HoverPopoverDirective, + ObjectTypeComponent, + ArrayTypeComponent, + NullTypeComponent, + PanelWrapperComponent, + TabsWrapperComponent, + TabsetTypeComponent, + ExpansionPanelWrapperComponent, + TextAreaTypeComponent, + HighlightVariablesPipe, + InputTypeComponent, + FormFieldWrapperComponent, + ], + entryComponents: [ + ErrorDialogComponent, + JsonViewerComponent, + DeployDialogComponent, + SubmitDialogComponent, + TestingDialogComponent, + LandingPageComponent, + HomeComponent, + ConfigManagerComponent, + EditorViewComponent, + PageNotFoundComponent, + EditorComponent, + PopoverRendererComponent, + ChangeHistoryComponent, + ], + imports: [ + BrowserModule, + BrowserAnimationsModule, + HttpClientModule, + SharedModule, + ConfigModule, + CoreModule, + AppRoutingModule, + NgxMatSelectSearchModule, + DragDropModule, + NgScrollbarModule, + NgxTextDiffModule, + ScrollingModule, + FormlyModule.forRoot({ + validationMessages: [ + { name: 'required', message: 'This field is required' }, + { name: 'null', message: 'should be null' }, + { name: 'minlength', message: 'Min length is' }, + { name: 'maxlength', message: 'Max length is' }, + { name: 'min', message: 'Min is' }, + { name: 'max', message: 'Max is' }, + { name: 'minItems', message: 'Min items required' }, + { name: 'maxItems', message: 'Max items' }, + ], + types: [ + { name: 'string', component: TextAreaTypeComponent }, + { + name: 'number', + component: InputTypeComponent, + wrappers: ['form-field'], + defaultOptions: { + templateOptions: { + type: 'number', + }, + }, + }, + { + name: 'integer', + component: InputTypeComponent, + wrappers: ['form-field'], + defaultOptions: { + templateOptions: { + type: 'number', + }, + }, + }, + { name: 'boolean', extends: 'checkbox' }, + { name: 'enum', extends: 'select' }, + { name: 'null', component: NullTypeComponent, wrappers: ['form-field'] }, + { name: 'array', component: ArrayTypeComponent }, + { name: 'object', component: ObjectTypeComponent }, + { name: 'tabs', component: TabsetTypeComponent}, + ], + wrappers: [ + { name: 'panel', component: PanelWrapperComponent }, + { name: 'expansion-panel', component: ExpansionPanelWrapperComponent }, + { name: 'form-field', component: FormFieldWrapperComponent }, + ], + extras: { checkExpressionOn: 'modelChange' }, + }), + ReactiveFormsModule, + FormlyMaterialModule, + + // ngrx + StoreModule.forRoot(reducers, { metaReducers }), + EffectsModule.forRoot([EditorEffects, RouterEffects]), + StoreRouterConnectingModule.forRoot(), + ], + providers: [ + environment.production ? PROD_PROVIDERS : DEV_PROVIDERS, + PopupService, + { provide: RouterStateSerializer, useClass: CustomRouterStateSerializer }, + { provide: LocationStrategy, useClass: HashLocationStrategy }, + { provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig }, + ViewResolver, + RepoResolver, + ConfigStoreGuard, + HighlightVariablesPipe, + StripSuffixPipe, + PopoverService, + ], + +}) +export class AppModule { } diff --git a/config-editor/config-editor-ui/src/app/commons/index.ts b/config-editor/config-editor-ui/src/app/commons/index.ts new file mode 100644 index 00000000..a63afb28 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/commons/index.ts @@ -0,0 +1 @@ +export { StatusCode } from './status-code'; diff --git a/config-editor/config-editor-ui/src/app/commons/status-code.ts b/config-editor/config-editor-ui/src/app/commons/status-code.ts new file mode 100644 index 00000000..bc5fcb23 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/commons/status-code.ts @@ -0,0 +1,6 @@ +export enum StatusCode { + OK = 'OK', + CREATED = 'CREATED', + BAD_REQUEST = 'BAD_REQUEST', + ERROR = 'INTERNAL_SERVER_ERROR', +} diff --git a/config-editor/config-editor-ui/src/app/components/change-history/change-history.component.html b/config-editor/config-editor-ui/src/app/components/change-history/change-history.component.html new file mode 100644 index 00000000..d197d3cb --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/change-history/change-history.component.html @@ -0,0 +1,11 @@ +
+

Change History

+ + + + + + + +
{{item.date | date:'yyyy MMM dd'}}{{item.author}}+ {{item.added}} - {{item.removed}}
+
diff --git a/config-editor/config-editor-ui/src/app/components/change-history/change-history.component.scss b/config-editor/config-editor-ui/src/app/components/change-history/change-history.component.scss new file mode 100644 index 00000000..4adeeadf --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/change-history/change-history.component.scss @@ -0,0 +1,39 @@ +.container { + margin: 0 20px; +} + +.title { + text-align: center; + padding-bottom: 10px; +} + +.added { + color: rgb(41, 145, 41); +} + +.removed { + color: #bd2020; +} + +.history-table { + width: 100%; + th { + font-weight: 400; + text-align: left !important; + font-size: 1.1em; + padding: 2px 7px; + } + tr:nth-child(even){ + background: #f5f5f5; + border-radius: 2px; + } + td { + padding: 5px 7px; + } + td:first-child(), th:first-child(){ + padding-left: 0; + } + td:last-child(), th:last-child(){ + padding-right: 0; + } +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/change-history/change-history.component.ts b/config-editor/config-editor-ui/src/app/components/change-history/change-history.component.ts new file mode 100644 index 00000000..99d40873 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/change-history/change-history.component.ts @@ -0,0 +1,26 @@ +import { FileHistory } from '../../model/config-model'; +import { PopoverContent, PopoverRef } from '../../popover/popover-ref'; + +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 're-change-history', + templateUrl: './change-history.component.html', + styleUrls: ['./change-history.component.scss'], +}) +export class ChangeHistoryComponent implements OnInit { + history: FileHistory[]; + content: PopoverContent; + + constructor(private popoverRef: PopoverRef) { + this.history = this.popoverRef.data; + } + + ngOnInit() { + this.content = this.popoverRef.content; + } + + close() { + this.popoverRef.close({id: 1}); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.html b/config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.html new file mode 100644 index 00000000..0c42d969 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.html @@ -0,0 +1,65 @@ + +
+
+
+
+

Store

+ {{(allConfigs$ | async).length}} {{(allConfigs$ | async).length === 1 ? 'item': 'items'}} +
+ + + +
+ +
+ + +
+
+ +
+
+
+

Deployment

+ {{filteredDeployment.configs.length}} {{filteredDeployment.configs.length === 1 ? 'item': 'items'}} +
+ + history + + + + + + + PR for release pending + + + +
+ +
+ +
+

drag item here to add to deployment

+
+
+ + + +
+
+
+
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.scss b/config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.scss new file mode 100644 index 00000000..aab0dba5 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.scss @@ -0,0 +1,205 @@ +.container { + display: flex; + justify-content: space-between; + align-items: stretch; + padding: 10px 30px; + min-height: 100%; + &>mat-divider { + margin: 0 40px; + } + max-width: 1800px; + margin: auto; +} + +.rules-container, +.deployment-container { + &>mat-divider { + margin: 10px 0; + } +} + +.title-info { + margin-top: 18px; +} + +.item-count { + margin-left: 10px; + color: #868686; + font-size: 1em; +} + +.add-button { + a { + min-width: 36px; + padding: 0; + margin-right: 10px; + } +} + +.rules-container { + width: 60%; + min-width: 800px; + margin-left: auto; +} + +.deployment-container { + min-width: 300px; + width: 30%; + margin-right: auto; +} + +.rule-list { + display: flex; + flex-direction: column; +} + +.deployment-list { + display: flex; + flex-direction: column; +} + +.chip-bag{ + align-content: center; +} + +.container-title { + display: flex; + justify-content: space-between; + align-items: center; + color: white; + margin-bottom: -5px; + h2 { + width: 90px; + max-width: 90px; + margin: 0 10px; + font-weight: 400; + font-size: 1.6em; + } +} + +.deployment-container-title { + @extend .container-title; +} + +mat-card { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + mat-card-title { + color: #83d3f1; + display: flex; + justify-content: space-between; + align-items: center; + font-size: 20px; + h4 { + overflow: hidden; + text-overflow: ellipsis; + font-weight: 400; + } + .unsaved-warning { + color: rgb(180, 180, 180); + font-style: italic; + font-size: 0.7em; + } + } + mat-card-subtitle { + margin-top: 10px; + display: flex; + justify-content: space-between; + align-items: center; + .chip { + display: inline-block; + margin-left: 5px; + padding: 2px 5px; + min-width: 40px; + text-align: center; + border-radius: 9999px; + color: #111; + background: rgb(180, 180, 180); + font-family: monospace; + } + } + mat-card-content { + flex: 1; + margin-bottom: 0; + font-size: 1em; + } + &:hover mat-card-footer { + opacity: 1; + } + mat-card-footer { + opacity: 0; + display: flex; + justify-content: flex-end; + align-items: center; + padding: 10px; + transition: all 0.2s ease-in-out; + a { + margin: 0 5px; + color: rgb(180, 180, 180); + cursor: pointer; + transition: all 0.2s ease-in-out; + &:hover { + color: white; + } + } + .drag-hint { + cursor: move; + } + } +} + +.pr-message { + color: orange; + display: inline-block; + margin-right: 10px; +} + +.placeholder-box { + background-color: #222; + border: 2px dotted white; + border-radius: 5px; + text-align: center; + padding: 20px; + h4 { + color: white; + font-weight: 400; + } +} + +.cdk-drag-preview { + box-sizing: border-box; + box-shadow: 0 5px 5px -3px rgba(0,0,0,0.2), + 0 8px 10px 1px rgba(0,0,0,0.14), + 0 3px 14px 2px rgba(0,0,0,0.12); +} + +.cdk-drag-placeholder { + opacity: 0; +} + +.cdk-drag-animating, +.rule-list.cdk-drop-list-dragging re-rule-tile:not(.cdk-drag-placeholder) { + transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); +} + +.cdk-drag-animating, +.deployment-list.cdk-drop-list-dragging re-deployment-tile:not(.cdk-drag-placeholder) { + transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); +} + +re-search { + width: 100%; +} + +.scrollbar { + --scrollbar-thumb-color: #868686; + --scrollbar-thumb-hover-color: #a1a1a1; +} + +.history-button { + margin: 0 0 0 auto; + color: #868686; + margin-top: 3px; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.ts b/config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.ts new file mode 100644 index 00000000..adbc3cac --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/config-manager/config-manager.component.ts @@ -0,0 +1,254 @@ +import { animate, query, stagger, style, transition, trigger } from '@angular/animations'; +import { + CdkDrag, + CdkDragDrop, + CdkDropList, + copyArrayItem, + moveItemInArray, + transferArrayItem, +} from '@angular/cdk/drag-drop'; +import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material'; +import { ConfigData, ConfigWrapper, Deployment, PullRequestInfo, SubmitStatus } from '@app/model'; +import { PopupService } from '@app/popup.service'; +import { Store } from '@ngrx/store'; +import * as fromStore from 'app/store'; +import { cloneDeep } from 'lodash'; +import { Observable, Subject } from 'rxjs'; +import { skip, take, takeUntil } from 'rxjs/operators'; +import { DeployDialogComponent } from '../deploy-dialog/deploy-dialog.component'; +import { JsonViewerComponent } from '../json-viewer/json-viewer.component'; +import { EditorService } from '@app/editor.service'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-config-manager', + styleUrls: ['./config-manager.component.scss'], + templateUrl: './config-manager.component.html', + animations: [ + trigger('list', [ + transition(':enter', [ + transition('* => *', []), + query(':enter', [ + style({ opacity: 0 }), + stagger(10, [ + style({ transform: 'scale(0.8)', opacity: 0 }), + animate('.6s cubic-bezier(.8,-0.6,0.7,1.5)', + style({transform: 'scale(1)', opacity: 1 })), + ]), + ], {optional: true}), + ]), + ]), + ], +}) +export class ConfigManagerComponent implements OnInit, OnDestroy { + private ngUnsubscribe = new Subject(); + public allConfigs$: Observable[]>; + public filteredConfigs$: Observable[]>; + public deployment$: Observable>>; + public deployment: Deployment>; + public configs: ConfigWrapper[]; + public selectedConfig$: Observable; + public selectedConfig: number; + public pullRequestPending$: Observable; + public releaseStatus$: Observable; + public searchTerm$: Observable; + public filteredDeployment: Deployment>; + public filteredDeployment$: Observable>>; + private filteredConfigs: ConfigWrapper[]; + private serviceName: string; + public filterMyConfigs$: Observable; + public filterUndeployed$: Observable; + public filterUpgradable$: Observable; + public deploymentHistory; + + private readonly UNSAVED_ITEM_ALERT = 'Unsaved item! Item must be submitted to the store before it can be deployed!'; + private readonly PR_OPEN_MESSAGE = 'A pull request is already open'; + + constructor(private store: Store, public dialog: MatDialog, private snackbar: PopupService, + private editorService: EditorService) { + this.allConfigs$ = this.store.select(fromStore.getConfigs); + this.filteredConfigs$ = this.store.select(fromStore.getConfigsFilteredBySearchTerm); + this.selectedConfig$ = this.store.select(fromStore.getSelectedConfig); + this.pullRequestPending$ = this.store.select(fromStore.getPullRequestPending); + this.releaseStatus$ = this.store.select(fromStore.getSubmitReleaseStatus); + this.deployment$ = this.store.select(fromStore.getStoredDeployment); + this.searchTerm$ = this.store.select(fromStore.getSearchTerm); + this.filteredDeployment$ = this.store.select(fromStore.getDeploymentFilteredBySearchTerm); + this.filterMyConfigs$ = this.store.select(fromStore.getFilterMyConfigs); + this.filterUndeployed$ = this.store.select(fromStore.getFilterUndeployed); + this.filterUpgradable$ = this.store.select(fromStore.getFilterUpgradable); + this.store.select(fromStore.getDeploymentHistory).pipe(take(1)) + .subscribe(h => this.deploymentHistory = {fileHistory: h}); + } + + ngOnInit() { + this.selectedConfig$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(s => this.selectedConfig = s); + this.deployment$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(s => { + this.deployment = cloneDeep(s); + }); + this.allConfigs$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(r => { + this.configs = cloneDeep(r); + }); + this.store.select(fromStore.getServiceName).pipe(takeUntil(this.ngUnsubscribe)) + .subscribe(name => this.serviceName = name); + + this.filteredConfigs$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(s => this.filteredConfigs = s); + this.filteredDeployment$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(s => { + this.filteredDeployment = cloneDeep(s); + }); + } + + ngOnDestroy() { + this.ngUnsubscribe.next(); + this.ngUnsubscribe.complete(); + } + + public onSearch(searchTerm: string) { + this.store.dispatch(new fromStore.Go({ + extras: { + queryParamsHandling: 'merge', + }, + path: [], + query: { search: searchTerm }, + })); + } + + public upgrade(index: number) { + const originalIndex = this.deployment.configs + .findIndex(d => d.name === this.filteredDeployment.configs[index].name); + const items = Object.assign(this.deployment.configs.slice(), { + [originalIndex]: this.configs.find(c => c.name === this.deployment.configs[originalIndex].name), + }); + this.deployment.configs = items; + this.store.dispatch(new fromStore.UpdateDeployment(this.deployment)); + } + + public drop(event: CdkDragDrop[]>) { + if (event.container.id === 'deployment-list' && event.previousContainer.id === 'store-list' && !event.item.data.savedInBackend) { + alert(this.UNSAVED_ITEM_ALERT); + + return; + } + + if (event.container.id === 'deployment-list') { + if (event.previousContainer.id === 'store-list') { + // In the case that the list has been filtered select the appropriate item to copy over + const index = this.configs.findIndex(e => e.name === this.filteredConfigs[event.previousIndex].name); + copyArrayItem(event.previousContainer.data, + event.container.data, + index, + event.currentIndex + ); + } else if (event.previousContainer.id === 'deployment-list') { + const prevIndex = this.deployment.configs.findIndex(e => + e.name === this.filteredDeployment.configs[event.previousIndex].name); + const currIndex = this.deployment.configs.findIndex(e => + e.name === this.filteredDeployment.configs[event.currentIndex].name); + moveItemInArray(event.container.data, prevIndex, currIndex); + } + this.store.dispatch(new fromStore.UpdateDeployment(cloneDeep(this.deployment))); + } + } + + public onView(id: number, releaseId: number = undefined) { + this.dialog.open(JsonViewerComponent, { + data: { + config1: releaseId === undefined ? undefined + : this.editorService.getLoader(this.serviceName) + .unwrapOptionalsFromArrays(cloneDeep(this.filteredDeployment.configs[releaseId])), + config2: this.editorService.getLoader(this.serviceName).unwrapOptionalsFromArrays(cloneDeep(this.filteredConfigs[id])), + }, + }); + } + + public onEdit(id: number) { + const index = this.configs.findIndex(r => r.name === this.filteredConfigs[id].name); + if (index > -1) { + this.store.dispatch(new fromStore.Go({ + path: [this.serviceName, 'edit', index], + })); + } + } + + public addToDeployment(id: number) { + const item: ConfigWrapper = this.configs.find(r => r.name === this.filteredConfigs[id].name); + if (item !== undefined) { + if (!item.savedInBackend) { + alert(this.UNSAVED_ITEM_ALERT); + + return; + } + if (this.deployment.configs.find(r => r.name === item.name) === undefined) { + const updatedDeployment: Deployment> = cloneDeep(this.deployment); + updatedDeployment.configs.push(item); + this.store.dispatch(new fromStore.UpdateDeployment(updatedDeployment)); + } + } + } + + public onRemove(id: number) { + const index = this.deployment.configs + .findIndex(r => r.name === this.filteredDeployment.configs[id].name); + + transferArrayItem(this.deployment.configs, [], index, 0); + this.store.dispatch(new fromStore.UpdateDeployment(cloneDeep(this.deployment))); + } + + public onClickCreate() { + this.store.dispatch(new fromStore.AddConfig({ + isNew: true, + configData: undefined, + savedInBackend: false, + name: `new_entry_${this.configs.length}`, + version: 0, + description: 'no description', + author: 'no author', + })); + } + + public onDeploy() { + this.store.dispatch(new fromStore.LoadPullRequestStatus()); + this.pullRequestPending$.pipe(skip(1), take(1)).subscribe(a => { + if (!a.pull_request_pending) { + const dialogRef = this.dialog.open(DeployDialogComponent, { + data: cloneDeep(this.deployment), + }); + dialogRef.afterClosed().subscribe((results: Deployment>) => { + if (results && results.configs.length > 0) { + if (results.deploymentVersion >= 0) { + this.store.dispatch(new fromStore.SubmitRelease(results)); + } + } + }); + } else { + this.snackbar.openNotification(this.PR_OPEN_MESSAGE); + } + }); + } + + public onFilterMine($event: boolean) { + this.store.dispatch(new fromStore.FilterMyConfigs($event)); + } + + public onRefreshPrStatus() { + this.store.dispatch(new fromStore.LoadPullRequestStatus()); + } + + public duplicateItemCheck(item: CdkDrag>, deployment: CdkDropList[]>) { + return deployment.data.find(d => d.name === item.data.name) === undefined + ? true : false; + } + + public noReturnPredicate() { + return false; + } + + public onFilterUpgradable($event: boolean) { + this.store.dispatch(new fromStore.FilterUpgradable($event)); + } + + public onFilterUndeployed($event: boolean) { + this.store.dispatch(new fromStore.FilterUndeployed($event)); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.html b/config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.html new file mode 100644 index 00000000..4088a858 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.html @@ -0,0 +1,66 @@ +
+ check + cancel +

Submit Deployment

+
+
+
+

Validating

+ +
+ +
+

Validation successful

+

Deploying to environment: {{ environment }}

+ +

Items in deployment:

+
+
    +
  1. + {{ config.name }} (v{{ config.version }} - {{ config.author }}) +
  2. +
+
+ +
+
+

Validation was unsuccessful

+

Status code: {{ statusCode }}

+ + + + Message + + + +

{{ message }}

+
+
+ + + + Exception + + + +

{{ exception || 'No exception provided - it may be wrapped in the message'}}

+
+
+ +
+
+
+ + +
+ +
+ +
+ +
+ + + +
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.scss b/config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.scss new file mode 100644 index 00000000..540a3a65 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.scss @@ -0,0 +1,41 @@ +.title-row { + display: flex; + justify-content: flex-start; + align-items: center; + h1 { + margin-left: 10px; + font-weight: 400; + font-size: 1.3em; + } +} + +.rules-list { + margin-left: 20px; + max-height: 500px; + li { + margin: 10px 0; + .extra-info { + color: #bbb; + font-size: 0.9em; + } + } +} + +.error { + font-family: monospace; +} + +p { + margin: 10px 0; + line-height: 1.6em; +} + +.button-row { + display: flex; + justify-content: flex-end; + align-items: center; +} + +mat-divider { + margin: 20px 0; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.ts b/config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.ts new file mode 100644 index 00000000..c368177b --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/deploy-dialog/deploy-dialog.component.ts @@ -0,0 +1,131 @@ +import { UiMetadataMap } from '../../model/ui-metadata-map'; + +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material'; +import { StatusCode } from '@app/commons'; + +import { FormGroup } from '@angular/forms'; +import { AppConfigService } from '@app/config'; +import { EditorService } from '@app/editor.service'; +import { ConfigData, ConfigWrapper, Deployment } from '@app/model'; +import { FormlyJsonschema } from '@app/ngx-formly/formly-json-schema.service'; +import { Store } from '@ngrx/store'; +import { FormlyFieldConfig, FormlyFormOptions } from '@ngx-formly/core'; +import * as fromStore from 'app/store'; +import { cloneDeep } from 'lodash'; +import { Observable } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { TestingDialogComponent } from '../testing-dialog/testing-dialog.component'; + +@Component({ + selector: 're-deploy-dialog', + styleUrls: ['deploy-dialog.component.scss'], + templateUrl: 'deploy-dialog.component.html', +}) +export class DeployDialogComponent { + deployment: Deployment>; + environment: string; + + isValid = undefined; + validating = true; + message: string; + exception: string; + statusCode: string; + serviceName$: Observable; + deploymentSchema = {}; + serviceName: string; + uiMetadata: UiMetadataMap; + extrasData = {}; + + testEnabled = false; + public options: FormlyFormOptions = {formState: {}}; + + fields: FormlyFieldConfig[]; + public form: FormGroup = new FormGroup({}); + + constructor(public dialogref: MatDialogRef, + private config: AppConfigService, + public dialog: MatDialog, + private store: Store, + private service: EditorService, + private formlyJsonSchema: FormlyJsonschema, + @Inject(MAT_DIALOG_DATA) public data: Deployment>) { + this.store.select(fromStore.getServiceName).pipe(take(1)).subscribe(r => { + this.validating = false; + this.serviceName = r; + this.uiMetadata = this.config.getUiMetadata(r); + if (this.uiMetadata.deployment.extras !== undefined) { + this.fields = [this.formlyJsonSchema.toFieldConfig(this.createDeploymentSchema(r))]; + } else { + this.service.getLoader(this.serviceName).validateRelease(data).pipe(take(1)) + .subscribe(s => { + if (s !== undefined) { + this.statusCode = s.status_code; + if (s.status_code !== StatusCode.OK) { + this.message = s.attributes.message; + this.exception = s.attributes.exception; + } + this.validating = false; + this.isValid = s.status_code === StatusCode.OK ? true : false; + } + }); + } + }); + + this.testEnabled = this.uiMetadata.testing.deploymentTestEnabled; + this.deployment = data; + this.environment = this.config.environment; + } + + private createDeploymentSchema(serviceName: string): string { + const depSchema = this.service.getLoader(serviceName).originalSchema; + depSchema.properties[this.uiMetadata.deployment.config_array] = {}; + delete depSchema.properties[this.uiMetadata.deployment.config_array]; + delete depSchema.properties[this.uiMetadata.deployment.version]; + depSchema.required = depSchema.required.filter(element => { + if (element !== this.uiMetadata.deployment.version && element !== this.uiMetadata.deployment.config_array) { + return true; + } + + return false; + }); + + return depSchema; + } + + onValidate() { + this.deployment = {...this.deployment, ...this.extrasData}; + this.service.getLoader(this.serviceName) + .validateRelease(this.deployment).pipe(take(1)).subscribe(s => { + if (s !== undefined) { + this.statusCode = s.status_code; + if (s.status_code !== StatusCode.OK) { + this.message = s.attributes.message; + this.exception = s.attributes.exception; + } + this.validating = false; + this.isValid = s.status_code === StatusCode.OK ? true : false; + } + }); + } + + onClickDeploy() { + const deployment = this.extrasData !== undefined + ? Object.assign(cloneDeep(this.deployment), this.extrasData) + : this.deployment; + this.dialogref.close(deployment); + } + + onClickTest() { + this.dialog.open(TestingDialogComponent, { + data: { + configDto: this.deployment, + singleConfig: false, + }, + }) + } + + onClickClose() { + this.dialogref.close(); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.html b/config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.html new file mode 100644 index 00000000..48d07252 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.html @@ -0,0 +1,9 @@ +
+ + +
+ + +
+
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.scss b/config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.scss new file mode 100644 index 00000000..db3496ca --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.scss @@ -0,0 +1,25 @@ +.container { + display: flex; + justify-content: space-between; + align-items: stretch; + height: 100%; +} + +re-side-bar { + min-width: 400px; + max-width: 800px; + flex: 1; + overflow-y: auto; + padding: 0 10px; +} + +mat-card-content { + max-height: 50px !important; + overflow-y: hidden !important; + text-overflow: ellipsis !important; +} + +.viewport { + flex: 2; + overflow-y: auto; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.ts b/config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.ts new file mode 100644 index 00000000..df2873f7 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/editor-view/editor-view.component.ts @@ -0,0 +1,31 @@ +import { AppConfigService } from '../../config/app-config.service'; + +import { ChangeDetectionStrategy } from '@angular/core'; +import { Component } from '@angular/core'; +import * as fromStore from '@app/store'; +import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { take } from 'rxjs/operators'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-editor-view', + styleUrls: ['./editor-view.component.scss'], + templateUrl: './editor-view.component.html', +}) +export class EditorViewComponent { + bootstrapped$: Observable; + + testEnabled = false; + sensorFieldsEnabled = false; + serviceName: string; + + constructor(private store: Store, private config: AppConfigService) { + this.store.select(fromStore.getServiceName).pipe(take(1)).subscribe(r => { + this.serviceName = r + this.testEnabled = this.config.getUiMetadata(r).testing.perConfigTestEnabled; + this.sensorFieldsEnabled = this.config.getUiMetadata(r).enableSensorFields; + }); + this.bootstrapped$ = this.store.select(fromStore.getBootstrapped); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/editor/editor.component.html b/config-editor/config-editor-ui/src/app/components/editor/editor.component.html new file mode 100644 index 00000000..c282a256 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/editor/editor.component.html @@ -0,0 +1,37 @@ + + + +
+ + + +
+ +

{{ (configs$ | async)[selectedIndex].name }}

+
+
+ + +
+
+ +

v{{ (configs$ | async)[selectedIndex].version }} by {{ (configs$ | async)[selectedIndex].author }}

+
+ + Data Source + + + {{sensor.sensor_name}} + + + + +
+ +
+
+ + + +
+
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/editor/editor.component.scss b/config-editor/config-editor-ui/src/app/components/editor/editor.component.scss new file mode 100644 index 00000000..4ad498ba --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/editor/editor.component.scss @@ -0,0 +1,79 @@ +mat-card { + width: 100%; + max-width: 1000px; + min-width: 800px; + margin: 20px auto; + mat-card-title { + display: flex; + justify-content: space-between; + align-items: center; + h2 { + max-width: 80%; + overflow: hidden; + text-overflow: ellipsis; + font-size: 20pt; + } + } +} + +textarea{ + width: 100%; + height: 100%; + background-color: white; + color: inherit; +} + +.mat-raised-button { + margin: 0 5px 0 0; +} + +.example { + color: red; +} + +::ng-deep .show-text .mat-input-element { + -webkit-text-fill-color: unset !important; +} + +mat-form-field { + width: 100%; +} + +fieldset { + background: rgba(255,255,255,0.1); +} + +.rule-title { + display: flex; + width: 85%; +} + +h2 { + padding: 0 20px 0 0; +} + +pre { + font-size: 0.5em; + display: inline; +} + +::ng-deep mat-expansion-panel { + margin: 20px 0 !important; +} + +::ng-deep .mat-card-header-text { + margin: 0 !important; +} + +::ng-deep material-tabs-widget>.ng-star-inserted { + margin-top: 20px !important; +} + +.scrollbar { + --scrollbar-thumb-color: #868686; + --scrollbar-thumb-hover-color: #a1a1a1; +} + +.submit-button { + margin-right: 1em; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/editor/editor.component.ts b/config-editor/config-editor-ui/src/app/components/editor/editor.component.ts new file mode 100644 index 00000000..1df36690 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/editor/editor.component.ts @@ -0,0 +1,292 @@ +import { ChangeDetectionStrategy, Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { MatDialog } from '@angular/material'; +import { AppConfigService } from '@app/config'; +import { ConfigData, ConfigWrapper, SensorFields } from '@app/model'; +import { PopupService } from '@app/popup.service'; +import { Store } from '@ngrx/store'; +import { FormlyFieldConfig, FormlyFormOptions } from '@ngx-formly/core'; +import * as fromStore from 'app/store'; +import { cloneDeep } from 'lodash'; +import * as omitEmpty from 'omit-empty'; +import { Observable, of, Subject } from 'rxjs'; +import { take, takeUntil } from 'rxjs/operators'; +import { SubmitDialogComponent } from '..'; +import { EditorService } from '../../editor.service'; +import { UiMetadataMap } from '../../model/ui-metadata-map'; +import { FormlyJsonschema } from '../../ngx-formly/formly-json-schema.service'; +import * as JsonPointer from '../../ngx-formly/util/jsonpointer.functions'; +import { TestingDialogComponent } from '../testing-dialog/testing-dialog.component'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-generic-editor', + styleUrls: ['./editor.component.scss'], + templateUrl: './editor.component.html', +}) +export class EditorComponent implements OnInit, OnDestroy { + public ngUnsubscribe = new Subject(); + public configs$: Observable[]>; + public selectedIndex$: Observable; + public schema$: Observable; + public user$: Observable; + public configName: string; + public selectedIndex: number; + public configs: ConfigWrapper[]; + public config: ConfigWrapper = undefined; + public configData: ConfigData = {}; + public schema: any = {}; + public enabled = 0; + public user: string; + public sensors$: Observable = of([]); + public selectedSensor$: Observable; + private metaDataMap: UiMetadataMap; + public fields: FormlyFieldConfig[]; + public options: FormlyFormOptions = {}; + public sensors: SensorFields[] = []; + private serviceName: string; + private dynamicFieldsMap: Map; + + public form: FormGroup = new FormGroup({}); + + private readonly NO_INPUT_MESSAGE = 'No data inputted to form'; + private readonly NO_NAME_MESSAGE = 'A name must be provided'; + private readonly UNIQUE_NAME_MESSAGE = 'Config name must be unique'; + private readonly SPACE_IN_NAME_MESSAGE = 'Config names cannot contain spaces'; + + @Input() testEnabled: boolean; + @Input() sensorFieldsEnabled: boolean; + @Input() editorType: string; + + constructor(public store: Store, public dialog: MatDialog, public snackbar: PopupService, + private appConfigService: AppConfigService, private formlyJsonschema: FormlyJsonschema, private editorService: EditorService) { + this.configs$ = this.store.select(fromStore.getConfigs); + this.selectedIndex$ = this.store.select(fromStore.getSelectedConfig); + this.schema$ = this.store.select(fromStore.getSchema); + this.user$ = this.store.select(fromStore.getCurrentUser); + this.store.select(fromStore.getBootstrapped).pipe(take(1)).subscribe(s => this.serviceName = s); + this.store.select(fromStore.getDynamicFieldsMap).pipe(takeUntil(this.ngUnsubscribe)).subscribe(s => this.dynamicFieldsMap = s); + } + + ngOnInit() { + this.schema$.pipe(takeUntil(this.ngUnsubscribe)).subscribe( + s => { + this.fields = [this.formlyJsonschema.toFieldConfig(s.schema)]; + }); + this.metaDataMap = this.appConfigService.getUiMetadata(this.editorType); + + this.configs$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(r => { + this.configs = []>r; + if (this.config && this.selectedIndex) { + this.config = this.configs[this.selectedIndex]; + } + }); + + this.store.select(fromStore.getSensorListFromDataSource).pipe(takeUntil(this.ngUnsubscribe)).subscribe( + s => this.sensors = s + ); + + this.selectedIndex$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(r => { + this.store.dispatch(new fromStore.SelectDataSource(undefined)); + if (this.config && this.configData) { + this.pushRuleUpdateToState(); + } + this.selectedIndex = r; + this.config = this.configs[r]; + this.configData = cloneDeep(this.config.configData) || {}; + this.configName = this.config.name; + this.options.formState = { + mainModel: this.configData, + sensorFields: this.sensors, + }; + }); + + this.user$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(u => this.user = u); + + if (this.sensorFieldsEnabled) { + this.sensors$ = this.store.select(fromStore.getSensorFields); + this.store.dispatch(new fromStore.LoadCentrifugeFields()); + this.selectedSensor$ = this.store.select(fromStore.getDataSource); + this.selectedSensor$.subscribe(s => this.options.formState.sensorFields = this.sensors) + } + } + + ngOnDestroy() { + if (this.config) { + this.store.select(fromStore.getServiceName).pipe(take(1)) + .subscribe(serviceName => { + if (serviceName === this.editorType) { + this.pushRuleUpdateToState(); + } + }) + } + this.ngUnsubscribe.next(); + this.ngUnsubscribe.complete(); + } + + private cleanConfigData(configData: ConfigData): ConfigData { + let cfg = this.removeFieldsWhichShouldBeHidden(this.dynamicFieldsMap, configData); + cfg = this.editorService.getLoader(this.serviceName).produceOrderedJson(cfg, '/'); + // recursively removes null, undefined, empty objects, empty arrays from the object + cfg = omitEmpty(cfg); + + return cfg; + } + + pushRuleUpdateToState(): ConfigWrapper { + const cleanedConfigData = this.cleanConfigData(this.configData); + + const configToUpdate = cloneDeep(this.config); + configToUpdate.configData = cloneDeep(cleanedConfigData); + if (this.config.isNew) { + configToUpdate.configData[this.metaDataMap.name] = configToUpdate.name = this.configName; + configToUpdate.configData[this.metaDataMap.version] = configToUpdate.version = 0; + configToUpdate.configData[this.metaDataMap.author] = configToUpdate.author = this.user; + } else { + configToUpdate.configData[this.metaDataMap.name] = configToUpdate.name = this.config.name; + configToUpdate.configData[this.metaDataMap.version] = configToUpdate.version = this.config.version; + configToUpdate.configData[this.metaDataMap.author] = configToUpdate.author = this.config.author; + } + configToUpdate.description = configToUpdate.configData[this.metaDataMap.description]; + + // check if rule has been changed, mark unsaved + if (JSON.stringify(this.config.configData) !== JSON.stringify(configToUpdate.configData)) { + configToUpdate.savedInBackend = false; + } + const newConfigs = Object.assign(this.configs.slice(), { + [this.selectedIndex]: configToUpdate, + }); + this.store.dispatch(new fromStore.UpdateConfigs(newConfigs)); + + return configToUpdate; + } + + private removeFieldsWhichShouldBeHidden(functionsMap: Map, cfg): ConfigData { + let data = cloneDeep(cfg); + const functionsMapKeys = []; + const functionsMapItr = functionsMap.keys(); + for (let i = 0; i < functionsMap.size; ++i) { + functionsMapKeys.push(functionsMapItr.next().value); + } + + for (const stringPath of functionsMapKeys) { + const path = JsonPointer.JsonPointer.parse(stringPath); + // find the lengths of arrays of objects so they can be iterated through with conditional function + const arrayIndices = []; + for (let j = 0; j < path.length; j++) { + // in generic path '-' corresponds to an array index + if (path[j] === '-') { + const obj = JsonPointer.JsonPointer.get(data, path.slice(0, j)); + if (obj !== undefined) { + arrayIndices.push(obj.length - 1); + } + } + } + + if (arrayIndices.length === 0) { + this.removeFromDataIfFuncFalse(data, {}, functionsMap, stringPath); + } + // TODO replace this with generic implementation where arrays of arrays is possible in JSON structure + for (let j = 0; j <= arrayIndices[0]; j++) { + this.removeFromDataIfFuncFalse(data, {parent: { parent: { key: j}, key: j } }, functionsMap, stringPath); + } + } + + return data; + } + + private removeFromDataIfFuncFalse(data, field, functionsMap: Map, stringPath: string) { + try { + const func = functionsMap.get(stringPath); + const dynFunc = new Function('model', 'localfield', 'field', func); + if (dynFunc(data, null, field)) { + let indexedPointer; + if (stringPath.includes('-')) { + indexedPointer = JsonPointer.JsonPointer.toIndexedPointer(stringPath, [field.parent.parent.key]); + } else { + indexedPointer = stringPath; + } + JsonPointer.JsonPointer.remove(data, indexedPointer); + } + + } catch { + console.warn('Something went wrong with condition evaluation when cleaning form', stringPath); + } + } + + onSubmit() { + const config = this.pushRuleUpdateToState(); + + if (!config.configData) { + this.snackbar.openNotification(this.NO_INPUT_MESSAGE); + + return; + } + + if (config.isNew) { + if (this.configName === undefined || this.configName === '') { + this.snackbar.openNotification(this.NO_NAME_MESSAGE); + + return; + } + + if (this.configs.find(f => config !== f && f.configData && f.name === this.configName) !== undefined) { + this.snackbar.openNotification(this.UNIQUE_NAME_MESSAGE); + + return; + } + + if (this.configName.includes(' ')) { + this.snackbar.openNotification(this.SPACE_IN_NAME_MESSAGE); + } + } + + this.form = new FormGroup({}); + this.dialog.open(SubmitDialogComponent, { + data: { + ...config, + name: this.configName, + }, + }).afterClosed().subscribe((submittedData: ConfigData) => { + if (submittedData) { + this.config = config; + if (config.isNew) { + this.store.dispatch(new fromStore.SubmitNewConfig(config)); + } else { + this.store.dispatch(new fromStore.SubmitConfigEdit(config)); + } + } + }); + } + + public onClone() { + const newConfig: ConfigWrapper = { + isNew: true, + configData: Object.assign({}, cloneDeep(this.config.configData), { + [this.metaDataMap.name]: `${this.config.name}_clone`, + [this.metaDataMap.version]: 0, + }), + savedInBackend: false, + name: `${this.config.name}_clone`, + author: this.user, + version: 0, + description: this.config.description, + }; + + this.store.dispatch(new fromStore.AddConfig(newConfig)); + } + + public onTest() { + const currentConfig = this.pushRuleUpdateToState().configData; + this.dialog.open(TestingDialogComponent, { + data: { + configDto: currentConfig, + singleConfig: true, + }, + }); + } + + public onSelectDataSource(dataSource: string) { + this.store.dispatch(new fromStore.SelectDataSource(dataSource)); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.html b/config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.html new file mode 100644 index 00000000..3134d48e --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.html @@ -0,0 +1,10 @@ +

Error Details

+
+

An error occurred when making a request. Please contact SecDev support for help.

+ +

{{data.name}}, {{data.message}}

+

{{data.error.attributes.message}}

+
+
+ +
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.scss b/config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.scss new file mode 100644 index 00000000..fdce56b5 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.scss @@ -0,0 +1,17 @@ +.details { + font-family: Roboto, "Helvetica Neue", sans-serif; +} + +.error { + font-family: monospace; + margin: 20px 0; +} + +.button-layout { + margin-right: 0px; + margin-left: auto; +} + +mat-divider { + margin: 10px 0; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.ts b/config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.ts new file mode 100644 index 00000000..294be351 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/error-dialog/error-dialog.component.ts @@ -0,0 +1,18 @@ +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; + +@Component({ + selector: 're-error-dialog', + styleUrls: ['error-dialog.component.scss'], + templateUrl: 'error-dialog.component.html', +}) +export class ErrorDialogComponent { + constructor(public dialogref: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + console.log(data); + } + + onClickClose() { + this.dialogref.close(); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/index.ts b/config-editor/config-editor-ui/src/app/components/index.ts new file mode 100644 index 00000000..6c9313f8 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/index.ts @@ -0,0 +1,10 @@ +export { EditorViewComponent } from './editor-view/editor-view.component'; +export { SideBarComponent } from './side-bar/side-bar.component'; +export { NavBarComponent } from './nav-bar/nav-bar.component'; +export { JsonViewerComponent } from './json-viewer/json-viewer.component'; +export { ConfigManagerComponent } from './config-manager/config-manager.component'; +export { SubmitDialogComponent } from './submit-dialog/submit-dialog.component'; +export { DeployDialogComponent } from './deploy-dialog/deploy-dialog.component'; +export { ErrorDialogComponent } from './error-dialog/error-dialog.component'; +export { LandingPageComponent } from './landing-page/landing-page.component'; +export { SearchComponent } from './search/search.component'; diff --git a/config-editor/config-editor-ui/src/app/components/init-component/init.component.ts b/config-editor/config-editor-ui/src/app/components/init-component/init.component.ts new file mode 100644 index 00000000..99c00661 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/init-component/init.component.ts @@ -0,0 +1,90 @@ +import { Component, OnDestroy } from '@angular/core'; +import { Router, Routes } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { Subject } from 'rxjs'; +import { delay, filter, map, switchMap, takeUntil, withLatestFrom } from 'rxjs/operators'; +import { ConfigManagerComponent, EditorViewComponent, LandingPageComponent } from '..'; +import { HomeComponent, PageNotFoundComponent } from '../../containers'; +import { EditorService } from '../../editor.service'; +import * as fromGuards from '../../guards'; +import { RepoResolver, ViewResolver } from '../../guards'; +import * as fromStore from '../../store'; +import { SetServiceNames } from '../../store'; + +@Component({ + template: '', +}) +export class InitComponent implements OnDestroy { + + private readonly specificEditorRoutes: Routes = [ + { + path: '', + component: ConfigManagerComponent, + resolve: { + message: ViewResolver, + }, + }, + { + path: 'edit', + redirectTo: 'edit/0', + }, + { + component: EditorViewComponent, + path: 'edit/:id', + canActivate: [fromGuards.ConfigStoreGuard], + }, + ] + + private appRoutes: Routes = [ + { + path: '', + pathMatch: 'full', + redirectTo: 'home', + }, + { + path: 'home', + component: LandingPageComponent, + resolve: { + message: RepoResolver, + }, + }, + ]; + + private ngUnsubscribe = new Subject(); + constructor(private router: Router, private store: Store, + private service: EditorService) { + this.service.getServiceNames().pipe(takeUntil(this.ngUnsubscribe)).subscribe((serviceList: string[]) => { + const routes = this.appRoutes; + serviceList.forEach(r => { + routes.push({path: r, component: HomeComponent, children: this.specificEditorRoutes}) + }); + routes.push({ + component: PageNotFoundComponent, + path: '**', + }); + this.router.resetConfig(routes); + this.store.dispatch(new SetServiceNames(serviceList)); + this.service.createLoaders(); + }) + + this.store.select(fromStore.getServiceNames).pipe( + takeUntil(this.ngUnsubscribe), + switchMap(_ => { + this.router.navigate([this.router.url]); + + return this.store.select(fromStore.getBootstrapped).pipe( + withLatestFrom(this.store.select(fromStore.getServiceName)), + filter(([bootstrapped, serviceName]) => bootstrapped !== undefined && bootstrapped === serviceName), + delay(100), + map(() => { + this.router.navigate([this.router.url]); + }) + ) + }) + ).subscribe(); + } + + ngOnDestroy() { + this.ngUnsubscribe.next(); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.html b/config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.html new file mode 100644 index 00000000..5999180e --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.html @@ -0,0 +1,11 @@ +
+ + +
diff --git a/config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.scss b/config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.scss new file mode 100644 index 00000000..2caed697 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.scss @@ -0,0 +1,15 @@ +.viewer{ + width: 100%; + font-size: 1.1em; + line-height: 1.2em; +} + +h4 { + margin-bottom: 20px; +} + +pre { + overflow-y: auto; + overflow-x: auto; + line-height: 1.6em; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.ts b/config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.ts new file mode 100644 index 00000000..0277aa2e --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/json-viewer/json-viewer.component.ts @@ -0,0 +1,37 @@ +import { Component } from '@angular/core'; +import { ChangeDetectionStrategy } from '@angular/core'; +import { Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { ConfigData, ConfigWrapper } from '@app/model'; + +export interface DiffContent { + leftContent: string; + rightContent: string; +} + +export interface DiffContent { + leftContent: string; + rightContent: string; +} + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-json-viewer', + styleUrls: ['./json-viewer.component.scss'], + templateUrl: './json-viewer.component.html', +}) +export class JsonViewerComponent { + public leftContent: ConfigWrapper; + public rightContent: ConfigWrapper; + + constructor(public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + + this.leftContent = data.config1; + this.rightContent = data.config2; + } + + onCompareResults($event) { + // noop + } +} diff --git a/config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.html b/config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.html new file mode 100644 index 00000000..c5fb7901 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.html @@ -0,0 +1,15 @@ +
+
+

Config Editor UI

+
+ +

{{ ruleset | titlecase}}

+ + + Working Repo + Release Repo + +
+
+
+
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.scss b/config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.scss new file mode 100644 index 00000000..bbf1433d --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.scss @@ -0,0 +1,46 @@ +.centre-box { + display: flex; + justify-content: center; + align-items: center; + text-align: center; + min-height: 100vh; + font-size: 2em; +} + +h1 { + font-weight: 400; + margin-bottom: 50px; + color: #eee; + font-size: 1.5em; + text-shadow: 0 1px 2px rgba(0,0,0,0.3); +} + +button { + margin: 20px auto; + display: block; +} + +.rulesets { + display: flex; + justify-content: center; + align-items: stretch; + flex-wrap: wrap; +} + +.ruleset { + margin: 25px; + padding: 40px 50px; + h2 { + font-size: 1em; + margin-bottom: 20px; + } + a { + display: inline-block; + margin: 5px; + } +} + +::ng-deep .rulesets .mat-raised-button { + font-size: 18px !important; + line-height: 46px !important; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.ts b/config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.ts new file mode 100644 index 00000000..d96aa9bc --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/landing-page/landing-page.component.ts @@ -0,0 +1,35 @@ +import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; +import { RepositoryLinks } from '@app/model'; +import * as fromStore from '@app/store'; +import { Store } from '@ngrx/store'; +import { Observable, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +@Component({ + changeDetection: ChangeDetectionStrategy.Default, + selector: 're-landing-page', + styleUrls: ['./landing-page.component.scss'], + templateUrl: './landing-page.component.html', +}) +export class LandingPageComponent implements OnInit, OnDestroy { + + private ngUnsubscribe = new Subject(); + serviceNames$: Observable; + repositoryLinks: { [name: string]: RepositoryLinks } = {}; + + constructor(private store: Store) { } + + ngOnInit(): void { + this.serviceNames$ = this.store.select(fromStore.getServiceNames); + this.store.select(fromStore.getRepositoryLinks).pipe(takeUntil(this.ngUnsubscribe)).subscribe(links => { + if (links) { + this.repositoryLinks = links.reduce((pre, cur) => ({ ...pre, [cur.rulesetName]: cur }), {}); + } + }); + } + + ngOnDestroy(): void { + this.ngUnsubscribe.next(); + this.ngUnsubscribe.complete(); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.html b/config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.html new file mode 100644 index 00000000..1a6edf3d --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.html @@ -0,0 +1,20 @@ + + +
+ +

{{ serviceName$ | async | titlecase }} Editor

+

{{ environment | titlecase }}

+
+
+ + + + {{ serviceName | titlecase }} + + + account_box +

{{ user$ | async }}

+
+
+
+ \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.scss b/config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.scss new file mode 100644 index 00000000..12e82177 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.scss @@ -0,0 +1,69 @@ +.nav-content { + display: flex; + align-items: center; + justify-content: space-between; + color: #eee; + background: #212121; + font-size: 0.8em; + padding: 0 30px; + &>div { + display: flex; + justify-content: center; + align-items: center; + } + img { + display: block; + height: 50px; + animation: spin 1.2s cubic-bezier(.55,.31,.45,.69) infinite; + margin-left: 20px; + } + h1 { + font-size: 1.8em; + display: inline-block; + margin: 0 10px 0 25px; + } + button { + margin: 0 5px; + font-size: 1em; + } + mat-icon { + margin-left: 40px; + margin-right: 2px; + display: inline-block; + } + h3 { + font-weight: 400; + } +} + +.env { + margin-left: 0 !important; + color: #ff9800 !important; +} + +::ng-deep .mat-button-toggle-appearance-standard .mat-button-toggle-label-content { + line-height: 36px !important; + padding: 0 30px !important; +} + +::ng-deep .mat-button-toggle-checked { + background: rgba(6, 167, 226, 0.9); +} + +.done-spin { + animation-iteration-count: 1 !important; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(720deg); + } +} + +mat-progress-bar { + position: absolute; + z-index: 1; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.ts b/config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.ts new file mode 100644 index 00000000..74a21a70 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/nav-bar/nav-bar.component.ts @@ -0,0 +1,38 @@ +import { Component } from '@angular/core'; +import { ChangeDetectionStrategy } from '@angular/core'; +import { AppConfigService } from '@app/config/app-config.service'; +import { Store } from '@ngrx/store'; +import * as fromStore from 'app/store'; +import { Observable } from 'rxjs'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-nav-bar', + styleUrls: ['./nav-bar.component.scss'], + templateUrl: './nav-bar.component.html', +}) +export class NavBarComponent { + user$: Observable; + loading$: Observable; + serviceName$: Observable; + serviceNames$: Observable; + environment: string; + + constructor(private store: Store, private config: AppConfigService) { + this.user$ = this.store.select(fromStore.getCurrentUser); + this.loading$ = this.store.select(fromStore.getLoading); + this.serviceName$ = this.store.select(fromStore.getServiceName); + this.serviceNames$ = this.store.select(fromStore.getServiceNames); + this.environment = this.config.environment; + } + + public onSelectView(view: string) { + this.store.dispatch(new fromStore.Go({ + extras: { + queryParamsHandling: 'merge', + }, + path: ['id', view], + query: {}, + })); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/search/search.component.html b/config-editor/config-editor-ui/src/app/components/search/search.component.html new file mode 100644 index 00000000..7cef3c0c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/search/search.component.html @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/search/search.component.scss b/config-editor/config-editor-ui/src/app/components/search/search.component.scss new file mode 100644 index 00000000..3f385faa --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/search/search.component.scss @@ -0,0 +1,32 @@ +.search-box { + display: flex; + justify-content: stretch; + align-items: stretch; + mat-icon { + margin: auto; + } + //margin: 10px; +} + +mat-checkbox { + margin: auto; + margin-right: 20px; + color: #b5b5b5; +} + +mat-form-field { + padding-right: 20px; +} + +.mat-checkbox-layout { + color: #b5b5b5; +} + +.checkboxes { + display: flex; + flex: 1; +} + +.search-container { + flex: 3; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/search/search.component.ts b/config-editor/config-editor-ui/src/app/components/search/search.component.ts new file mode 100644 index 00000000..695f6112 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/search/search.component.ts @@ -0,0 +1,47 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-search', + styleUrls: ['./search.component.scss'], + templateUrl: './search.component.html', +}) + +export class SearchComponent implements OnInit { + @ViewChild('searchBox', { static: true }) searchBox; + @Input() searchTerm: string; + @Input() filterMyConfigs: boolean; + @Input() filterUndeployed: boolean; + @Input() filterUpgradable: boolean; + @Output() searchTermChange: EventEmitter = new EventEmitter(); + @Output() myConfigsChange: EventEmitter = new EventEmitter(); + @Output() undeployedConfigsChange: EventEmitter = new EventEmitter(); + @Output() updatedConfigsChange: EventEmitter = new EventEmitter(); + + myConfigs = true; + + ngOnInit(): void { + this.searchBox.nativeElement.focus(); + } + + public onSearch(searchTerm: string) { + this.searchTermChange.emit(searchTerm); + } + + public onClearSearch() { + this.onSearch(''); + this.searchTerm = ''; + } + + public clickMyConfigs($event: boolean) { + this.myConfigsChange.emit($event); + } + + public clickNotDeployed($event: boolean) { + this.undeployedConfigsChange.emit($event); + } + + public clickUpdatedConfigs($event: boolean) { + this.updatedConfigsChange.emit($event); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.html b/config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.html new file mode 100644 index 00000000..a0fc57d7 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.html @@ -0,0 +1,11 @@ + +
+ +
+ + + +
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.scss b/config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.scss new file mode 100644 index 00000000..eeb3c94c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.scss @@ -0,0 +1,24 @@ +.back-button { + margin: 15px; +} + +::ng-deep .back-button .mat-raised-button { + font-size: 1.2em; +} + +mat-divider { + margin: 10px; +} + +mat-card { + margin: 10px; +} + +.scrollbar { + --scrollbar-thumb-color: #868686; + --scrollbar-thumb-hover-color: #a1a1a1; +} + +re-rule-tile { + margin: inherit 5px; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.ts b/config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.ts new file mode 100644 index 00000000..0c90067c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/side-bar/side-bar.component.ts @@ -0,0 +1,37 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { ConfigData, ConfigWrapper } from '@app/model'; +import { Store } from '@ngrx/store'; +import * as fromStore from 'app/store'; +import { Observable } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { AppConfigService } from '../../config'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-side-bar', + styleUrls: ['./side-bar.component.scss', '../config-manager/config-manager.component.scss'], + templateUrl: './side-bar.component.html', +}) +export class SideBarComponent { + public configs$: Observable[]>; + public selectedConfig$: Observable; + private serviceName: string; + + constructor(public config: AppConfigService, private store: Store) { + this.configs$ = this.store.select(fromStore.getConfigs); + this.selectedConfig$ = this.store.select(fromStore.getSelectedConfig); + this.store.select(fromStore.getServiceName).pipe(take(1)).subscribe(name => this.serviceName = name); + } + + public onReturn() { + this.store.dispatch(new fromStore.Go({ + path: [this.serviceName], + })); + } + + public onSelect(index: number) { + this.store.dispatch(new fromStore.Go({ + path: [this.serviceName, 'edit', index], + })); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.html b/config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.html new file mode 100644 index 00000000..b76d949c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.html @@ -0,0 +1,48 @@ +
+ check + cancel +

Submit Config

+
+
+
+

Validating

+ +
+ +
+

Config has been validated by the backend

+

Do you wish to submit {{ config.name }} to the store?

+
+ +

Config did not pass backend validation.

+

Status code: {{ statusCode }}

+ + + + Message + + + +

{{ message }}

+
+
+ + + + Exception + + + +

{{ exception || 'No exception provided - it may be wrapped in the message'}}

+
+
+
+
+ + + +
+
+ + +
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.scss b/config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.scss new file mode 100644 index 00000000..0f0fa36f --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.scss @@ -0,0 +1,25 @@ +.title-row { + display: flex; + justify-content: flex-start; + align-items: center; + h1 { + margin-left: 10px; + font-weight: 400; + font-size: 1.3em; + } +} + +.error { + font-family: monospace; +} + +p { + margin: 10px 0; + line-height: 1.6em; +} + +.button-row { + display: flex; + justify-content: flex-end; + align-items: center; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.ts b/config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.ts new file mode 100644 index 00000000..082bc2d5 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/submit-dialog/submit-dialog.component.ts @@ -0,0 +1,53 @@ +import { Component, Inject } from '@angular/core'; +import { OnInit } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { StatusCode } from '@app/commons/status-code'; +import { ConfigData, ConfigWrapper, EditorResult, ExceptionInfo } from '@app/model'; +import { Store } from '@ngrx/store'; +import * as fromStore from 'app/store'; +import { Observable } from 'rxjs'; + +@Component({ + selector: 're-submit-dialog', + styleUrls: ['submit-dialog.component.scss'], + templateUrl: 'submit-dialog.component.html', +}) +export class SubmitDialogComponent implements OnInit { + config: ConfigWrapper; + configValidity$: Observable>; + message: string; + exception: string; + statusCode: string; + validating = true; + isValid = false; + + constructor(public dialogref: MatDialogRef, + private store: Store, + @Inject(MAT_DIALOG_DATA) public data: ConfigWrapper) { + this.configValidity$ = this.store.select(fromStore.getConfigValidity); + this.config = data; + this.store.dispatch(new fromStore.ValidateConfig(this.config)); + } + + ngOnInit() { + this.configValidity$.subscribe(v => { + if (v !== undefined) { + this.statusCode = v.status_code; + if (v.status_code !== StatusCode.OK) { + this.message = v.attributes.message; + this.exception = v.attributes.exception; + } + this.validating = false; + this.isValid = this.statusCode === StatusCode.OK; + } + }); + } + + onClickSubmit() { + this.dialogref.close(this.config); + } + + onClickClose() { + this.dialogref.close(); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.html b/config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.html new file mode 100644 index 00000000..bb783bd8 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.html @@ -0,0 +1,42 @@ +
+
+

Test Deployment Configuration:

+
+

{{r?.name}}

+
+
+
+

Test Config

+
+

{{deploymentConfig?.name}}

+
+
+
+
+
+
+ +

noteEvent

+

help

+
+ +
+
+ +

computerTest Output

+ +
+

cancel

+
+
+

check

+
+
+
{{ output }}
+
+
+
+
+ + +
diff --git a/config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.scss b/config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.scss new file mode 100644 index 00000000..64b3fb0e --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.scss @@ -0,0 +1,91 @@ +pre { + max-width: 800px; + min-width: 800px; + min-height: 600px; + max-height: 600px; + overflow-x: auto; + overflow-y: auto; + background-color: black; + padding: 20px; +} + +textarea { + min-width: 300px; + max-width: 800px; + min-height: 600px; + max-height: 600px; + overflow-x: auto; + overflow-y: auto; + background-color: black; + color: inherit; + border-radius: 5px; + overflow-wrap: inherit; + width: 800px; +} + +.input { + display: block; + margin: 20px; + border: 1px solid rgba(255,255,255,0.3); + border-radius: 5px; +} + +.console { + display: block; + margin: 20px; + border: 1px solid rgba(255,255,255,0.3); + border-radius: 5px; +} + +h4 { + font-weight: 400; + font-family: monospace; + font-size: 1.2em; + margin: 5px; + display: flex; + justify-content: flex-start; + align-items: center; + +} + +.columns { + display: flex; + padding: 10px; +} + +.config-options { + margin: 10px; +} + +.button-row { + display: flex; + justify-content: flex-end; + align-items: center; +} + +mat-form-field { + padding-bottom: 20px; +} + +.title { + display: flex; + overflow: auto; +} + +.help { + margin-left: auto; +} + +.left-icon { + margin: 0 10px 0 5px; +} + +::ng-deep .mat-tooltip { + white-space: pre-line; + font-size: 0.7em; + line-height: 1.4em; + } + +.list-item { + padding: 10px; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.ts b/config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.ts new file mode 100644 index 00000000..aee24f84 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/testing-dialog/testing-dialog.component.ts @@ -0,0 +1,154 @@ +import { Inject } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { AppConfigService } from '@app/config'; +import { EditorService } from '@app/editor.service'; +import { ConfigData, Deployment, EditorResult } from '@app/model'; +import { PopupService } from '@app/popup.service'; +import { Store } from '@ngrx/store'; +import * as fromStore from 'app/store'; +import { of, Subject } from 'rxjs'; +import { take, takeUntil } from 'rxjs/operators'; +import { ConfigLoaderService } from '../../config-loader.service'; +import { ConfigTestResult } from '../../model/config-model'; + +@Component({ + selector: 're-testing-dialog', + styleUrls: ['testing-dialog.component.scss'], + templateUrl: 'testing-dialog.component.html', +}) +export class TestingDialogComponent implements OnDestroy, OnInit { + deploymentConfig: Deployment; + alert: string; + output: string; + EVENT_HELP: string; + testSuccess = 'none'; + private ngUnsubscribe = new Subject(); + private service: ConfigLoaderService; + private env: string; + isSingleConfig: boolean; + + constructor(public dialogref: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any, + private editorService: EditorService, + public snackbar: PopupService, + private store: Store, + private appConfig: AppConfigService) { + this.store.select(fromStore.getServiceName).pipe(take(1)).subscribe(r => { + this.env = r; + this.service = this.editorService.getLoader(r); + this.EVENT_HELP = this.appConfig.getUiMetadata(this.env).testing.helpMessage; + }) + this.deploymentConfig = data.configDto; + this.isSingleConfig = data.singleConfig; + } + + ngOnInit() { + this.store.select(fromStore.getConfigTestingEvent).pipe(take(1)).subscribe(e => this.alert = e); + } + + public beginTest() { + this.testSuccess = 'none'; + if (this.alert === null || this.alert === undefined || this.alert === '') { + this.output = 'Error: please provide an alert to test the rule against'; + this.testSuccess = 'fail'; + + return; + } + + let event: any; + try { + // TODO remove this once test specification is done properly + if (this.env === 'parserconfig') { + event = {log: this.alert}; + } else { + event = JSON.parse(this.alert); + } + } catch (e) { + this.output = 'Error in alert JSON:\n\n' + e; + this.testSuccess = 'fail'; + + return; + } + + const testDto: any = { + files: [{ + content: + this.deploymentConfig, + }], + event: event, + }; + + if (this.service) { + if (this.isSingleConfig) { + this.service.testSingleConfig(testDto).pipe(takeUntil(this.ngUnsubscribe)) + .map(r => r) + .catch(err => { + this.ngUnsubscribe.next(); + this.snackbar.openSnackBar(err, `Error could not contact ${this.env} backend`); + + return of(null); + }).subscribe((b: EditorResult) => { + if (b === null) { + return; + } + if (b.status_code === 'OK') { + this.output = b.attributes.test_result_output; + } else { + if (b.attributes.message && b.attributes.exception) { + this.output = b.attributes.message + '\n' + b.attributes.exception; + } else if (b.attributes.message !== undefined) { + this.output = b.attributes.message; + } else if (b.attributes.exception !== undefined) { + this.output = b.attributes.exception; + } + } + this.testSuccess = b.attributes.test_result_complete ? 'success' : 'fail'; + } + ) + } else { + this.service.testDeploymentConfig(testDto).pipe(takeUntil(this.ngUnsubscribe)) + .map(r => r) + .catch(err => { + this.ngUnsubscribe.next(); + this.snackbar.openSnackBar(err, `Error could not contact ${this.env} backend`); + + return of(null); + }).subscribe((b: EditorResult) => { + if (b === null) { + return; + } + if (b.status_code === 'OK') { + this.output = b.attributes.test_result_output; + } else { + if (b.attributes.message && b.attributes.exception) { + this.output = b.attributes.message + '\n' + b.attributes.exception; + } else if (b.attributes.message !== undefined) { + this.output = b.attributes.message; + } else if (b.attributes.exception !== undefined) { + this.output = b.attributes.exception; + } + } + this.testSuccess = b.attributes.test_result_complete ? 'success' : 'fail'; + } + ) + } + } else { + this.snackbar.openSnackBar(`Error, could not load ${this.env} service correctly, + this is likely due to not being able to fetch the service name`, 'Error loading testing service'); + } + } + + public onTab($event) { + return false; + } + + onClickClose() { + this.dialogref.close(); + } + + ngOnDestroy() { + this.store.dispatch(new fromStore.StoreConfigTestingEvent(this.alert)); + this.ngUnsubscribe.next(); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/tile/config-tile.component.html b/config-editor/config-editor-ui/src/app/components/tile/config-tile.component.html new file mode 100644 index 00000000..25dfd7f6 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/tile/config-tile.component.html @@ -0,0 +1,35 @@ +
+
+
+ + v{{config.version || '0' }} + +

{{config.author}}

+
+ + +
+

{{config.name}}

+ +
+
+ {{tag}} +
+
+
+
+

{{config.description}}

+
+ + + edit + + + pageview + + + arrow_forward + + +
+
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/components/tile/config-tile.component.scss b/config-editor/config-editor-ui/src/app/components/tile/config-tile.component.scss new file mode 100644 index 00000000..08edc860 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/tile/config-tile.component.scss @@ -0,0 +1,167 @@ +.chip { + display: inline-block; + margin: 0 auto; + padding: 2px 5px; + min-width: 40px; + text-align: center; + border-radius: 9999px; + color: #111; + background: rgb(180, 180, 180); + font-family: monospace; + pointer-events: none; +} + +.tag-chip { + display: inline-block; + margin: 0 auto; + padding: 2px 5px; + min-width: 40px; + max-width: 200px; + text-align: center; + border-radius: 9999px; + color: #111; + background: #868686; + font-family: monospace; + margin-left: 10px; +} + +.tag-text { + padding-top: 2px; + font-size: 8pt; + text-overflow: ellipsis; + overflow: hidden; +} + +.inline { + display: flex; +} +.inline-title { + display: flex; + margin-top: 5px; +} + +.column-fixed { + margin: 0 10px; + width: 60px; + min-width: 60px; +} + +mat-divider { + margin-right: 10px; +} + +.column { + overflow: hidden; +} + +.tags-column { + overflow: hidden; + margin-left: 20px; + display: inline-flex; + white-space: nowrap; +} + +.warn { + background: orange !important; +} + +.title { + color: #83d3f1; + font-size: 18px; + font-weight: 200; + overflow: hidden; + text-overflow: ellipsis; + font-weight: 400; + white-space: nowrap; + padding-top: 5px; +} + +.rule-title { + color: #83d3f1; + font-size: 18px; + font-weight: 200; + overflow: hidden; + text-overflow: ellipsis; + font-weight: 400; + white-space: nowrap; + padding-top: 5px; + display: contents; +} + +.space { + flex: 5; +} + +.author { + color: white; + font-size: 14px; + font-weight: 100; + flex: 1; + padding-top: 5px; + text-align: center; +} + +.subtitle { + font-weight: 100; + padding-top: 3px; + color: rgba(255, 255, 255, 0.7); + font-size: 12px; + flex: 5; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.box { + background-color: rgb(68, 68, 68); + color: inherit; + padding: 5px; + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); + border-radius: 5px; + margin-bottom: 5px +} + +.buttons { + margin-right: 0px; + margin-left: auto; + opacity: 0; + display: flex; + justify-content: flex-end; + align-items: center; + padding: 10px; + transition: all 0.2s ease-in-out; + a { + margin: 0 5px; + color: rgb(180, 180, 180); + cursor: pointer; + transition: all 0.2s ease-in-out; + &:hover { + color: white; + } + } + + .drag-hint { + cursor: move; + } +} + +:hover .buttons { + opacity: 1; +} + +.chip-bag { + margin-top: 5px; + display: flex; + pointer-events: none; +} + +button { + line-height: 18px; + margin-top: 2px; +} + +.selected-rule-box { + @extend .box; + box-shadow: 0 0 0 1px rgba(255,255,255,0.9) inset !important; + margin: 20px 0; +} diff --git a/config-editor/config-editor-ui/src/app/components/tile/config-tile.component.ts b/config-editor/config-editor-ui/src/app/components/tile/config-tile.component.ts new file mode 100644 index 00000000..99f14a6f --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/tile/config-tile.component.ts @@ -0,0 +1,33 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; +import { ConfigData, ConfigWrapper } from '../../model/config-model'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-config-tile', + styleUrls: ['./config-tile.component.scss'], + templateUrl: './config-tile.component.html', +}) +export class ConfigTileComponent { + + @Input() config: ConfigWrapper; + @Input() disableButtons: boolean; + @Input() selected: boolean; + + @Output() onEdit = new EventEmitter(); + @Output() onView = new EventEmitter(); + @Output() onAddToDeployment = new EventEmitter(); + + constructor() {} + + editConfig() { + this.onEdit.emit(); + } + + viewConfig() { + this.onView.emit(); + } + + addToDeployment() { + this.onAddToDeployment.emit(); + } +} diff --git a/config-editor/config-editor-ui/src/app/components/tile/deployment-tile.component.html b/config-editor/config-editor-ui/src/app/components/tile/deployment-tile.component.html new file mode 100644 index 00000000..dfd1c02a --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/tile/deployment-tile.component.html @@ -0,0 +1,24 @@ +
+
+
+ + v{{config.version || '0' }} + +

{{config.author}}

+
+ + +

{{config.name}}

+ + +
+ + + delete + + + swap_vert + + +
+
diff --git a/config-editor/config-editor-ui/src/app/components/tile/deployment-tile.component.ts b/config-editor/config-editor-ui/src/app/components/tile/deployment-tile.component.ts new file mode 100644 index 00000000..633599e8 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/components/tile/deployment-tile.component.ts @@ -0,0 +1,32 @@ +import { ConfigData, ConfigWrapper } from '../../model/config-model'; + +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-deployment-tile', + styleUrls: ['./config-tile.component.scss'], + templateUrl: './deployment-tile.component.html', +}) +export class DeploymentTileComponent { + + @Input() config: ConfigWrapper; + + @Output() onDelete = new EventEmitter(); + @Output() onUpgrade = new EventEmitter(); + @Output() onViewDiff = new EventEmitter(); + + constructor() {} + + deleteConfig() { + this.onDelete.emit(); + } + + upgradeConfig() { + this.onUpgrade.emit(); + } + + viewDiff() { + this.onViewDiff.emit(); + } +} diff --git a/config-editor/config-editor-ui/src/app/config-loader.service.ts b/config-editor/config-editor-ui/src/app/config-loader.service.ts new file mode 100644 index 00000000..5ac2bfa3 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/config-loader.service.ts @@ -0,0 +1,345 @@ +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { AppConfigService } from './config/app-config.service'; +import { IConfigLoaderService } from './editor.service'; +import { SchemaDto } from './model'; +import { + ConfigData, + ConfigTestDto, + ConfigTestResult, + ConfigWrapper, + ContentRuleFile, + Deployment, + DeploymentWrapper, + EditorResult, + ExceptionInfo, + GitFiles, + PullRequestInfo, + RepositoryLinks, + RepositoryLinksWrapper, + SchemaInfo, +} from './model/config-model'; +import { Field } from './model/sensor-fields'; +import { UiMetadataMap } from './model/ui-metadata-map'; + +import { cloneDeep } from 'lodash'; + +export class ConfigLoaderService implements IConfigLoaderService { + private optionalObjects: string[] = []; + private readonly uiMetadata: UiMetadataMap; + private labelsFunc: Function; + public originalSchema; + public modelOrder = {}; + + constructor(private http: HttpClient, private config: AppConfigService, private env: string) { + this.uiMetadata = this.config.getUiMetadata(this.env); + try { + this.labelsFunc = new Function('model', this.uiMetadata.labelsFunc); + } catch { + console.error('unable to parse labels funciton'); + this.labelsFunc = () => []; + } + } + + public getConfigs(): Observable[]> { + + return this.http.get>>( + `${this.config.serviceRoot}api/v1/${this.env}/configstore/configs`) + .map(result => { + if (result.attributes && result.attributes.files && result.attributes.files.length > 0) { + return result.attributes.files.map(file => ({ + isNew: false, + configData: this.wrapOptionalsInArray(file.content), + savedInBackend: true, + name: file.content[this.uiMetadata.name], + description: file.content[this.uiMetadata.description], + author: file.content[this.uiMetadata.author], + version: file.content[this.uiMetadata.version], + versionFlag: -1, + isDeployed: false, + tags: this.labelsFunc(file.content), + fileHistory: file.file_history, + })); + } + + throw new DOMException('bad format response when loading configs'); + }); + } + + public getConfigsFromFiles(files: ContentRuleFile[]): ConfigWrapper[] { + const ret: ConfigWrapper[] = []; + for (const file of files) { + ret.push({ + isNew: false, + configData: this.wrapOptionalsInArray(file.content), + savedInBackend: true, + name: file.content[this.uiMetadata.name], + description: file.content[this.uiMetadata.description], + author: file.content[this.uiMetadata.author], + version: file.content[this.uiMetadata.version], + versionFlag: -1, + isDeployed: false, + tags: this.labelsFunc(file.content), + }); + } + + return ret; + } + + private returnSubTree(tree, path: string): any { + let subtree = cloneDeep(tree); + path.split('.').forEach(node => { + subtree = subtree[node]; + }); + + return subtree; + } + + public getSchema(): Observable { + return this.http.get>(`${this.config.serviceRoot}api/v1/${this.env}/configs/schema`) + .map(x => { + this.originalSchema = x.attributes.rules_schema; + try { + return this.returnSubTree(x, this.uiMetadata.perConfigSchemaPath); + } catch { + throw new Error('Call to schema endpoint didn\'t return the expected schema'); + } + }) + .map(schema => { + this.optionalObjects = []; // clear optional objects in case they have been set previously; + this.modelOrder = {} + this.wrapOptionalsInSchema(schema, '', ''); + delete schema.properties[this.uiMetadata.name]; + delete schema.properties[this.uiMetadata.author]; + delete schema.properties[this.uiMetadata.version]; + schema.required = schema.required.filter( + f => (f !== this.uiMetadata.name) && (f !== this.uiMetadata.author) && (f !== this.uiMetadata.version)); + + return { schema }; + }); + } + + // function to go through the output json and reorder the properties such that it is consistent with the schema + public produceOrderedJson(configData: ConfigData, path: string) { + if (this.modelOrder[path]) { + const currentCfg = cloneDeep(configData) + configData = {}; + for (const key of this.modelOrder[path]) { + configData[key] = currentCfg[key]; + const searchPath = path === '/' ? path + key : path + '/' + key; + // ensure it has children + if (typeof(configData[key]) === typeof({}) && this.modelOrder[searchPath] !== undefined) { + if (configData[key].length === undefined) { + // is an object + const tempCopy = cloneDeep(configData[key]) + configData[key] = {}; + const tmpObj = {} + for (const orderedKey of this.modelOrder[searchPath]) { + if (tempCopy[orderedKey] !== undefined) { + tmpObj[orderedKey] = tempCopy[orderedKey]; + } + } + configData[key] = tmpObj; + configData[key] = this.produceOrderedJson(configData[key], searchPath) + } else { + // is an array + const tmp = cloneDeep(configData[key]); + configData[key] = []; + for (let i = 0; i < tmp.length; ++i) { + configData[key].push(this.produceOrderedJson(tmp[i], searchPath)); + } + } + } + } + } + + return configData; + } + + private wrapOptionalsInArray(obj: object) { + for (const optional of this.optionalObjects) { + this.findAndWrap(obj, optional); + } + + return obj; +} + private findAndWrap(obj: any, optionalKey: string) { + if (typeof(obj) === typeof ({})) { + for (const key of Object.keys(obj)) { + if (key === optionalKey) { + obj[key] = [obj[key]]; + + return; + } + this.findAndWrap(obj[key], optionalKey); + } + } + } + + private wrapOptionalsInSchema(obj: any, propKey?: string, path?: string): any { + if (obj === undefined || obj === null || typeof (obj) !== typeof ({})) { + return; + } + if (obj.type === 'object' && typeof(obj.properties) === typeof ({})) { + path = path.endsWith('/') ? path + propKey : path + '/' + propKey; + const requiredProperties = obj.required || []; + const props = Object.keys(obj.properties); + this.modelOrder[path] = props; + for (const property of props) { + const thingy = obj.properties[property]; + const isRequired = requiredProperties.includes(property); + const isObject = thingy.type === 'object'; + if (!isRequired && isObject) { + this.optionalObjects.push(property); + const sub = {...thingy}; + thingy.type = 'array'; + delete thingy.required; + delete thingy.properties; + delete thingy.title; + delete thingy.description; + if (sub['x-schema-form'] !== undefined) { + delete sub['x-schema-form']; + } + thingy.items = sub; + thingy.maxItems = 1; + this.wrapOptionalsInSchema(thingy.items, property, path); + } else { + this.wrapOptionalsInSchema(thingy, property, path); + } + } + } else if (obj.type === 'array') { + path = path === '/' ? path : path + '/'; + if (obj.items.type === 'object') { + this.wrapOptionalsInSchema(obj.items, propKey, path); + } + } else if (obj.type === undefined && !obj.hasOwnProperty('properties')) { + path = path === '/' ? path + propKey : path + '/' + propKey; + for (const key of Object.keys(obj)) { + this.wrapOptionalsInSchema(obj[key], key, path); + } + } + } + + public unwrapOptionalsFromArrays(obj: any) { + if (obj === undefined || obj === null || typeof (obj) !== typeof ({})) { + return obj; + } + + for (const key of Object.keys(obj)) { + if (this.optionalObjects.includes(key)) { + obj[key] = obj[key] === [] || obj[key] === undefined || obj[key] === null ? undefined : obj[key][0]; + } + } + for (const key of Object.keys(obj)) { + this.unwrapOptionalsFromArrays(obj[key]); + } + + return obj; + } + + public getPullRequestStatus(): Observable { + return this.http.get>(`${this.config.serviceRoot}api/v1/${this.env}/configstore/release/status`) + .map(result => result.attributes); + } + + public getRelease(): Observable { + return this.http.get>> + (`${this.config.serviceRoot}api/v1/${this.env}/configstore/release`) + .map(result => result.attributes.files[0]) + .map(result => ( + { + deploymentHistory: result.file_history, + storedDeployment: { + deploymentVersion: result.content[this.uiMetadata.deployment.version], + configs: result.content[this.uiMetadata.deployment.config_array].map(configData => ({ + isNew: false, + configData: this.wrapOptionalsInArray(configData), + savedInBackend: true, + name: configData[this.uiMetadata.name], + description: configData[this.uiMetadata.description], + author: configData[this.uiMetadata.author], + version: configData[this.uiMetadata.version], + versionFlag: -1, + tags: this.labelsFunc(configData), + })), + }, + } + )) + } + + public getRepositoryLinks(): Observable { + return this.http.get>( + `${this.config.serviceRoot}api/v1/${this.env}/configstore/repositories`) + .map(result => ({ + ...result.attributes.rules_repositories, + rulesetName: this.env, + })) + } + + public validateConfig(config: ConfigWrapper): Observable> { + const json = JSON.stringify(this.unwrapOptionalsFromArrays(cloneDeep(config.configData)), null, 2); + + return this.http.post>( + `${this.config.serviceRoot}api/v1/${this.env}/configs/validate?singleConfig=true`, json); + } + + public validateRelease(deployment: Deployment>): Observable> { + const validationFormat = this.marshalDeploymentFormat(deployment); + const json = JSON.stringify(validationFormat, null, 2); + + return this.http.post>(`${this.config.serviceRoot}api/v1/${this.env}/configs/validate`, json); + } + + public submitRelease(deployment: Deployment>): Observable> { + const releaseFormat = this.marshalDeploymentFormat(deployment); + const json = JSON.stringify(releaseFormat, null, 2); + + return this.http.post>(`${this.config.serviceRoot}api/v1/${this.env}/configstore/release`, json); + } + + public submitConfigEdit(config: ConfigWrapper): Observable>> { + const json = JSON.stringify(this.unwrapOptionalsFromArrays(cloneDeep(config.configData)), null, 2); + + return this.http.put>>( + `${this.config.serviceRoot}api/v1/${this.env}/configstore/configs`, json); + } + + public submitNewConfig(config: ConfigWrapper): Observable>> { + const json = JSON.stringify(this.unwrapOptionalsFromArrays(cloneDeep(config.configData)), null, 2); + + return this.http.post>>( + `${this.config.serviceRoot}api/v1/${this.env}/configstore/configs`, json); + } + + public getFields(): Observable { + return this.http.get>( + `${this.config.serviceRoot}api/v1/${this.env}/configs/fields`) + .map(f => f.attributes.fields); + } + + public testDeploymentConfig(testDto: ConfigTestDto): Observable> { + testDto.files[0].content = this.marshalDeploymentFormat(testDto.files[0].content); + + return this.http.post>( + `${this.config.serviceRoot}api/v1/${this.env}/configs/test?singleConfig=false`, testDto) + } + + public testSingleConfig(testDto: ConfigTestDto): Observable> { + testDto.files[0].content = this.unwrapOptionalsFromArrays(cloneDeep(testDto.files[0].content)); + + return this.http.post>( + `${this.config.serviceRoot}api/v1/${this.env}/configs/test?singleConfig=true`, testDto) + } + + public marshalDeploymentFormat(deployment: Deployment>): any { + const d = cloneDeep(deployment); + delete d.deploymentVersion; + delete d.configs; + + return Object.assign(d, { + [this.uiMetadata.deployment.version]: deployment.deploymentVersion, + [this.uiMetadata.deployment.config_array]: + deployment.configs.map(config => this.unwrapOptionalsFromArrays(cloneDeep(config.configData))), + }); + } +} diff --git a/config-editor/config-editor-ui/src/app/config/app-config.service.ts b/config-editor/config-editor-ui/src/app/config/app-config.service.ts new file mode 100644 index 00000000..db185424 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/config/app-config.service.ts @@ -0,0 +1,59 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/toPromise'; +import { ConfigData } from '../model/config-model'; +import { UiMetadataMap } from '../model/ui-metadata-map'; +import { EditorConfig } from './editor-config'; + +@Injectable({ + providedIn: 'root', + }) +export class AppConfigService { + + private config: EditorConfig; + private uiMetadata: UiMetadataMap; + + constructor(private http: HttpClient) { } + + // This gets called on startup and APP_INITIALIZER will wait for the promise to resolve + public loadConfig(): Promise { + return this.http.get('config.json') + .toPromise() + .then((r: ConfigData) => { + // tslint:disable-next-line:no-console + console.info(`Loaded ${r.environment} config`, r); + this.config = r; + }); + } + + public loadUiMetadata(): Promise { + return this.http.get('assets/uiSetupConfig.json') + .toPromise() + .then((r: UiMetadataMap) => { + // tslint:disable-next-line:no-console + console.info('loaded UI setup', r); + this.uiMetadata = r; + }) + } + + public getServiceList(): string[] { + return Object.keys(this.uiMetadata); + } + + public getUiMetadata(serviceName: string): UiMetadataMap { + return this.uiMetadata[serviceName]; + } + + public getConfig(): EditorConfig { + return this.config; + } + + public get environment(): string { + return this.config.environment; + } + + public get serviceRoot(): string { + return this.config.serviceRoot; + } +} diff --git a/config-editor/config-editor-ui/src/app/config/config.module.ts b/config-editor/config-editor-ui/src/app/config/config.module.ts new file mode 100644 index 00000000..f18f162c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/config/config.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +// import { HttpModule } from '@angular/http'; + +import { HttpClientModule } from '@angular/common/http'; +import { AppConfigService } from './app-config.service'; + +export function configFactory(config: AppConfigService) { + return config.getConfig(); +} + +@NgModule({ + imports: [HttpClientModule], + providers: [AppConfigService], +}) +export class ConfigModule { + constructor() {} +} diff --git a/config-editor/config-editor-ui/src/app/config/editor-config.ts b/config-editor/config-editor-ui/src/app/config/editor-config.ts new file mode 100644 index 00000000..4753a61e --- /dev/null +++ b/config-editor/config-editor-ui/src/app/config/editor-config.ts @@ -0,0 +1,4 @@ +export class EditorConfig { + environment: string; + serviceRoot: string; +} diff --git a/config-editor/config-editor-ui/src/app/config/index.ts b/config-editor/config-editor-ui/src/app/config/index.ts new file mode 100644 index 00000000..f2cdea65 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/config/index.ts @@ -0,0 +1,3 @@ +export { EditorConfig } from './editor-config'; +export { AppConfigService } from './app-config.service'; +export { ConfigModule } from './config.module'; diff --git a/config-editor/config-editor-ui/src/app/containers/home/home.component.html b/config-editor/config-editor-ui/src/app/containers/home/home.component.html new file mode 100644 index 00000000..a3d23ee1 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/containers/home/home.component.html @@ -0,0 +1,6 @@ +
+ +
+ +
+
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/containers/home/home.component.scss b/config-editor/config-editor-ui/src/app/containers/home/home.component.scss new file mode 100644 index 00000000..687c8bdd --- /dev/null +++ b/config-editor/config-editor-ui/src/app/containers/home/home.component.scss @@ -0,0 +1,12 @@ +.container { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: stretch; + height: 100vh; +} + +.router-holder { + flex: 1; + overflow-y: auto; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/containers/home/home.component.ts b/config-editor/config-editor-ui/src/app/containers/home/home.component.ts new file mode 100644 index 00000000..647bb284 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/containers/home/home.component.ts @@ -0,0 +1,12 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-home', + styleUrls: ['./home.component.scss'], + templateUrl: './home.component.html', +}) +export class HomeComponent { + + constructor() {} +} diff --git a/config-editor/config-editor-ui/src/app/containers/index.ts b/config-editor/config-editor-ui/src/app/containers/index.ts new file mode 100644 index 00000000..0c6606bc --- /dev/null +++ b/config-editor/config-editor-ui/src/app/containers/index.ts @@ -0,0 +1,2 @@ +export { HomeComponent } from './home/home.component'; +export { PageNotFoundComponent } from './page-not-found/page-not-found.component'; diff --git a/config-editor/config-editor-ui/src/app/containers/page-not-found/page-not-found.component.scss b/config-editor/config-editor-ui/src/app/containers/page-not-found/page-not-found.component.scss new file mode 100644 index 00000000..efe09758 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/containers/page-not-found/page-not-found.component.scss @@ -0,0 +1,7 @@ +div { + font-family: Roboto, "Helvetica Neue", sans-serif; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/containers/page-not-found/page-not-found.component.ts b/config-editor/config-editor-ui/src/app/containers/page-not-found/page-not-found.component.ts new file mode 100644 index 00000000..bf16cc9a --- /dev/null +++ b/config-editor/config-editor-ui/src/app/containers/page-not-found/page-not-found.component.ts @@ -0,0 +1,9 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-page-not-found', + styleUrls: ['./page-not-found.component.scss'], + template: '
Page not found!
', +}) +export class PageNotFoundComponent { } diff --git a/config-editor/config-editor-ui/src/app/core/core.module.ts b/config-editor/config-editor-ui/src/app/core/core.module.ts new file mode 100644 index 00000000..528ad0f9 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/core/core.module.ts @@ -0,0 +1,16 @@ +import { NgModule, Optional, SkipSelf } from '@angular/core'; +import { EditorService } from 'app/editor.service'; + +@NgModule({ + providers: [ + EditorService, + ], +}) +export class CoreModule { + constructor( @Optional() @SkipSelf() parentModule: CoreModule) { + if (parentModule) { + throw new Error( + 'CoreModule is already loaded. Import it in the AppModule only '); + } + } +} diff --git a/config-editor/config-editor-ui/src/app/core/index.ts b/config-editor/config-editor-ui/src/app/core/index.ts new file mode 100644 index 00000000..653ddb7b --- /dev/null +++ b/config-editor/config-editor-ui/src/app/core/index.ts @@ -0,0 +1 @@ +export { CoreModule } from './core.module'; diff --git a/config-editor/config-editor-ui/src/app/credentials-interceptor.ts b/config-editor/config-editor-ui/src/app/credentials-interceptor.ts new file mode 100644 index 00000000..b079644f --- /dev/null +++ b/config-editor/config-editor-ui/src/app/credentials-interceptor.ts @@ -0,0 +1,14 @@ +import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; + +@Injectable({ + providedIn: 'root', + }) +export class CredentialsInterceptor implements HttpInterceptor { + intercept(req: HttpRequest, next: HttpHandler): Observable> { + const clone = req.clone({ withCredentials: true }); + + return next.handle(clone); + } +} diff --git a/config-editor/config-editor-ui/src/app/editor.service.ts b/config-editor/config-editor-ui/src/app/editor.service.ts new file mode 100644 index 00000000..595f440e --- /dev/null +++ b/config-editor/config-editor-ui/src/app/editor.service.ts @@ -0,0 +1,91 @@ +import { ConfigTestDto, DeploymentWrapper } from './model/config-model'; + +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { AppConfigService } from '@app/config'; +import { ConfigLoaderService } from '@app/config-loader.service'; +import { + ConfigData, + ConfigWrapper, + Deployment, + EditorResult, + ExceptionInfo, + GitFiles, + PullRequestInfo, + RepositoryLinks, + SchemaDto, + SensorFieldTemplate, + UserName +} from '@app/model'; +import { Field, SensorFields } from '@app/model/sensor-fields'; +import { StripSuffixPipe } from '@app/pipes'; +import { Observable } from 'rxjs'; + +export interface IConfigLoaderService { + getConfigs(): Observable[]>; + getConfigsFromFiles(files: any); + getSchema(): Observable; + getPullRequestStatus(): Observable; + getRelease(): Observable; + getRepositoryLinks(): Observable; + validateConfig(config: ConfigWrapper): Observable>; + validateRelease(deployment: Deployment>): Observable>; + submitNewConfig(config: ConfigWrapper): Observable>>; + submitConfigEdit(config: ConfigWrapper): Observable>>; + submitRelease(deployment: Deployment>): Observable>; + getFields(): Observable + testDeploymentConfig(config: any): Observable>; + testSingleConfig(config: ConfigTestDto): Observable>; +}; + +@Injectable({ + providedIn: 'root', + }) +export class EditorService { + + loaderServices: Map = new Map(); + + constructor( + private http: HttpClient, + private config: AppConfigService) {} + + public getUser(): Observable { + return this.http.get>(`${this.config.serviceRoot}user`) + .map(result => new StripSuffixPipe().transform(result.attributes.user_name, '@UBERIT.NET')); + } + + public getServiceNames(): Observable { + return this.http.get>(`${this.config.serviceRoot}user`) + .map(result => result.attributes.services) + .map(arr => arr.map(serviceName => serviceName.name)); + } + + public getSensorFields(): Observable { + return this.http.get>( + `${this.config.serviceRoot}api/v1/sensorfields`) + .map(result => result.attributes.sensor_template_fields.sort((a, b) => { + if (a.sensor_name > b.sensor_name) { + return 1; + } else if (a.sensor_name < b.sensor_name) { + return -1; + } else { + return 0; + } + } + )); + } + + public createLoaders() { + this.config.getServiceList().forEach(element => { + this.loaderServices.set(element, new ConfigLoaderService(this.http, this.config, element)); + }); + } + + public getLoader(serviceName: string): any { + try { + return this.loaderServices.get(serviceName); + } catch { + throw new DOMException('Invalid service name - can\'t do nothing'); + } + } +} diff --git a/config-editor/config-editor-ui/src/app/guards/config-store.guard.ts b/config-editor/config-editor-ui/src/app/guards/config-store.guard.ts new file mode 100644 index 00000000..fe30982f --- /dev/null +++ b/config-editor/config-editor-ui/src/app/guards/config-store.guard.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate } from '@angular/router'; +import * as fromStore from '@app/store'; +import { Store } from '@ngrx/store'; +import { combineLatest, Observable } from 'rxjs'; +import { filter, map, take, tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root', + }) +export class ConfigStoreGuard implements CanActivate { + + constructor(private store: Store) { } + + canActivate(route: ActivatedRouteSnapshot): Observable | Promise | boolean { + const id = parseInt(route.params['id'], 10); + const serviceName = route.parent.url[0].path; + + return isNaN(id) + ? false + : combineLatest(this.store.select(fromStore.getBootstrapped), this.store.select(fromStore.getConfigs)).pipe( + + tap(([bootstrapped, configs]) => { + if (bootstrapped !== serviceName) { + this.store.dispatch(new fromStore.Bootstrap(serviceName)); + } + }), + filter(([bootstrapped, configs]) => bootstrapped === serviceName), + map(([isBootstrapped, configs]) => id < configs.length), + take(1)); + } +} diff --git a/config-editor/config-editor-ui/src/app/guards/index.ts b/config-editor/config-editor-ui/src/app/guards/index.ts new file mode 100644 index 00000000..8cf83832 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/guards/index.ts @@ -0,0 +1,3 @@ +export { ConfigStoreGuard } from './config-store.guard'; +export { ViewResolver } from './view.resolver'; +export { RepoResolver } from './repo.resolver'; diff --git a/config-editor/config-editor-ui/src/app/guards/repo.resolver.ts b/config-editor/config-editor-ui/src/app/guards/repo.resolver.ts new file mode 100644 index 00000000..f78cab24 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/guards/repo.resolver.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { Resolve } from '@angular/router'; +import * as fromStore from '@app/store'; +import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs/Observable'; +import { map, take, tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root', + }) +export class RepoResolver implements Resolve { + + constructor(private store: Store) { } + + resolve(): Observable { + return this.store.select(fromStore.getRepositoryLinks).pipe( + tap(repositoryLinks => { + if (!repositoryLinks) { + this.store.dispatch(new fromStore.LoadRepositories()); + } + }), + map(repositoryLinks => true), + take(1)); + } +} diff --git a/config-editor/config-editor-ui/src/app/guards/view.resolver.ts b/config-editor/config-editor-ui/src/app/guards/view.resolver.ts new file mode 100644 index 00000000..2c159112 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/guards/view.resolver.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; +import * as fromStore from '@app/store'; +import { Store } from '@ngrx/store'; +import { of } from 'rxjs'; +import { Observable } from 'rxjs/Observable'; +import { filter, map, take, tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root', + }) +export class ViewResolver implements Resolve { + constructor(private store: Store) { } + + resolve(route: ActivatedRouteSnapshot): Observable { + let serviceName = ''; + if (route.parent.url[0] === undefined) { + return of(false); + } + serviceName = route.parent.url[0].path; + + return this.store.select(fromStore.getBootstrapped).pipe( + tap(bootstrapped => { + if (bootstrapped !== serviceName) { + this.store.dispatch(new fromStore.Bootstrap(serviceName)); + } + }), + map(bootstrapped => bootstrapped === serviceName), + filter(isBootstrapped => isBootstrapped), + take(1)); + } +} diff --git a/config-editor/config-editor-ui/src/app/model/config-model.ts b/config-editor/config-editor-ui/src/app/model/config-model.ts new file mode 100644 index 00000000..373afd56 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/model/config-model.ts @@ -0,0 +1,102 @@ +import { SensorFields } from '@app/model'; +import { SchemaDto } from './schema'; + +export interface EditorResult { + status_code: string; + attributes: T; +} + +export interface ExceptionInfo { + exception?: string; + message?: string; +} + +export interface GitFiles extends ExceptionInfo { + files: T[]; +} + +export interface GeneralRule { + file_name: string; +} + +export interface ContentRuleFile extends GeneralRule { + content: T; +} + +export interface UserName extends ExceptionInfo { + user_name: string; +} + +export interface RepositoryLinksWrapper extends ExceptionInfo { + rules_repositories: RepositoryLinks; +} + +export interface RepositoryLinks { + rule_store_url: string; + rules_release_url: string; + rulesetName: string; +} + +export interface SchemaInfo extends ExceptionInfo { + rules_schema: any; +} + +export interface PullRequestInfo extends ExceptionInfo { + pull_request_pending: boolean; + pull_request_url: string; +} + +export interface ConfigWrapper { + versionFlag?: number; + isDeployed?: boolean; + isNew: boolean; + configData: T; + savedInBackend: boolean; + name: string; + author: string; + version: number; + description: string; + tags?: string[]; + fileHistory?: FileHistory[]; +} + +export interface FileHistory { + author: string; + date: string; + removed: number; + added: number; +} + +export interface ConfigTestDto { + files: Deployment, + event: string, +} + +export type ConfigData = any; + +export interface Deployment { + configs: T[]; + deploymentVersion: number; +} + +export interface BootstrapData { + configs: ConfigWrapper[], + configSchema: SchemaDto, + currentUser: string, + pullRequestPending: PullRequestInfo, + storedDeployment: Deployment>, + sensorFields: SensorFields[], + deploymentHistory?: FileHistory[], +}; + +export interface ConfigTestResult { + exception: string; + message: string; + test_result_output: string; + test_result_complete: boolean; +} + +export interface DeploymentWrapper { + storedDeployment: Deployment>; + deploymentHistory: FileHistory[]; +} diff --git a/config-editor/config-editor-ui/src/app/model/index.ts b/config-editor/config-editor-ui/src/app/model/index.ts new file mode 100644 index 00000000..7c8d989d --- /dev/null +++ b/config-editor/config-editor-ui/src/app/model/index.ts @@ -0,0 +1,7 @@ +export { SchemaDto } from './schema'; +export { GitFiles, UserName, SchemaInfo, EditorResult, ContentRuleFile, + PullRequestInfo, ConfigWrapper, ConfigData, Deployment, + BootstrapData, ExceptionInfo, RepositoryLinks, RepositoryLinksWrapper, FileHistory, +} from './config-model'; +export { SubmitStatus } from './submit-status'; +export { SensorFieldTemplate, SensorFields } from './sensor-fields'; diff --git a/config-editor/config-editor-ui/src/app/model/schema.ts b/config-editor/config-editor-ui/src/app/model/schema.ts new file mode 100644 index 00000000..dc65cac2 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/model/schema.ts @@ -0,0 +1,11 @@ +export class SchemaDto { + schema: Schema; +} + +export interface Schema { + description: string; + properties: any; + required: string[]; + title: string; + type: string; +} diff --git a/config-editor/config-editor-ui/src/app/model/sensor-fields.ts b/config-editor/config-editor-ui/src/app/model/sensor-fields.ts new file mode 100644 index 00000000..a5066fec --- /dev/null +++ b/config-editor/config-editor-ui/src/app/model/sensor-fields.ts @@ -0,0 +1,12 @@ +export interface SensorFieldTemplate { + sensor_template_fields: SensorFields[]; +} + +export interface SensorFields { + fields: Field[]; + sensor_name: string; +} + +export interface Field { + name: string; +} diff --git a/config-editor/config-editor-ui/src/app/model/submit-status.ts b/config-editor/config-editor-ui/src/app/model/submit-status.ts new file mode 100644 index 00000000..d6a4bdb4 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/model/submit-status.ts @@ -0,0 +1,24 @@ +export interface ISubmitStatus { + submitInFlight: boolean; + submitSuccess: boolean; + statusCode: string; + message: string; +} + +export class SubmitStatus implements ISubmitStatus { + public submitInFlight; + public submitSuccess; + public statusCode; + public message; + + constructor( + submitInFlight: boolean = false, + submitSuccess: boolean = false, + message: string = undefined, + statusCode: string = undefined) { + this.submitInFlight = submitInFlight; + this.submitSuccess = submitSuccess; + this.statusCode = statusCode; + this.message = message; + } +} diff --git a/config-editor/config-editor-ui/src/app/model/ui-metadata-map.ts b/config-editor/config-editor-ui/src/app/model/ui-metadata-map.ts new file mode 100644 index 00000000..5a900ada --- /dev/null +++ b/config-editor/config-editor-ui/src/app/model/ui-metadata-map.ts @@ -0,0 +1,23 @@ +export interface UiMetadataMap { + name: string, + version: string, + author: string, + description: string, + labelsFunc: string, + testing: TestConfig, + enableSensorFields: boolean, + perConfigSchemaPath: string, + deployment: DeploymentConfig, +} + +export interface TestConfig { + perConfigTestEnabled: boolean, + deploymentTestEnabled: boolean, + helpMessage: string +} + +export interface DeploymentConfig { + version: string, + config_array: string, + extras?: string[], +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/array.type.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/array.type.ts new file mode 100644 index 00000000..70a5366f --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/array.type.ts @@ -0,0 +1,128 @@ + +import { Component } from '@angular/core'; +import { FieldArrayType } from '@ngx-formly/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'formly-array-type', + template: ` + {{ to.label }} +

{{ to.description }}

+ + +
+
+ +
+
+ `, + styles: [` + legend { + font-weight: 400; + margin: 5px; + font-size: 1.3em; + } + + .description { + padding: 0 10px 10px 15px; + font-size: 0.9em; + color: rgba(255, 255, 255, 0.7); + } + + .row { + display: flex; + padding-top: 5px; + } + + .rhs { + margin: 5px auto 5px 0; + } + + .close-button { + cursor: pointer; + top: 6px; + right: 6px; + fill: orange; + z-index: 500; + } + + .add-button { + margin: 5px 0 5px 0; + } + + .column { + display: block; + width: 16px; + } + + .move-arrow { + width: 14px; + height: 14px; + font-size: 18px; + cursor: pointer; + } + + .greyed-out { + width: 14px; + height: 14px; + font-size: 18px; + color: #707070; + cursor: default; + } + + .blank-icon { + width: 14px; + height: 14px; + opacity: 0; + cursor: default; + } + + .close-button:hover { background: rgba(255,255,255,0.2); } + .array-item:hover > .close-button { visibility: visible } + .array-item { + flex: 9; + position: relative; + transition: all 0.2s ease-in-out; + } + `], +}) +export class ArrayTypeComponent extends FieldArrayType { + public showRemoveButton = true; + + moveUp (index: number) { + if (index > 0) { + this.reorder(index, index - 1); + } + } + + moveDown (index: number) { + if (index < this.field.fieldGroup.length - 1) { + this.reorder(index, index + 1); + } + } + + reorder (oldIndex, newIndex) { + const temp = this.model[oldIndex]; + this.remove(oldIndex); + this.add(newIndex, temp); + } +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/expansion-panel-wrapper.component.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/expansion-panel-wrapper.component.ts new file mode 100644 index 00000000..c3030862 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/expansion-panel-wrapper.component.ts @@ -0,0 +1,23 @@ + +import { Component } from '@angular/core'; +import { FieldWrapper } from '@ngx-formly/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'formly-expansion-panel-wrapper', + template: ` + + + + {{ to.label }} + + + {{ to.description }} + + + + + `, +}) +export class ExpansionPanelWrapperComponent extends FieldWrapper { +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/form-field-wrapper.component.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/form-field-wrapper.component.ts new file mode 100644 index 00000000..3d562ea9 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/form-field-wrapper.component.ts @@ -0,0 +1,138 @@ +import { FocusMonitor } from '@angular/cdk/a11y'; +import { AfterContentChecked, + AfterViewInit, Component, ElementRef, OnDestroy, OnInit, Renderer2, TemplateRef, ViewChild } from '@angular/core'; +import { MatFormField } from '@angular/material/form-field'; +import { MatFormFieldControl } from '@angular/material/form-field'; +import { FieldWrapper, FormlyFieldConfig, ɵdefineHiddenProp as defineHiddenProp } from '@ngx-formly/core'; +import { Subject } from 'rxjs'; + +import { FieldType } from '@ngx-formly/material'; + +interface MatFormlyFieldConfig extends FormlyFieldConfig { + _matprefix: TemplateRef; + _matsuffix: TemplateRef; + __formField__: FormFieldWrapperComponent; + _componentFactory: any; +} + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'formly-wrapper-mat-form-field', + template: ` + + + + + {{ to.label }} + * + + + + + + + + + + + + + {{ to.description }} + + `, + providers: [{ provide: MatFormFieldControl, useExisting: FormFieldWrapperComponent }], +}) +export class FormFieldWrapperComponent extends FieldWrapper + implements OnInit, OnDestroy, MatFormFieldControl, AfterViewInit, AfterContentChecked { + // TODO: remove `any`, once dropping angular `V7` support. + @ViewChild(MatFormField, { static: true }) formField!: MatFormField; + + stateChanges = new Subject(); + _errorState = false; + private initialGapCalculated = false; + + constructor( + private renderer: Renderer2, + private elementRef: ElementRef, + private focusMonitor: FocusMonitor + ) { + super(); + + focusMonitor.monitor(elementRef, true).subscribe(origin => { + this.field.focus = !!origin; + this.stateChanges.next(); + }); + } + + ngOnInit() { + this.formField._control = this; + defineHiddenProp(this.field, '__formField__', this.formField); + + const fieldComponent = this.formlyField['_componentFactory']; + if (fieldComponent && !(fieldComponent.componentRef.instance instanceof FieldType)) { + console.warn( + `Component '${fieldComponent.component.prototype.constructor.name}' must extend 'FieldType' from '@ngx-formly/material'.`); + } + + // fix for https://github.com/angular/material2/issues/11437 + if (this.formlyField.hide && this.formlyField.templateOptions!.appearance === 'outline') { + this.initialGapCalculated = true; + } + } + + ngAfterContentChecked() { + if (!this.initialGapCalculated || this.formlyField.hide) { + return; + } + + this.formField.updateOutlineGap(); + this.initialGapCalculated = true; + } + + ngAfterViewInit() { + // temporary fix for https://github.com/angular/material2/issues/7891 + if (this.formField.underlineRef && this.to.hideFieldUnderline === true) { + this.renderer.removeClass(this.formField.underlineRef.nativeElement, 'mat-form-field-underline'); + this.renderer.removeClass(this.formField.underlineRef.nativeElement.firstChild, 'mat-form-field-ripple'); + } + } + + ngOnDestroy() { + delete this.formlyField.__formField__; + this.stateChanges.complete(); + this.focusMonitor.stopMonitoring(this.elementRef); + } + + setDescribedByIds(ids: string[]): void { } + onContainerClick(event: MouseEvent): void { + this.formlyField.focus = true; + this.stateChanges.next(); + } + + get errorState() { + const showError = this.options!.showError!(this); + if (showError !== this._errorState) { + this._errorState = showError; + this.stateChanges.next(); + } + + return showError; + } + get controlType() { return this.to.type; } + get focused() { return !!this.formlyField.focus && !this.disabled; } + get disabled() { return !!this.to.disabled; } + get required() { return !!this.to.required; } + get placeholder() { return this.to.placeholder || ''; } + get shouldPlaceholderFloat() { return this.shouldLabelFloat; } + get value() { return this.formControl.value; } + get ngControl() { return this.formControl as any; } + get empty() { return !this.formControl.value; } + get shouldLabelFloat() { return this.focused || !this.empty; } + + get formlyField() { return this.field as MatFormlyFieldConfig; } +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/input.type.component.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/input.type.component.ts new file mode 100644 index 00000000..a5824296 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/input.type.component.ts @@ -0,0 +1,38 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatInput } from '@angular/material/input'; +import { FieldType } from '@ngx-formly/material/form-field'; + +@Component({ + selector: 'formly-field-mat-input', + template: ` + + + + + `, +}) +export class InputTypeComponent extends FieldType implements OnInit { + @ViewChild(MatInput, { static: true }) formFieldControl!: MatInput; + + get type() { + return this.to.type || 'text'; + } +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/null.type.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/null.type.ts new file mode 100644 index 00000000..6fd2c11b --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/null.type.ts @@ -0,0 +1,9 @@ + +import { Component } from '@angular/core'; +import { FieldType } from '@ngx-formly/core'; + +@Component({ + selector: 'formly-null-type', + template: '', +}) +export class NullTypeComponent extends FieldType {} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/object.type.component.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/object.type.component.ts new file mode 100644 index 00000000..82ff207a --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/object.type.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import { FieldType } from '@ngx-formly/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'formly-object-type', + template: ` + + + `, + styles: [` + mat-card:last-child { + display: none; + } + `], +}) +export class ObjectTypeComponent extends FieldType { + defaultOptions = { + defaultValue: {}, + }; +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/panel-wrapper.component.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/panel-wrapper.component.ts new file mode 100644 index 00000000..0cd88aab --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/panel-wrapper.component.ts @@ -0,0 +1,34 @@ + +import { Component } from '@angular/core'; +import { FieldWrapper } from '@ngx-formly/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'formly-wrapper-panel', + template: ` + + + + {{ to.label }} + + + +

{{ to.description }}

+ +
+ + `, + styles: [` + .description { + padding: 0 10px 10px 15px; + font-size: 0.9em; + color: rgba(255, 255, 255, 0.7); + } + + .mat-card:nth-child(3) { + display: none; + } + `], +}) +export class PanelWrapperComponent extends FieldWrapper { +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/tabs-wrapper.component.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/tabs-wrapper.component.ts new file mode 100644 index 00000000..384d1e42 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/tabs-wrapper.component.ts @@ -0,0 +1,17 @@ +import { Component, ViewChild, ViewContainerRef } from '@angular/core'; +import { FieldWrapper } from '@ngx-formly/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'formly-wrapper-tabs', + template: + ` + + + + + `, +}) +export class TabsWrapperComponent extends FieldWrapper { + @ViewChild('fieldComponent', { read: ViewContainerRef, static: true }) fieldComponent: ViewContainerRef; +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/tabset.type.component.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/tabset.type.component.ts new file mode 100644 index 00000000..07405044 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/tabset.type.component.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/core'; +import { FieldType } from '@ngx-formly/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'formly-tabset-type', + template: + ` + + + + + `, +}) +export class TabsetTypeComponent extends FieldType { + defaultOptions = { + defaultValue: {}, + }; +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/components/textarea.type.component.ts b/config-editor/config-editor-ui/src/app/ngx-formly/components/textarea.type.component.ts new file mode 100644 index 00000000..2b52723a --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/components/textarea.type.component.ts @@ -0,0 +1,157 @@ +import { AfterViewInit, Component, ElementRef, OnDestroy, ViewChild } from '@angular/core'; +import { FormControl } from '@angular/forms'; +import { MatAutocompleteSelectedEvent, MatAutocompleteTrigger } from '@angular/material'; +import { MatInput } from '@angular/material/input'; +import { SensorFields } from '@app/model'; +import { FieldType } from '@ngx-formly/material/form-field'; +import { cloneDeep } from 'lodash'; +import { Observable, Subject } from 'rxjs'; +import { debounceTime, takeUntil, tap } from 'rxjs/operators'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'formly-field-mat-textarea', + template: ` +
+ + {{ to.label }} + + + + + {{field.name}} + + + + + +
+
+ `, + styles: [` + textarea { + resize: none; + line-height: normal; + overflow: hidden; + } + + mat-form-field { + width: 100%; + } + + .hide-text { + -webkit-text-fill-color: transparent; + } + + .show-overlay { + display: block; + width: 100%; + overflow-wrap: break-word; + white-space: pre-wrap; + } + + .highlighted-overlay { + position: absolute; + top: 18px; + left: 0; + z-index: 10; + } + + .overlay-holder { + position: relative; + line-height: normal; + overflow: hidden; + } + + ::ng-deep .overlay-holder .mat-input-element { + position: relative; + z-index: 20; + } + `], +}) +export class TextAreaTypeComponent extends FieldType implements OnDestroy, AfterViewInit { + @ViewChild(MatInput, {static: false}) formFieldControl!: MatInput; + + @ViewChild('textbox', {static: true}) textbox: ElementRef; + @ViewChild('autocompleteInput', { read: MatAutocompleteTrigger, static: false }) autocomplete: MatAutocompleteTrigger; + + @ViewChild('formfield', {static: true}) formfield: FormControl; + + public displayOverlay = true; + public modelValue; + sensorFields$: Observable; + autoCompleteList: SensorFields[]; + filteredList: SensorFields[] = []; + sensorDataSource$: any; + _value; + private _prevValue; + + + private ngUnsubscribe: Subject = new Subject(); + private readonly variableRegex = new RegExp(/\${([a-zA-Z_.:]*)(?![^ ]*})/); + + constructor() { + super(); + } + + ngOnDestroy() { + this.ngUnsubscribe.next(); + this.ngUnsubscribe.complete(); + } + + ngAfterViewInit() { + // populate the model value with the current form value + this.modelValue = this.value; + this.resizeTextArea(this.field.model[this.field.key]); + this.formControl.valueChanges.pipe(tap(v => this.modelValue = v), debounceTime(400), takeUntil(this.ngUnsubscribe)).subscribe(val => { + if (val === null || val === undefined || !this.options.formState.sensorFields) { + return; + } + this._prevValue = this._value; + this._value = val; + this.autoCompleteList = this.options.formState.sensorFields; + this.filteredList = cloneDeep(this.options.formState.sensorFields); + const matches = this.variableRegex.exec(val); + if (matches != null && matches.length > 0) { + for (let i = 0; i < this.options.formState.sensorFields.length; ++i) { + this.filteredList[i].fields = this.options.formState.sensorFields[i].fields + .filter(n => n.name.includes(matches[matches.length - 1])); + } + this.autocomplete.autocompleteDisabled = false; + this.autocomplete.openPanel(); + } else { + this.autocomplete.closePanel(); + this.autocomplete.autocompleteDisabled = true; + } + }); + } + + resizeTextArea(event) { + const textarea = this.textbox.nativeElement as HTMLTextAreaElement; + // scrollheight needs some persuading to tell us what the new height should be + textarea.style.height = '20px'; + if (textarea.scrollHeight !== 0) { + textarea.style.height = `${textarea.scrollHeight}px`; + } + } + + public autoCompleteSelected($event: MatAutocompleteSelectedEvent) { + const replacementStr = this._prevValue.replace(this.variableRegex, '${' + $event.option.value + '}'); + this.field.formControl.setValue(replacementStr); + } +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/formly-json-schema.service.ts b/config-editor/config-editor-ui/src/app/ngx-formly/formly-json-schema.service.ts new file mode 100644 index 00000000..174f31ce --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/formly-json-schema.service.ts @@ -0,0 +1,328 @@ +import { TitleCasePipe } from '@angular/common'; +import { Injectable } from '@angular/core'; +import { AbstractControl } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { FormlyFieldConfig } from '@ngx-formly/core'; +import { ɵreverseDeepMerge as reverseDeepMerge } from '@ngx-formly/core'; +import * as fromStore from 'app/store'; +import { JSONSchema7, JSONSchema7TypeName } from 'json-schema'; +import { cloneDeep } from 'lodash'; + +export interface FormlyJsonschemaOptions { + /** + * allows to intercept the mapping, taking the already mapped + * formly field and the original JSONSchema source from which it + * was mapped. + */ + map?: (mappedField: FormlyFieldConfig, mapSource: JSONSchema7) => FormlyFieldConfig; +} + +function isEmpty(v) { + return v === '' || v === undefined || v === null; +} + +interface IOptions extends FormlyJsonschemaOptions { + schema: JSONSchema7; +} + +@Injectable({ providedIn: 'root' }) +export class FormlyJsonschema { + private dynamicFieldsMap: Map; + + titleCasePipe: TitleCasePipe = new TitleCasePipe(); + + constructor(private store: Store) {} + + toFieldConfig(schema: JSONSchema7, options?: FormlyJsonschemaOptions): FormlyFieldConfig { + this.dynamicFieldsMap = new Map(); + const fieldConfig = this._toFieldConfig(schema, { schema, ...(options || {}) }, []); + this.store.dispatch(new fromStore.UpdateDynamicFieldsMap(this.dynamicFieldsMap)); + + return fieldConfig; + } + + private _toFieldConfig(schema: JSONSchema7, options: IOptions, propKey?: string[]): FormlyFieldConfig { + if (schema.$ref) { + schema = this.resolveDefinition(schema, options); + } + + if (schema.allOf) { + schema = this.resolveAllOf(schema, options); + } + + let field: FormlyFieldConfig = { + type: this.guessType(schema), + defaultValue: schema.default, + templateOptions: { + label: schema.title ? this.titleCasePipe.transform( schema.title.replace(/_/g, ' ')) : '', + readonly: schema.readOnly, + description: schema.description, + }, + }; + + switch (field.type) { + case 'null': { + this.addValidator(field, 'null', c => c.value === null); + break; + } + case 'boolean': { + field.templateOptions.label = this.titleCasePipe.transform(propKey[propKey.length - 1].replace(/_/g, ' ')); + field.templateOptions.description = schema.description; + break; + } + case 'number': + case 'integer': { + field.templateOptions.label = this.titleCasePipe.transform(propKey[propKey.length - 1].replace(/_/g, ' ')); + field.parsers = [v => isEmpty(v) ? null : Number(v)]; + if (schema.hasOwnProperty('minimum')) { + field.templateOptions.min = schema.minimum; + } + + if (schema.hasOwnProperty('maximum')) { + field.templateOptions.max = schema.maximum; + } + + if (schema.hasOwnProperty('exclusiveMinimum')) { + field.templateOptions.exclusiveMinimum = schema.exclusiveMinimum; + this.addValidator(field, 'exclusiveMinimum', c => isEmpty(c.value) || (c.value > schema.exclusiveMinimum)); + } + + if (schema.hasOwnProperty('exclusiveMaximum')) { + field.templateOptions.exclusiveMaximum = schema.exclusiveMaximum; + this.addValidator(field, 'exclusiveMaximum', c => isEmpty(c.value) || (c.value < schema.exclusiveMaximum)); + } + + if (schema.hasOwnProperty('multipleOf')) { + field.templateOptions.step = schema.multipleOf; + this.addValidator(field, 'multipleOf', c => isEmpty(c.value) || (c.value % schema.multipleOf === 0)); + } + break; + } + case 'string': { + ['minLength', 'maxLength', 'pattern'].forEach(prop => { + if (schema.hasOwnProperty(prop)) { + field.templateOptions[prop] = schema[prop]; + } + }); + field.templateOptions.label = propKey[propKey.length - 1] !== '-' + ? this.titleCasePipe.transform(propKey[propKey.length - 1].replace(/_/g, ' ')) + : ''; + break; + } + case 'object': { + field.fieldGroup = []; + + const [propDeps, schemaDeps] = this.resolveDependencies(schema); + Object.keys(schema.properties || {}).forEach(key => { + const newPropKey = cloneDeep(propKey); + newPropKey.push(key); + const f = this._toFieldConfig( schema.properties[key], options, newPropKey); + field.fieldGroup.push(f); + f.key = key; + if (Array.isArray(schema.required) && schema.required.indexOf(key) !== -1) { + f.templateOptions.required = true; + } + if (!f.templateOptions.required && propDeps[key]) { + f.expressionProperties = { + 'templateOptions.required': m => m && propDeps[key].some(k => !isEmpty(m[k])), + }; + } + + if (schemaDeps[key]) { + field.fieldGroup.push({ + ...this._toFieldConfig(schemaDeps[key], options), + hideExpression: m => !m || isEmpty(m[key]), + }); + } + }); + + break; + } + case 'array': { + field.fieldGroup = []; + field.templateOptions.label = this.titleCasePipe.transform(propKey[propKey.length - 1].replace(/_/g, ' ')); + const newPropKey2 = cloneDeep(propKey); + + if (schema.hasOwnProperty('minItems')) { + field.templateOptions.minItems = schema.minItems; + this.addValidator(field, 'minItems', c => isEmpty(c.value) || (c.value.length >= schema.minItems)); + } + if (schema.hasOwnProperty('maxItems')) { + field.templateOptions.maxItems = schema.maxItems; + this.addValidator(field, 'maxItems', c => isEmpty(c.value) || (c.value.length <= schema.maxItems)); + } + + Object.defineProperty(field, 'fieldArray', { + get: () => { + if (!Array.isArray(schema.items)) { + // When items is a single schema, the additionalItems keyword is meaningless, and it should not be used. + if (newPropKey2[newPropKey2.length - 1] !== '-') { + newPropKey2.push('-'); + } + + return this._toFieldConfig( schema.items, options, newPropKey2); + } + + const itemSchema = schema.items[field.fieldGroup.length] + ? schema.items[field.fieldGroup.length] + : schema.additionalItems; + + return itemSchema + ? this._toFieldConfig( itemSchema, options) + : null; + }, + enumerable: true, + configurable: true, + }); + break; + } + } + + if (schema.hasOwnProperty('x-schema-form')) { + if (schema['x-schema-form'].hasOwnProperty('type')) { + field.type = schema['x-schema-form'].type; + } + if (schema['x-schema-form'].hasOwnProperty('wrappers')) { + field.wrappers = schema['x-schema-form'].wrappers; + } else if (field.type === 'object') { + field.wrappers = ['panel'] + } + if (schema['x-schema-form'].hasOwnProperty('condition')) { + if (schema['x-schema-form'].condition.hasOwnProperty('hideExpression')) { + try { + const dynFunc: Function = + new Function('model', 'localFields', 'field', schema['x-schema-form'].condition.hideExpression); + field.hideExpression = (model, formState, f) => dynFunc(formState.mainModel, model, f); + } catch { + console.warn('Something went wrong with applying condition evaluation to form'); + } + this.dynamicFieldsMap.set(('/' + propKey.join('/')), schema['x-schema-form'].condition.hideExpression); + } + } + } + + if (schema.enum) { + field.type = 'enum'; + field.templateOptions.options = schema.enum.map(value => ({ value, label: value })); + } + + // map in possible formlyConfig options from the widget property + if (schema['widget'] && schema['widget'].formlyConfig) { + field = reverseDeepMerge(schema['widget'].formlyConfig, field); + } + + // if there is a map function passed in, use it to allow the user to + // further customize how fields are being mapped + return options.map ? options.map(field, schema) : field; + } + + private resolveAllOf({ allOf, ...baseSchema }: JSONSchema7, options: IOptions) { + if (!allOf.length) { + throw Error(`allOf array can not be empty ${allOf}.`); + } + + return allOf.reduce((base: JSONSchema7, schema: JSONSchema7) => { + if (schema.$ref) { + schema = this.resolveDefinition(schema, options); + } + + if (schema.allOf) { + schema = this.resolveAllOf(schema, options); + } + if (base.required && schema.required) { + base.required = [...base.required, ...schema.required]; + } + + if (schema.uniqueItems) { + base.uniqueItems = schema.uniqueItems; + } + + // resolve to min value + ['maxLength', 'maximum', 'exclusiveMaximum', 'maxItems', 'maxProperties'] + .forEach(prop => { + if (!isEmpty(base[prop]) && !isEmpty(schema[prop])) { + base[prop] = base[prop] < schema[prop] ? base[prop] : schema[prop]; + } + }); + + // resolve to max value + ['minLength', 'minimum', 'exclusiveMinimum', 'minItems', 'minProperties'] + .forEach(prop => { + if (!isEmpty(base[prop]) && !isEmpty(schema[prop])) { + base[prop] = base[prop] > schema[prop] ? base[prop] : schema[prop]; + } + }); + + return reverseDeepMerge(base, schema); + }, baseSchema); + } + + private resolveDefinition(schema: JSONSchema7, options: IOptions): JSONSchema7 { + const [uri, pointer] = schema.$ref.split('#/'); + if (uri) { + throw Error(`Remote schemas for ${schema.$ref} not supported yet.`); + } + + const definition = !pointer ? null : pointer.split('/').reduce( + (def, path) => def && def.hasOwnProperty(path) ? def[path] : null, + options.schema + ); + + if (!definition) { + throw Error(`Cannot find a definition for ${schema.$ref}.`); + } + + if (definition.$ref) { + return this.resolveDefinition(definition, options); + } + + return { + ...definition, + ...['title', 'description', 'default'].reduce((annotation, p) => { + if (schema.hasOwnProperty(p)) { + annotation[p] = schema[p]; + } + + return annotation; + }, {}), + }; + } + + private resolveDependencies(schema: JSONSchema7) { + const deps = {}; + const schemaDeps = {}; + + Object.keys(schema.dependencies || {}).forEach(prop => { + const dependency = schema.dependencies[prop] as JSONSchema7; + if (Array.isArray(dependency)) { + // Property dependencies + dependency.forEach(dep => { + if (!deps[dep]) { + deps[dep] = [prop]; + } else { + deps[dep].push(prop); + } + }); + } else { + // schema dependencies + schemaDeps[prop] = dependency; + } + }); + + return [deps, schemaDeps]; + } + + private guessType(schema: JSONSchema7) { + const type = schema.type as JSONSchema7TypeName; + if (!type && schema.properties) { + return 'object'; + } + + return type; + } + + private addValidator(field: FormlyFieldConfig, name: string, validator: (control: AbstractControl) => boolean) { + field.validators = field.validators || {}; + field.validators[name] = validator; + } +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/util/jsonpointer.functions.ts b/config-editor/config-editor-ui/src/app/ngx-formly/util/jsonpointer.functions.ts new file mode 100644 index 00000000..36c819f7 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/util/jsonpointer.functions.ts @@ -0,0 +1,299 @@ +import { Injectable } from '@angular/core'; +import { hasOwn } from './utility.functions'; +import { + isArray, + isDefined, + isMap, + isObject, + isString + } from './validator.functions'; + + +/** + * 'JsonPointer' class + * + * Some utilities for using JSON Pointers with JSON objects + * https://tools.ietf.org/html/rfc6901 + * + * get, getCopy, getFirst, set, setCopy, insert, insertCopy, remove, has, dict, + * forEachDeep, forEachDeepCopy, escape, unescape, parse, compile, toKey, + * isJsonPointer, isSubPointer, toIndexedPointer, toGenericPointer, + * toControlPointer, toSchemaPointer, toDataPointer, parseObjectPath + * + * Some functions based on manuelstofer's json-pointer utilities + * https://github.com/manuelstofer/json-pointer + */ +export type Pointer = string | string[]; + +@Injectable({ + providedIn: 'root', + }) +export class JsonPointer { + + /** + * 'get' function + * + * Uses a JSON Pointer to retrieve a value from an object. + * + * // { object } object - Object to get value from + * // { Pointer } pointer - JSON Pointer (string or array) + * // { number = 0 } startSlice - Zero-based index of first Pointer key to use + * // { number } endSlice - Zero-based index of last Pointer key to use + * // { boolean = false } getBoolean - Return only true or false? + * // { boolean = false } errors - Show error if not found? + * // { object } - Located value (or true or false if getBoolean = true) + */ + static get( + object, pointer, startSlice = 0, endSlice: number = null, + getBoolean = false, errors = false + ) { + if (object === null) { return getBoolean ? false : undefined; } + let keyArray: any[] = this.parse(pointer, errors); + if (typeof object === 'object' && keyArray !== null) { + let subObject = object; + if (startSlice >= keyArray.length || endSlice <= -keyArray.length) { return object; } + if (startSlice <= -keyArray.length) { startSlice = 0; } + if (!isDefined(endSlice) || endSlice >= keyArray.length) { endSlice = keyArray.length; } + keyArray = keyArray.slice(startSlice, endSlice); + for (let key of keyArray) { + if (key === '-' && isArray(subObject) && subObject.length) { + key = subObject.length - 1; + } + if (isMap(subObject) && subObject.has(key)) { + subObject = subObject.get(key); + } else if (typeof subObject === 'object' && subObject !== null && + hasOwn(subObject, key) + ) { + subObject = subObject[key]; + } else { + if (errors) { + console.error(`get error: "${key}" key not found in object.`); + console.error(pointer); + console.error(object); + } + return getBoolean ? false : undefined; + } + } + return getBoolean ? true : subObject; + } + if (errors && keyArray === null) { + console.error(`get error: Invalid JSON Pointer: ${pointer}`); + } + if (errors && typeof object !== 'object') { + console.error('get error: Invalid object:'); + console.error(object); + } + return getBoolean ? false : undefined; + } + + /** + * 'remove' function + * + * Uses a JSON Pointer to remove a key and its attribute from an object + * + * // { object } object - object to delete attribute from + * // { Pointer } pointer - JSON Pointer (string or array) + * // { object } + */ + static remove(object, pointer) { + const keyArray = this.parse(pointer); + if (keyArray !== null && keyArray.length) { + let lastKey = keyArray.pop(); + const parentObject = this.get(object, keyArray); + if (isArray(parentObject)) { + if (lastKey === '-') { lastKey = parentObject.length - 1; } + parentObject.splice(lastKey, 1); + } else if (isObject(parentObject)) { + delete parentObject[lastKey]; + } + return object; + } + console.error(`remove error: Invalid JSON Pointer: ${pointer}`); + return object; + } + + /** + * 'has' function + * + * Tests if an object has a value at the location specified by a JSON Pointer + * + * // { object } object - object to chek for value + * // { Pointer } pointer - JSON Pointer (string or array) + * // { boolean } + */ + static has(object, pointer) { + const hasValue = this.get(object, pointer, 0, null, true); + return hasValue; + } + + /** + * 'dict' function + * + * Returns a (pointer -> value) dictionary for an object + * + * // { object } object - The object to create a dictionary from + * // { object } - The resulting dictionary object + */ + static dict(object) { + const results: any = {}; + this.forEachDeep(object, (value, pointer) => { + if (typeof value !== 'object') { results[pointer] = value; } + }); + return results; + } + + /** + * 'forEachDeep' function + * + * Iterates over own enumerable properties of an object or items in an array + * and invokes an iteratee function for each key/value or index/value pair. + * By default, iterates over items within objects and arrays after calling + * the iteratee function on the containing object or array itself. + * + * The iteratee is invoked with three arguments: (value, pointer, rootObject), + * where pointer is a JSON pointer indicating the location of the current + * value within the root object, and rootObject is the root object initially + * submitted to th function. + * + * If a third optional parameter 'bottomUp' is set to TRUE, the iterator + * function will be called on sub-objects and arrays after being + * called on their contents, rather than before, which is the default. + * + * This function can also optionally be called directly on a sub-object by + * including optional 4th and 5th parameterss to specify the initial + * root object and pointer. + * + * // { object } object - the initial object or array + * // { (v: any, p?: string, o?: any) => any } function - iteratee function + * // { boolean = false } bottomUp - optional, set to TRUE to reverse direction + * // { object = object } rootObject - optional, root object or array + * // { string = '' } pointer - optional, JSON Pointer to object within rootObject + * // { object } - The modified object + */ + static forEachDeep( + object, fn: (v: any, p?: string, o?: any) => any = (v) => v, + bottomUp = false, pointer = '', rootObject = object + ) { + if (typeof fn !== 'function') { + console.error(`forEachDeep error: Iterator is not a function:`, fn); + return; + } + if (!bottomUp) { fn(object, pointer, rootObject); } + if (isObject(object) || isArray(object)) { + for (const key of Object.keys(object)) { + const newPointer = pointer + '/' + this.escape(key); + this.forEachDeep(object[key], fn, bottomUp, newPointer, rootObject); + } + } + if (bottomUp) { fn(object, pointer, rootObject); } + } + + /** + * 'forEachDeepCopy' function + * + * Similar to forEachDeep, but returns a copy of the original object, with + * the same keys and indexes, but with values replaced with the result of + * the iteratee function. + * + * // { object } object - the initial object or array + * // { (v: any, k?: string, o?: any, p?: any) => any } function - iteratee function + * // { boolean = false } bottomUp - optional, set to TRUE to reverse direction + * // { object = object } rootObject - optional, root object or array + * // { string = '' } pointer - optional, JSON Pointer to object within rootObject + * // { object } - The copied object + */ + static forEachDeepCopy( + object, fn: (v: any, p?: string, o?: any) => any = (v) => v, + bottomUp = false, pointer = '', rootObject = object + ) { + if (typeof fn !== 'function') { + console.error(`forEachDeepCopy error: Iterator is not a function:`, fn); + return null; + } + if (isObject(object) || isArray(object)) { + let newObject = isArray(object) ? [ ...object ] : { ...object }; + if (!bottomUp) { newObject = fn(newObject, pointer, rootObject); } + for (const key of Object.keys(newObject)) { + const newPointer = pointer + '/' + this.escape(key); + newObject[key] = this.forEachDeepCopy( + newObject[key], fn, bottomUp, newPointer, rootObject + ); + } + if (bottomUp) { newObject = fn(newObject, pointer, rootObject); } + return newObject; + } else { + return fn(object, pointer, rootObject); + } + } + + /** + * 'isJsonPointer' function + * + * Checks a string or array value to determine if it is a valid JSON Pointer. + * Returns true if a string is empty, or starts with '/' or '#/'. + * Returns true if an array contains only string values. + * + * // value - value to check + * // { boolean } - true if value is a valid JSON Pointer, otherwise false + */ + static isJsonPointer(value) { + if (isArray(value)) { + return value.every(key => typeof key === 'string'); + } else if (isString(value)) { + if (value === '' || value === '#') { return true; } + if (value[0] === '/' || value.slice(0, 2) === '#/') { + return !/(~[^01]|~$)/g.test(value); + } + } + return false; + } + + /** + * 'escape' function + * + * Escapes a string reference key + * + * // { string } key - string key to escape + * // { string } - escaped key + */ + static escape(key) { + const escaped = key.toString().replace(/~/g, '~0').replace(/\//g, '~1'); + return escaped; + } + + /** + * 'unescape' function + * + * Unescapes a string reference key + * + * // { string } key - string key to unescape + * // { string } - unescaped key + */ + static unescape(key) { + const unescaped = key.toString().replace(/~1/g, '/').replace(/~0/g, '~'); + return unescaped; + } + + /** + * 'parse' function + * + * Converts a string JSON Pointer into a array of keys + * (if input is already an an array of keys, it is returned unchanged) + * + * // { Pointer } pointer - JSON Pointer (string or array) + * // { boolean = false } errors - Show error if invalid pointer? + * // { string[] } - JSON Pointer array of keys + */ + static parse(pointer, errors = false) { + if (!this.isJsonPointer(pointer)) { + if (errors) { console.error(`parse error: Invalid JSON Pointer: ${pointer}`); } + return null; + } + if (isArray(pointer)) { return pointer; } + if (typeof pointer === 'string') { + if ((pointer)[0] === '#') { pointer = pointer.slice(1); } + if (pointer === '' || pointer === '/') { return []; } + return (pointer).slice(1).split('/').map(this.unescape); + } + } +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/util/utility.functions.ts b/config-editor/config-editor-ui/src/app/ngx-formly/util/utility.functions.ts new file mode 100644 index 00000000..c210083f --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/util/utility.functions.ts @@ -0,0 +1,34 @@ +import { + isArray, + isMap, + isObject, + isSet, +} from './validator.functions'; + +/** + * Utility function library: + * + * addClasses, copy, forEach, forEachCopy, hasOwn, mergeFilteredObject, + * uniqueItems, commonItems, fixTitle, toTitleCase +*/ + +/** + * 'hasOwn' utility function + * + * Checks whether an object or array has a particular property. + * + * // {any} object - the object to check + * // {string} property - the property to look for + * // {boolean} - true if object has property, false if not + */ +export function hasOwn(object: any, property: string): boolean { + if (!object || !['number', 'string', 'symbol'].includes(typeof property) || + (!isObject(object) && !isArray(object) && !isMap(object) && !isSet(object)) + ) { return false; } + if (isMap(object) || isSet(object)) { return object.has(property); } + if (typeof property === 'number') { + if (isArray(object)) { return object[property]; } + property = property + ''; + } + return object.hasOwnProperty(property); +} diff --git a/config-editor/config-editor-ui/src/app/ngx-formly/util/validator.functions.ts b/config-editor/config-editor-ui/src/app/ngx-formly/util/validator.functions.ts new file mode 100644 index 00000000..a454937b --- /dev/null +++ b/config-editor/config-editor-ui/src/app/ngx-formly/util/validator.functions.ts @@ -0,0 +1,76 @@ +import { AbstractControl } from '@angular/forms'; + +/** + * Validator utility function library: + * + * Validator and error utilities: + * _executeValidators, _executeAsyncValidators, _mergeObjects, _mergeErrors + * + * Individual value checking: + * isDefined, hasValue, isEmpty + * + * Individual type checking: + * isString, isNumber, isInteger, isBoolean, isFunction, isObject, isArray, + * isMap, isSet, isPromise, isObservable + * + * Multiple type checking and fixing: + * getType, isType, isPrimitive, toJavaScriptType, toSchemaType, + * _toPromise, toObservable + * + * Utility functions: + * inArray, xor + * + * Typescript types and interfaces: + * SchemaPrimitiveType, SchemaType, JavaScriptPrimitiveType, JavaScriptType, + * PrimitiveValue, PlainObject, IValidatorFn, AsyncIValidatorFn + * + * Note: 'IValidatorFn' is short for 'invertable validator function', + * which is a validator functions that accepts an optional second + * argument which, if set to TRUE, causes the validator to perform + * the opposite of its original function. + */ + +export type SchemaPrimitiveType = + 'string' | 'number' | 'integer' | 'boolean' | 'null'; +export type SchemaType = + 'string' | 'number' | 'integer' | 'boolean' | 'null' | 'object' | 'array'; +export type JavaScriptPrimitiveType = + 'string' | 'number' | 'boolean' | 'null' | 'undefined'; +export type JavaScriptType = + 'string' | 'number' | 'boolean' | 'null' | 'undefined' | 'object' | 'array' | + 'map' | 'set' | 'arguments' | 'date' | 'error' | 'function' | 'json' | + 'math' | 'regexp'; // Note: this list is incomplete +export type PrimitiveValue = string | number | boolean | null | undefined; +export interface PlainObject { [k: string]: any; } + +export type IValidatorFn = (c: AbstractControl, i?: boolean) => PlainObject; +export type AsyncIValidatorFn = (c: AbstractControl, i?: boolean) => any; + + +export function isObject(item: any): boolean { + return item !== null && typeof item === 'object' && + Object.prototype.toString.call(item) === '[object Object]'; +} + +export function isArray(item: any): boolean { + return Array.isArray(item) || + Object.prototype.toString.call(item) === '[object Array]'; +} + +export function isMap(item: any): boolean { + return typeof item === 'object' && + Object.prototype.toString.call(item) === '[object Map]'; +} + +export function isString(value) { + return typeof value === 'string'; +} + +export function isDefined(value) { + return value !== undefined && value !== null; +} + +export function isSet(item: any): boolean { + return typeof item === 'object' && + Object.prototype.toString.call(item) === '[object Set]'; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/pipes/highlight-variables.pipe.ts b/config-editor/config-editor-ui/src/app/pipes/highlight-variables.pipe.ts new file mode 100644 index 00000000..eefd68aa --- /dev/null +++ b/config-editor/config-editor-ui/src/app/pipes/highlight-variables.pipe.ts @@ -0,0 +1,25 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; + +@Pipe({ name: 'highlightVariables' }) +export class HighlightVariablesPipe implements PipeTransform { + + constructor(private sanitiser: DomSanitizer) { } + + transform(text: string): SafeHtml { + if (!text) { + return ''; + } + + const highlightedText = text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') + .replace(/\n/g, '
') + .replace(/\${([\w.:]+)}/g, '\${$1}'); + + return this.sanitiser.bypassSecurityTrustHtml(highlightedText); + } +} diff --git a/config-editor/config-editor-ui/src/app/pipes/index.ts b/config-editor/config-editor-ui/src/app/pipes/index.ts new file mode 100644 index 00000000..f59c1234 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/pipes/index.ts @@ -0,0 +1,2 @@ +export { StripSuffixPipe } from './strip-suffix.pipe'; +export { HighlightVariablesPipe } from './highlight-variables.pipe'; diff --git a/config-editor/config-editor-ui/src/app/pipes/strip-suffix.pipe.ts b/config-editor/config-editor-ui/src/app/pipes/strip-suffix.pipe.ts new file mode 100644 index 00000000..957088f0 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/pipes/strip-suffix.pipe.ts @@ -0,0 +1,15 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'stripSuffix' }) +export class StripSuffixPipe implements PipeTransform { + public transform(text: string, remove: string): string { + if (text === undefined) { + return ''; + } + if (text.endsWith(remove)) { + return text.substring(0, text.length - remove.length); + } + + return text; + } +} diff --git a/config-editor/config-editor-ui/src/app/popover/hover-popover.directive.ts b/config-editor/config-editor-ui/src/app/popover/hover-popover.directive.ts new file mode 100644 index 00000000..4d02f880 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/popover/hover-popover.directive.ts @@ -0,0 +1,55 @@ +import { Directive, ElementRef, HostListener, Input, OnDestroy } from '@angular/core'; +import { ChangeHistoryComponent } from '@app/components/change-history/change-history.component'; +import { ConfigData, FileHistory } from '@app/model/config-model'; +import { Subject, timer } from 'rxjs'; +import { debounce, distinctUntilKeyChanged, takeUntil } from 'rxjs/operators'; +import { ConfigWrapper } from '../model/config-model'; +import { PopoverRef } from './popover-ref'; +import { PopoverService } from './popover-service'; + +@Directive({ + // tslint:disable-next-line:directive-selector + selector: '[hoverPopover]', +}) +export class HoverPopoverDirective implements OnDestroy { + public hoverObserver$ = new Subject(); + private ngUnsubscribe$ = new Subject(); + + popoverRef: PopoverRef; + + // tslint:disable-next-line:no-input-rename + @Input('hoverPopover') config: ConfigWrapper; + + constructor(private el: ElementRef, private popover: PopoverService) { + this.hoverObserver$.pipe( + takeUntil(this.ngUnsubscribe$), + debounce(() => timer(200)), + distinctUntilKeyChanged('event') + ).subscribe(event => { + if (event.event === 'open') { + this.popoverRef = this.popover.open({ + origin: this.el.nativeElement, + content: ChangeHistoryComponent, + data: this.config.fileHistory, + }); + } + if (event.event === 'close') { + if (this.popoverRef !== undefined) { + this.popoverRef.close(); + } + } + }); + } + + @HostListener('mouseenter') onMouseEnter() { + this.hoverObserver$.next({event: 'open'}); + } + + @HostListener('mouseleave') onMouseLeave() { + this.hoverObserver$.next({event: 'close'}); + } + + ngOnDestroy() { + this.ngUnsubscribe$.next(); + } +} diff --git a/config-editor/config-editor-ui/src/app/popover/popover-ref.ts b/config-editor/config-editor-ui/src/app/popover/popover-ref.ts new file mode 100644 index 00000000..052c2ad7 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/popover/popover-ref.ts @@ -0,0 +1,27 @@ +import { OverlayRef } from '@angular/cdk/overlay'; +import { TemplateRef, Type } from '@angular/core'; +import { Subject } from 'rxjs'; + +export interface PopoverCloseEvent { + type: 'backdropClick' | 'close'; + data: T; +} + export type PopoverContent = TemplateRef | Type | string; + export class PopoverRef { + private afterClosed = new Subject>(); + afterClosed$ = this.afterClosed.asObservable(); + constructor(public overlay: OverlayRef, public content: PopoverContent, public data: T) { + overlay.backdropClick().subscribe(() => this._close('backdropClick', data)); + } + close(data?: T) { + this._close('close', data); + } + private _close(type, data) { + this.overlay.dispose(); + this.afterClosed.next({ + type, + data, + }); + this.afterClosed.complete(); + } +} diff --git a/config-editor/config-editor-ui/src/app/popover/popover-renderer.component.html b/config-editor/config-editor-ui/src/app/popover/popover-renderer.component.html new file mode 100644 index 00000000..cb3e8098 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/popover/popover-renderer.component.html @@ -0,0 +1,11 @@ +
+ +
+ + + + + + +
+
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/popover/popover-renderer.component.scss b/config-editor/config-editor-ui/src/app/popover/popover-renderer.component.scss new file mode 100644 index 00000000..8ba95af3 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/popover/popover-renderer.component.scss @@ -0,0 +1,7 @@ +.popover { + background-color: #fff; + padding: 1rem; + font-size: 14px; + box-shadow: 0 20px 20px 2px rgba(0, 0, 0, 0.3); + border-radius: 5px; +} \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/popover/popover-renderer.component.ts b/config-editor/config-editor-ui/src/app/popover/popover-renderer.component.ts new file mode 100644 index 00000000..41110d21 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/popover/popover-renderer.component.ts @@ -0,0 +1,28 @@ +import { ChangeDetectionStrategy, Component, OnInit, TemplateRef } from '@angular/core'; +import { PopoverContent, PopoverRef } from './popover-ref'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: 're-popover-renderer', + templateUrl: './popover-renderer.component.html', + styleUrls: ['./popover-renderer.component.scss'], +}) + +export class PopoverRendererComponent implements OnInit { + renderMethod: 'template' | 'component' | 'text' = 'component'; + content: PopoverContent; + context; + constructor(private popoverRef: PopoverRef) { + } + ngOnInit() { + this.content = this.popoverRef.content; + if (typeof this.content === 'string') { + this.renderMethod = 'text'; + } else if (this.content instanceof TemplateRef) { + this.renderMethod = 'template'; + this.context = { + close: this.popoverRef.close.bind(this.popoverRef), + } + } + } +} diff --git a/config-editor/config-editor-ui/src/app/popover/popover-service.ts b/config-editor/config-editor-ui/src/app/popover/popover-service.ts new file mode 100644 index 00000000..c9186eb3 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/popover/popover-service.ts @@ -0,0 +1,77 @@ +import { ConnectionPositionPair, Overlay, OverlayConfig, PositionStrategy } from '@angular/cdk/overlay'; +import { ComponentPortal, PortalInjector } from '@angular/cdk/portal'; +import { Injectable, Injector } from '@angular/core'; +import { PopoverRef } from './popover-ref'; +import { PopoverRendererComponent } from './popover-renderer.component'; + +export interface PopoverParams { + origin: HTMLElement; + content: any; + data?: T; + width?: string | number; + height?: string | number; +} + @Injectable() +export class PopoverService { + constructor(private overlay: Overlay, private injector: Injector) {} + + open({origin, content, data, width, height}: PopoverParams): PopoverRef { + const overlayRef = this.overlay.create(this.getOverlayConfig({origin, width, height})); + const popoverRef = new PopoverRef(overlayRef, content, data); + const injector = this.createInjector(popoverRef, this.injector); + overlayRef.attach(new ComponentPortal(PopoverRendererComponent, null, injector)); + + return popoverRef; + } + createInjector(popoverRef: PopoverRef, injector: Injector) { + const tokens = new WeakMap([[PopoverRef, popoverRef]]); + + return new PortalInjector(injector, tokens); + } + private getOverlayConfig({origin, width, height}): OverlayConfig { + return new OverlayConfig({ + width, + height, + hasBackdrop: false, + backdropClass: 'cdk-overlay-dark-backdrop', + positionStrategy: this.getOverlayPosition(origin), + scrollStrategy: this.overlay.scrollStrategies.reposition(), + }); + } + private getOverlayPosition(origin: HTMLElement): PositionStrategy { + const positionStrategy = this.overlay.position() + .flexibleConnectedTo(origin) + .withPositions(this.getPositions()) + .withPush(false); + + return positionStrategy; + } + private getPositions(): ConnectionPositionPair[] { + return [ + { + originX: 'start', + originY: 'center', + overlayX: 'end', + overlayY: 'top', + }, + { + originX: 'start', + originY: 'center', + overlayX: 'end', + overlayY: 'bottom', + }, + { + originX: 'end', + originY: 'center', + overlayX: 'start', + overlayY: 'top', + }, + { + originX: 'end', + originY: 'center', + overlayX: 'start', + overlayY: 'bottom', + }, + ] + } +} diff --git a/config-editor/config-editor-ui/src/app/popup.service.ts b/config-editor/config-editor-ui/src/app/popup.service.ts new file mode 100644 index 00000000..9c7d8777 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/popup.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { MatDialog, MatSnackBar } from '@angular/material'; +import { Observable } from 'rxjs/Observable'; +import { ErrorDialogComponent } from './components/error-dialog/error-dialog.component'; + +@Injectable({ + providedIn: 'root', + }) +export class PopupService { + private snackbarAction$: Observable; + + constructor(public snackBar: MatSnackBar, public dialog: MatDialog) {} + + openSnackBar(error: any, description: string, action: string = 'DETAILS') { + console.error(error); + this.snackBar.open(description, action, { duration: 5000 }); + this.snackbarAction$ = this.snackBar._openedSnackBarRef.onAction(); + this.snackbarAction$.subscribe( + () => this.dialog.open(ErrorDialogComponent, + { + data: error, + width: '500px', + }), + () => console.error('an error occurred')); + } + + openNotification(description: string) { + this.snackBar.open(description, null, { duration: 5000, verticalPosition: 'top' }); + } +} diff --git a/config-editor/config-editor-ui/src/app/shared/index.ts b/config-editor/config-editor-ui/src/app/shared/index.ts new file mode 100644 index 00000000..bdf1b5e8 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/shared/index.ts @@ -0,0 +1 @@ +export { SharedModule } from './shared.module'; diff --git a/config-editor/config-editor-ui/src/app/shared/shared.module.ts b/config-editor/config-editor-ui/src/app/shared/shared.module.ts new file mode 100644 index 00000000..4d248693 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/shared/shared.module.ts @@ -0,0 +1,60 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { + MatAutocompleteModule, + MatButtonModule, + MatButtonToggleModule, + MatCardModule, + MatCheckboxModule, + MatChipsModule, + MatCommonModule, + MatDialogModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatProgressBarModule, + MatRadioModule, + MatSelectModule, + MatSnackBarModule, + MatTableModule, + MatTabsModule, + MatToolbarModule, + MatTooltipModule, +} from '@angular/material'; + +@NgModule({ + exports: [ + CommonModule, + FlexLayoutModule, + FormsModule, + MatAutocompleteModule, + MatButtonModule, + MatButtonToggleModule, + MatCardModule, + MatCheckboxModule, + MatChipsModule, + MatCommonModule, + MatDialogModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatProgressBarModule, + MatRadioModule, + MatSelectModule, + MatSnackBarModule, + MatTableModule, + MatTabsModule, + MatToolbarModule, + MatTooltipModule, + ReactiveFormsModule, + ], +}) +export class SharedModule { } diff --git a/config-editor/config-editor-ui/src/app/store/editor.actions.ts b/config-editor/config-editor-ui/src/app/store/editor.actions.ts new file mode 100644 index 00000000..ed5365c7 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/store/editor.actions.ts @@ -0,0 +1,268 @@ +import { BootstrapData, ConfigData, ConfigWrapper, Deployment, EditorResult, + ExceptionInfo, PullRequestInfo, RepositoryLinks } from '@app/model'; +import { Field } from '@app/model/sensor-fields'; +import { State } from '@app/store'; +import { RouterAction } from '@ngrx/router-store'; +import { Action } from '@ngrx/store'; + +export const SET_SERVICE_NAMES = '[Configs] Set Service Names'; +export const UPDATE_DEPLOYMENT = '[Configs] Update Deployment'; +export const UPDATE_DEPLOYMENT_SUCCESS = '[Configs] Update Deployment Success'; +export const UPDATE_DEPLOYMENT_FAILURE = '[Configs] Update Deployment Success'; +export const UPDATE_CONFIGS = '[Configs] Update Configs'; +export const SELECT_CONFIG = '[Configs] Select Config'; +export const ADD_CONFIG = '[Configs] Add Config'; +export const LOAD_REPOSITORIES = '[Configs] Load Repositories'; +export const LOAD_REPOSITORIES_SUCCESS = '[Configs] Load Repositories Success'; +export const LOAD_REPOSITORIES_FAILURE = '[Configs] Load Repositories Failure'; +export const LOAD_PULL_REQUEST_STATUS = '[Configs] Load Pull Request Status' +export const LOAD_PULL_REQUEST_STATUS_SUCCESS = '[Configs] Load Pull Request Status Success'; +export const LOAD_PULL_REQUEST_STATUS_FAILURE = '[Configs] Load Pull Request Status Failure'; +export const VALIDATE_CONFIG = '[Configs] Validate Config'; +export const VALIDATE_CONFIGS = '[Configs] Validate Configs'; +export const VALIDATE_CONFIGS_SUCCESS = '[Configs] Validate Configs Success'; +export const VALIDATE_CONFIGS_FAILURE = '[Configs] Validate Configs Failure'; +export const SUBMIT_RELEASE = '[Configs] Submit Release'; +export const SUBMIT_RELEASE_SUCCESS = '[Configs] Submit Release Success'; +export const SUBMIT_RELEASE_FAILURE = '[Configs] Submit Release Failure'; +export const SUBMIT_NEW_CONFIG = '[Configs] Submit Config'; +export const SUBMIT_NEW_CONFIG_SUCCESS = '[Configs] Submit Config Success'; +export const SUBMIT_NEW_CONFIG_FAILURE = '[Configs] Submit Config Failure'; +export const SUBMIT_CONFIG_EDIT = '[Configs] Submit Config Edit'; +export const SUBMIT_CONFIG_EDIT_SUCCESS = '[Configs] Submit Config Edit Success'; +export const SUBMIT_CONFIG_EDIT_FAILURE = '[Configs] Submit Config Edit Failure'; +export const BOOTSTRAP = '[Configs] Bootstrap'; +export const BOOTSTRAP_SUCCESS = '[Configs] Bootstrap Success'; +export const BOOTSTRAP_FAILURE = '[Configs] Bootstrap Failure'; +export const SEARCH_CONFIG = '[Configs] Search Config'; +export const SELECT_DATA_SOURCE = '[Configs] Select Data Source'; +export const LOAD_CENTRIFUGE_FIELDS = '[Configs] Load Centrifuge Fields'; +export const LOAD_CENTRIFUGE_FIELDS_SUCCESS = '[Configs] Load Centrifuge Fields Success'; +export const LOAD_CENTRIFUGE_FIELDS_FAILURE = '[Configs] Load Centrifuge Fields Failure'; +export const STORE_CONFIG_TESTING_EVENT = '[Config Testing] Store Config Testing Event'; +export const FILTER_MY_CONFIGS = '[Search] Filter My Configs'; +export const FILTER_UNDEPLOYED = '[Search] Filter Undeployed'; +export const FILTER_UPGRADABLE = '[Search] Filter Upgradable'; +export const UPDATE_DYNAMIC_FIELDS_MAP = '[schema] Update Dynamic Fields Map'; + +export class SetServiceNames implements Action { + readonly type = SET_SERVICE_NAMES; + constructor(public payload: string[]) { } +} + +export class Bootstrap implements Action { + readonly type = BOOTSTRAP; + constructor(public payload: string) { } +} + +export class BootstrapSuccess implements Action { + readonly type = BOOTSTRAP_SUCCESS; + constructor(public payload: BootstrapData) { } +} + +export class BootstrapFailure implements Action { + readonly type = BOOTSTRAP_FAILURE; + constructor(public payload: any) { } +} + +export class ValidateConfig implements Action { + readonly type = VALIDATE_CONFIG; + constructor(public payload: ConfigWrapper) { } +} + +export class ValidateConfigs implements Action { + readonly type = VALIDATE_CONFIGS; + constructor(public payload: Deployment>) { } +} + +export class ValidateConfigsSuccess implements Action { + readonly type = VALIDATE_CONFIGS_SUCCESS; + constructor(public payload: EditorResult) { } +} + +export class ValidateConfigsFailure implements Action { + readonly type = VALIDATE_CONFIGS_FAILURE; + constructor(public payload: any) { } +} + +export class LoadRepositories implements Action { + readonly type = LOAD_REPOSITORIES; +} + +export class LoadRepositoriesSuccess implements Action { + readonly type = LOAD_REPOSITORIES_SUCCESS; + constructor(public payload: RepositoryLinks[]) { } +} + +export class LoadRepositoriesFailure implements Action { + readonly type = LOAD_REPOSITORIES_FAILURE; + constructor(public payload: any) { } +} + +export class LoadCentrifugeFields implements Action { + readonly type = LOAD_CENTRIFUGE_FIELDS; +} + +export class LoadCentrifugeFieldsSuccess implements Action { + readonly type = LOAD_CENTRIFUGE_FIELDS_SUCCESS; + constructor(public payload: Field[]) { } +} + +export class LoadCentrifugeFieldsFailure implements Action { + readonly type = LOAD_CENTRIFUGE_FIELDS_FAILURE; + constructor(public payload: any) { } +} + +export class LoadPullRequestStatus implements Action { + readonly type = LOAD_PULL_REQUEST_STATUS; +} + +export class LoadPullRequestStatusSuccess implements Action { + readonly type = LOAD_PULL_REQUEST_STATUS_SUCCESS; + constructor(public payload: PullRequestInfo) { } +} + +export class LoadPullRequestStatusFailure implements Action { + readonly type = LOAD_PULL_REQUEST_STATUS_FAILURE; + constructor(public payload: any) { } +} + +export class SubmitRelease implements Action { + readonly type = SUBMIT_RELEASE; + constructor(public payload: Deployment>) { } +} + +export class SubmitReleaseSuccess implements Action { + readonly type = SUBMIT_RELEASE_SUCCESS; + constructor(public payload: EditorResult) { } +} + +export class SubmitReleaseFailure implements Action { + readonly type = SUBMIT_RELEASE_FAILURE; + constructor(public payload: any) { } +} + +export class SubmitNewConfig implements Action { + readonly type = SUBMIT_NEW_CONFIG; + constructor(public payload: ConfigWrapper) { } +} + +export class SubmitNewConfigSuccess implements Action { + readonly type = SUBMIT_NEW_CONFIG_SUCCESS; + constructor(public payload: ConfigWrapper) { } +} + +export class SubmitNewConfigFailure implements Action { + readonly type = SUBMIT_NEW_CONFIG_FAILURE; + constructor(public payload: any) { } +} + +export class SubmitConfigEdit implements Action { + readonly type = SUBMIT_CONFIG_EDIT; + constructor(public payload: ConfigWrapper) { } +} + +export class SubmitConfigEditSuccess implements Action { + readonly type = SUBMIT_CONFIG_EDIT_SUCCESS; + constructor(public payload: EditorResult) { } +} + +export class SubmitConfigEditFailure implements Action { + readonly type = SUBMIT_CONFIG_EDIT_FAILURE; + constructor(public payload: any) { } +} + +export class UpdateConfigs implements Action { + readonly type = UPDATE_CONFIGS; + constructor(public payload: ConfigWrapper[]) { } +} + +export class UpdateDeployment implements Action { + readonly type = UPDATE_DEPLOYMENT; + constructor(public payload: Deployment>) { } +} + +export class SelectConfig implements Action { + readonly type = SELECT_CONFIG; + constructor(public payload: number) { } +} + +export class AddConfig implements Action { + readonly type = ADD_CONFIG; + constructor(public payload: ConfigWrapper) { } +} + +export class SearchConfig implements Action { + readonly type = SEARCH_CONFIG; + constructor(public payload: string) { } +} + +export class SelectDataSource implements Action { + readonly type = SELECT_DATA_SOURCE; + constructor(public payload: string) { } +} + +export class StoreConfigTestingEvent implements Action { + readonly type = STORE_CONFIG_TESTING_EVENT; + constructor(public payload: string) { } +} + +export class FilterMyConfigs implements Action { + readonly type = FILTER_MY_CONFIGS; + constructor(public payload: boolean) { } +} + +export class FilterUndeployed implements Action { + readonly type = FILTER_UNDEPLOYED; + constructor(public payload: boolean) { } +} + +export class FilterUpgradable implements Action { + readonly type = FILTER_UPGRADABLE; + constructor(public payload: boolean) { } +} + +export class UpdateDynamicFieldsMap implements Action { + readonly type = UPDATE_DYNAMIC_FIELDS_MAP; + constructor(public payload: object) { } +} + +export type Actions + = RouterAction + | UpdateConfigs + | SubmitRelease + | SubmitReleaseSuccess + | SubmitReleaseFailure + | SubmitNewConfig + | SubmitNewConfigSuccess + | SubmitNewConfigFailure + | SubmitConfigEdit + | SubmitConfigEditSuccess + | SubmitConfigEditFailure + | SelectConfig + | UpdateDeployment + | AddConfig + | LoadRepositories + | LoadRepositoriesSuccess + | LoadRepositoriesFailure + | LoadPullRequestStatus + | LoadPullRequestStatusSuccess + | LoadPullRequestStatusFailure + | LoadCentrifugeFields + | LoadCentrifugeFieldsSuccess + | LoadCentrifugeFieldsFailure + | ValidateConfig + | ValidateConfigs + | ValidateConfigsSuccess + | ValidateConfigsFailure + | Bootstrap + | BootstrapSuccess + | BootstrapFailure + | SearchConfig + | SelectDataSource + | StoreConfigTestingEvent + | FilterMyConfigs + | FilterUpgradable + | FilterUndeployed + | UpdateDynamicFieldsMap + | SetServiceNames; diff --git a/config-editor/config-editor-ui/src/app/store/editor.effects.ts b/config-editor/config-editor-ui/src/app/store/editor.effects.ts new file mode 100644 index 00000000..ce93804d --- /dev/null +++ b/config-editor/config-editor-ui/src/app/store/editor.effects.ts @@ -0,0 +1,179 @@ +import { Injectable } from '@angular/core'; +import { EditorService } from '@app/editor.service'; +import { Actions, Effect, ofType } from '@ngrx/effects'; +import { Action, Store } from '@ngrx/store'; +import { PopupService } from 'app/popup.service'; +import * as fromStore from 'app/store'; +import { forkJoin, Observable, of } from 'rxjs'; +import { withLatestFrom } from 'rxjs/internal/operators/withLatestFrom'; +import { exhaustMap, filter, switchMap } from 'rxjs/operators'; +import { RepositoryLinks } from '../model/config-model'; +import * as actions from './editor.actions'; + +@Injectable({ + providedIn: 'root', + }) +export class EditorEffects { + + private readonly VALIDATION_FAILED_MESSAGE = 'Failed to validate config with backend'; + private readonly BOOTSTRAP_FAILED_MESSAGE = 'Failed to load all required data at app startup'; + private readonly REPOSITORY_LOAD_FAILED_MESSAGE = 'Failed to load repositories'; + private readonly RELEASE_STATUS_FAILED_MESSAGE = 'Failed to load release status'; + private readonly RELEASE_SUCCESS_MESSAGE = 'Submitted release successfully!'; + private readonly RELEASE_FAILED_MESSAGE = 'Failed to submit release to github'; + private readonly NEW_CONFIG_SUCCESS_MESSAGE = 'Submitted new config successfully!'; + private readonly NEW_CONFIG_FAILED_MESSAGE = 'Failed to submit new config to github'; + private readonly EDIT_CONFIG_SUCCESS_MESSAGE = 'Submitted config edit successfully!'; + private readonly EDIT_CONFIG_FAILED_MESSAGE = 'Failed to submit config edit to github'; + + + @Effect() + bootstrap$: Observable = this.actions$.pipe( + ofType(actions.BOOTSTRAP), + withLatestFrom(this.store.select(fromStore.getBootstrapped)), + filter(([action, bootStrapped]) => bootStrapped !== action.payload), + exhaustMap(([action, isBootStrapped]) => forkJoin([ + this.editorService.getLoader(action.payload).getSchema() + .switchMap(schema => forkJoin([ + of(schema), + this.editorService.getLoader(action.payload).getConfigs(), + this.editorService.getLoader(action.payload).getRelease() + .map(result => [result.deploymentHistory, result.storedDeployment]), + ])), + this.editorService.getUser(), + this.editorService.getLoader(action.payload).getPullRequestStatus(), + this.editorService.getSensorFields(), + ]) + .map(([[configSchema, configs, [deploymentHistory, storedDeployment]], currentUser, pullRequestPending, sensorFields]: any) => + new actions.BootstrapSuccess( + { configs, configSchema, currentUser, pullRequestPending, storedDeployment, sensorFields, deploymentHistory })) + .catch(error => + this.errorHandler(error, this.BOOTSTRAP_FAILED_MESSAGE, of(new fromStore.BootstrapFailure(error))))) + ); + + @Effect() + loadRepositories$: Observable = this.actions$.pipe( + ofType(actions.LOAD_REPOSITORIES), + withLatestFrom(this.store.select(fromStore.getServiceNames)), + exhaustMap(([action, serviceNames]) => { + return forkJoin(serviceNames. + map(serviceName => this.editorService.getLoader(serviceName).getRepositoryLinks()) + ) + .map((result: RepositoryLinks[]) => new actions.LoadRepositoriesSuccess(result)) + .catch(error => this.errorHandler( + error, this.REPOSITORY_LOAD_FAILED_MESSAGE, of(new actions.LoadRepositoriesFailure(error)) + ) + )} + ) + ); + + @Effect() + loadPullRequestStatus$ = this.actions$.pipe( + ofType(actions.LOAD_PULL_REQUEST_STATUS), + withLatestFrom(this.store.select(fromStore.getServiceName)), + switchMap(([action, serviceName]) => + this.editorService.getLoader(serviceName).getPullRequestStatus() + .map((result) => new actions.LoadPullRequestStatusSuccess(result)) + .catch(error => this.errorHandler( + error, this.RELEASE_STATUS_FAILED_MESSAGE, of(new actions.LoadPullRequestStatusFailure(error))))) + ); + + @Effect() + addConfig$: Observable = this.actions$.pipe( + ofType(actions.ADD_CONFIG), + withLatestFrom(this.store.select(fromStore.getServiceName), this.store.select(fromStore.getConfigs)), + exhaustMap(([action, serviceName, configs]) => + of(new fromStore.Go({ + path: [serviceName, 'edit', configs.length - 1], + }))) + ); + + @Effect() + submitRelease$ = this.actions$.pipe( + ofType(actions.SUBMIT_RELEASE), + withLatestFrom(this.store.select(fromStore.getServiceName)), + switchMap(([action, serviceName]) => + this.editorService.getLoader(serviceName).submitRelease(action.payload) + .map(result => { + this.displayNotification(this.RELEASE_SUCCESS_MESSAGE); + this.store.dispatch(new actions.LoadPullRequestStatus()); + + return new actions.SubmitReleaseSuccess(result); + }) + .catch(error => + this.errorHandler(error, this.RELEASE_FAILED_MESSAGE, of(new actions.SubmitReleaseFailure(error))))) + ); + + @Effect() + submitNewConfig$ = this.actions$.pipe( + ofType(actions.SUBMIT_NEW_CONFIG), + withLatestFrom(this.store.select(fromStore.getServiceName)), + switchMap(([action, serviceName]) => + this.editorService.getLoader(serviceName).submitNewConfig(action.payload) + .map(result => { + this.displayNotification(this.NEW_CONFIG_SUCCESS_MESSAGE); + + return new actions.SubmitNewConfigSuccess( + this.editorService.getLoader(serviceName).getConfigsFromFiles(result.attributes.files) + ); + }) + .catch(error => this.errorHandler( + error, this.NEW_CONFIG_FAILED_MESSAGE, of(new actions.SubmitNewConfigFailure(error))))) + ); + + @Effect() + validateConfig$ = this.actions$.pipe( + ofType(actions.VALIDATE_CONFIG), + withLatestFrom(this.store.select(fromStore.getServiceName)), + switchMap(([action, serviceName]) => + this.editorService.getLoader(serviceName).validateConfig(action.payload) + .map(result => new actions.ValidateConfigsSuccess(result)) + .catch(error => this.errorHandler( + error, this.VALIDATION_FAILED_MESSAGE, of(new actions.ValidateConfigsFailure(error))))) + ); + + @Effect() + validateConfigs$ = this.actions$.pipe( + ofType(actions.VALIDATE_CONFIGS), + withLatestFrom(this.store.select(fromStore.getStoredDeployment), this.store.select(fromStore.getServiceName)), + switchMap(([action, deployment, serviceName]) => + this.editorService.getLoader(serviceName).validateRelease(action.payload) + .map(result => new actions.ValidateConfigsSuccess(result)) + .catch(error => this.errorHandler( + error, this.VALIDATION_FAILED_MESSAGE, of(new actions.ValidateConfigsFailure(error))))) + ); + + @Effect() + submitRuleEdit$ = this.actions$.pipe( + ofType(actions.SUBMIT_CONFIG_EDIT), + withLatestFrom(this.store.select(fromStore.getServiceName)), + switchMap(([action, serviceName]) => + this.editorService.getLoader(serviceName).submitConfigEdit(action.payload) + .map(result => { + this.displayNotification(this.EDIT_CONFIG_SUCCESS_MESSAGE); + + return new actions.SubmitConfigEditSuccess( + this.editorService.getLoader(serviceName).getConfigsFromFiles(result.attributes.files) + ) + }) + .catch(error => this.errorHandler( + error, this.EDIT_CONFIG_FAILED_MESSAGE, of(new actions.SubmitConfigEditFailure(error))))) + ); + + constructor( + private actions$: Actions, + private snackBar: PopupService, + private editorService: EditorService, + private store: Store) {} + + // Opens snackbar with a summary of the error, passes the error to an error details dialog + public errorHandler(error: any, description: string, action$: Observable): Observable { + this.snackBar.openSnackBar(error, description); + + return action$; + } + + public displayNotification(description: string) { + this.snackBar.openNotification(description); + } +} diff --git a/config-editor/config-editor-ui/src/app/store/editor.reducer.ts b/config-editor/config-editor-ui/src/app/store/editor.reducer.ts new file mode 100644 index 00000000..130c18e8 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/store/editor.reducer.ts @@ -0,0 +1,323 @@ +import { StatusCode } from '@app/commons'; +import { + ConfigData, ConfigWrapper, Deployment, EditorResult, ExceptionInfo, + FileHistory, PullRequestInfo, RepositoryLinks, SchemaDto, SensorFields, SubmitStatus, +} from '@app/model'; +import { cloneDeep } from 'lodash'; +import * as editor from './editor.actions'; + +export interface State { + bootstrapped: string; + currentUser: string; + configs: ConfigWrapper[]; + storedDeployment: Deployment>; + configSchema: SchemaDto; + selectedConfig: number; + errorMessage: string; + loaded: boolean; + loading: boolean; + newForm: boolean; + requestInflight: boolean; + selectedView: string; + pullRequestPending: PullRequestInfo; + submitReleaseStatus: SubmitStatus; + submitConfigStatus: SubmitStatus; + configValidity: EditorResult; + serviceName: string; + repositoryLinks: RepositoryLinks[]; + searchTerm: string; + sensorFields: SensorFields[]; + dataSource: string; + configTestingEvent: string; + filterMyConfigs: boolean; + filterUndeployed: boolean; + filterUpgradable: boolean; + serviceNames: string[]; + deploymentHistory: FileHistory[]; + dynamicFieldsMap: Map; +} + +export const initialState: State = { + bootstrapped: undefined, + currentUser: undefined, + dataSource: undefined, + errorMessage: undefined, + loaded: false, + loading: false, + newForm: false, + pullRequestPending: undefined, + requestInflight: false, + configValidity: undefined, + configs: [], + configSchema: undefined, + searchTerm: undefined, + selectedConfig: undefined, + selectedView: undefined, + storedDeployment: undefined, + submitReleaseStatus: new SubmitStatus(), + submitConfigStatus: new SubmitStatus(), + serviceName: undefined, + repositoryLinks: undefined, + sensorFields: [], + configTestingEvent: '', + filterMyConfigs: false, + filterUndeployed: false, + filterUpgradable: false, + serviceNames: [], + deploymentHistory: [], + dynamicFieldsMap: new Map(), +} + +export function reducer(state = initialState, action: editor.Actions): State { + switch (action.type) { + + case editor.BOOTSTRAP: + return Object.assign({}, state, { + serviceName: action.payload, + loading: true, + }); + + case editor.SET_SERVICE_NAMES: + return Object.assign({}, state, { + serviceNames: action.payload, + }); + + case editor.BOOTSTRAP_SUCCESS: + const data = cloneDeep(action.payload); + detectOutdatedConfigs(data.storedDeployment.configs, data.configs); + + return Object.assign({}, state, data, { + bootstrapped: state.serviceName, + loading: false, + }); + + case editor.UPDATE_CONFIGS: + return Object.assign({}, state, { + configs: action.payload, + }); + + case editor.BOOTSTRAP_FAILURE: + return Object.assign({}, state, { + errorMessage: action.payload, + loading: false, + requestInflight: false, + }) + + case editor.SELECT_CONFIG: + return Object.assign({}, state, { + configSchema: state.configSchema && Object.assign({}, state.configSchema), + selectedConfig: action.payload, + }); + + case editor.ADD_CONFIG: + return Object.assign({}, state, { + configs: [...state.configs, action.payload], + }); + + case editor.UPDATE_DEPLOYMENT: + const configsClone = cloneDeep(state.configs); + const depClone: Deployment> = cloneDeep(action.payload); + detectOutdatedConfigs(depClone.configs, configsClone); + + return Object.assign({}, state, { + configs: configsClone, + storedDeployment: depClone, + }); + + case editor.LOAD_PULL_REQUEST_STATUS: + return Object.assign({}, state, { + pullRequestPending: { + pull_request_pending: true, + pull_request_url: undefined, + }, + }); + + case editor.LOAD_PULL_REQUEST_STATUS_SUCCESS: + return Object.assign({}, state, { + pullRequestPending: action.payload, + }); + + case editor.LOAD_PULL_REQUEST_STATUS_SUCCESS: + return Object.assign({}, state, { + pullRequestPending: action.payload, + }); + + case editor.LOAD_REPOSITORIES_SUCCESS: + return Object.assign({}, state, { + repositoryLinks: action.payload, + }); + + case editor.SUBMIT_NEW_CONFIG: + case editor.SUBMIT_CONFIG_EDIT: + return Object.assign({}, state, { + loading: true, + }); + + case editor.SUBMIT_CONFIG_EDIT_SUCCESS: + case editor.SUBMIT_NEW_CONFIG_SUCCESS: + const configs = cloneDeep(action.payload); + const dep: Deployment> = cloneDeep(state.storedDeployment); + detectOutdatedConfigs(dep.configs, configs); + + return Object.assign({}, state, { + loading: false, + configs: configs, + storedDeployment: dep, + }); + + case editor.SUBMIT_NEW_CONFIG_FAILURE: + case editor.SUBMIT_CONFIG_EDIT_FAILURE: + return Object.assign({}, state, { + loading: false, + }); + + case editor.SUBMIT_RELEASE: + return Object.assign({}, state, { + loading: true, + pullRequestPending: { + pull_request_pending: true, + pull_request_url: undefined, + }, + submitReleaseStatus: new SubmitStatus(true), + }); + + case editor.SUBMIT_RELEASE_SUCCESS: + const statusSuccess: SubmitStatus = new SubmitStatus(); + switch (action.payload.status_code) { + case StatusCode.CREATED: + statusSuccess.submitSuccess = true; + break; + case StatusCode.BAD_REQUEST: + case StatusCode.ERROR: + statusSuccess.statusCode = action.payload.status_code; + statusSuccess.message = action.payload.attributes.message; + } + statusSuccess.submitInFlight = false; + + // set pr status to true to prevent deploy button appearing before the pr action has completed + return Object.assign({}, state, { + loading: false, + pullRequestPending: { + pull_request_pending: false, + pull_request_url: undefined, + }, + submitReleaseStatus: statusSuccess, + }); + + case editor.VALIDATE_CONFIGS_SUCCESS: + return Object.assign({}, state, { + configValidity: action.payload, + }); + + case editor.VALIDATE_CONFIGS_FAILURE: + return Object.assign({}, state, { + errorMessage: action.payload, + configValidity: { + attributes: { + message: action.payload, + exception: action.payload, + }, + status_code: '500', + }, + }); + + case editor.SEARCH_CONFIG: + return Object.assign({}, state, { + searchTerm: action.payload, + }); + + case editor.SELECT_DATA_SOURCE: + return Object.assign({}, state, { + dataSource: action.payload, + }); + + case editor.LOAD_CENTRIFUGE_FIELDS_SUCCESS: + const sensors: SensorFields[] = cloneDeep(state.sensorFields); + sensors.push({fields: action.payload, sensor_name: state.serviceName}); + + return Object.assign({}, state, { + sensorFields: sensors, + }); + + case editor.LOAD_CENTRIFUGE_FIELDS_FAILURE: + return Object.assign({}, state, { + errorMessage: action.payload, + }); + + case editor.STORE_CONFIG_TESTING_EVENT: + return Object.assign({}, state, { + configTestingEvent: action.payload, + }); + + case editor.FILTER_MY_CONFIGS: + return Object.assign({}, state, { + filterMyConfigs: action.payload, + }); + + case editor.FILTER_UPGRADABLE: + return Object.assign({}, state, { + filterUpgradable: action.payload, + }); + + case editor.FILTER_UNDEPLOYED: + return Object.assign({}, state, { + filterUndeployed: action.payload, + }); + + case editor.UPDATE_DYNAMIC_FIELDS_MAP: + return Object.assign({}, state, { + dynamicFieldsMap: action.payload, + }); + + default: + return state; + } +} + +export function detectOutdatedConfigs(deployment: ConfigWrapper[], store: ConfigWrapper[]) { + store.forEach(config => { + const matchingConfig = deployment.find(r => !r.isNew && r.name === config.name); + if (matchingConfig) { + config.isDeployed = true; + matchingConfig.isDeployed = true; + if (matchingConfig.version !== config.version) { + config.versionFlag = config.version; + matchingConfig.versionFlag = config.version; + } else { + config.versionFlag = -1; + matchingConfig.versionFlag = -1; + } + } else { + config.isDeployed = false; + config.versionFlag = -1; + } + }); +} + +export const getConfigs = (state: State) => state.configs; +export const getSelectedConfig = (state: State) => state.selectedConfig; +export const getSchema = (state: State) => state.configSchema; +export const getLoaded = (state: State) => state.loaded; +export const getBootstrapped = (state: State) => state.bootstrapped; +export const getLoading = (state: State) => state.loading; +export const getSelectedView = (state: State) => state.selectedView; +export const getErrorMessage = (state: State) => state.errorMessage; +export const getCurrentUser = (state: State) => state.currentUser; +export const getNewForm = (state: State) => state.newForm; +export const getRequestInflight = (state: State) => state.requestInflight; +export const getStoredDeployment = (state: State) => state.storedDeployment; +export const getPullRequestPending = (state: State) => state.pullRequestPending; +export const getSubmitReleaseStatus = (state: State) => state.submitReleaseStatus; +export const getConfigValidity = (state: State) => state.configValidity; +export const getServiceName = (state: State) => state.serviceName; +export const getRepositoryLinks = (state: State) => state.repositoryLinks; +export const getSearchTerm = (state: State) => state.searchTerm; +export const getSensorFields = (state: State) => state.sensorFields; +export const getDataSource = (state: State) => state.dataSource; +export const getConfigTestingEvent = (state: State) => state.configTestingEvent; +export const getFilterMyConfigs = (state: State) => state.filterMyConfigs; +export const getFilterUndeployed = (state: State) => state.filterUndeployed; +export const getFilterUpgradable = (state: State) => state.filterUpgradable; +export const getServiceNames = (state: State) => state.serviceNames; +export const getDeploymentHistory = (state: State) => state.deploymentHistory; +export const getDynamicFieldsMap = (state: State) => state.dynamicFieldsMap; diff --git a/config-editor/config-editor-ui/src/app/store/index.ts b/config-editor/config-editor-ui/src/app/store/index.ts new file mode 100644 index 00000000..38902dda --- /dev/null +++ b/config-editor/config-editor-ui/src/app/store/index.ts @@ -0,0 +1,159 @@ +import { RouterStateUrl } from '@app/app-routing'; +import { ConfigWrapper } from '@app/model'; +import { SensorFields } from '@app/model/sensor-fields'; +import * as fromRouter from '@ngrx/router-store'; +import { Action, ActionReducer, ActionReducerMap, createSelector, MetaReducer } from '@ngrx/store'; +import { environment } from 'environments/environment'; +import { cloneDeep } from 'lodash'; +import { storeFreeze } from 'ngrx-store-freeze'; +import { Deployment } from '../model'; +import { ConfigData } from '../model/config-model'; +import * as fromEditor from './editor.reducer'; + +export * from './editor.actions' +export * from './router-actions' + +export interface State { + editor: fromEditor.State; + routerReducer: fromRouter.RouterReducerState; +} + +export const reducers: ActionReducerMap = { + editor: fromEditor.reducer, + routerReducer: fromRouter.routerReducer, +}; + +export function logger(reducer: ActionReducer): ActionReducer { + return function (state: State, action: Action): State { + console.log('state', state); + console.log('action', action); + + const newState = reducer(state, action); + console.log('newState', newState); + + return newState; + }; +} + +export function sortByDeploymentOrder(configList: ConfigWrapper[], + deployment: ConfigWrapper[]): ConfigWrapper[] { + let pos = 0; + for (const r of deployment) { + for (let i = pos; i < configList.length; ++i) { + if (configList[i].name === r.name) { + const tmp = configList[pos]; + configList[pos] = configList[i]; + configList[i] = tmp; + } + } + ++pos; + } + + return configList; +} + +export const metaReducers: MetaReducer[] = environment.production ? [] : [logger, storeFreeze]; + +export const getEditorState = (state: State) => state.editor; +export const getRouterState = (state: State) => state.routerReducer; + +export const getConfigs = createSelector(getEditorState, fromEditor.getConfigs); +export const getSelectedConfig = createSelector(getEditorState, fromEditor.getSelectedConfig); +export const getSchema = createSelector(getEditorState, fromEditor.getSchema); +export const getLoaded = createSelector(getEditorState, fromEditor.getLoaded); +export const getBootstrapped = createSelector(getEditorState, fromEditor.getBootstrapped); +export const getLoading = createSelector(getEditorState, fromEditor.getLoading); +export const getSelectedView = createSelector(getEditorState, fromEditor.getSelectedView); +export const getNewForm = createSelector(getEditorState, fromEditor.getNewForm); +export const getRequestInflight = createSelector(getEditorState, fromEditor.getRequestInflight); +export const getErrorMessage = createSelector(getEditorState, fromEditor.getErrorMessage); +export const getStoredDeployment = createSelector(getEditorState, fromEditor.getStoredDeployment); +export const getCurrentUser = createSelector(getEditorState, fromEditor.getCurrentUser); +export const getPullRequestPending = createSelector(getEditorState, fromEditor.getPullRequestPending); +export const getSubmitReleaseStatus = createSelector(getEditorState, fromEditor.getSubmitReleaseStatus); +export const getConfigValidity = createSelector(getEditorState, fromEditor.getConfigValidity); +export const getServiceName = createSelector(getEditorState, fromEditor.getServiceName); +export const getRepositoryLinks = createSelector(getEditorState, fromEditor.getRepositoryLinks); +export const getSearchTerm = createSelector(getEditorState, fromEditor.getSearchTerm); +export const getSensorFields = createSelector(getEditorState, fromEditor.getSensorFields); +export const getDataSource = createSelector(getEditorState, fromEditor.getDataSource); +export const getConfigTestingEvent = createSelector(getEditorState, fromEditor.getConfigTestingEvent); +export const getFilterMyConfigs = createSelector(getEditorState, fromEditor.getFilterMyConfigs); +export const getFilterUndeployed = createSelector(getEditorState, fromEditor.getFilterUndeployed); +export const getFilterUpgradable = createSelector(getEditorState, fromEditor.getFilterUpgradable); +export const getServiceNames = createSelector(getEditorState, fromEditor.getServiceNames); +export const getDeploymentHistory = createSelector(getEditorState, fromEditor.getDeploymentHistory); +export const getDynamicFieldsMap = createSelector(getEditorState, fromEditor.getDynamicFieldsMap); + +export const getDeploymentFilteredBySearchTerm = createSelector( + [getStoredDeployment, getSearchTerm, getFilterMyConfigs, getCurrentUser, getFilterUndeployed, getFilterUpgradable], + (deployment: Deployment>, searchTerm, isMyConfig, user, undeployed, upgradable) => { + const dep: Deployment> = cloneDeep(deployment); + + if (undeployed) { + return {configs: [], deploymentVersion: dep.deploymentVersion}; + } + + if (upgradable) { + dep.configs = dep.configs.filter(d => d.versionFlag > 0); + } + + if (isMyConfig) { + dep.configs = deployment.configs.filter(r => r.author === user); + } + + if (!(searchTerm === null || searchTerm === undefined || searchTerm === '')) { + const lowerCaseSearchTerm = searchTerm.toLowerCase(); + dep.configs = dep.configs.filter(f => f.name.toLowerCase().includes(lowerCaseSearchTerm) + || f.author.toLowerCase().startsWith(lowerCaseSearchTerm) + || f.tags === undefined ? true : f.tags.join(' ').includes(lowerCaseSearchTerm)); + } + + return dep; + } +) + +export const getConfigsFilteredBySearchTerm = createSelector( + [getConfigs, getSearchTerm, getDeploymentFilteredBySearchTerm, + getFilterMyConfigs, getCurrentUser, getFilterUndeployed, getFilterUpgradable], + + (configSet: ConfigWrapper[], searchTerm: string, + deployment: Deployment>, isMyConfig, user, undeployed, upgradable) => { + + let configs: ConfigWrapper[] = cloneDeep(configSet); + + if (undeployed) { + configs = configs.filter(r => !r.isDeployed); + } + + if (upgradable) { + configs = configs.filter(r => r.versionFlag > 0); + } + + if (isMyConfig) { + configs = configs.filter(r => r.author === user); + } + + if (searchTerm === null || searchTerm === undefined || searchTerm === '') { + return sortByDeploymentOrder(configs, deployment.configs); + } + const lowerCaseSearchTerm = searchTerm.toLowerCase(); + + // use startswith for author as we assume the user will enter the whole name here + return sortByDeploymentOrder(configs.filter((r: ConfigWrapper) => + r.name.toLowerCase().includes(lowerCaseSearchTerm) + || r.author.toLowerCase().startsWith(lowerCaseSearchTerm) + || r.tags === undefined ? true : r.tags.join(' ').includes(lowerCaseSearchTerm)), deployment.configs); + } +) + +export const getSensorListFromDataSource = createSelector( + [getSensorFields, getDataSource], + (sensorFields: SensorFields[], dataSource: String) => { + if (dataSource === null || dataSource === undefined) { + return [{sensor_name: 'select a data source!', fields: [{name: ''}]}]; + } + + return [sensorFields.find(i => i.sensor_name === dataSource)]; + } +) diff --git a/config-editor/config-editor-ui/src/app/store/router-actions.ts b/config-editor/config-editor-ui/src/app/store/router-actions.ts new file mode 100644 index 00000000..93957376 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/store/router-actions.ts @@ -0,0 +1,28 @@ +import { NavigationExtras } from '@angular/router'; +import { Action } from '@ngrx/store'; + +export const GO = '[Router] Go'; +export const BACK = '[Router] Back'; +export const FORWARD = '[Router] Forward'; + +export class Go implements Action { + readonly type = GO; + + constructor( + public payload: { + path: any[]; + query?: object; + extras?: NavigationExtras; + } + ) {} +} + +export class Back implements Action { + readonly type = BACK; +} + +export class Forward implements Action { + readonly type = FORWARD; +} + +export type RouterActionsUnion = Go | Back | Forward; diff --git a/config-editor/config-editor-ui/src/app/store/router-effects.ts b/config-editor/config-editor-ui/src/app/store/router-effects.ts new file mode 100644 index 00000000..5f12ce0c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/store/router-effects.ts @@ -0,0 +1,89 @@ +import { Location } from '@angular/common'; +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { RouterStateUrl } from '@app/app-routing'; +import { Actions, Effect, ofType } from '@ngrx/effects'; +import { ROUTER_NAVIGATION, RouterNavigationAction } from '@ngrx/router-store'; +import { Action, Store } from '@ngrx/store'; +import * as fromStore from 'app/store'; +import { Observable, of } from 'rxjs'; +import { catchError, filter, map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; +import * as ProductActions from './editor.actions'; +import { State } from './editor.reducer'; +import * as RouterActions from './router-actions'; + +@Injectable({ + providedIn: 'root', + }) +export class RouterEffects { + + @Effect() + configSelection$: Observable = this.actions$.pipe( + ofType>(ROUTER_NAVIGATION), + map(route => route.payload.routerState), + withLatestFrom(this.store.select(fromStore.getBootstrapped), this.store.select(fromStore.getConfigs)), + filter(([route, isBootstrapped, configs]) => + route.url.includes('edit') && (!isBootstrapped || parseInt(route.params['id'], 10) < configs.length)), + switchMap(([route, isBootstrapped, configs]) => of(new ProductActions.SelectConfig(parseInt(route.params['id'], 10)))), + catchError(e => this.errorHandler(e, 'Failed to navigate to ', of())) + ); + + @Effect({ dispatch: false }) + navigate$ = this.actions$.pipe( + ofType(RouterActions.GO), + map((action: RouterActions.Go) => action.payload), + tap(({ path, query: queryParams, extras }) => + this.router.navigate(path, { queryParams, ...extras }) + ) + ); + + @Effect({ dispatch: false }) + navigateBack$ = this.actions$.pipe( + ofType(RouterActions.BACK), + tap(() => this.location.back()) + ); + + @Effect({ dispatch: false }) + navigateForward$ = this.actions$.pipe( + ofType(RouterActions.FORWARD), + tap(() => this.location.forward()) + ); + + + @Effect() + searchNavigation$: Observable = this.navigationOnQueryParam( + 'search', + (state) => state.searchTerm, + (route, paramKey, state) => { + return of(new ProductActions.SearchConfig(route.queryParams[paramKey])); + }, + 'Failed to set search term' + ); + + constructor( + private actions$: Actions, + private store: Store, + private router: Router, + private location: Location + ) {} + + navigationOnQueryParam(queryParamKey: string, + getStateValue: ((state: State) => string), + nextAction: ((route: RouterStateUrl, paramKey: string, state: State) => Observable), + errorMessage: string): Observable { + return this.actions$.pipe( + ofType>(ROUTER_NAVIGATION), + map(route => route.payload.routerState), + withLatestFrom(of(queryParamKey), this.store.select(fromStore.getEditorState)), + filter(([route, paramKey, state]) => paramKey in route.queryParams && route.queryParams[paramKey] !== getStateValue(state)), + switchMap(([route, paramKey, state]) => nextAction(route, paramKey, state)), + catchError(e => + this.errorHandler(e, errorMessage, of()) + ) + ); + } + + errorHandler(error: any, description: string, action$: Observable): Observable { + return action$; + } +} diff --git a/config-editor/config-editor-ui/src/app/text-diff/format-line.pipe.ts b/config-editor/config-editor-ui/src/app/text-diff/format-line.pipe.ts new file mode 100644 index 00000000..a464f8d2 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/format-line.pipe.ts @@ -0,0 +1,19 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'formatLine', +}) +export class FormatLinePipe implements PipeTransform { + transform(line: string, diffs?: string[]): string { + if (!line) { + return ' '; + } + + return line + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/ /g, ' '); + } +} diff --git a/config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.css b/config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.css new file mode 100644 index 00000000..d503741f --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.css @@ -0,0 +1,85 @@ +.td-loading-roller { + display: inline-block; + position: relative; + width: 64px; + height: 64px; + } + .td-loading-roller div { + animation: lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; + transform-origin: 32px 32px; + } + .td-loading-roller div:after { + content: " "; + display: block; + position: absolute; + width: 6px; + height: 6px; + border-radius: 50%; + background: #000; + margin: -3px 0 0 -3px; + } + .td-loading-roller div:nth-child(1) { + animation-delay: -0.036s; + } + .td-loading-roller div:nth-child(1):after { + top: 50px; + left: 50px; + } + .td-loading-roller div:nth-child(2) { + animation-delay: -0.072s; + } + .td-loading-roller div:nth-child(2):after { + top: 54px; + left: 45px; + } + .td-loading-roller div:nth-child(3) { + animation-delay: -0.108s; + } + .td-loading-roller div:nth-child(3):after { + top: 57px; + left: 39px; + } + .td-loading-roller div:nth-child(4) { + animation-delay: -0.144s; + } + .td-loading-roller div:nth-child(4):after { + top: 58px; + left: 32px; + } + .td-loading-roller div:nth-child(5) { + animation-delay: -0.18s; + } + .td-loading-roller div:nth-child(5):after { + top: 57px; + left: 25px; + } + .td-loading-roller div:nth-child(6) { + animation-delay: -0.216s; + } + .td-loading-roller div:nth-child(6):after { + top: 54px; + left: 19px; + } + .td-loading-roller div:nth-child(7) { + animation-delay: -0.252s; + } + .td-loading-roller div:nth-child(7):after { + top: 50px; + left: 14px; + } + .td-loading-roller div:nth-child(8) { + animation-delay: -0.288s; + } + .td-loading-roller div:nth-child(8):after { + top: 45px; + left: 10px; + } + @keyframes lds-roller { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } + \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.html b/config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.html new file mode 100644 index 00000000..92d50e05 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.html @@ -0,0 +1,10 @@ +
+
+
+
+
+
+
+
+
+
diff --git a/config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.ts b/config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.ts new file mode 100644 index 00000000..a4bff8b9 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/loader-spinner/loader-spinner.component.ts @@ -0,0 +1,15 @@ +import { Component, Input, OnInit } from '@angular/core'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'td-loader-spinner', + templateUrl: './loader-spinner.component.html', + styleUrls: ['./loader-spinner.component.css'], +}) +export class LoaderSpinnerComponent implements OnInit { + @Input() active = false; + + constructor() {} + + ngOnInit() {} +} diff --git a/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff-container.directive.ts b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff-container.directive.ts new file mode 100644 index 00000000..55bfeb03 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff-container.directive.ts @@ -0,0 +1,15 @@ +import { Directive, ElementRef, Input } from '@angular/core'; + +@Directive({ + // tslint:disable-next-line:directive-selector + selector: '[tdContainer]', +}) +export class ContainerDirective { + @Input() id: string; + + element: HTMLTableHeaderCellElement; + + constructor(_el: ElementRef) { + this.element = _el.nativeElement; + } +} diff --git a/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.css b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.css new file mode 100644 index 00000000..e6f0c158 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.css @@ -0,0 +1,252 @@ +.td-wrapper { + display: grid; + width: 100%; + grid-row-gap: 10px; + grid-template-columns: repeat(2, [col] 50%); + grid-template-rows: repeat(2, [row] auto); + background-color: #24292e; + /* color: #444; */ + color: #e5e9ee; + font-family: 'Courier New', Courier, monospace; + font-size: 12pt; + } + + .td-toolbar-show-diff { + grid-column: 1; + grid-row: 1; + padding-left: 5px; + } + + .button { + padding: 5px 10px; + } + + .td-toolbar-select-format { + margin-left: auto; + grid-column: 2; + grid-row: 1; + } + + .td-table-container { + grid-column: 1 / 2; + grid-row: 2; + width: 100%; + max-width: 100%; + overflow-x: auto; + } + + .td-table-wrapper { + display: flex; + width: 200%; + } + + .td-table { + /* border: 1px solid darkgray; */ + max-height: 50vh; + width: 100%; + max-width: 100%; + } + + .fit-column { + width: 1px; + white-space: nowrap; + } + + .line-number-col { + position: relative; /* I am the fallback */ + + /* Give it everything you got! (use an auto prefixer...) */ + position: -webkit-sticky; + position: sticky; + left: 0; + top: auto; + border-right: 1px solid #2e353c; + color: #838a92; + text-align: right; + background-color: #1d2125; + padding-left: 10px; + padding-right: 10px; + /* font-size: 87.5%; */ + font-family: 'Courier New', Courier, monospace; + } + + .line-number-col-left { + color: #838a92; + padding-left: 10px; + padding-right: 10px; + text-align: right; + background-color: #1d2125; + /* font-size: 87.5%; */ + font-family: 'Courier New', Courier, monospace; + } + + .insert-row, + .insert-row > .line-number-col { + background-color: #0c4532; + /* background-color: #dfd; */ + /* border-color: #b4e2b4; */ + border-color: #188a64; + } + + .delete-row, + .delete-row > .line-number-col { + border-color: #b31d28; + background-color: #421a1a; + } + + .empty-row { + background-color: #1d2125; + height: 24px; + } + + .td-table td { + border-top: 0; + padding-top: 0; + padding-bottom: 0; + white-space: nowrap; + max-width: 50%; + } + + pre { + margin-bottom: 0; + } + + td.content-col { + padding: 0; + margin: 0; + line-height: 24px; + } + + td.prefix-col { + padding-left: 10px; + padding-right: 10px; + line-height: 24px; + } + + .td-btn-group { + border-radius: 4px; + } + + .td-btn-group button { + background-color: rgba(23,162,184,.7); /* Green background */ + border: 1px solid #17a2b8; /* Green border */ + color: white; /* White text */ + cursor: pointer; /* Pointer/hand icon */ + float: left; /* Float the buttons side by side */ + } + + .td-btn-group button:not(:last-child) { + border-right: none; /* Prevent double borders */ + } + .td-btn-group button:first-child { + -webkit-border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-topleft: 4px; + -moz-border-radius-bottomleft: 4px; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + + .td-btn-group button:last-child { + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } + + /* Clear floats (clearfix hack) */ + .td-btn-group:after { + content: ''; + clear: both; + display: table; + } + + /* Add a background color on hover */ + .td-btn-group button:hover, + .td-btn-group button.active { + background-color: #17a2b8; + } + + /* Customize the label (the container) */ + .td-checkbox-container { + display: block; + position: relative; + padding-left: 21px; + margin-bottom: 0; + cursor: pointer; + font-size: 14px; + line-height: 28px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + /* Hide the browser's default checkbox */ + .td-checkbox-container input { + position: absolute; + opacity: 0; + cursor: pointer; + height: 0; + width: 0; + } + + /* Create a custom checkbox */ + .checkmark { + position: absolute; + top: 5px; + left: 0; + height: 16px; + width: 16px; + background-color: #eee; + } + + /* On mouse-over, add a grey background color */ + .td-checkbox-container:hover input ~ .checkmark { + background-color: #ccc; + } + + /* When the checkbox is checked, add a blue background */ + .td-checkbox-container input:checked ~ .checkmark { + background-color: #17a2b8; + } + + /* Create the checkmark/indicator (hidden when not checked) */ + .checkmark:after { + content: ""; + position: absolute; + display: none; + } + + /* Show the checkmark when checked */ + .td-checkbox-container input:checked ~ .checkmark:after { + display: block; + } + + /* Style the checkmark/indicator */ + .td-checkbox-container .checkmark:after { + left: 4px; + top: 0px; + width: 5px; + height: 10px; + border: solid white; + border-width: 0 3px 3px 0; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } + + .insert-row > .highlight { + background-color: #188a64 !important; + } + + .delete-row > .highlight { + background-color: #b31d28 !important; + } + + .scrollbar { + --scrollbar-thumb-color: #868686; + --scrollbar-thumb-hover-color: #a1a1a1; + } \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.html b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.html new file mode 100644 index 00000000..5b568552 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.html @@ -0,0 +1,120 @@ + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ + +
+ + + + + + + + + +
+ {{ row.leftContent?.lineNumber !== -1 ? row.leftContent?.lineNumber : ' ' }} + + {{ row.leftContent?.prefix || ' ' }} + + + + +
+
+ +
+ + + + + + + + + +
+ {{ row.rightContent?.lineNumber !== -1 ? row.rightContent?.lineNumber : ' ' }} + + {{ row.rightContent?.prefix || ' ' }} + + + + +
+
+
+ + + + +
+
\ No newline at end of file diff --git a/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.ts b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.ts new file mode 100644 index 00000000..cb16ea3c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.component.ts @@ -0,0 +1,208 @@ +import { CdkScrollable, ScrollDispatcher } from '@angular/cdk/scrolling'; +import { + AfterViewInit, + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + QueryList, + ViewChildren +} from '@angular/core'; +import { Observable, Subscription } from 'rxjs'; +import { ContainerDirective } from './ngx-text-diff-container.directive'; +import { DiffContent, DiffPart, DiffResults, DiffTableFormat, DiffTableFormatOption, DiffTableRowResult } from './ngx-text-diff.model'; +import { NgxTextDiffService } from './ngx-text-diff.service'; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'td-ngx-text-diff', + templateUrl: './ngx-text-diff.component.html', + styleUrls: ['./ngx-text-diff.component.css'], +}) +export class NgxTextDiffComponent implements OnInit, AfterViewInit, OnDestroy { + private _hideMatchingLines = false; + @ViewChildren(ContainerDirective) containers: QueryList; + @Input() format: DiffTableFormat = 'SideBySide'; + @Input() left = ''; + @Input() right = ''; + @Input() diffContent: Observable; + @Input() loading = false; + @Input() showToolbar = true; + @Input() showBtnToolbar = true; + @Input() + get hideMatchingLines() { + return this._hideMatchingLines; + } + + set hideMatchingLines(hide: boolean) { + this.hideMatchingLinesChanged(hide); + } + @Input() outerContainerClass: string; + @Input() outerContainerStyle: any; + @Input() toolbarClass: string; + @Input() toolbarStyle: any; + @Input() compareRowsClass: string; + @Input() compareRowsStyle: any; + @Input() synchronizeScrolling = true; + @Output() compareResults = new EventEmitter(); + subscriptions: Subscription[] = []; + tableRows: DiffTableRowResult[] = []; + filteredTableRows: DiffTableRowResult[] = []; + tableRowsLineByLine: DiffTableRowResult[] = []; + filteredTableRowsLineByLine: DiffTableRowResult[] = []; + diffsCount = 0; + + formatOptions: DiffTableFormatOption[] = [ + { + id: 'side-by-side', + name: 'side-by-side', + label: 'Side by Side', + value: 'SideBySide', + icon: 'la-code', + }, + { + id: 'line-by-line', + name: 'line-by-line', + label: 'Line by Line', + value: 'LineByLine', + icon: 'la-file-text', + }, + ]; + + constructor(private scrollService: ScrollDispatcher, private diff: NgxTextDiffService, private cd: ChangeDetectorRef) { } + + ngOnInit() { + this.loading = true; + if (this.diffContent) { + this.subscriptions.push( + this.diffContent.subscribe(content => { + this.loading = true; + this.left = content.leftContent; + this.right = content.rightContent; + this.renderDiffs() + .then(() => { + this.cd.detectChanges(); + this.loading = false; + }) + .catch(() => (this.loading = false)); + }) + ); + } + this.renderDiffs() + .then(() => (this.loading = false)) + .catch(e => (this.loading = false)); + } + + ngAfterViewInit() { + this.initScrollListener(); + } + + ngOnDestroy(): void { + if (this.subscriptions) { + this.subscriptions.forEach(subscription => subscription.unsubscribe()); + } + } + + hideMatchingLinesChanged(value: boolean) { + this._hideMatchingLines = value; + if (this.hideMatchingLines) { + this.filteredTableRows = this.tableRows.filter( + row => (row.leftContent && row.leftContent.prefix === '-') || (row.rightContent && row.rightContent.prefix === '+') + ); + this.filteredTableRowsLineByLine = this.tableRowsLineByLine.filter( + row => (row.leftContent && row.leftContent.prefix === '-') || (row.rightContent && row.rightContent.prefix === '+') + ); + } else { + this.filteredTableRows = this.tableRows; + this.filteredTableRowsLineByLine = this.tableRowsLineByLine; + } + } + + setDiffTableFormat(format: DiffTableFormat) { + this.format = format; + } + + async renderDiffs() { + try { + this.diffsCount = 0; + this.tableRows = await this.diff.getDiffsByLines(this.left, this.right); + this.tableRowsLineByLine = this.tableRows.reduce((tableLineByLine: DiffTableRowResult[], row: DiffTableRowResult) => { + if (!tableLineByLine) { + tableLineByLine = []; + } + if (row.hasDiffs) { + if (row.leftContent) { + tableLineByLine.push({ + leftContent: row.leftContent, + rightContent: null, + belongTo: row.belongTo, + hasDiffs: true, + numDiffs: row.numDiffs, + }); + } + if (row.rightContent) { + tableLineByLine.push({ + leftContent: null, + rightContent: row.rightContent, + belongTo: row.belongTo, + hasDiffs: true, + numDiffs: row.numDiffs, + }); + } + } else { + tableLineByLine.push(row); + } + + return tableLineByLine; + }, []); + this.diffsCount = this.tableRows.filter(row => row.hasDiffs).length; + this.filteredTableRows = this.tableRows; + this.filteredTableRowsLineByLine = this.tableRowsLineByLine; + this.emitCompareResultsEvent(); + } catch (e) { + throw e; + } + } + + emitCompareResultsEvent() { + const diffResults: DiffResults = { + hasDiff: this.diffsCount > 0, + diffsCount: this.diffsCount, + rowsWithDiff: this.tableRows + .filter(row => row.hasDiffs) + .map(row => ({ + leftLineNumber: row.leftContent ? row.leftContent.lineNumber : null, + rightLineNumber: row.rightContent ? row.rightContent.lineNumber : null, + numDiffs: row.numDiffs, + })), + }; + + this.compareResults.next(diffResults); + } + + trackTableRows(index, row: DiffTableRowResult) { + return row && row.leftContent ? row.leftContent.lineContent : row && row.rightContent ? row.rightContent.lineContent : undefined; + } + + trackDiffs(index, diff: DiffPart) { + return diff && diff.content ? diff.content : undefined; + } + + private initScrollListener() { + this.subscriptions.push(this.scrollService.scrolled().subscribe((scrollableEv: CdkScrollable) => { + if (scrollableEv && this.synchronizeScrolling) { + const scrollableId = scrollableEv.getElementRef().nativeElement.id; + const nonScrolledContainer: ContainerDirective = this.containers.find(container => container.id !== scrollableId); + if (nonScrolledContainer) { + nonScrolledContainer.element.scrollTo({ + top: scrollableEv.measureScrollOffset('top'), + left: scrollableEv.measureScrollOffset('left'), + }); + } + } + })); + } +} diff --git a/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.model.ts b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.model.ts new file mode 100644 index 00000000..7f0c9f39 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.model.ts @@ -0,0 +1,46 @@ +export type DiffTableFormat = 'SideBySide' | 'LineByLine'; +export type SideDiff = 'both' | 'left' | 'right'; + +export interface DiffTableFormatOption { + id: string; + name: string; + label: string; + value: DiffTableFormat; + icon?: string; + disabled?: boolean; +} + +export interface DiffContent { + leftContent: string; + rightContent: string; +} + +export interface DiffPart { + content: string; + isDiff: boolean; +} + +export interface DiffLineResult { + lineNumber: number; + prefix: string; + lineContent: string; + lineDiffs: DiffPart[]; +} + +export interface DiffTableRowResult { + leftContent: DiffLineResult; + rightContent: DiffLineResult; + belongTo: SideDiff; + hasDiffs: boolean; + numDiffs: number; +} + +export interface DiffResults { + hasDiff: boolean; + diffsCount: number; + rowsWithDiff: { + leftLineNumber?: number; + rightLineNumber?: number; + numDiffs: number; + }[]; +} diff --git a/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.module.ts b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.module.ts new file mode 100644 index 00000000..78451d8d --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.module.ts @@ -0,0 +1,16 @@ +import { ScrollDispatchModule } from '@angular/cdk/scrolling'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { NgScrollbarModule } from 'ngx-scrollbar'; +import { FormatLinePipe } from './format-line.pipe'; +import { LoaderSpinnerComponent } from './loader-spinner/loader-spinner.component'; +import { ContainerDirective } from './ngx-text-diff-container.directive'; +import { NgxTextDiffComponent } from './ngx-text-diff.component'; + +@NgModule({ + imports: [CommonModule, FormsModule, ScrollDispatchModule, NgScrollbarModule], + declarations: [NgxTextDiffComponent, LoaderSpinnerComponent, FormatLinePipe, ContainerDirective], + exports: [NgxTextDiffComponent], +}) +export class NgxTextDiffModule {} diff --git a/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.service.ts b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.service.ts new file mode 100644 index 00000000..a92cd42c --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.service.ts @@ -0,0 +1,227 @@ +import { Injectable } from '@angular/core'; +import { Diff, DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, diff_match_patch } from 'diff-match-patch'; +import { DiffLineResult, DiffPart, DiffTableRowResult } from './ngx-text-diff.model'; +import { isEmpty } from './ngx-text-diff.utils'; + +@Injectable({ + providedIn: 'root', +}) +export class NgxTextDiffService { + diffParser: diff_match_patch; + + constructor() { + this.initParser(); + } + + private initParser() { + this.diffParser = new diff_match_patch(); + } + + getDiffsByLines(left: string, right: string): Promise { + return new Promise((resolve, reject) => { + const a = this.diffParser.diff_linesToChars_(left, right); + const lineText1 = a.chars1; + const lineText2 = a.chars2; + const linesArray = a.lineArray; + const diffs: Diff[] = this.diffParser.diff_main(lineText1, lineText2, true); + this.diffParser.diff_charsToLines_(diffs, linesArray); + const rows: DiffTableRowResult[] = this.formatOutput(diffs); + if (!rows) { + reject('Error'); + } + + resolve(rows); + }); + } + + private formatOutput(diffs: Diff[]): DiffTableRowResult[] { + let lineLeft = 1; + let lineRight = 1; + + return diffs.reduce((rows: DiffTableRowResult[], diff: Diff) => { + if (!rows) { + rows = []; + } + const diffType: number = diff[0]; + const diffValue: string = diff[1]; + let leftDiffRow: DiffTableRowResult = null; + let rightDiffRow: DiffTableRowResult = null; + let leftContent: DiffLineResult = null; + let rightContent: DiffLineResult = null; + let rowTemp: DiffTableRowResult = null; + switch (diffType) { + case DIFF_EQUAL: // 0 + diffValue + .split('\n') + .filter((value, index, array) => { + if (index === array.length - 1) { + return !isEmpty(value); + } + + return true; + }) + .forEach(line => { + leftContent = { + lineNumber: lineLeft, + lineContent: line, + lineDiffs: [], + prefix: '', + }; + rightContent = { + lineNumber: lineRight, + lineContent: line, + lineDiffs: [], + prefix: '', + }; + rowTemp = { + leftContent, + rightContent, + belongTo: 'both', + hasDiffs: false, + numDiffs: 0, + }; + rows.push(rowTemp); + lineRight = lineRight + 1; + lineLeft = lineLeft + 1; + }); + break; + case DIFF_DELETE: // -1 + diffValue + .split('\n') + .filter((value, index, array) => { + if (index === array.length - 1) { + return !isEmpty(value); + } + + return true; + }) + .forEach(line => { + rightDiffRow = rows.find( + row => !row.leftContent && row.rightContent && row.rightContent.lineNumber === lineLeft && row.rightContent.prefix !== '' + ); + leftContent = { + lineNumber: lineLeft, + lineContent: line, + lineDiffs: [{ content: line, isDiff: true }], + prefix: '-', + }; + if (rightDiffRow) { + rightDiffRow.leftContent = leftContent; + rightDiffRow.leftContent.lineDiffs = this.getDiffParts( + rightDiffRow.leftContent.lineContent, + rightDiffRow.rightContent.lineContent + ); + rightDiffRow.rightContent.lineDiffs = this.getDiffParts( + rightDiffRow.rightContent.lineContent, + rightDiffRow.leftContent.lineContent + ); + rightDiffRow.belongTo = 'both'; + rightDiffRow.numDiffs = this.countDiffs(rightDiffRow); + } else { + rows.push({ + leftContent, + rightContent: null, + hasDiffs: true, + belongTo: 'left', + numDiffs: 1, + }); + } + lineLeft = lineLeft + 1; + }); + break; + case DIFF_INSERT: // 1 + diffValue + .split('\n') + .filter((value, index, array) => { + if (index === array.length - 1) { + return !isEmpty(value); + } + + return true; + }) + .forEach(line => { + leftDiffRow = rows.find( + row => row.leftContent && !row.rightContent && row.leftContent.lineNumber === lineRight && row.leftContent.prefix !== '' + ); + rightContent = { + lineNumber: lineRight, + lineContent: line, + lineDiffs: [{ content: line, isDiff: true }], + prefix: '+', + }; + if (leftDiffRow) { + leftDiffRow.rightContent = rightContent; + leftDiffRow.leftContent.lineDiffs = this.getDiffParts( + leftDiffRow.leftContent.lineContent, + leftDiffRow.rightContent.lineContent + ); + leftDiffRow.rightContent.lineDiffs = this.getDiffParts( + leftDiffRow.rightContent.lineContent, + leftDiffRow.leftContent.lineContent + ); + leftDiffRow.belongTo = 'both'; + leftDiffRow.numDiffs = this.countDiffs(leftDiffRow); + } else { + rows.push({ + leftContent: null, + rightContent, + hasDiffs: true, + belongTo: 'right', + numDiffs: 1, + }); + } + lineRight = lineRight + 1; + }); + break; + } + + return rows; + }, []); + } + + private countDiffs(result: DiffTableRowResult): number { + let diffCount = 0; + if (result.leftContent) { + diffCount += result.leftContent.lineDiffs.filter(diff => diff.isDiff).length; + } + if (result.leftContent) { + diffCount += result.rightContent.lineDiffs.filter(diff => diff.isDiff).length; + } + + return diffCount; + } + + private getDiffParts(value: string, compareValue: string): DiffPart[] { + const diffParts: DiffPart[] = []; + let i = 0; + let j = 0; + let shared = ''; + let diff = ''; + + while (i < value.length) { + if (value[i] === compareValue[j] && j < compareValue.length) { + if (diff !== '') { + diffParts.push({ content: diff, isDiff: true }); + diff = ''; + } + shared += value[i]; + } else { + if (shared !== '') { + diffParts.push({ content: shared, isDiff: false }); + shared = ''; + } + diff += value[i]; + } + i++; + j++; + } + + if (diff !== '') { + diffParts.push({ content: diff, isDiff: true }); + } else if (shared !== '') { + diffParts.push({ content: shared, isDiff: false }); + } + + return diffParts; + } +} diff --git a/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.utils.ts b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.utils.ts new file mode 100644 index 00000000..d446af65 --- /dev/null +++ b/config-editor/config-editor-ui/src/app/text-diff/ngx-text-diff.utils.ts @@ -0,0 +1,2 @@ +export const isNil = val => val === undefined || val === null; +export const isEmpty = val => val == null || !(Object.keys(val) || val).length || (Object.keys(val) || val).length === 0; diff --git a/config-editor/config-editor-ui/src/assets/.gitkeep b/config-editor/config-editor-ui/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/config-editor/config-editor-ui/src/assets/gr.png b/config-editor/config-editor-ui/src/assets/gr.png new file mode 100644 index 0000000000000000000000000000000000000000..449afcbf05d95dfc0da5a5f51fdecb22a6561bf3 GIT binary patch literal 5340 zcmaJ_c|4SB`?r)(wy`^vF(fo&9m9})Ml&&XMH0gdM#eB>-$J&rWsJsJvSi5~Doe`R zNH`&(w8)YQ6=ml)opUwE3jKR4CN;tU_J6fYYa8y^~luwkv4 zzdmj**1tBKp3Yh%1CR~@wj_^$U@RHWW`rZT;elu())Q}o$Kpc$`|+pQ*fXlZOGY__=*L2{v7I&u@x!`b#s>i1@SX%;JU= zR2Ug=8)jkW9(LIsjsqF!15bzOuoMvS0a#!N(Z`pf6QT$DORo-#{>4@S0sj&SxU2{I z+bIW(70`r4#sf8#VGwsU4RxRvTv<&MuC5IQ1Jza4U@EFm6*V|SO+$zELREqPJRp`e zGR{NC24VV-E!IvC|y?`UYS_AifmY z-x?5jiaVL$7eFBS0)J`5x{(3{^gt|6{|ta^CJ{syyh_rDGO5@dO!V@W2kih}h)klX`_ zc;5gtLJ!0`QN|H)I#8S{4hB_MgSbK6p%4#sC=8;Fb%#N49@;PuxVsz99S;4i=fC2O z)QpfY7{VB)uA!!eglTI)5!xm&B-B*HMAZbL`5TM&r37Go-SNL|6MotL8*B1Eu{tJX zJT`ztwj+^zes_VD7b$>5@gn&FO-z1OT~k>TsBoU(iz5Y76n_=!@3;|oG9d_$GbNLV zz`ruBL-;RVctG8-I1No01d4@fL77?@ncL zSdsYsc1Q>At_{cG;W!9ZTU869riO>H6lvojZt74RRuihm;=(~HEEiRNHP3%E({C25 zLw}L~js|P zImy&4_I9icx75DGQ?H$O;$}jaBVsnK&yz*>8EO*Es!66o4n`-qc#7rSRFyz?^S)97 zcZ&r#B^>;wU(;JY3=Ivnug^bR4%HZqyyM$Bl>bs=l=9}`ebUpV-R+6XyoecKg>KCO2g|N*h%I{&t1p8{UYWWuyiA|9!%fQe^JRLSSc_7WW<1X z9r*#pAA58dw?Qe6mjIcLpxfNxcaL~Vc9NUCa^&7cGQ^QLJqb;Sv&X$1hFm2TFP!8H zxsK-=@L||9P;;EnK{$Bf?wZ+Vc=Tp?9R5xY(yUZMHERyQpgZb#JOg*ruEfqoG0uZ& zVN%blrR&-m%42X1q?^oB|KQPO+7QI|v+k)CC0v3YCXB zaNHDvk5L@vGwFE^kh0G~V(Kz}Aqj#t4m)`Tp=Z>oDCgN;KE)3dnHo{5+qH)F{EUu- zds~WdYRE%S1S#IDM4p~>fb!Ek7bM0?u8j45eM>aKuL>`H?<4xS&oFnG&)_-yyp3b~P8wQECylQ+yQ#NHoLlpbF( zv-tkT%bTy?HRl?VukiMJcDr6$-xKrVmKn;$Jaz#4O2b7t*$(m9iMXZ=)OAxS#qJ&L zX#1LMsx$)+ywntJlTlTZjLOk9xhS8W^dl1d@~#gsrKczh?euJBI5`H91T7r?ULEN? zDF-k;+v@qP!6V8pFXEuBb#-G}DRg=h5lpRfMQ2${^DH)`Xy!F}kYfV{re4yWN4fZZ z)|&#b_jc_V3ty`GVKn8Fk<=}TH0&qWqDaUjjOY-YaKc2_3-ny|tSfJ2e3<9>HI+RhdU%TYn2pxf!-Yee2nSnGk z0ZKzvQ?EEv#2dK3a=v=uK`527X)}6e!a#Tc7LUXeOUDvh z5EVz58}>IGd)BS)e}8bauukP$M=WnEf62^K!5hG-LFDx~4-31{{Ra(^4y}q|YUoS% z_q7KeF)IPDUQ&)CPaQwJX$}5-~S3j1eXw6S-ryw|-VY#Vmb+Tg(W+3pKt?@Qxy znt`@+cjinYpSbYCAHhne^&%D^Op5d+;jei1b-u9XdOHkbPujh&Xb(XwRJ1inJ1^T3po4moyZqeNywAlsTIt}5^uS2~yO z(8~Pyk!N$~#?ke9y=Ip^{zmmvJ=KHa^u-xNf8-khg7o?tCt2xJ;LoFlO8flW64*19 zO|WyOm5)23MqwD5qf;iZ@f=gZM{i&vsifT-zWym=_z^bL$}})OeQNn$gwfGp(uJ!*~O#MMGv(ceSf?zzw(yuah<(?IeE(4T-)C@v(@JFac_zK zi~VFX=B6rKg=^z@t+ch-&@6Op*UQ^Um)EG{4ZDGI#?1W=_Y~uVT^CeH*EMPCsuS zGM|j>ghI(Z0p2g4g=ETzuz_Xp=Lq@svqRF$x>rO8f`rVShOG1NNQ_L0Zs#nZe$RS+YU;LB>*YB%8lCw9t(isBR~&&t-rPtmJa z-whREvc(-uYATOcF)K;Y)|tVtQm%;m)g9Wd-L+#XjD!zGsRu9U{k*xbKUzWD3NWzD z+R-G>|52AAO~OIIzU#J7T-{jB~!#3aDSQrqm3(gS0yf4G*U~IKo7Hj5lt4> zP7jH}d6?1{43yYy4)%U7BvD4{0;az|6QRwaSf8WYwFN;0>%KZ)doY_+zR|mGDM%B% zeZ#WG-dfO4H*PNRctg|;DJbYJALRSZVlI+fi$3yLeYw}Ey74=A+mllD4CTxnYENp0 zq7O6Cj;K@Ba`E49j5^qmcaHlGDRO~&+NzpEjCKx*n zh-#*`f4s`{$ti8Fx4PTO*lX-Kr?~OwZj9YlfxP`j?i{9~?uVJoNV@TzDrWx!AM^Jb zk)IETYXZbJG3Nrs$9pHES7abWpF; z(mZqW&`!CQ2!O{H;o#PxTxfd1q|+=R<>1jR-KA~tAHL_S(>^HxhaagY(yIYEOugqF zqZ9tHfrjK)N2ZoRe>SxkdQ+eFpU*L~!%w@uC4mhgCqydVVzBwDw8Vpv8CBJT#ANAe z@#eZhucDWwOJxrR{~WBP5abTDp3B^NCw3=I@ABKmb3iTc))|;u#7*U>w)d{H>7w7W~#mXd(lyRIpC>n+ZM?{?M#<;a{emN3QI%oX+ z@wJFNdBET;j%l$v%Q@q=sYqFL6_|ka=YO%Lmc8J3pJ*&~dl2~TtxaZTuV|`Jn$rBo-hOWrx zg30wEvUi-3-3wOROWOAAkCeX*_|xXjD)eOtH;*GhBISD5K(%a2eMU|)CK%^v&UEIN z8(B*?c#1iCI-hOJVbYtmQUzO{StEJk_dS!7U+|<#)OYM@bfd>?x597Df8L=Mj0q>x zQGOW>{v_!^fkcEZxJM(fSX>QsfEfHD;@B5RtOyO$8_^;n+G2F{Lmkw>Rp48`JWnWw zJ;)}<*rEWVMTI2?PTKi!-kzEY^M5u&R`=HvR)^5IV(q0D`urf;FFet2ZCa9Mx6Z!o z8|y@+hvyX#Z*>$JabP7UI3%zCNM6iK64$f!mKFUJG`V%<=6bJMkd8-*^%@7m1&=Be8-2TGc6?7qg%1F{| zpUy4$#Ov>GHziG8wbd`obh0_Ld_euUvTV7V8B%f?o38!R$zHP}4`nFc@>~WV;aD*o zH(jchmXQ^o>mZlRf%DANV85gcy!!nlc;9}qf*;g^%d?jsoPDA$1G{(bO8m^J>C`19 zRi3og59JMC3Zpw7_iR+&L6_1|wYmA$T!o6_f~&@Nc;#;jnfFdTCRL^pq%jL*-4#0%UNvguSjSidJW z>885*ifrKtQGq1O@#@bUt<+h!)04flIm48-U1F<>h&U~pHXFCoHnsjozGR|e{;?;$ zGjagGTiWjkW{#429IG_ zT?V}=CqzU;h5HX@xfmhDg;w_zTNbpC+hf+xMkN`jcy=dqYSjlet$Ec&!}c@~Frb5a6RhkQKq4NHTD%`G6GeqA1* z=*V&R;ODMDDRONUM*-G6-EBtFG3#?rc}!4eET`SKknAI`3zx5O9AV?bwt8Za2?f9I O8_`G$M6I!F?EeAg!j|j+ literal 0 HcmV?d00001 diff --git a/config-editor/config-editor-ui/src/assets/grbig.png b/config-editor/config-editor-ui/src/assets/grbig.png new file mode 100644 index 0000000000000000000000000000000000000000..ead180b97d08f1b17d063c18de6616c2b263bde7 GIT binary patch literal 19282 zcmZ6z2RxPSA3uH@Cwr9aT}d25Lb6vy2;m$Y93e6yBb$>MDpFQf6yh9vL^c^wBzy1d z>=EIA-SvEbzu)WsdS0IAx$kq|*L{u8^%?Ka`*VfsXy2rvWTS*2h(`UEsvZOpqv1dD zQ{YbR{e)5QpHug4-&BQ8;D6rMWWNG;D4cH@xk3;X1N=t>y-8*PH_6=8wbaO_DXHnn zqf_NZxRV97T z;ngueXZ^jD`NJ+h^WY4=J{p$-zd8O zt;%TcPL+{|VVvz{qV|+^KEF?DL!ecoBVuwiM11zW9kSH6(fss#S^CoL7P4r0WlLXf26f|$WeJ-I)bE^=4Wr;Js|9z=iGPKle^kW0v?k3-fO?a zCD4PiYcGrL6R=|V^yy|_H|QG$26TW&=ky1~Nw||M79DgUl$h?4;X{1z^#{phVv z`Qy_rr&+G1bHF{)CkhtE;Slt>P$Lrlwt+!Se#);nh|)n= zv6Q~Q-J~_aVL&y{2WCW3t0wE$mqhP~hBTbG1@h$&w41&Ub64?W9a`|==phBG{z3$K z1$%kuD>hr{yt;c-r%8o)>dSW%59Y+TvmJQMoftT?=6x@-*OC zF$WUjV>)98?m!&E^Yhf{lALnoNOA*3=Rm`AnMG;T57@)BgK&sh-Ma-jhr14b@pz&q zSTf;oJe^WKF}Wdxp)v+5QZ-3yFFpq*$C>>3GSt#!xcA{YSHgX{+XCSG;3;xrF!Q8H zh!mcu24e z-?TRBiuo*amV1=LF? zX`riw7G9M}if>0*8(#$F(vHthQR19}`knPi#IuZ%0tj;SrAy@`M5JQ2MULdeOq3a0 z&xTkM^E1Ifm1vB>ZZwlgpRX9Eue_8&+Sbx9f0w(?c9n>WvshvTF41VLSW%?)M!Fdc3?t;L<(ud=~EA{FGYzVatIdT2ml%0)cfzGLG&oA!L zTl^u0Fb}Wg$iXv}Lz>*eWI=v)FX={$2vl#7acA#=oHdSp@EmnT)A{>%9YdH-6QIdW zXGS@E&DZKc6YxXfzFLo=F~Oyg5yHGkL^-pY1QT7Y1BqS9<5FYh>;;t@JB*zv{RJ7TbRasF;ZHt&VyL+3EAlKG z63x{M)Z;~teroVN(Do$g0Jg$=QQnc+ByfEra^$lDHNS+Yi_%)uN#$}ft@fWoU|eX9 zB0HsjlZ?u!mE_82w}*4%fvspg3HWD|*$s48o^T}P6ueWUN=6O6xpR9WXoz1PGcpD97-D=eNaRlPkQ z(|eHapDz$`TTjQV{$g;0uDa>siBr|)gv8F9Pq|$=o4_pI(zE&$cc!-5qt21DSF#-v z!6G_HuHB_Kqtwg3%XZz(Z0*sG!Ou5`T9$KX$GrCR$I@z-;=da}U#o!%NW)T-P%>tH z>RiO$(Q7U5MT=?7R0FNy5fEOx53GywLVMTIVd8o3z(aAM8!)^gPXvKP$XH%?yO6VI z2F#{zT;tHN%@Vg@U!e3|_ke@K$I9_4dpiq8tESFj&9Ol|*wgvsC}(~hpda6Xi7ap4 zksR?I@Be>{Q+=$=eX}PxggP~SNXZjB-;mrLm7`=u#)^8i!S=~Vh2mMLzm^v$`bNen zO6j@;ur%Mrvw~K+mu$9^NJoGQI6+s&X|gaYO@2}q%IDUPH?hwlB}WG%8ySl!^%t36 z=96$QWIJ*%GwV6uxWMDe?yYIily_kFUio&9iXMfDo|{*EZA-iGzgMo%8otKX&Tp7-U5pGVIBlrDn6I|YTJB#6hHO;)HqA8y#vX)wjao1nIG@CS}3nA@ea#g zGR&WpAz-B$@~<%nkv2pe3kDmx);;*sB9zzR@g4M&$BH&8L8~P}JLv7Qtn58WVV?ng z=K`|Jh&-UR;^Q2lX#*-It0bR(>1s)xpL-8W_dSL9jRY7rT~b#VCWJ8J55j&Rc1WlfUOt zhVf5CVfQo`c@l#e>4u;U@i~!7WB$6UJT{c$+1QETFo9qO882Tle-X z?xO(^?T^6fHbhCNO3+{B*!2zhr_%ZK8v_~yf$OvNRIgyxD{G2Aw5E0@DVWF&}UVS!(i6wJS_T7$6}Wcd$1C=_f=o)lLR?V$hy{d$eOK z?{Yg4{C+R&02QmcR#JH?U|>h-$%Foq*Tm2yvzo=9%p{h45^M{jLG8QE3z>*tcmgY3b;Yl$Hd#DTEm@hrjQS& z6T(e|+(+QS=D4ESTlKdyclo#7HHaYc!0+4GZjZS!=VoBYaBnG^nRxwB<20zepy3Tbr7G( zB5RRrA$T;#v~RB882(0a{ln9{z#au7okH-tcZb#fHJl4%^d;99C@L5~5M@6zZPZT- zKOLm_@N}`n0%!Q^-5TH?{B^9@AY36i=G7rAOjGSLQxQ|?U?ti^m8O|@29HW5M_nx;ff|KG<rMSLsl6f#Z0tU<)|g_7F|xovL3j3z+{I@B`@2%0=I;dD9` z>=hJnhor2h8V#1;mOskkfuOX_9ZJIv^^!pRDbVt@LRJWe|Lu*4e3B7DhoYuOK$CX0 zrVaPrUIK;~bUp~!pYtX`@OP@)<4uAcXwKwA(E62$JS->Je-%T(eS_+Gfg9h+((@qN zDFyuB3m@>E#0{{zty5=7k>CNVFH$DKAo!qs(ex#tVwklD2{%|glf)>*HnPQ?f9?1b zgd5$zhd_=EYF7Xk0Yr2z%0PDUdEd`H%>5IB2WE*6+>Vy%ayspj;OgIG0Mzr6i@k6r z2!lOR%^L3AlYx7zu(?gi^nCUAt6LAuhtA?(YCsS+%?4GtOP44yD*KxXbtmQfKn^Jc z5z(P(#LF}YW^*drU>|W>gJDQZd2NK<6H+;D?4!C__W1U5#&>5S=vu2Q68+4&&HV3- zYd#=@>b+9!U2KF@{2LAak6#Z#&Z*gkg<$t{TC$EZN8*8ffN(ytWr2*q$<>G~3r=d5 zn?X^R17|^>1cE#~|H*nB6FxcVvjIko98%;0_agg{drf_v31&v7j%B)FM5A-zj6#M5 zqjV@>+HM1(1)I@44KCo*-i_RtO^3t)ITd z;nCE$+*W%}z1-QG~aHYj9q7RAs?ty?5r_MS=MuUrP z_=1ImsRs2c1bF~f{SqN?8(WrqmE-4%Ud0lZ0hu3I+OvjA-h~N1b1zgi4%@TP&w;0g zYivJc;=Ma!+9VwWL7uAPs6up&3qPhT?MHrd34s&n4_sr%G9?op^$SGwI51I)w@3_| z-15$%Xs-(&xTW>q1vrW_3p|^q*5N<(Tx^f2`0Y=2!z6SyCD&C1E8dxwmu&my4u5sZ1mw2n=y zm=0LsC|5s3WJ5-0=>K(W!4@*j&&N6fPnMd=9rj9b(PRWT=FHe@7wCqS9X!L2>W9Bu z=CXX7Oa{gi_I2Rl(~}XbdrC0`GiknqcrgiGFqS_JWfwheh+kvQw{-yWV~#Ouu#c=?_s;B#;xwv3E;@dX~)}fYg%;iB*oB z?nZ@e`+;^KqT7dIU)hShtxbR&!?6&&Gf0Kh1WRAL3^Vz;>jxV=iP70`{TMx+bu%*M6a<_=)AC zzf)-q4;PQBj5xMcb& zF6h(MhGbEoy&>X$2|3`7W?NN;zpxWAfP3#A+kWO-rd8z}p1XNR>h<4;tXaCEtAIFt zAcp4=FPh40(;e4yfbaip7yF)lH`0rZcWGgpYb;!bp9)dL43a%-6*K_*%4B2Cq6C40qCc*b9zO^}+Y^I)^Q4&OF8e8zu}-t+P0OjIQB9?O9{{phgr;>i4|q^PRS~&;{*B~nOqrsH-m>+6Z5qeJ!Z9E zaf(2re|5gE%~?HHF})b~|>Bv{%TF46-)0dfuX3u*uj-B_$D^OAL#I}95HDo;C2 zs_MB|3XS+qD0@`ok9)!(s*rjnmXc!gwS{_Vnu?muUAuJE@(2JT%Tr4l9rUT}Svh}FSyU6j2oxM0$XA}@zBBoixjOJJvw>d@CW=%n;6+#-waQaVr)#wVb^aKm z494Hy7#KxU0f5jrO?Hcl7#V760uPaUNS< zCX7x-MD&-u2O;uQyVBm&dB>y@HjTkq@c+~-3eBnD$yxpczXVf+XhdKUuSyICGxP)4# za#sSa9)h&{6YD|A+aqn@tUYXWRy}*Y&D`6v(l?lWzE~P`^x+Il-HUpFf-&|uU(<3L2}iYMumNN{W5gXII)9Y-tVKN zj{v4wzTa8r;cI;7IRe01yasK;j*+B8R5!m#nSbg!sCxTHo;J@+&GM0Zjd+&IU%bSB z?d&(UfFNU!NTyEVyQ@1d23VislYHW~Zza}F_ec5+8Vb1n_Uob9Of{~&{#aM#2@Tq{ zL%*Xb)gxoQ*{{HwCw&~LVCGZR($(ZPtC4%?Wcd6-9VtP*mHV2glK@*J-riDE#B4^e zURQm_sa(F&*B?ZhCr1wseg;Q|4Mwnv1dI2K6xf5C<_cZcbrvSJ-1GvZHoLq7rduEW zCTQRlYVOF+s!Esq_Dk~CO1aHk>bJ?V!e!9<*+I-A!Qm1Y2?`;UowXRMws!NnBBKsD z3B``Qjzx`IO`U?Qo!PB0VH2h0UpWUcNp&|51^f4VN+sQ1x=Ck z5Nt|*zu(y+kSx0|dS!s)cEs#{mA+BC{Lb;rIl>K!nlr<(L+Q4Ax zVLe;zhrKNchW3Xl?&V-_!vOS!)i3jm59jqXJRkiu{6rx)!@Mu9essBpd_D15U8|dL zZ0S%(R1dR#o`?DCfT>qQiiTOVq5*@=9M*V>x#$zl!+_xq| zCe5jlia4H6@ZV=Y%KNNN^7!a_4p;7EvQSd-;rNT?J^1g!j`fDu%TSXYgSy_?Z@foj z>UAz#KJYSVW1#3;4<_JPRo!Jep#pYsJF2$J>Q4zJ9Z{r<7d@d{&t0W64$`0MVa90a zcvh~&Rj(HiKAP{N`bUQR3*NY#U|0icsp^+&`g9?m20byj$^TJl*7A#>G89W9;Yde-3Og zUI;Ay?TuEq9qMyDw%VV^Rw=&h%}5U1AqaJ2_-XrSsyMPf?j1#a&VI)YEk^e1xl+vyz7lHmB2swa4&e64| zjCKb`GUKc?le70@IYoxUf)(ejQI+gL4uR8-hv+(IaoZa=Q`im8HY8S)|bWI_!S5)u&KeA?BYUi`KFAX-cmS||4rvRCO=;P_<7`g)5AjleMsX;^+sTB2JmG!^bDR8+ zjQjjsgfv-e&9wJkL%p!$%5*QYXtN}qNi?p;Ua&=>{Jo}m&L6@rjHs#k?XWsb7tga} zYfY_(C$uDw+_xN(EbEmkVr2gm>^}DEV%d^Ijq9G=kU1`>BGgge8_Re%JR*8`?lPk4 z=>>_eub+wGWtmDT1>;W>4J_3azdM$cyDYFqWWT{&I>u5m_PlBfOy`$bhuc+-irbtv zQ5QX8WStEv?5cYX9_s|u$s$spzP|-hj38vbGOToQ? zov=q4@xe_4TyeRGGg5<~&x6B=SO(v%Nwlr}#vFiqaTU^^YYxyzt}2 zTQRn&wFKs~7~n|%Cx-Q zv06oJ;zLZqWW-FxJxl{5`b7R77jq`cl6y~Nwm83;$=;oiKC-3>S==kQ{IUP1w3WKv zZ02F9oCEJNY-O52Y@q2D{~q|&H4{q%Y2RB5xCd@@6f=GAnJ)ojB?wKZY3e3l;UV`H z`7pm7&=+0He>={)arcnK z{`&P*I#@}iSij2@v9A* zL3i^lIb13-x~a|qFen$KD=+QyW5uklx}ImYb-uZ-AHNu2&q}>V)B>a#4e+E#Afq=c zV5`P<-_GFs@*B_$GVxUQ%n6~X@{guG*8qLE=D-ikWwt`R3ni79G(yN~qch?(4fzLa z54)L<;}YrI1I3?)?K*6}Qyx6&uH2Tj9uC;qmg^7b*qIkpz4b`YDlawV=#dC;5I=WH z)x1NOc*T9CeKlJ0`ROUrA=qm>NtiIZ;2ve?Iv~yIHf=BM6|x3o!Lh6tPRyhx=VbrD zb7_-(Z+rLAUNOdg>luIudi)Jve4UK&BTR8LT6Rht_M6=QWWvkmXFWrtAg>KL8L4ZQ z0YBq%43FbGT$5^AtCd<3+Nk;cfNS|^^5O5gi+^lJp3!cFaHOhSZ(2`)VW#&11KMP1 zh7UdIw*b&0Fd*XZ`QF*24#s4-{I7Q{K`TG~du;a(O*hhnHzF_Mok2Lgv}q*radvBG zq;m#fgrjgBkBHtv?>84w)uzx#UCT6=J)e{LPgMd+$FV9d=(H>aBq z2`5))nC!>HEBvkJmxU7Z71G}%BJ$7}1?NdG-ZP(LH@58~<9!a!0aga)sgvyZyp6ck zoS)#)+MOOLuWg&th3)e1a$fVg=Fu6y(ymVF@;A;bQ4= zP)b+8is4b3zL+cFo@wVz8)2sEf`xCoWrO4kMvkt>g1lAFm(ml)exmEAIU2u${G}G- zBpDfZ`HSHPo(11rox&zKJ+Rh1w|>+p)h6WZg7n+j&BN@ZF4wqk`UkMz>4GgQi$-M~ z2x4`Kc@k*--WtlJb$##tD#pF$BFzDGa2cbq{z6(qr=&%>NzvoO!oT6+Q>t0OKe6R} zHo`vs`?<+ZLC(GVzXWt?3@R?9y`u}<6d&O%P5KtMqHtuW5KDrpg`D1=b#DMYPs_!w$+<{zfLLx{>)}?fHJy!k{4|7x6`A33gEO?K^nKix7`E>fB7fH&* zi+x|r_2v-0jQ`d1I9nx-o8-WqB#t@mCQ(IGrzWAQeOrg#zPPNbSEi=MV#}^{p(v7# zQp3-_{b*nyspCnne}3f{lDUA|NIN-O+FwIiEBqIYX8klDIeGpJMUDOZ)(K%mh}KvO z763S#4F`YWL}^Es_p2Q82T32)rVeC(G{1eBOi$)pXY7Ze{y#8_#N}b>Evq4iypFkz zQb4SEPKMv^3xBe7I9oU`w0*(-nPB~$@#_Tvm~(ToAMaZvG9CLos7q3SQ@jG|aO|z^ z_l=tP_WM$_cd^FY9kwlBkOTU4sJJ?0*4+nCf{~QH*-5)bi7`FG58u9lmZ{EeI4zOB z<=xfU)d$pJ%*5)P{jtPiyF)9Sz+WEY&NP6raUGLb4p63h1j@uq|84gdxh zu4f0ysdJ71eDLD<9$Uxu9L#M3aLpaEkq-aRZL6TbFbQp)$9C4rN7PHx{{*qaUS&ch1gFSZU1k-PM7?KGfgOe z*`$|5sP?NIqm%PXAM)B(C3EVuqL?>BA0LHICqvFWUz_VSqGe3^zAdn?&l|) zN<`e!a|}6G#yEUQeM0JDX;&T08PXOh_80f<7SnCD7&)!;}o>VPdkHDa|Kag5o0~}#t7agV5YHrS!26T?^IK`T--&YCJdXd(O$y z_qFXfGXD@l3unbtiWq0{*4F$PmsPH7&%cl`-40@<{1Gcp9(9sh=<%%MoyWoiX$}{c zbnvxdkR1-(PL5gLeoS^T(!8ZpP$#`r0w7l%+Jj%_2Gf8zH~@R*$!GOV_^x9#F%u4w z*)Me89$niW!6=->buI0NI3*r_c<&05(`ea_;nS}tT05QFQpGqOK>8~Az-Wa)%;=42 z0y#)9Zr2q1N?_Z7n__B4Ze+%i2vWPzMd!Jfn8DcS9?t1_X2aRJ?YD+xiyp;dHFCqp z>Ha?#{N!@>97sc+GN_2JhOR05PQdY#8HEvG!qsj(ZZzZWkG~z%7iQ4r9Q(_Q;;f8` z{bQ74{_9nt666r8#8hyqn90pzwH4|vQ_#bWgGY`RtWFm~Rtw+gR#V63l5*r zdSAMh!*Fo$-RA1-Y+M5K?5Dh${%8XkR14#$n`=6lx>5$`A6wNfk2*{3VnYzL1&kSX6m(+M>o?bC4L?X3`#H*_zAV*u-c z=*+>P;b%B|%iY?}*@E6+?g*uOtoR?N)mxp~G{ zwj-^(-XsOBKQVc2F(bV?ZEuEGn~Gh#8&u&4Td2cWG+hcQ62-|M<$exJeE^|>U0!L`xheNbu3sxZaUI)kf0CUB zFgLZYF)pp{TBvF46uwgU^FK37Yc~?y`utr~BIq5kxgXP{Gx#5h)_#`4Kj4TZIjhqu zO>?AGcPu;5b)u$x@_Mn(@p|UTZ2#KJ)ORzij*n{mYU*H3QhrOuZBYT{I)XUvBfy-K zO|ph5j#LvJeAHT-lmR-j4#0)6YX?7p-Kr={iHjU;Wh?g?X_fCUOd845p5RA;RLYW+ z^q!Qp_?E+lko`^9ISHyDsP&Gx7YnAqH z^<>LT=aq|}`Ni%h77KSwx6$*EwtT$wD<#9oAnop)1d280x+K@&2bT54q}VTwS_!8f zGZccwhUzW0u>gXnF9fL(_!^`_z`y=~msT8w*FKA>C`oezT)cw2FglT(?|+XHGlBmj zqJl38qY`n89s2)kZj-YRusGpt3dBK;e$C^$_xeMqAh-f4)`yq%SOFCN_iH#`GD0oY zb!FBo;vY53;MYe*v3w`lEtgd8YeX7o1K_@%hJ*?JA`h0a7qD#+@T;#*5#Wf^x(yu+ zav(VNQ$iZiDL1p0BHVoEua>gbSe_^C|iD4kT*FPaE8$h=D+jwfyC8gcJgPD8{2o%lLN$v`<5ES6! zsxK_k_3_hXDm0+3>c=^Ua6~)73*K^42V%nhv5XLa_sQ_KZB>v$+_&ynSIAZ`Ah5t<^{^cy@C^QF~cnCDP4Yr=Nc_w_X3{Br&vR7rDH;adL72yJPzO zG+X4Ac=_!_90HXY|EB7KX?Z)Gxqx*$!G#ECqbi}cfd?^CQ+n5>*A#e65}#ouR3AwQ z4-jo((TMTVD}%ETIOd{uz|E9M?oDOAn-@D1Q0sy~w!adc3;>NN`oleBIQhzC@#`E6 zxBhX_tnXNuBZfRc2VO3p61pK_HGh1@PwXfIu}_P~K$EE*#7ytlikqBok%DhR(IvLa zVF$lI(_#8&$N!P^s&elBL}YezS~LnWLsoHQmrWY3r~IIoAa<66KY5>kRKPx4oc$u^ z3Ielp7eA4t-HWAC9Q-_epyXaz_ISFrBI0{im`0hRrW=`jgCH}mQ2MaQ-*v7v-?$;- zzsyqQmH(SUPqYNDN3T3v+}MsCN~^F#*z@H78m1&R%(__3P8Q7zW`*>Y+ca<23}|3l zqj81m5O6T8CofG3fuHvI$T0R9^#(}v%@}Vd*5>vbvoEjssZnzvIGREK6-x4Vl=3fp z?TjUpC2pewFPt^r`yiXB>!aacPr?qa@8hv<0G|!1FTTzW7Orf_c_Em zo_Ks-Il=>-)B)1Zan{1H+AF8Evj%jsTM=0&B+yL`^`#nnzdvt~=+>^~TL!FZ9m;V2 z(lb$BsNNMlM?9IaAeJLFgL4NMkEBj1;p<8D5}#w%8Qfmxd|&Bvh5L)(nXAj*0ZQ+D zb_L>s(w5j68v3dc{Z%u#6+|6hxRkEfzcmccRrld3g*Q;{$lg zKkh{&(6mTE3Dn?4QMZ(yhA+ppw#9WTN4Ll>Sv&@tuNF9`AhVZv??84^rn|giJavUz z^OM>j*v@H$A9r#r9}nMI9Er3sk^y<+?80`0ClWihkRiEz!~BUnVFdsbC}88>pMge| zMVNK20eD)+^kH7g%EYK@VzN}NRt20nq=6p3jitE;X|o<@tfPEBf(Jh zGqcM)GKt&f>f6{#fgjHJ+D~fJcFItynh0}risnJVdumi6%tiz5-z}q(CP`i#4_K^y z)t0KetO%ilLYF#Tvun9!$y($*w&*!!wE2MeVqN<+topXaobPRC@H{=~WYtIZUahk`Dx>@G0T`62Y0{{9h09 zX@-#iGq`{F4R=;Wto=RkJ;O>>FR{d+|97ZN%U1wZkA+#lqU?zGt<@Bp$eawva% zcYZ~TfeK0n+nDlnVewdaaq$tY1H(`M8BuV16x<$t{mnBpnS^PE&E;l^3^YrI$2k8_ zP`~_iEtZcg1oa0`HTkh~8Gz~qRCGm@+2w1Oh5>~&b(J6F!ka5j`M}a}wTeV>s;E6g zb9Pw8ac=Y5LQ`>kFzXNmjhC#L-t9(biIlX5gu9rsR0_m9^#j8^O!>>X(hiX25?>6H zL9;iPgZgdpy;-+U9OKY)ff;c2q0;xBHWCe&OZ0fyi+dE0iWU<=e~vCD8sx8&5-=Vq z1Weuek>K5jqBkTVMbW}`#!2R7q3n+`X9^EmzwYK<@eA9W4}D1k(PIcMi1X%v-|A^XgYO>Lx#Xj_ZEM?io#&B5fT)o4UEZ(=f(DudQB%ZmV~MeG zV`(_Y#>R=K5Y8DJi@YQ9Rq`VlUy@1inUP@aL4cPy`_e*_H?GK9z8tVh`rZC(_w8&w zCDTZ7=V$`q9ubu6*)%SC*GVV5vF;-C&=E0QNKzr3?4<+95I9Z%O+^R}_5g1_dH=ea zw(m=j_L#d^#Mc-^4Arym1a|yhQ9=arZ~192l!<`=u{j0-X#d0OC0VAWT>V^&xFCH0|{Q)+%wa zT;lbT=~|i|WZ=Hk&rZPBssB=dnw{gm{2tv*3|SqvB=;eGGK8~tP#}@|nxDk*&}fwj zkA5MG2AniOK_VzY^MFQrs+~wXD#hh0Hj^$t*zaY4NoKqN2{h>qKQpY6Jk?T>b1u6M z3rHvxIV*Uf?opVsrvX9vd`CCH2go)JmY*8Sau<$s7(@1OcvFCCo%O&n${9zSYjtlUuR3HpR?E*2?vDDMZ< zkNOJWfv5pgFeg~WqA&CK5sJ8fQ@Wq);gxyOaw16d@=;3?=s<;6oXbn@fQ9Jrzjvo- z0KqT)!}JZ;s%0YNkxGfyf==5#2NEdQ1d!G&g@Rm1?H+o_Vd0u4&Bq?vfWssS$o`-^ zQ`?}dBNx!2G)m`6kK4aF>CFCQzH_opxF>yn6J&q0sUdp#tK~AF6egkP)yNiGVSiT% zt!QzB(bZ}a#r^MtzdqQy^&ZJ@oEr#;yj@3%M|ZxR;)Im5VCn%z+8+4IVQVCY^8Vq4 zAq3{NZon&t8ej#5ip_bUagE>n<^dyOF`fdX>|@seFA*qrQg((BPG*=7kolIKq@j6ze$v zmoUL=u43U%=%&vTw61)e(SL#zCR9#I#KQvKy$Rk0POb@-q#q!j&l}!#0!hK-3z9-7 zmiFHnyLT;)u1!poUYeK?tx;_ij4OdL-3X%h(4@Ho%_p1R9QJo6Nq}tr3K2RLO^j0j zgaeV5F=5Gvyn3elsJq9+?+6c_Y1?6S2&Nq3xR4!A_ zh;W8RH!qxm*2{r$7!bXS|GX5-PWj2(;5&}5C}J)PP=QuuEhY6Rp!KY^@k|s2>X*Q_ zvbJtQz;9fnDyZr@LPL{s0Dtm%P!y*_fjaBElRHUt`yOM*YP6aH6Xe+elKok^n(q3I za%SjyflcMp36XOT+cLPRpz0^J$N?`vF=GHPe5x9O7v(n^((!~jAHhfuugs%12BOHt zU-^-}hPJwZ-TnS7P$XZgTvBWd3uGAzFBleWo-R%${MbrHkwd>dKo;)acx)9Yk?>la zmhK`I0>3j9Un`)8Heu7$ARUw+nZ;};`>yS_!dE~lP6lgj0QwD=d;pT%=m7A|L50%w z#=mXk<(Cfw-p~f%XxU%OA^IiwD_8I?r`8%YDgS18tI-v3W2w+F+kj0MZXom#rlZ&b zwug!URL==ux#!MvwIG10F87}Mf-3`#2Vg1(RXsc8#am<NH%1oUS<>>L&V zEl&*yz99sc7AZ*aAxL_U!Gba+7{D}Y;kdimW#d(Y`^RZCZZH*4SR=pp$Q|a414*-b zQ9Jdg)^PRNBBO|z^fld=1Nem6>o^0#pQnH!k`KCkO90{#e`eVxQt-lh-L&4@tG2Is zF!WC-0kDFtZ!ketO!+VcRby7`s+>sAmQbDk>$!nHAfg6!Hq7i0G}Vr*mW`XzQ1chC z14PU4yhh)Mt6zI_<6eaxOFNHYfpeQdYuAdG4A% zWVntd13=XKoUdWlWZ+$lb2|HbG0bl@IF$j9_M$WTD`!H0sK(gtY3Z}o{=s;aQ&Rb~+Emd)Q)6?+sJ)V5_QcB@xJwBjJNV!v`ZO;U z&iqmNTPd?2QZ3u}=>1PelATKS#qPVCQGkXEctZkc9sr04o=T;C>xe)XeD%J49s|u9 zVAO*w(y>@ciXOBc1ayTB5L67K8DKoW4aO@X2mrVvfHdCeVoL5}5ZA)wGm&M9=GP>+ z_@=(wdk?B?MK*{h%q2YekhULnJ}JG#56kkr{83vhV0b2p8CVp1#-oS>_xJn1j!-X%M~Dfw^L=JWB$#^7iXD2s{%m4vgMw z4SYvrf^mAlmPP=Y zRe@_yj*kw+rrJ$_{y|7%5c1eOP&u&xILW*nCcJo%1O>Gp>||;r&UfcoOW3vQOR2@W;bB+BNV7{=JHznce1~D&{ol()1|P^23@(RL8J&1i{XMrOVS__Rr5b({c!1; z#h|F8!sG&lZQy!gzNq0asJA%c{;80u#v~f5uy@;=)K*@_H z_d-qYj2dDtz@-r&m&!N~zlbUq2Gg|%U0~eM3L?7U>Fu#W}VQStT zPQwx$j?KJGW3TN@zVF%mA63fqNOZgfc}@U#FX2AXvD6fYl6Ri(zAVRX)?;EOUSuKN zFEEyGLBrKB-Q5K`Ze$ER_CL#}v0fnw_I2Ms(}=|Ch^(9UPz z<*)Fo43`7w{T+vS?h`X9&P7GUu8CXO=wJ$`?WD6vhy_p#?Q6Mz#JN_H?o0cTo52JXz@s z>h-b&A{g??(OwO)VxRyT+q`A|J?$jHU9Db_{M5@(5!)K+T&7e9#lmUnC}&U(%}YhA zum~y#*IVA2&4iO#6oQO@xW27GgCM5M6|kK`jGmAR6$BI3bi$qGh{OudD$yB!Eux%v zWe-xNK&LjA?ybwSs-L-Yi#!mH%E=gwwF3mEBJ@CYozZ&lD+WK~^>+YI9t3oGX=Jps zS_RzS$wmHL;8P5D*-4FrtzRi8Qu=qhgI`!ZBDHV4|8$uH@a|uehLi(=5lKr|ur8yV z>ADM7R=~yInV>|kc(Q}P2#DWm)4>KDRJ1?wh06uvw0bsyUDgVCibaGsB~hS*g-AEl zSK(s$zb6QgjW#|-(1QsI77E^^(Ed~!QUO;qve5CvW!*5@vIIfi$Ve0!ji4`A{6IVv zfkP-Wk(==7Hw1JEC+BI@QznCYyZwT-9|0Gwc;o+;;@6WMJQ!&`K=2QT^@MWW?E}Dx z@!kB8V8Pi>ZqvVb0KG)B3*)qFm!uZb?!jtF(~#96Ig`P7e* z5KJG*$elMoGW+rXtn+k(?ihCE;PVR5nQ&J^I5O#;f(+_eZL)ko=Lgu6QdZmH6`k;T zQg}=}Rt;oN?0rL)Z|SWSWupH^{vZ`73XW6Y*J)U74FK*(QL$G2IjfBek+O(MAjR_lHQfDaNCD&c| zt?*t7uDz`Owf#JH>iV5c*y)i?Y+5677zL{QJoEPPep+kOV8w=fq4nAu%4~m}PquBp zCz?%)>&=A+03Yvpr$>Hg{bWQL85~-^nIPifn2JCmD9~;1KwagpZHuC>YeYC)=->Lex>$uGwS~KI!8^#B@s?8) z@kCEW+sXFVYD8xj_y<7;0LA_3`TQYH@g`IiRP^ zgnN4mUcLWgVR5*S>I@1lMfxU2trZ?@`s789kLLrKAO$kyi%KFQs#I4HIl_e}%1lrl z0)7?HB_(NXPJy4A%XuM%5M(DEDG^m|LtiLV%|!rNvyG+b+OEeuV2xAYbP=$w@yF+t zs1zH5`oOM&;RYB|cnyvj*=IX4f+#r&;NS`(DpFy{`4U?FjGrM7mUkUi8y{_!tFAVZ zILlzfxOAym`BN$?Q;#_X>c+} z{r$pwv+&U?N>n(NhFkz;JH5ya!2%NntlOkwVMZ%>u3ib_PEJqwUn7#rv2G6(7ow&Q z*#8xMQURI_mnbV2xfxuT&BWPfcCi4QzHxRC4&Fh$nt5_-kl2^ye+A*mjNl}VNwKS+ zNsg%uF{j}R29QUB4^7Dhp+2c_y-&JEMjia&fkAoFYKFfrf}>K50f${t8a|H&3p3i~ zRRY@k!W8{gVlSw5**O6`?eC!h#KcVWI&eI2Dj&OUI`Ht z7&DQ`kYc5z1j$Xey6RnYs|o_8eN`HBv3^}KB~!;BSr zyArd&DJKvy^Ajp*QuwpmAWvtj>{PT$25xHx3aep|I(&L;>`(Dk{~e2f)CWDsY0YSD zxn?c-8&(E#XT87k@$kikopG@oR7Myj=(4jZ*yz>SsuIDMPr`CQv&rfY)&~)sa^ReY zqU+$89mul{6kR9)%HPj1!lC`YE8qL1q(>Vf+L8qph&6Y3j8eT1y3z-dQtK8 zoY~Wu%Z_U)w*@xTqd$G%HOvH)iKB<3g&2KMNHGq0LKM$;NDG&PKWv1${xe^yGt%%= z?8dwKInnQ1uJ{?n2m<2>(!nM%fCnh)cYKdN5bZY2-STncLJp{Qy7lAb`*9gia`7gk z;&U7q{IV=UOx@cmw-&w2s>OM-CC8UrS$WHv;pB+XE&}`3hs=HS8)%yP=r2wfxJ`Lgjtvi<1?c7>}PshhP8L%db}2o zSzCj*Q0w>63Ul>tsD9E#OoVIOWl zHJ|Vr(F=L4RWtq~xp^po&QLK+nVeivaX(MQdkTItkLR_xhrv%gmnY&jgRf_3Kp~H> zTAYixM;;$f{xsZ0Jrc&cuL@LQ74)2Y|Me#CJ>vWD_mYhZ<9aAhFYT+n{JqG(2Ysil mtUIWi^=8b{)U5krmVB7i2WD*w+rwY#j1%ZWdW};ullu*UAx4k@ literal 0 HcmV?d00001 diff --git a/config-editor/config-editor-ui/src/gr-palette.scss b/config-editor/config-editor-ui/src/gr-palette.scss new file mode 100644 index 00000000..0b4d8b40 --- /dev/null +++ b/config-editor/config-editor-ui/src/gr-palette.scss @@ -0,0 +1,32 @@ +$mat-gr-blue: ( + 50: #e1f4fc, + 100: #b4e5f6, + 200: #83d3f1, + 300: #51c1eb, + 400: #2bb4e6, + 500: #06a7e2, + 600: #059fdf, + 700: #0496da, + 800: #038cd6, + 900: #027ccf, + A100: #f6fbff, + A200: #c3e4ff, + A400: #90cdff, + A700: #77c1ff, + contrast: ( + 50: $black-87-opacity, + 100: $black-87-opacity, + 200: $black-87-opacity, + 300: $black-87-opacity, + 400: $black-87-opacity, + 500: white, + 600: white, + 700: white, + 800: white, + 900: $white-87-opacity, + A100: $black-87-opacity, + A200: $black-87-opacity, + A400: $black-87-opacity, + A700: white, + ) +); \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/index.html b/config-editor/config-editor-ui/src/index.html new file mode 100644 index 00000000..0901a7b7 --- /dev/null +++ b/config-editor/config-editor-ui/src/index.html @@ -0,0 +1,60 @@ + + + + + + Config Editor + + + + + + + + + + +
+
+ Config Editor +
+
+
+ + + \ No newline at end of file diff --git a/config-editor/config-editor-ui/src/main.ts b/config-editor/config-editor-ui/src/main.ts new file mode 100644 index 00000000..29e4bc3b --- /dev/null +++ b/config-editor/config-editor-ui/src/main.ts @@ -0,0 +1,11 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule).catch(err => console.error(err)); diff --git a/config-editor/config-editor-ui/src/polyfills.ts b/config-editor/config-editor-ui/src/polyfills.ts new file mode 100644 index 00000000..31f112b0 --- /dev/null +++ b/config-editor/config-editor-ui/src/polyfills.ts @@ -0,0 +1,74 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** IE10 and IE11 requires the following to support `@angular/animation`. */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + +/** Evergreen browsers require these. **/ +import 'core-js/es6/reflect'; +import 'core-js/es7/reflect'; + + +/** ALL Firefox browsers require the following to support `@angular/animation`. **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + + +/*************************************************************************************************** + * Zone JS is required by Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ + +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. +/** + * Need to import at least one locale-data with intl. + */ +// import 'intl/locale-data/jsonp/en'; + +import './rxjs.imports.ts'; diff --git a/config-editor/config-editor-ui/src/rxjs.imports.ts b/config-editor/config-editor-ui/src/rxjs.imports.ts new file mode 100644 index 00000000..b870881f --- /dev/null +++ b/config-editor/config-editor-ui/src/rxjs.imports.ts @@ -0,0 +1,12 @@ +import 'rxjs/add/observable/forkJoin'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/observable/throw'; +import 'rxjs/add/observable/timer'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/filter'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/mergeMap'; +import 'rxjs/add/operator/switchMap'; +import 'rxjs/add/operator/withLatestFrom'; + diff --git a/config-editor/config-editor-ui/src/styles.scss b/config-editor/config-editor-ui/src/styles.scss new file mode 100644 index 00000000..b515dde3 --- /dev/null +++ b/config-editor/config-editor-ui/src/styles.scss @@ -0,0 +1,39 @@ +@import '~@angular/material/theming'; +@import '~material-design-icons/iconfont/material-icons.css'; +@import 'gr-palette'; +// Plus imports for other components in your app. + +// Include the base styles for Angular Material core. We include this here so that you only +// have to load a single css file for Angular Material in your app. +@include mat-core(); + +// Define the palettes for your theme using the Material Design palettes available in palette.scss +// (imported above). For each palette, you can optionally specify a default, lighter, and darker +// hue. +$primary: mat-palette($mat-gr-blue); +$accent: mat-palette($mat-orange); + +// The warn palette is optional (defaults to red). +$warn: mat-palette($mat-red, 600); + +// Create the theme object (a Sass map containing all of the palettes). +$theme: mat-dark-theme($primary, $accent, $warn); + +// Include theme styles for core and each component used in your app. +// Alternatively, you can import and @include the theme mixins for each component +// that you are using. +@include angular-material-theme($theme); + + +* { + border: 0; + padding: 0; + margin: 0; + box-sizing: border-box; +} + +body { + margin: 0px; + font-family: Roboto, "Helvetica Neue", sans-serif; + background: #303030; +} diff --git a/config-editor/config-editor-ui/src/testing/index.ts b/config-editor/config-editor-ui/src/testing/index.ts new file mode 100644 index 00000000..60337fcc --- /dev/null +++ b/config-editor/config-editor-ui/src/testing/index.ts @@ -0,0 +1,2 @@ +export { RouterStubModule } from './router-stub'; +export { TestingModule } from './testing.module'; diff --git a/config-editor/config-editor-ui/src/testing/material-stub/index.ts b/config-editor/config-editor-ui/src/testing/material-stub/index.ts new file mode 100644 index 00000000..3ad03f09 --- /dev/null +++ b/config-editor/config-editor-ui/src/testing/material-stub/index.ts @@ -0,0 +1 @@ +export { MaterialStubModule } from './material-stub.module'; diff --git a/config-editor/config-editor-ui/src/testing/material-stub/material-stub.module.ts b/config-editor/config-editor-ui/src/testing/material-stub/material-stub.module.ts new file mode 100644 index 00000000..ef2c7683 --- /dev/null +++ b/config-editor/config-editor-ui/src/testing/material-stub/material-stub.module.ts @@ -0,0 +1,55 @@ +import { NgModule } from '@angular/core'; + +import * as material from './material-stubs'; + +const COMPONENTS = [ + material.MatAutocompleteStubComponent, + material.MatAutocompleteStubDirective, + material.MatButtonToggleGroupStubComponent, + material.MatButtonToggleStubComponent, + material.MatCardContentStubComponent, + material.MatCardStubComponent, + material.MatCardSubtitleStubComponent, + material.MatCardTitleStubComponent, + material.MatCellStubComponent, + material.MatCheckBoxStubComponent, + material.MatChipListStubComponent, + material.MatChipStubComponent, + material.MatDialogActionsStubComponent, + material.MatDialogContentStubComponent, + material.MatDividerStubComponent, + material.MatErrorStubComponent, + material.MatHeaderCellStubComponent, + material.MatHeaderRowStubComponent, + material.MatHintStubComponent, + material.MatIconStubComponent, + material.MatFormFieldStubComponent, + material.MatListStubComponent, + material.MatListItemStubComponent, + material.MatListOptionStubComponent, + material.MatMenuStubComponent, + material.MatMenuTriggerForStubDirective, + material.MatNavListStubComponent, + material.MatOptionStubComponent, + material.MatProgressBarStubComponent, + material.MatRowStubComponent, + material.MatSelectionListStubComponent, + material.MatSelectStubComponent, + material.MatSelectTriggerStubComponent, + material.MatSidenavContainerStubComponent, + material.MatSidenavStubComponent, + material.MatSpinnerStubComponent, + material.MatTabGroupStubComponent, + material.MatTableStubComponent, + material.MatTabStubComponent, + material.MatToolbarStubComponent, + material.MatCardActionsStubComponent, + material.NgxDatatableColumnStubComponent, + material.NgxDatatableStubComponent, +]; + +@NgModule({ + declarations: COMPONENTS, + exports: COMPONENTS, +}) +export class MaterialStubModule { } diff --git a/config-editor/config-editor-ui/src/testing/material-stub/material-stubs.ts b/config-editor/config-editor-ui/src/testing/material-stub/material-stubs.ts new file mode 100644 index 00000000..cb210fe3 --- /dev/null +++ b/config-editor/config-editor-ui/src/testing/material-stub/material-stubs.ts @@ -0,0 +1,240 @@ +import { Component, Directive, EventEmitter, forwardRef, Input, Output } from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-icon', template: '' }) +export class MatIconStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-form-field', template: '' }) +export class MatFormFieldStubComponent { + @Input() color: any; +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-nav-list', template: '' }) +export class MatNavListStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-card', template: '' }) +export class MatCardStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-card-title', template: '' }) +export class MatCardTitleStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-chip', template: '' }) +export class MatChipStubComponent { + @Input() color: any; +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-chip-list', template: '' }) +export class MatChipListStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-progress-bar', template: '' }) +export class MatProgressBarStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-card-content', template: '' }) +export class MatCardContentStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-card-subtitle', template: '' }) +export class MatCardSubtitleStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-spinner', template: '' }) +export class MatSpinnerStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-option', template: '' }) +export class MatOptionStubComponent { + @Input() value: any; +} + +@Component({ + providers: [ + { + multi: true, + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MatSelectStubComponent), + }, + ], + // tslint:disable-next-line:component-selector + selector: 'mat-select', + template: '', +}) +export class MatSelectStubComponent implements ControlValueAccessor { + writeValue(): void { } + registerOnChange(): void { } + registerOnTouched(): void { } +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-select-trigger', template: '' }) +export class MatSelectTriggerStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-sidenav-container', template: '' }) +export class MatSidenavContainerStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-sidenav', template: '' }) +export class MatSidenavStubComponent { + @Input() opened: any; + @Output() onCloseStart = new EventEmitter(); +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-autocomplete', template: '', exportAs: 'matAutocomplete' }) +export class MatAutocompleteStubComponent { + @Input() displayWith: (any) => (any) => any; +} + +// tslint:disable-next-line:directive-selector +@Directive({ selector: 'input[matAutocomplete]' }) +export class MatAutocompleteStubDirective { + @Input() matAutocomplete: any; +} + +// tslint:disable-next-line:directive-selector +@Directive({ selector: 'button[matMenuTriggerFor]' }) +export class MatMenuTriggerForStubDirective { + @Input() matMenuTriggerFor: any; +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-menu', template: '', exportAs: 'matMenu' }) +export class MatMenuStubComponent { + @Input() overlapTrigger: any; +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-divider', template: '' }) +export class MatDividerStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-error', template: '' }) +export class MatErrorStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-list', template: '' }) +export class MatListStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-list-item', template: '' }) +export class MatListItemStubComponent { } + +@Component({ + providers: [ + { + multi: true, + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MatCheckBoxStubComponent), + }, + ], + // tslint:disable-next-line:component-selector + selector: 'mat-checkbox', + template: '', +}) +export class MatCheckBoxStubComponent implements ControlValueAccessor { + @Input() disabled: any; + + writeValue(): void { } + registerOnChange(): void { } + registerOnTouched(): void { } +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-toolbar', template: '' }) +export class MatToolbarStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-dialog-actions', template: '' }) +export class MatDialogActionsStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-dialog-content', template: '' }) +export class MatDialogContentStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-tab', template: '' }) +export class MatTabStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-tab-group', template: '' }) +export class MatTabGroupStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-table', template: '' }) +export class MatTableStubComponent { + @Input() dataSource: any; +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-header-cell', template: '' }) +export class MatHeaderCellStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-cell', template: '' }) +export class MatCellStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-header-row', template: '' }) +export class MatHeaderRowStubComponent { + @Input() cdkHeaderRowDef: any; +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-row', template: '' }) +export class MatRowStubComponent { + @Input() cdkRowDefColumns: any; + @Input() cdkRowDef: any; +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-card-actions', template: '' }) +export class MatCardActionsStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-button-toggle', template: '' }) +export class MatButtonToggleStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-button-toggle-group', template: '', exportAs: 'matButtonToggleGroup' }) +export class MatButtonToggleGroupStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-hint', template: '' }) +export class MatHintStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-list-option', template: '' }) +export class MatListOptionStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'mat-selection-list', template: '' }) +export class MatSelectionListStubComponent { } + +// tslint:disable-next-line:component-selector +@Component({ selector: 'ngx-datatable', template: '' }) +export class NgxDatatableStubComponent { + @Input() rows: any[]; + @Input() columnMode: string; + @Input() headerHeight: number; + @Input() footerHeight: number; + @Input() rowHeight: number; + @Input() scrollbarV: boolean; + @Input() scrollbarH: boolean; + @Input() selectionType: string; +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'ngx-datatable-column', template: '' }) +export class NgxDatatableColumnStubComponent { + @Input() name: string; + @Input() flexGrow: number; +} diff --git a/config-editor/config-editor-ui/src/testing/ngrx-stubs.ts b/config-editor/config-editor-ui/src/testing/ngrx-stubs.ts new file mode 100644 index 00000000..79d3e51c --- /dev/null +++ b/config-editor/config-editor-ui/src/testing/ngrx-stubs.ts @@ -0,0 +1,40 @@ +import { Action } from '@ngrx/store'; +import { State } from 'app/store'; +import * as classifications from 'app/store/editor.reducer'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { Observable } from 'rxjs/Observable'; +import { map } from 'rxjs/operator/map'; + +export class MockStore extends BehaviorSubject { + + private expectFunc: (action: Action) => void; + + constructor(initialState2: T) { + super(initialState2); + } + + dispatch = (action: Action): void => { + if (this.expectFunc) { + this.expectFunc(action); + } + } + + select = (pathOrMapFn: any): Observable => map.call(this, pathOrMapFn); + + get state(): T { + return this.getValue(); + } + + updateState(state: T): void { + this.next(state); + } + + setExpect(func: (action: Action) => void): void { + this.expectFunc = func; + } +} + +export const initialState: State = { + editor: classifications.initialState, + routerReducer: undefined, +}; diff --git a/config-editor/config-editor-ui/src/testing/router-stub/index.ts b/config-editor/config-editor-ui/src/testing/router-stub/index.ts new file mode 100644 index 00000000..7a6eef01 --- /dev/null +++ b/config-editor/config-editor-ui/src/testing/router-stub/index.ts @@ -0,0 +1 @@ +export { RouterStubModule } from './router-stub.module'; diff --git a/config-editor/config-editor-ui/src/testing/router-stub/router-stub.module.ts b/config-editor/config-editor-ui/src/testing/router-stub/router-stub.module.ts new file mode 100644 index 00000000..6e7d6d10 --- /dev/null +++ b/config-editor/config-editor-ui/src/testing/router-stub/router-stub.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; + +import * as router from './router-stubs'; + +const COMPONENTS = [ + router.RouterLinkActiveStubDirective, + router.RouterLinkStubDirective, + router.RouterOutletStubComponent, +]; + +@NgModule({ + declarations: COMPONENTS, + exports: COMPONENTS, +}) +export class RouterStubModule { } diff --git a/config-editor/config-editor-ui/src/testing/router-stub/router-stubs.ts b/config-editor/config-editor-ui/src/testing/router-stub/router-stubs.ts new file mode 100644 index 00000000..380edc57 --- /dev/null +++ b/config-editor/config-editor-ui/src/testing/router-stub/router-stubs.ts @@ -0,0 +1,20 @@ +import { Component, Directive, Input } from '@angular/core'; + +// tslint:disable-next-line:directive-selector +@Directive({ selector: '[routerLinkActive]' }) +export class RouterLinkActiveStubDirective { + @Input() routerLinkActive: any; + @Input() routerLinkActiveOptions: any; +} + +@Directive({ + // tslint:disable-next-line:directive-selector + selector: '[routerLink]', +}) +export class RouterLinkStubDirective { + @Input() routerLink: any; +} + +// tslint:disable-next-line:component-selector +@Component({ selector: 'router-outlet', template: '' }) +export class RouterOutletStubComponent { } diff --git a/config-editor/config-editor-ui/src/testing/testing.module.ts b/config-editor/config-editor-ui/src/testing/testing.module.ts new file mode 100644 index 00000000..c865023b --- /dev/null +++ b/config-editor/config-editor-ui/src/testing/testing.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; + +import { MaterialStubModule } from './material-stub'; + +@NgModule({ + exports: [ + NoopAnimationsModule, + FormsModule, + ReactiveFormsModule, + MaterialStubModule, + ], +}) +export class TestingModule { } diff --git a/config-editor/config-editor-ui/src/tsconfig.app.json b/config-editor/config-editor-ui/src/tsconfig.app.json new file mode 100644 index 00000000..684c2e48 --- /dev/null +++ b/config-editor/config-editor-ui/src/tsconfig.app.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "es2015", + "baseUrl": "", + "types": ["node"] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/config-editor/config-editor-ui/src/typings.d.ts b/config-editor/config-editor-ui/src/typings.d.ts new file mode 100644 index 00000000..ef5c7bd6 --- /dev/null +++ b/config-editor/config-editor-ui/src/typings.d.ts @@ -0,0 +1,5 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +} diff --git a/config-editor/config-editor-ui/tsconfig.json b/config-editor/config-editor-ui/tsconfig.json new file mode 100644 index 00000000..b0ccf8cd --- /dev/null +++ b/config-editor/config-editor-ui/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "baseUrl": "src", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "noUnusedLocals": false, + // Currently fails AOT builds when true. Can be updated periodically and run locally to remove unnecessary code. + "noUnusedParameters": false, + "esModuleInterop": true, + "target": "es2015", + "resolveJsonModule": true, + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ], + "paths": { + "@app/*": ["app/*"], + "@env/*": ["environments/*"] + } + } +} diff --git a/config-editor/config-editor-ui/tslint.json b/config-editor/config-editor-ui/tslint.json new file mode 100644 index 00000000..890eb053 --- /dev/null +++ b/config-editor/config-editor-ui/tslint.json @@ -0,0 +1,156 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "align": true, + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "import-blacklist": [ + true + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + "static-before-instance", + "variables-before-functions" + ], + "newline-before-return": true, + "new-parens": true, + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-key-quotes": [ + true, + "consistent-as-needed" + ], + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "ordered-imports": [ + true, + { + "import-sources-order": "case-insensitive", + "named-imports-order": "case-insensitive" + } + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + "always" + ], + "trailing-comma": [ + true, + { + "multiline": { + "objects": "always", + "arrays": "always", + "functions": "never", + "typeLiterals": "ignore" + }, + "singleline": "never" + } + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "typeof-compare": true, + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "directive-selector": [ + true, + "attribute", + "re", + "camelCase" + ], + "component-selector": [ + true, + "element", + "re", + "kebab-case" + ], + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "no-access-missing-member": true, + "templates-use-public": true, + "invoke-injectable": true + } +} \ No newline at end of file