diff --git a/ui/.angular-cli.json b/ui/.angular-cli.json deleted file mode 100644 index fdc1df3f..00000000 --- a/ui/.angular-cli.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "project": { - "name": "beetle-studio" - }, - "apps": [ - { - "root": "src", - "outDir": "dist", - "assets": [ - "assets", - "favicon.ico" - ], - "index": "index.html", - "main": "main.ts", - "polyfills": "polyfills.ts", - "test": "test.ts", - "tsconfig": "tsconfig.app.json", - "testTsconfig": "tsconfig.spec.json", - "prefix": "app", - "styles": [ - "styles.css" - ], - "scripts": [], - "environmentSource": "environments/environment.ts", - "environments": { - "dev": "environments/environment.ts", - "prod": "environments/environment.prod.ts" - } - } - ], - "e2e": { - "protractor": { - "config": "./protractor.conf.js" - } - }, - "lint": [ - { - "project": "src/tsconfig.app.json", - "exclude": "**/node_modules/**" - }, - { - "project": "src/tsconfig.spec.json", - "exclude": "**/node_modules/**" - }, - { - "project": "e2e/tsconfig.e2e.json", - "exclude": "**/node_modules/**" - } - ], - "test": { - "karma": { - "config": "./karma.conf.js" - } - }, - "defaults": { - "styleExt": "css", - "component": {} - } -} diff --git a/ui/.gitignore b/ui/.gitignore new file mode 100644 index 00000000..ee5c9d83 --- /dev/null +++ b/ui/.gitignore @@ -0,0 +1,39 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.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 +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/ui/README.md b/ui/README.md index d68ff074..504a5a9f 100644 --- a/ui/README.md +++ b/ui/README.md @@ -1,14 +1,10 @@ -# BeetleStudio +# Ui -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.3.2. - -## Running with [Nodejs](https://nodejs.org) - -Execute `npm start` to serve the Angular app using nodejs. Navigate to `http://localhost:8080`. This command is meant for production and the files in the `dist` directory will have to be recompiled for code changes to be displayed. +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.2.7. ## Development server -Execute `npm start -- -d` for a development server. Navigate to `http://localhost:8080/`. The app will automatically reload if you change any of the source files. +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 @@ -16,7 +12,7 @@ Run `ng generate component component-name` to generate a new component. You can ## 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. +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 @@ -25,7 +21,6 @@ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github. ## 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 diff --git a/ui/angular.json b/ui/angular.json new file mode 100644 index 00000000..3c585d2b --- /dev/null +++ b/ui/angular.json @@ -0,0 +1,162 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ui": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "app", + "schematics": {}, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/ui", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "ui:build" + }, + "configurations": { + "production": { + "browserTarget": "ui:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ui:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": [ + "src/styles.css" + ], + "scripts": [], + "assets": [ + "src/favicon.ico", + "src/assets" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "ui-e2e": { + "root": "e2e/", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "ui:serve" + }, + "configurations": { + "production": { + "devServerTarget": "ui:serve:production" + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "beetle-lib": { + "root": "projects/beetle-lib", + "sourceRoot": "projects/beetle-lib/src", + "projectType": "library", + "prefix": "btl", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/beetle-lib/tsconfig.lib.json", + "project": "projects/beetle-lib/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/beetle-lib/src/test.ts", + "tsConfig": "projects/beetle-lib/tsconfig.spec.json", + "karmaConfig": "projects/beetle-lib/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/beetle-lib/tsconfig.lib.json", + "projects/beetle-lib/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "ui" +} \ No newline at end of file diff --git a/ui/e2e/app.e2e-spec.ts b/ui/e2e/app.e2e-spec.ts deleted file mode 100644 index 00a295e2..00000000 --- a/ui/e2e/app.e2e-spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { AppPage } from "./app.po"; - -describe("beetle-studio App", () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it("should display welcome message", () => { - page.navigateTo(); - expect(page.getParagraphText()).toEqual("Welcome to app!").then(() => { - // nothing to do - }); - }); -}); diff --git a/ui/e2e/app.po.ts b/ui/e2e/app.po.ts deleted file mode 100644 index b7e87d8a..00000000 --- a/ui/e2e/app.po.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { browser, by, element } from "protractor"; -import { promise } from "selenium-webdriver"; - -export class AppPage { - public navigateTo(): promise.Promise< any > { - return browser.get("/"); - } - - public getParagraphText(): promise.Promise { - return element(by.css("app-root h1")).getText(); - } -} diff --git a/ui/protractor.conf.js b/ui/e2e/protractor.conf.js similarity index 86% rename from ui/protractor.conf.js rename to ui/e2e/protractor.conf.js index 7ee3b5ee..86776a39 100644 --- a/ui/protractor.conf.js +++ b/ui/e2e/protractor.conf.js @@ -6,7 +6,7 @@ const { SpecReporter } = require('jasmine-spec-reporter'); exports.config = { allScriptsTimeout: 11000, specs: [ - './e2e/**/*.e2e-spec.ts' + './src/**/*.e2e-spec.ts' ], capabilities: { 'browserName': 'chrome' @@ -21,8 +21,8 @@ exports.config = { }, onPrepare() { require('ts-node').register({ - project: 'e2e/tsconfig.e2e.json' + project: require('path').join(__dirname, './tsconfig.e2e.json') }); jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); } -}; +}; \ No newline at end of file diff --git a/ui/e2e/src/app.e2e-spec.ts b/ui/e2e/src/app.e2e-spec.ts new file mode 100644 index 00000000..007dfa6a --- /dev/null +++ b/ui/e2e/src/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { AppPage } from './app.po'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('Welcome to ui!'); + }); +}); diff --git a/ui/e2e/src/app.po.ts b/ui/e2e/src/app.po.ts new file mode 100644 index 00000000..82ea75ba --- /dev/null +++ b/ui/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/ui/e2e/tsconfig.e2e.json b/ui/e2e/tsconfig.e2e.json index 1d9e5edf..a6dd6220 100644 --- a/ui/e2e/tsconfig.e2e.json +++ b/ui/e2e/tsconfig.e2e.json @@ -1,8 +1,7 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "outDir": "../out-tsc/e2e", - "baseUrl": "./", + "outDir": "../out-tsc/app", "module": "commonjs", "target": "es5", "types": [ @@ -11,4 +10,4 @@ "node" ] } -} +} \ No newline at end of file diff --git a/ui/karma.conf.js b/ui/karma.conf.js deleted file mode 100644 index bdca91d4..00000000 --- a/ui/karma.conf.js +++ /dev/null @@ -1,26 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular/cli'], - plugins: [ - require('karma-jasmine'), - require('karma-phantomjs-launcher' ), - require('karma-junit-reporter'), - require('@angular/cli/plugins/karma') - ], - junitReporter : { - // .../beetle-studio/target/karma-reports/*.xml - outputDir : '../../target/karma-reports/' - }, - angularCli: { - environment: 'dev' - }, - reporters: ['junit', 'progress'], - autoWatch: false, - browsers: [ 'PhantomJS' ], - singleRun: true - }); -}; diff --git a/ui/locale/README.md b/ui/locale/README.md deleted file mode 100644 index 95265770..00000000 --- a/ui/locale/README.md +++ /dev/null @@ -1 +0,0 @@ -* messages.{languageCode}.xlf files go here diff --git a/ui/locale/messages.es.xlf b/ui/locale/messages.es.xlf deleted file mode 100644 index 9cd0babd..00000000 --- a/ui/locale/messages.es.xlf +++ /dev/null @@ -1,462 +0,0 @@ - - - - - - Confirm Delete - Confirmar Eliminación - - src/app/shared/confirm-delete/confirm-delete.component.ts - 9 - - - - Cancel - Cancelar - - src/app/shared/confirm-delete/confirm-delete.component.ts - 15 - - - - Delete - Borrar - - src/app/shared/confirm-delete/confirm-delete.component.ts - 16 - - - - Connection Properties - Propiedades de conexión - - src/app/connections/shared/add-connection-form/add-connection-form.component.ts - 2 - - Properties for a connection - Connection Properties - - - Name - Nombre - - src/app/connections/shared/add-connection-form/add-connection-form.component.ts - 6 - - - - JNDI Name - Nombre JNDI - - src/app/connections/shared/add-connection-form/add-connection-form.component.ts - 12 - - - - Driver - Conductor - - src/app/connections/shared/add-connection-form/add-connection-form.component.ts - 18 - - - - JDBC - JDBC - - src/app/connections/shared/add-connection-form/add-connection-form.component.ts - 24 - - - - Create Connection - Crear Conexión - - src/app/connections/shared/add-connection-form/add-connection-form.component.ts - 34 - - - - Creating - Crear - - src/app/connections/shared/add-connection-form/add-connection-form.component.ts - 36 - - - - Cancel - Cancelar - - src/app/connections/shared/add-connection-form/add-connection-form.component.ts - 38 - - - - JNDI: - JNDI: - - src/app/connections/connections-cards/connections-cards.component.ts - 15 - - - - Driver: - Conductor: - - src/app/connections/connections-cards/connections-cards.component.ts - 18 - - - - JNDI: - JNDI: - - src/app/connections/connections-list/connections-list.component.ts - 18 - - - - Driver: - Conductor: - - src/app/connections/connections-list/connections-list.component.ts - 21 - - - - Ping - Silbido - - src/app/connections/connections-list/connections-list.component.ts - 34 - - - - Edit - Editar - - src/app/connections/connections-list/connections-list.component.ts - 35 - - - - Delete - Borrar - - src/app/connections/connections-list/connections-list.component.ts - 36 - - - - Connections - Conexiones - - src/app/connections/connections.component.ts - 13 - - - - Name - Nombre - - src/app/connections/connections.component.ts - 19 - - - - Add Connection - Agregar Conexión - - src/app/connections/connections.component.ts - 31 - - - src/app/connections/connections.component.ts - 63 - - - - Connections found - (out of total) - Connections found - (fuera de total) - - src/app/connections/connections.component.ts - 42 - - - - No Connections Found - Sin Conexiones Encontradas - - src/app/connections/connections.component.ts - 57 - - - - - No Connections were found - please click below to create a new Connection! - - No se encontraron conexiones: ¡haga clic a continuación para crear una nueva conexión! - - src/app/connections/connections.component.ts - 58 - - - - No Connections matched the filter!  Please try changing your filter criteria... - Sin conexiones coincidió con el filtro! Intente cambiar sus criterios de filtro ... - - src/app/connections/connections.component.ts - 71 - - - - Do you really want to delete the selected Connection? - ¿Realmente quieres eliminar la conexión seleccionada? - - src/app/connections/connections.component.ts - 106 - - - - Edit Connection - Editar Conexión - - src/app/connections/edit-connection/edit-connection.component.ts - 10 - - - - Beetle Studio - BeetlE Studio - - src/app/core/nav-header/nav-header.component.ts - 4 - - - src/app/core/nav-header/nav-header.component.ts - 32 - - - - About - Acerca de - - src/app/core/nav-header/nav-header.component.ts - 16 - - - - Logout - Cerrar Sesión - - src/app/core/nav-header/nav-header.component.ts - 18 - - - - Version - versión - - src/app/core/nav-header/nav-header.component.ts - 36 - - - - Built On - Construida Sobre - - src/app/core/nav-header/nav-header.component.ts - 40 - - - - Project URL - URL del proyecto - - src/app/core/nav-header/nav-header.component.ts - 44 - - - - - © 2016 Red Hat, Inc (JBoss Middleware) - - © 2016 Red Hat, Inc (JBoss Middleware) - - src/app/core/nav-header/nav-header.component.ts - 50 - - - - Connections - Conexiones - - src/app/core/vertical-nav/vertical-nav.component.ts - 12 - - - - Server Error Encountered - Error del servidor encontrado - - src/app/shared/page-error/page-error.component.ts - 11 - - - - - Error was encountered communicating with the server. Please reload the page. - - Se ha encontrado un error al comunicarse con el servidor. Por favor recarga la página. - - src/app/shared/page-error/page-error.component.ts - 15 - - - - Reload Page - Recargar Página - - src/app/shared/page-error/page-error.component.ts - 19 - - - src/app/shared/page-error/page-error.component.ts - 66 - - - src/app/shared/page-error/page-error.component.ts - 85 - - - src/app/shared/page-error/page-error.component.ts - 108 - - - - Server Error Details - Detalles de error del servidor - - src/app/shared/page-error/page-error.component.ts - 23 - - - - Toggle Details - Toggle Details - - src/app/shared/page-error/page-error.component.ts - 28 - - - - Page Not Found - Página No Encontrada - - src/app/shared/page-error/page-error.component.ts - 37 - - - src/app/shared/page-not-found/page-not-found.component.ts - 1 - - - - - You attempted to navigate to a page that does not exist! Please hit the back button - or go back to home (button below). - - ¡Intentaste navegar a una página que no existe! Por favor, presiona el botón Atrás o regrese a su hogar (botón a continuación).. - - src/app/shared/page-error/page-error.component.ts - 41 - - - - Back to Home - De Vuelta a Casa - - src/app/shared/page-error/page-error.component.ts - 46 - - - - Data Already Exists - Los Datos Ya Existen - - src/app/shared/page-error/page-error.component.ts - 56 - - - - - It appears you attempted to add or create something that already exists. Instead of adding it again, - try finding the existing resource and editing. - - Parece que intentaste agregar o crear algo que ya existe. En lugar de agregarlo nuevamente, - intenta encontrar el recurso y la edición existentes. - - src/app/shared/page-error/page-error.component.ts - 60 - - - - Connection Error - Error de Conexión - - src/app/shared/page-error/page-error.component.ts - 76 - - - - (Could Not Reach Server) - (No se pudo alcanzar el servidor) - - src/app/shared/page-error/page-error.component.ts - 77 - - - - - We couldn't reach the server. Try reloading the page in a few minutes or check your internet connection. - - No pudimos llegar al servidor. Intente volver a cargar la página en unos pocos minutos o consulte su conexión a Internet. - - src/app/shared/page-error/page-error.component.ts - 81 - - - - Unexpected Error on Page - Error Inesperado en la Página - - src/app/shared/page-error/page-error.component.ts - 95 - - - - - Something unexpected happened. Please try reloading the page, or you could just go back to Home. - See the buttons below... - - Algo inesperado sucedió. Intente volver a cargar la página o simplemente vuelva a Inicio. - Mira los botones a continuación ... - - src/app/shared/page-error/page-error.component.ts - 102 - - - - Back to Dashboard - Volver al Tablero - - src/app/shared/page-error/page-error.component.ts - 107 - - - - - diff --git a/ui/messages.xlf b/ui/messages.xlf deleted file mode 100644 index 64852e90..00000000 --- a/ui/messages.xlf +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - Confirm Delete - - src/app/shared/confirm-delete/confirm-delete.component.ts - 9 - - - - Cancel - - src/app/shared/confirm-delete/confirm-delete.component.ts - 15 - - - - Delete - - src/app/shared/confirm-delete/confirm-delete.component.ts - 16 - - - - JNDI: - - src/app/connections/connections-cards/connections-cards.component.ts - 15 - - - - Driver: - - src/app/connections/connections-cards/connections-cards.component.ts - 18 - - - - JNDI: - - src/app/connections/connections-list/connections-list.component.ts - 18 - - - - Driver: - - src/app/connections/connections-list/connections-list.component.ts - 21 - - - - Ping - - src/app/connections/connections-list/connections-list.component.ts - 34 - - - - Edit - - src/app/connections/connections-list/connections-list.component.ts - 35 - - - - Delete - - src/app/connections/connections-list/connections-list.component.ts - 36 - - - - Connections - - src/app/connections/connections.component.ts - 13 - - - - Name - - src/app/connections/connections.component.ts - 19 - - - - Add Connection - - src/app/connections/connections.component.ts - 31 - - - src/app/connections/connections.component.ts - 63 - - - - Connections found - (out of total) - - src/app/connections/connections.component.ts - 42 - - - - No Connections Found - - src/app/connections/connections.component.ts - 57 - - - - - No Connections were found - please click below to create a new Connection! - - - src/app/connections/connections.component.ts - 58 - - - - No Connections matched the filter!  Please try changing your filter criteria... - - src/app/connections/connections.component.ts - 71 - - - - Do you really want to delete the selected Connection? - - src/app/connections/connections.component.ts - 106 - - - - Beetle Studio - - src/app/core/nav-header/nav-header.component.ts - 4 - - - src/app/core/nav-header/nav-header.component.ts - 32 - - - - About - - src/app/core/nav-header/nav-header.component.ts - 16 - - - - Logout - - src/app/core/nav-header/nav-header.component.ts - 18 - - - - Version - - src/app/core/nav-header/nav-header.component.ts - 36 - - - - Built On - - src/app/core/nav-header/nav-header.component.ts - 40 - - - - Project URL - - src/app/core/nav-header/nav-header.component.ts - 44 - - - - - © 2016 Red Hat, Inc (JBoss Middleware) - - - src/app/core/nav-header/nav-header.component.ts - 50 - - - - Connections - - src/app/core/vertical-nav/vertical-nav.component.ts - 12 - - - - Server Error Encountered - - src/app/shared/page-error/page-error.component.ts - 11 - - - - - Error was encountered communicating with the server. Please reload the page. - - - src/app/shared/page-error/page-error.component.ts - 15 - - - - Reload Page - - src/app/shared/page-error/page-error.component.ts - 19 - - - src/app/shared/page-error/page-error.component.ts - 66 - - - src/app/shared/page-error/page-error.component.ts - 85 - - - src/app/shared/page-error/page-error.component.ts - 108 - - - - Server Error Details - - src/app/shared/page-error/page-error.component.ts - 23 - - - - Toggle Details - - src/app/shared/page-error/page-error.component.ts - 28 - - - - Page Not Found - - src/app/shared/page-error/page-error.component.ts - 37 - - - src/app/shared/page-not-found/page-not-found.component.ts - 1 - - - - - You attempted to navigate to a page that does not exist! Please hit the back button - or go back to home (button below). - - - src/app/shared/page-error/page-error.component.ts - 41 - - - - Back to Home - - src/app/shared/page-error/page-error.component.ts - 46 - - - - Data Already Exists - - src/app/shared/page-error/page-error.component.ts - 56 - - - - - It appears you attempted to add or create something that already exists. Instead of adding it again, - try finding the existing resource and editing. - - - src/app/shared/page-error/page-error.component.ts - 60 - - - - Connection Error - - src/app/shared/page-error/page-error.component.ts - 76 - - - - (Could Not Reach Server) - - src/app/shared/page-error/page-error.component.ts - 77 - - - - - We couldn't reach the server. Try reloading the page in a few minutes or check your internet connection. - - - src/app/shared/page-error/page-error.component.ts - 81 - - - - Unexpected Error on Page - - src/app/shared/page-error/page-error.component.ts - 95 - - - - - Something unexpected happened. Please try reloading the page, or you could just go back to Home. - See the buttons below... - - - src/app/shared/page-error/page-error.component.ts - 102 - - - - Back to Dashboard - - src/app/shared/page-error/page-error.component.ts - 107 - - - - - diff --git a/ui/package-lock.json b/ui/package-lock.json index ee3a5b06..c53b47eb 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,556 +1,964 @@ { - "name": "beetle-studio", + "name": "ui", "version": "0.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@angular-devkit/architect": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.8.7.tgz", + "integrity": "sha512-gYCZXBLR4RqfGiMHTvryaI3loOPtdeyDRh4/szgLjWuIbyihFCTlrxWvQJdr+seClP9XibLYTfD77vadXO+Rnw==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.8.7", + "rxjs": "~6.2.0" + } + }, + "@angular-devkit/build-angular": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.8.7.tgz", + "integrity": "sha512-k8MIdglzZdbgJGlJeyUOWBNJJ/a5PUcmaXnKQb9N6qd2//l7fooKrZRkZhcml7ZPlrs8BEjGjql5EKvyLGV75A==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.8.7", + "@angular-devkit/build-optimizer": "0.8.7", + "@angular-devkit/build-webpack": "0.8.7", + "@angular-devkit/core": "0.8.7", + "@ngtools/webpack": "6.2.7", + "ajv": "~6.4.0", + "autoprefixer": "^8.4.1", + "circular-dependency-plugin": "^5.0.2", + "clean-css": "^4.1.11", + "copy-webpack-plugin": "4.5.2", + "file-loader": "^1.1.11", + "glob": "^7.0.3", + "html-webpack-plugin": "^3.0.6", + "istanbul": "^0.4.5", + "istanbul-instrumenter-loader": "^3.0.1", + "karma-source-map-support": "^1.2.0", + "less": "^3.7.1", + "less-loader": "^4.1.0", + "license-webpack-plugin": "^1.3.1", + "loader-utils": "^1.1.0", + "mini-css-extract-plugin": "~0.4.0", + "minimatch": "^3.0.4", + "node-sass": "^4.9.3", + "opn": "^5.1.0", + "parse5": "^4.0.0", + "portfinder": "^1.0.13", + "postcss": "^6.0.22", + "postcss-import": "^11.1.0", + "postcss-loader": "^2.1.5", + "postcss-url": "^7.3.2", + "raw-loader": "^0.5.1", + "rxjs": "~6.2.0", + "sass-loader": "^7.1.0", + "semver": "^5.5.0", + "source-map-loader": "^0.2.3", + "source-map-support": "^0.5.0", + "stats-webpack-plugin": "^0.6.2", + "style-loader": "^0.21.0", + "stylus": "^0.54.5", + "stylus-loader": "^3.0.2", + "tree-kill": "^1.2.0", + "uglifyjs-webpack-plugin": "^1.2.5", + "url-loader": "^1.0.1", + "webpack": "4.16.4", + "webpack-dev-middleware": "^3.1.3", + "webpack-dev-server": "^3.1.4", + "webpack-merge": "^4.1.2", + "webpack-sources": "^1.1.0", + "webpack-subresource-integrity": "^1.1.0-rc.4" + } + }, + "@angular-devkit/build-ng-packagr": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.8.7.tgz", + "integrity": "sha512-TefIivw+6EMxB3hT6S9YPomQKngV7KMXsi1Jyh+glrO6BMk+TWoL36hxr1UNNG9Wgzl3Pey5IqmjVg2EHihALQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.8.7", + "@angular-devkit/core": "0.8.7", + "rxjs": "~6.2.0", + "semver": "^5.3.0" + } + }, "@angular-devkit/build-optimizer": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.13.tgz", - "integrity": "sha512-yEMkYU4YU8XlA5OauPhg22ZEWJ4X2VhiFKUwfeo4UWJ7lz4XWiuBJocrT5NHWqI1S0rOLpSixLXG9byvFMbavA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.8.7.tgz", + "integrity": "sha512-mItzwOnYukisGknLFfZjXtni6yYPUQQbWV15RIRBpl8Hg05aOWsIBbUvaBWVfU/1G9vN6lodVdUwTQce3VqqGA==", + "dev": true, "requires": { "loader-utils": "^1.1.0", "source-map": "^0.5.6", - "typescript": "^2.3.3" + "typescript": "~2.9.2", + "webpack-sources": "^1.1.0" + } + }, + "@angular-devkit/build-webpack": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.8.7.tgz", + "integrity": "sha512-KVJ+BLD3bKJIpDRvmQK3D0QOHCWOTzBZTixo+pFI5H+970GVSd32GMDAuxngg6kc9ubVCxvyLFa5MTlbayK+8A==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.8.7", + "@angular-devkit/core": "0.8.7", + "rxjs": "~6.2.0" + } + }, + "@angular-devkit/core": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.7.tgz", + "integrity": "sha512-r9w+ppbUdBQlZLfLsU+lqg3VPxKoSbF9Aic0K6hC53VxI/lN5GpRkdIcDWfAYGlsj9GGgk/JAX6Q22LskSfGYg==", + "dev": true, + "requires": { + "ajv": "~6.4.0", + "chokidar": "^2.0.3", + "rxjs": "~6.2.0", + "source-map": "^0.5.6" + } + }, + "@angular-devkit/schematics": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.8.7.tgz", + "integrity": "sha512-Xu49OH0tpfqKLMdLy0ghbMwsYVHLlnjsKm8JQKkDah9oYMnj94ZoqESi1xVorYVHHJ1Jbi9Xm3ZY3QGF+x0j7g==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.8.7", + "rxjs": "~6.2.0" } }, "@angular/animations": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-4.4.6.tgz", - "integrity": "sha1-+mYYmaik44y3xYPHpcl85l1ZKjU=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-6.1.10.tgz", + "integrity": "sha512-dd/lq7kw3uwfHPICan8psu2nthuUpp7PvMLuNIm0XxObZ4oNs0ls6uxKEDPnEkRKoGdiJpvmsyzZZN9ACMPEAA==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/cli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.3.2.tgz", - "integrity": "sha512-VAZXI19PbhhUE/dJH5r6HT7502y0OXYzxhbGIagh/e7SNKnVV8KglVL4zfTfnsI8kmLrFFbAmPy7xomKO8Btkg==", + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-6.2.7.tgz", + "integrity": "sha512-wybRnA7jxeZv4BWFWdiAGZxYq2mobDKiz31K49dvfOTlJ5rylDsGjkn9vQplC1Q0rrY+tkNGF8w0A1E4zNiNPA==", + "dev": true, "requires": { - "@angular-devkit/build-optimizer": "0.0.13", - "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.6.2", - "autoprefixer": "^6.5.3", - "chalk": "^2.0.1", - "circular-dependency-plugin": "^3.0.0", - "common-tags": "^1.3.1", - "core-object": "^3.1.0", - "css-loader": "^0.28.1", - "cssnano": "^3.10.0", - "denodeify": "^1.2.1", - "diff": "^3.1.0", - "ember-cli-normalize-entity-name": "^1.0.0", - "ember-cli-string-utils": "^1.0.0", - "exports-loader": "^0.6.3", - "extract-text-webpack-plugin": "3.0.0", - "file-loader": "^0.10.0", - "fs-extra": "^4.0.0", - "get-caller-file": "^1.0.0", - "glob": "^7.0.3", - "heimdalljs": "^0.2.4", - "heimdalljs-logger": "^0.1.9", - "html-webpack-plugin": "^2.29.0", - "inflection": "^1.7.0", - "inquirer": "^3.0.0", - "isbinaryfile": "^3.0.0", - "istanbul-instrumenter-loader": "^2.0.0", - "karma-source-map-support": "^1.2.0", - "less": "^2.7.2", - "less-loader": "^4.0.5", - "license-webpack-plugin": "^0.5.1", - "lodash": "^4.11.1", - "memory-fs": "^0.4.1", - "minimatch": "^3.0.3", - "node-modules-path": "^1.0.0", - "node-sass": "^4.3.0", - "nopt": "^4.0.1", - "opn": "~5.1.0", - "portfinder": "~1.0.12", - "postcss-loader": "^1.3.3", - "postcss-url": "^5.1.2", - "raw-loader": "^0.5.1", - "resolve": "^1.1.7", - "rsvp": "^3.0.17", - "rxjs": "^5.4.2", - "sass-loader": "^6.0.3", - "script-loader": "^0.7.0", + "@angular-devkit/architect": "0.8.7", + "@angular-devkit/core": "0.8.7", + "@angular-devkit/schematics": "0.8.7", + "@schematics/angular": "0.8.7", + "@schematics/update": "0.8.7", + "json-schema-traverse": "^0.4.1", + "opn": "^5.3.0", + "rxjs": "~6.2.0", "semver": "^5.1.0", - "silent-error": "^1.0.0", - "source-map-loader": "^0.2.0", - "source-map-support": "^0.4.1", - "style-loader": "^0.13.1", - "stylus": "^0.54.5", - "stylus-loader": "^3.0.1", - "temp": "0.8.3", - "typescript": ">=2.0.0 <2.5.0", - "url-loader": "^0.5.7", - "walk-sync": "^0.3.1", - "webpack": "~3.4.1", - "webpack-dev-middleware": "^1.11.0", - "webpack-dev-server": "~2.5.1", - "webpack-merge": "^4.1.0", - "zone.js": "^0.8.14" + "symbol-observable": "^1.2.0", + "yargs-parser": "^10.0.0" }, "dependencies": { - "typescript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", - "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=" + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } } } }, "@angular/common": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-4.4.6.tgz", - "integrity": "sha1-S4FCByTggooOg5uVpV6xp+g5GPI=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.1.10.tgz", + "integrity": "sha512-73xxTSYJNKfiJ7C1Ajg+sz5l8y+blb/vNgHYg7O3yem5zLBnfPpidJ1UGg4W4d2Y+jwUVJbZKh8SKJarqAJVUQ==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/compiler": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-4.4.6.tgz", - "integrity": "sha1-LuH68lt1fh0SiXkHS+f65SmzvCA=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-6.1.10.tgz", + "integrity": "sha512-FPIb2j3zfoBwb6vo/u0gQeu70h8InGlSisBr3xMACs/35/pwB6kbQR+JQiUr0D7k6QApg7AuMkvq8aFNelg0aw==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/compiler-cli": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-4.4.6.tgz", - "integrity": "sha1-uv09HiYOmQh+uajPdTLb1gOrubE=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-6.1.10.tgz", + "integrity": "sha512-GCWdyeNQSnF4RfzO4A0+WHsNEgxKpl5arg4ldLSWMNkj/DrhMD4TnmxhR+IVY+7ieMkUBwpcuWRnjdOdnbmV+w==", + "dev": true, "requires": { - "@angular/tsc-wrapped": "4.4.6", + "chokidar": "^1.4.2", "minimist": "^1.2.0", - "reflect-metadata": "^0.1.2" + "reflect-metadata": "^0.1.2", + "tsickle": "^0.32.1" }, "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, "@angular/core": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-4.4.6.tgz", - "integrity": "sha1-EwMf0Q3P5DiHVBmzjyESCVi8I1Q=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.1.10.tgz", + "integrity": "sha512-61l3rIQTVdT45eOf6/fBJIeVmV10mcrxqS4N/1OWkuDT29YSJTZSxGcv8QjAyyutuhcqWWpO6gVRkN07rWmkPg==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/forms": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-4.4.6.tgz", - "integrity": "sha1-/mSs5CQ1wbgPSQNLfEHOjK8UpEo=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-6.1.10.tgz", + "integrity": "sha512-zAPx2kMV1/FbP5DrY472Sd/ze1m+GS6T5ullZCtP392r62p2RkwzDCXieR51YiRJjZj3M6c3AcRND7PWBdXT7A==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/http": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-4.4.6.tgz", - "integrity": "sha1-CvaAxnEL3AJtlA4iXP0PalwAXQw=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-6.1.10.tgz", + "integrity": "sha512-LDsSqyexh8fj23y+G2oSGLWSZVhbxBBo2ehYHnRgH/jlp0pmZVLRaGgUMNSCVtZc1rxLzpEjZjtw+P+qlutAtw==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/language-service": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-4.4.6.tgz", - "integrity": "sha1-SY7OlcX2BmQDv5/TxYMa9CtFYYs=" + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-6.1.10.tgz", + "integrity": "sha512-nN29Ovomg21eL8acwOSUFAYwWFI1TuFwUgUu37ZssfVQrYdaV+BFx3yv3P0nKU90h3Hp+oIkWHd8U34UYrvBCg==", + "dev": true }, "@angular/platform-browser": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-4.4.6.tgz", - "integrity": "sha1-qYOcVH4bZU+h0kqJeAyLpquNzOA=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.1.10.tgz", + "integrity": "sha512-CB7pqMwtgb7KjdHDAJlsXcs0rrU+2xQVaoOaqEfJtUrKhtGMLaZh8Qoic5l92SoGattkOw7SYarAOsWlAsVfvw==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/platform-browser-dynamic": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.4.6.tgz", - "integrity": "sha1-TT2aanvyzz3kBYphWuBZ7/ZB+jY=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.1.10.tgz", + "integrity": "sha512-DmBSUyFPoyKqkmBXyJ2CrP1oXDioeoBlPA8lmWUDUv2yBuoHIzIkdY/OkTZbdyu/QYa1hK2Jl9OlfoeoenKddg==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.9.0" } }, "@angular/router": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-4.4.6.tgz", - "integrity": "sha1-D2rSmuD/jSyeo3m9MgRHIXt+yGY=", - "requires": { - "tslib": "^1.7.1" - } - }, - "@angular/tsc-wrapped": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@angular/tsc-wrapped/-/tsc-wrapped-4.4.6.tgz", - "integrity": "sha1-Fnh8u/UL3H5zgSOxnDJSfyROF40=", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-6.1.10.tgz", + "integrity": "sha512-tekI3dkdvd65oMoxjjgRA+16uDgPUBWHhYxids6pgO8vobZNtCo8VaVlcDyLUhdmtS5kONELx0iL5E2M0Y2Bag==", "requires": { - "tsickle": "^0.21.0" + "tslib": "^1.9.0" } }, - "@ngtools/json-schema": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz", - "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=" - }, - "@ngtools/webpack": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.6.2.tgz", - "integrity": "sha512-2s2kCCV3FQUC+MG69e+H5k7zELuVcQ0Gkl1ioqR25HOclxv0UGVY7jsmz9LRm/DanS5ORXQt4S82EFV1dY4w+A==", + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, "requires": { - "loader-utils": "^1.0.2", - "magic-string": "^0.22.3", - "source-map": "^0.5.6" + "@babel/highlight": "^7.0.0" } }, - "@swimlane/ngx-datatable": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-11.3.2.tgz", - "integrity": "sha512-Fn1RMJ991elSvp+LV2SGzG28ypuLM2DFyXAb7o8p4kzuhqtELwB25doXrLLVrtE2QtKmzoD9fRfbEUNsBKgoWA==", - "optional": true - }, - "@types/d3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-5.0.0.tgz", - "integrity": "sha512-BVfPw7ha+UgsG24v6ymerMY4+pJgQ/6p+hJA4loCeaaqV9snGS/G6ReVaQEn8Himn67dWn/Je9WhRbnDO7MzLw==", - "dev": true, - "requires": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-collection": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-voronoi": "*", - "@types/d3-zoom": "*" - } - }, - "@types/d3-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.1.tgz", - "integrity": "sha512-YBaAfimGdWE4nDuoGVKsH89/dkz2hWZ0i8qC+xxqmqi+XJ/aXiRF0jPtzXmN7VdkpVjy1xuDmM5/m1FNuB6VWA==", - "dev": true - }, - "@types/d3-axis": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.10.tgz", - "integrity": "sha512-5YF0wfdQMPKw01VAAupLIlg/T4pn5M3/vL9u0KZjiemnVnnKBEWE24na4X1iW+TfZiYJ8j+BgK2KFYnAAT54Ug==", + "@babel/generator": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.5.tgz", + "integrity": "sha512-IO31r62xfMI+wBJVmgx0JR9ZOHty8HkoYpQAjRWUGG9vykBTlGHdArZ8zoFtpUu2gs17K7qTl/TtPpiSi6t+MA==", "dev": true, "requires": { - "@types/d3-selection": "*" + "@babel/types": "^7.1.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + } } }, - "@types/d3-brush": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.0.8.tgz", - "integrity": "sha512-9Thv09jvolu9T1BE3fHmIeYSgbwSpdxtF6/A5HZEDjSTfgtA0mtaXRk5AiWOo0KjuLsI+/7ggD3ZGN5Ye8KXPQ==", + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", "dev": true, "requires": { - "@types/d3-selection": "*" + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "@types/d3-chord": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.7.tgz", - "integrity": "sha512-WbCN7SxhZMpQQw46oSjAovAmvl3IdjhLuQ4r7AXCzNKyxtXXBWuihSPZ4bVwFQF3+S2z37i9d4hfUBatcSJpog==", - "dev": true - }, - "@types/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-vR3BT0GwHc5y93Jv6bxn3zoxP/vGu+GdXu/r1ApjbP9dLk9I2g6NiV7iP/QMQSuFZd0It0n/qWrfXHxCWwHIkg==", - "dev": true - }, - "@types/d3-color": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.2.1.tgz", - "integrity": "sha512-xwb1tqvYNWllbHuhMFhiXk63Imf+QNq/dJdmbXmr2wQVnwGenCuj3/0IWJ9hdIFQIqzvhT7T37cvx93jtAsDbQ==", - "dev": true - }, - "@types/d3-contour": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-1.2.1.tgz", - "integrity": "sha512-p8iC4KeVFyT3qRTGQRj0Jf5QDdPsDUevBEnma7gEsY1yDolVSLanG2eFAiLV+xj8/5DK7oU7Ey8z0drs3pbsug==", + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, "requires": { - "@types/d3-array": "*", - "@types/geojson": "*" + "@babel/types": "^7.0.0" } }, - "@types/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-xyWJQMr832vqhu6fD/YqX+MSFBWnkxasNhcStvlhqygXxj0cKqPft0wuGoH5TIq5ADXgP83qeNVa4R7bEYN3uA==", - "dev": true - }, - "@types/d3-drag": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.1.tgz", - "integrity": "sha512-J9liJ4NNeV0oN40MzPiqwWjqNi3YHCRtHNfNMZ1d3uL9yh1+vDuo346LBEr8yyBm30WHvrHssAkExVZrGCswtA==", + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", "dev": true, "requires": { - "@types/d3-selection": "*" + "@babel/types": "^7.0.0" } }, - "@types/d3-dsv": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.0.33.tgz", - "integrity": "sha512-jx5YvaVC3Wfh6LobaiWTeU1NkvL2wPmmpmajk618bD+xVz98yNWzmZMvmlPHGK0HXbMeHmW/6oVX48V9AH1bRQ==", - "dev": true - }, - "@types/d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha1-k6MBhovp4VBh89RDQ7GrP4rLbwk=", - "dev": true - }, - "@types/d3-fetch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-1.1.2.tgz", - "integrity": "sha512-w6ANZv/mUh+6IV3drT22zgPWMRobzuGXhzOZC8JPD+ygce0/Vx6vTci3m3dizkocnQQCOwNbrWWWPYqpWiKzRQ==", + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", "dev": true, "requires": { - "@types/d3-dsv": "*" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } } }, - "@types/d3-force": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.1.1.tgz", - "integrity": "sha512-ePkELuaFWY4yOuf+Bvx5Xd+ihFiYG4bdnW0BlvigovIm8Sob2t76e9RGO6lybQbv6AlW9Icn9HuZ9fmdzEoJyg==", - "dev": true - }, - "@types/d3-format": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.3.0.tgz", - "integrity": "sha512-ZiY4j3iJvAdOwzwW24WjlZbUNvqOsnPAMfPBmdXqxj3uKJbrzBlRrdGl5uC89pZpFs9Dc92E81KcwG2uEgkIZA==", + "@babel/parser": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.5.tgz", + "integrity": "sha512-WXKf5K5HT6X0kKiCOezJZFljsfxKV1FpU8Tf1A7ZpGvyd/Q4hlrJm2EwoH2onaUq3O4tLDp+4gk0hHPsMyxmOg==", "dev": true }, - "@types/d3-geo": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.10.3.tgz", - "integrity": "sha512-hfdaxM2L0wA9mDZrrSf2o+DyhEpnJYCiAN+lHFtpfZOVCQrYBA5g33sGRpUbAvjSMyO5jkHbftMWPEhuCMChSg==", + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", "dev": true, "requires": { - "@types/geojson": "*" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" } }, - "@types/d3-hierarchy": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.2.tgz", - "integrity": "sha512-L+Ht4doqlCIH8jYN2AC1mYIOj13OxlRhdWNWXv2pc3o5A9i3YmQ0kz6A7w8c+Ujylfusi/FO+zVlVnQoOHc2Qw==", - "dev": true - }, - "@types/d3-interpolate": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.2.0.tgz", - "integrity": "sha512-qM9KlUrqbwIhBRtw9OtAEbkis1AxsOJEun2uxaX/vEsBp3vyNBmhPz9boXXEqic9ZRi7fCpUNRwyZvxa0PioIw==", + "@babel/traverse": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.5.tgz", + "integrity": "sha512-eU6XokWypl0MVJo+MTSPUtlfPePkrqsF26O+l1qFGlCKWwmiYAYy2Sy44Qw8m2u/LbPCsxYt90rghmqhYMGpPA==", "dev": true, "requires": { - "@types/d3-color": "*" + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.5", + "@babel/types": "^7.1.5", + "debug": "^3.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, - "@types/d3-path": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.7.tgz", - "integrity": "sha512-U8dFRG+8WhkLJr2sxZ9Cw/5WeRgBnNqMxGdA1+Z0+ZG6tK0s75OQ4OXnxeyfKuh6E4wQPY8OAKr1+iNDx01BEQ==", - "dev": true - }, - "@types/d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-E6Kyodn9JThgLq20nxSbEce9ow5/ePgm9PX2EO6W1INIL4DayM7cFaiG10DStuamjYAd0X4rntW2q+GRjiIktw==", - "dev": true - }, - "@types/d3-quadtree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.5.tgz", - "integrity": "sha1-HOHmWerkUw3wyxJ/KX8XQaNnqC4=", - "dev": true - }, - "@types/d3-random": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.1.tgz", - "integrity": "sha512-jUPeBq1XKK9/5XasTvy5QAUwFeMsjma2yt/nP02yC2Tijovx7i/W5776U/HZugxc5SSmtpx4Z3g9KFVon0QrjQ==", - "dev": true - }, - "@types/d3-scale": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.0.1.tgz", - "integrity": "sha512-D5ZWv8ToLvqacE7XkdMNHMiiVDULdDxT7FMMGU0YJC3/nVzBmApjyTyxracUWOQyY3KK7YhZ05on8pOcNi0dfQ==", + "@babel/types": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.5.tgz", + "integrity": "sha512-sJeqa/d9eM/bax8Ivg+fXF7FpN3E/ZmTrWbkk6r+g7biVYfALMnLin4dKijsaqEhpd2xvOGfQTkQkD31YCVV4A==", "dev": true, "requires": { - "@types/d3-time": "*" + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, - "@types/d3-scale-chromatic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.2.0.tgz", - "integrity": "sha512-bhS2SVzUzRtrxp1REhGCfHmj8pyDv9oDmsonYiPvBl8KCxPJTxnfXBF39PzAJrYnRKM41TR0kQzsJvL+NmcDtg==", - "dev": true - }, - "@types/d3-selection": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.3.1.tgz", - "integrity": "sha512-G+eO+2G1iW3GNrROxhoU+ar+bIJbQq1QkxcfhwjQ19xA20n3T31j5pSJqAOWvPSoFTz4Ets/DQgYhmgT4jepDg==", + "@ngtools/json-schema": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz", + "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=", "dev": true }, - "@types/d3-shape": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.2.3.tgz", - "integrity": "sha512-iP9TcX0EVi+LlX+jK9ceS+yhEz5abTitF+JaO2ugpRE/J+bccaYLe/0/3LETMmdaEkYarIyboZW8OF67Mpnj1w==", + "@ngtools/webpack": { + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-6.2.7.tgz", + "integrity": "sha512-4ComGy7zufbkzMap+0fTdTdB7Spl+4WQLUhJP5wNQX9Hp8RhfoimmMvjZq+2L89hThn9od8vyT6Fbg0SAHcoKw==", "dev": true, "requires": { - "@types/d3-path": "*" + "@angular-devkit/core": "0.8.7", + "rxjs": "~6.2.0", + "tree-kill": "^1.0.0", + "webpack-sources": "^1.1.0" } }, - "@types/d3-time": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.0.8.tgz", - "integrity": "sha512-/UCphyyw97YAq4zKsuXH33R3UNB4jDSza0fLvMubWr/ONh9IePi1NbgFP222blhiCe724ebJs8U87+aDuAq/jA==", - "dev": true - }, - "@types/d3-time-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.0.tgz", - "integrity": "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==", - "dev": true - }, - "@types/d3-timer": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.7.tgz", - "integrity": "sha512-830pT+aYZrgbA91AuynP3KldfB1A1s60d0gKiV+L7JcSKSJapUzUffAm8VZod7RQOxF5SzoItV6cvrTzjbmrJQ==", - "dev": true - }, - "@types/d3-transition": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.1.2.tgz", - "integrity": "sha512-sTENKlKkUaKUYjeYIj69VYIi3VKeBinY/pYdy5VkjNmEOIasUtZIyAY04waMU4Rq7u+czKQdcP7Aoaf5wpDGfA==", + "@schematics/angular": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.8.7.tgz", + "integrity": "sha512-bQArM3PSIBhPmXnYwTcMX4yMUCtUx4gfOaTRsWSD1KmLOka9MwU4wYN1mPOX2O5ygl5X11DnkhLhTSfyYL/Zvw==", "dev": true, "requires": { - "@types/d3-selection": "*" + "@angular-devkit/core": "0.8.7", + "@angular-devkit/schematics": "0.8.7", + "typescript": ">=2.6.2 <2.10" } }, - "@types/d3-voronoi": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.7.tgz", - "integrity": "sha512-/dHFLK5jhXTb/W4XEQcFydVk8qlIAo85G3r7+N2fkBFw190l0R1GQ8C1VPeXBb2GfSU5GbT2hjlnE7i7UY5Gvg==", - "dev": true - }, - "@types/d3-zoom": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.7.1.tgz", - "integrity": "sha512-Ofjwz6Pt53tRef9TAwwayN+JThNVYC/vFOepa/H4KtwjhsqkmEseHvc2jpJM7vye5PQ5XHtTSOpdY4Y/6xZWEg==", + "@schematics/update": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.8.7.tgz", + "integrity": "sha512-Lz9z6/1ta9e3Oows/OFjKBFlcfSeq8ZnOA+/t+uxUMwo38Reh6X+C2MHkTs/KLM3F5T67D1nAgB8lqwxBkXKrA==", "dev": true, "requires": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" + "@angular-devkit/core": "0.8.7", + "@angular-devkit/schematics": "0.8.7", + "npm-registry-client": "^8.5.1", + "rxjs": "~6.2.0", + "semver": "^5.3.0", + "semver-intersect": "^1.1.2" } }, - "@types/geojson": { - "version": "7946.0.4", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.4.tgz", - "integrity": "sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q==", + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "@types/jasmine": { - "version": "2.5.54", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", - "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", + "version": "2.8.11", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.11.tgz", + "integrity": "sha512-ITPYT5rkV9S0BcucyBwXIUzqzSODVhvAzhOGV0bwZMuqWJeU0Kfdd6IJeJjGI8Gob+lDyAtKaWUfhG6QXJIPRg==", "dev": true }, "@types/jasminewd2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", - "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", + "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", "dev": true, "requires": { "@types/jasmine": "*" } }, "@types/node": { - "version": "6.0.101", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz", - "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==", + "version": "8.9.5", + "resolved": "http://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", "dev": true }, "@types/q": { "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "resolved": "http://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", "dev": true }, "@types/selenium-webdriver": { - "version": "2.53.42", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz", - "integrity": "sha1-dMt3+2BS7a/yqJhN2v2I1BnyXKw=", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.13.tgz", + "integrity": "sha512-rI0LGoMiZGUM+tjDakQpwZOvcmQoubiJ7hxqrYU12VRxBuGGvOThxrBOU/QmJKlKg1WG6FMzuvcEyLffvVSsmw==", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "requires": { - "mime-types": "~2.1.16", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==" - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "@webassemblyjs/ast": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", + "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", + "dev": true, "requires": { - "acorn": "^4.0.3" + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "debug": "^3.1.0", + "mamacro": "^0.0.3" }, "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", + "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", + "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", + "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", + "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.13" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", + "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", + "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "mamacro": "^0.0.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", + "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", + "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", + "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", + "dev": true, + "requires": { + "ieee754": "^1.1.11" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", + "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", + "dev": true, + "requires": { + "long": "4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + } + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", + "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", + "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/helper-wasm-section": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "@webassemblyjs/wast-printer": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", + "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", + "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", + "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", + "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/floating-point-hex-parser": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-code-frame": "1.5.13", + "@webassemblyjs/helper-fsm": "1.5.13", + "long": "^3.2.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", + "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "long": "^3.2.0" + } + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, "adm-zip": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", - "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", "dev": true }, "after": { @@ -560,186 +968,192 @@ "dev": true }, "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { - "extend": "~3.0.0", - "semver": "~5.0.1" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } + "es6-promisify": "^5.0.0" } }, "ajv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", - "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", + "version": "6.4.0", + "resolved": "http://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, "requires": { - "co": "^4.6.0", "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.3.0", - "json-stable-stringify": "^1.0.1" + "uri-js": "^3.0.2" } }, - "ajv-keywords": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", - "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } + "ajv-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", + "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "dev": true }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true }, - "angular-tree-component": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/angular-tree-component/-/angular-tree-component-7.2.0.tgz", - "integrity": "sha512-xUQvY18WjA8SqNlhDVPWVK0UyPSv2biCRGVrfRiFXEDJQAevLKiXJkw/awTa2mfH/4cuJhmjZuDGXubpcj6Tvw==", + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, "requires": { - "lodash": "^4.17.5", - "mobx": "^3.6.2", - "mobx-angular": "2.1.1" + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + "ansi-colors": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz", + "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==", + "dev": true }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "app-root-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", - "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", + "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", "dev": true }, "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { - "default-require-extensions": "^1.0.0" + "default-require-extensions": "^2.0.0" } }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true }, "array-flatten": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true }, "array-slice": { "version": "0.2.3", @@ -751,6 +1165,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, "requires": { "array-uniq": "^1.0.1" } @@ -758,17 +1173,19 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true }, "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", "dev": true }, "arrify": { @@ -781,17 +1198,22 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "optional": true + "dev": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -802,82 +1224,124 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, "requires": { "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } } }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true }, "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "requires": { - "lodash": "^4.14.0" - } + "version": "1.5.2", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true }, "async-foreach": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "optional": true + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, - "atoa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atoa/-/atoa-1.0.0.tgz", - "integrity": "sha1-DMDpGkgOc4+SPrwQNnZHF3mzSkk=", - "optional": true + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true }, "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "version": "8.6.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.5.tgz", + "integrity": "sha512-PLWJN3Xo/rycNkx+mp8iBDMTm3FeWe4VmYaZDSqL5QQB9sLsQkG5k8n+LNDFnhh9kdq2K+egL/icpctOmDHwig==", + "dev": true, "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", + "browserslist": "^3.2.8", + "caniuse-lite": "^1.0.30000864", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^5.2.16", + "postcss": "^6.0.23", "postcss-value-parser": "^3.2.3" } }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "^1.1.3", "esutils": "^2.0.2", "js-tokens": "^3.0.2" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -889,14 +1353,16 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, "requires": { "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", @@ -904,21 +1370,15 @@ "detect-indent": "^4.0.0", "jsesc": "^1.3.0", "lodash": "^4.17.4", - "source-map": "^0.5.6", + "source-map": "^0.5.7", "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - } } }, "babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, "requires": { "babel-runtime": "^6.22.0" } @@ -927,6 +1387,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -936,6 +1397,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, "requires": { "babel-runtime": "^6.26.0", "babel-traverse": "^6.26.0", @@ -948,6 +1410,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-messages": "^6.23.0", @@ -964,6 +1427,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, "requires": { "babel-runtime": "^6.26.0", "esutils": "^2.0.2", @@ -974,7 +1438,8 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true }, "backo2": { "version": "1.0.2", @@ -983,9 +1448,65 @@ "dev": true }, "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "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://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } }, "base64-arraybuffer": { "version": "0.1.5", @@ -994,9 +1515,10 @@ "dev": true }, "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true }, "base64id": { "version": "1.0.0", @@ -1007,13 +1529,14 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -1030,32 +1553,34 @@ "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true }, "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true }, "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "optional": true, + "dev": true, "requires": { "inherits": "~2.0.0" } }, "blocking-proxy": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz", - "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -1063,43 +1588,47 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "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", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" } }, "bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, "requires": { "array-flatten": "^2.1.0", "deep-equal": "^1.0.1", @@ -1112,51 +1641,113 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, "requires": { - "hoek": "4.x.x" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - } } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "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://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true }, "browserify-aes": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz", - "integrity": "sha512-WYCMOT/PtGTlpOKFht0YJFYcPy6pLCR98CtWfzK13zoynLlBMvAdEMSRGmgnJCw2M2j/5qxBkinZQFobieM8dQ==", + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -1167,9 +1758,10 @@ } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -1177,19 +1769,22 @@ } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" @@ -1199,6 +1794,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, "requires": { "bn.js": "^4.1.1", "browserify-rsa": "^4.0.0", @@ -1210,79 +1806,144 @@ } }, "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, "requires": { - "pako": "~0.2.0" + "pako": "~1.0.5" } }, "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "browserstack": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.1.tgz", + "integrity": "sha512-O8VMT64P9NOLhuIoD4YngyxBURefaSdR4QdhG8l6HZ9VxtU7jc3m6jLufFwKA5gaf7fetfB2TnRJnMxyob+heg==", + "dev": true, "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "https-proxy-agent": "^2.2.1" } }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true }, - "c3": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/c3/-/c3-0.4.23.tgz", - "integrity": "sha512-fI6hbx1QoATU0gRQtPWsUGWX+ssXhxGH1ogew32KjVmGHFE4WmfmBkh+RkuHDoeCIoGFon7XTpKcwUZpBGW4mQ==", - "optional": true, + "cacache": { + "version": "10.0.4", + "resolved": "http://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, "requires": { - "d3": "~3.5.0" - }, - "dependencies": { - "d3": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", - "optional": true - } + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "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" } }, "callsite": { @@ -1295,6 +1956,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, "requires": { "no-case": "^2.2.0", "upper-case": "^1.1.1" @@ -1303,293 +1965,243 @@ "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" } }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } + "caniuse-lite": { + "version": "1.0.30000907", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000907.tgz", + "integrity": "sha512-No5sQ/OB2Nmka8MNOOM6nJx+Hxt6MQ6h7t7kgJFu9oTuwjykyKRSBP/+i/QAyFHxeHB+ddE0Da1CG5ihx9oehQ==", + "dev": true }, - "caniuse-db": { - "version": "1.0.30000740", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000740.tgz", - "integrity": "sha1-A/yqoXbj7QdYlfctRsGhIUm76sk=" + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "dependencies": { - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "^1.3.0", + "anymatch": "^2.0.0", "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.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": "^2.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" + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" } }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "circular-dependency-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-3.0.0.tgz", - "integrity": "sha1-m2hpLjWw41EJmNAWS2rlARvqV2A=" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz", + "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==", + "dev": true }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, "requires": { - "chalk": "^1.1.3" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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" + "is-descriptor": "^0.1.0" } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "clean-css": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", - "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", - "requires": { - "source-map": "0.5.x" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } } }, "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, "clone-deep": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", - "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, "requires": { "for-own": "^1.0.0", - "is-plain-object": "^2.0.1", - "kind-of": "^3.2.2", - "shallow-clone": "^0.1.2" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" } }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "requires": { - "q": "^1.1.2" - } + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true }, "codelyzer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.0.2.tgz", - "integrity": "sha512-nYwOr49+IV09e7C4aXkVALRz0+XpHqZiUUcxHuDZH4xP1FBcHINyr3qvVhv5Gfm7XRmoLx32tsIhrQhW/gBcog==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.3.0.tgz", + "integrity": "sha512-RLMrtLwrBS0dfo2/KTP+2NHofCpzcuh0bEp/A/naqvQonbUL4AW/qWQdbpn8dMNudtpmzEx9eS8KEpGdVPg1BA==", "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.6", + "source-map": "^0.5.7", "sprintf-js": "^1.0.3" } }, - "codemirror": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.32.0.tgz", - "integrity": "sha512-95OxAlYiigW0g4n4ixFdavG07clJGILp3MvHh2pKR3FvyrTuHHvqtKSVbrV3/Jz6o0YqGvyCDLDTbH4h6ciaSw==" - }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "^1.0.0" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - } + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "colors": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true }, "combine-lists": { "version": "1.0.1", @@ -1601,25 +2213,31 @@ } }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true }, - "common-tags": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.4.0.tgz", - "integrity": "sha1-EYe+Tz1M8MBCfUP3Tu8fc1AWFMA=", - "requires": { - "babel-runtime": "^6.18.0" - } + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", + "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", + "dev": true }, "component-bind": { "version": "1.0.0", @@ -1628,9 +2246,9 @@ "dev": true }, "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, "component-inherit": { @@ -1640,91 +2258,77 @@ "dev": true }, "compressible": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", - "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "dev": true, "requires": { - "mime-db": ">= 1.29.0 < 2" + "mime-db": ">= 1.36.0 < 2" } }, "compression": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", - "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "dev": true, "requires": { - "accepts": "~1.3.4", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "~2.0.11", + "compressible": "~2.0.14", "debug": "2.6.9", "on-headers": "~1.0.1", - "safe-buffer": "5.1.1", + "safe-buffer": "5.1.2", "vary": "~1.1.2" } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "connect": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", - "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=", + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", "dev": true, "requires": { "debug": "2.6.9", - "finalhandler": "1.0.6", + "finalhandler": "1.1.0", "parseurl": "~1.3.2", "utils-merge": "1.0.1" }, "dependencies": { "finalhandler": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", - "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "dev": true, "requires": { "debug": "2.6.9", @@ -1735,18 +2339,26 @@ "statuses": "~1.3.1", "unpipe": "~1.0.0" } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true } } }, "connect-history-api-fallback": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", - "integrity": "sha1-5R0X+PDvDbkKZP20feMFFVbp8Wk=" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, "requires": { "date-now": "^0.1.4" } @@ -1754,111 +2366,156 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true }, - "contra": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/contra/-/contra-1.9.4.tgz", - "integrity": "sha1-9TveQtfltZhcrk2ZqNYQUm3o8o0=", - "optional": true, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, "requires": { - "atoa": "1.0.0", - "ticky": "1.0.1" + "safe-buffer": "~5.1.1" } }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" - }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "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" + } }, - "core-object": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", - "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-zmC33E8FFSq3AbflTvqvPvBo621H36Afsxlui91d+QyZxPIuXghfnTsa1CuqiAaCPgJoSUWfTFbKJnadZpKEbQ==", + "dev": true, "requires": { - "chalk": "^2.0.0" + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" } }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, "requires": { "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } } } }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" } }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", - "ripemd160": "^2.0.0", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -1872,51 +2529,17 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "optional": true, + "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" } }, - "crossvent": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/crossvent/-/crossvent-1.5.4.tgz", - "integrity": "sha1-2ixPj0DJR4JRe/K+7BBEFIGUq5I=", - "optional": true, - "requires": { - "custom-event": "1.0.0" - }, - "dependencies": { - "custom-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.0.tgz", - "integrity": "sha1-LkYovhncSyFLXAJjDFlx6BFhgGI=", - "optional": true - } - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.x.x" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.x.x" - } - } - } - }, "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -1927,44 +2550,27 @@ "inherits": "^2.0.1", "pbkdf2": "^3.0.3", "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0" + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-loader": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", - "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", - "requires": { - "babel-code-frame": "^6.11.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": ">=2.6.1 <4", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.0.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.0.0", - "postcss-modules-local-by-default": "^1.0.1", - "postcss-modules-scope": "^1.0.0", - "postcss-modules-values": "^1.1.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - } + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true }, "css-parse": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", - "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true }, "css-select": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, "requires": { "boolbase": "~1.0.0", "css-what": "2.1", @@ -1973,9 +2579,10 @@ } }, "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, "requires": { "cssesc": "^0.1.0", "fastparse": "^1.1.1", @@ -1983,9 +2590,10 @@ } }, "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", + "dev": true }, "cssauron": { "version": "1.4.0", @@ -1999,60 +2607,20 @@ "cssesc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - } + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - } + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, "requires": { "array-find-index": "^1.0.1" } @@ -2063,295 +2631,38 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "^0.10.9" - } - }, - "d3": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.5.0.tgz", - "integrity": "sha512-HRDSYvT3n7kMvJH7Avp7iR0Xsz97bkCFka9aOg04EdyXyiAP8yQzUpLH3712y9R7ffVo1g94t1OYFHBB0yI9vQ==", - "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" - } - }, - "d3-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", - "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" - }, - "d3-axis": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", - "integrity": "sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=" - }, - "d3-brush": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz", - "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-chord": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz", - "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=", - "requires": { - "d3-array": "1", - "d3-path": "1" - } - }, - "d3-collection": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", - "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" - }, - "d3-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.0.tgz", - "integrity": "sha512-dmL9Zr/v39aSSMnLOTd58in2RbregCg4UtGyUArvEKTTN6S3HKEy+ziBWVYo9PTzRyVW+pUBHUtRKz0HYX+SQg==" - }, - "d3-contour": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.0.tgz", - "integrity": "sha512-6zccxidQRtcydx0lWqHawdW1UcBzKZTxv0cW90Dlx98pY/L7GjQJmftH1tWopYFDaLCoXU0ECg9x/z2EuFT8tg==", - "requires": { - "d3-array": "^1.1.1" - } - }, - "d3-dispatch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz", - "integrity": "sha1-RuFJHqqbWMNY/OW+TovtYm54cfg=" - }, - "d3-drag": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", - "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", - "requires": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "d3-dsv": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz", - "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==", - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - } - }, - "d3-ease": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", - "integrity": "sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=" - }, - "d3-fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.0.tgz", - "integrity": "sha512-j+V4vtT6dceQbcKYLtpTueB8Zvc+wb9I93WaFtEQIYNADXl0c1ZJMN3qQo0CssiTsAqK8pePwc7f4qiW+b0WOg==", - "requires": { - "d3-dsv": "1" - } - }, - "d3-force": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", - "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "d3-format": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.0.tgz", - "integrity": "sha512-ycfLEIzHVZC3rOvuBOKVyQXSiUyCDjeAPIj9n/wugrr+s5AcTQC2Bz6aKkubG7rQaQF0SGW/OV4UEJB9nfioFg==" - }, - "d3-geo": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.10.0.tgz", - "integrity": "sha512-VK/buVGgexthTTqGRNXQ/LSo3EbOFu4p2Pjud5drSIaEnOaF2moc8A3P7WEljEO1JEBEwbpAJjFWMuJiUtoBcw==", - "requires": { - "d3-array": "1" - } - }, - "d3-hierarchy": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz", - "integrity": "sha512-nn4bhBnwWnMSoZgkBXD7vRyZ0xVUsNMQRKytWYHhP1I4qHw+qzApCTgSQTZqMdf4XXZbTMqA59hFusga+THA/g==" - }, - "d3-interpolate": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.2.0.tgz", - "integrity": "sha512-zLvTk8CREPFfc/2XglPQriAsXkzoRDAyBzndtKJWrZmHw7kmOWHNS11e40kPTd/oGk8P5mFJW5uBbcFQ+ybxyA==", - "requires": { - "d3-color": "1" - } - }, - "d3-path": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", - "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=" - }, - "d3-polygon": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz", - "integrity": "sha1-FoiOkCZGCTPysXllKtN4Ik04LGI=" - }, - "d3-quadtree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz", - "integrity": "sha1-rHmH4+I/6AWpkPKOG1DTj8uCJDg=" - }, - "d3-random": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz", - "integrity": "sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM=" - }, - "d3-scale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.1.0.tgz", - "integrity": "sha512-Bb2N3ZgzPdKVEoWGkt8lPV6R7YdpSBWI70Xf26NQHOVjs77a6gLUmBOOPt9d9nB8JiQhwXY1RHCa+eSyWCJZIQ==", - "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "d3-scale-chromatic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.0.tgz", - "integrity": "sha512-YwMbiaW2bStWvQFByK8hA6hk7ToWflspIo2TRukCqERd8isiafEMBXmwfh8c7/0Z94mVvIzIveRLVC6RAjhgeA==", - "requires": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "d3-selection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz", - "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" - }, - "d3-shape": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", - "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", - "requires": { - "d3-path": "1" - } - }, - "d3-time": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", - "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" - }, - "d3-time-format": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", - "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", - "requires": { - "d3-time": "1" - } - }, - "d3-timer": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", - "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" - }, - "d3-transition": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", - "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "d3-voronoi": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", - "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=" - }, - "d3-zoom": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", - "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -2359,31 +2670,115 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + } }, "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { - "strip-bom": "^2.0.0" + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, "requires": { "globby": "^6.1.0", "is-path-cwd": "^1.0.0", @@ -2393,37 +2788,52 @@ "rimraf": "^2.2.8" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "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": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } } } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true }, "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -2432,20 +2842,23 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, "requires": { "repeating": "^2.0.0" } }, "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true }, "di": { "version": "0.0.1", @@ -2454,60 +2867,43 @@ "dev": true }, "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" } }, - "directory-encoder": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/directory-encoder/-/directory-encoder-0.7.2.tgz", - "integrity": "sha1-WbTiqk8lQi9sY7UntGL14tDdLFg=", + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, "requires": { - "fs-extra": "^0.23.1", - "handlebars": "^1.3.0", - "img-stats": "^0.5.2" - }, - "dependencies": { - "fs-extra": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.23.1.tgz", - "integrity": "sha1-ZhHbpq3yq43Jxp+rN83fiBgVfj0=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - } + "arrify": "^1.0.1", + "path-type": "^3.0.0" } }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true }, "dns-packet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", - "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -2517,23 +2913,18 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, "requires": { "buffer-indexof": "^1.0.0" } }, "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, "requires": { - "utila": "~0.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" - } + "utila": "~0.4" } }, "dom-serialize": { @@ -2552,6 +2943,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, "requires": { "domelementtype": "~1.1.1", "entities": "~1.1.1" @@ -2559,25 +2951,29 @@ "dependencies": { "domelementtype": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true } } }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz", + "integrity": "sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==", + "dev": true }, "domhandler": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, "requires": { "domelementtype": "1" } @@ -2586,44 +2982,72 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, "requires": { "dom-serializer": "0", "domelementtype": "1" } }, - "dragula": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/dragula/-/dragula-3.7.2.tgz", - "integrity": "sha1-SjXJ05gf+sGpScKcpyhQWOhzk84=", - "optional": true, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, "requires": { - "contra": "1.9.4", - "crossvent": "1.5.4" + "is-obj": "^1.0.0" } }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "~0.1.0" + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true }, "electron-to-chromium": { - "version": "1.3.24", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.24.tgz", - "integrity": "sha1-m3uIuwXOufoBahd4M8wt3jiPIbY=" + "version": "1.3.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", + "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==", + "dev": true }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -2634,143 +3058,106 @@ "minimalistic-crypto-utils": "^1.0.0" } }, - "ember-cli-normalize-entity-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz", - "integrity": "sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc=", - "requires": { - "silent-error": "^1.0.0" - } - }, - "ember-cli-string-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", - "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=" - }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true }, "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } }, "engine.io": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", "dev": true, "requires": { - "accepts": "1.3.3", + "accepts": "~1.3.4", "base64id": "1.0.0", "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.2" + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" }, "dependencies": { - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "~2.1.11", - "negotiator": "0.6.1" - } - }, "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.7.2" + "ms": "2.0.0" } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true } } }, "engine.io-client": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "version": "3.2.1", + "resolved": "http://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", "dev": true, "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", "has-cors": "1.1.0", "indexof": "0.0.1", - "parsejson": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.7.2" + "ms": "2.0.0" } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true } } }, "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", "dev": true, "requires": { "after": "0.8.2", - "arraybuffer.slice": "0.0.6", + "arraybuffer.slice": "~0.0.7", "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" + "blob": "0.0.5", + "has-binary2": "~1.0.2" } }, "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "tapable": "^1.0.0" } }, - "ensure-posix-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz", - "integrity": "sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI=" - }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -2778,188 +3165,208 @@ "dev": true }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true }, "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, "requires": { - "prr": "~0.0.0" + "prr": "~1.0.1" } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, - "es5-ext": { - "version": "0.10.30", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", - "requires": { - "es6-iterator": "2", - "es6-symbol": "~3.1" - } - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-symbol": "^3.1" + "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" } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es6-promise": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", - "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", "dev": true }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "es6-promisify": { + "version": "5.0.0", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "es6-promise": "^4.0.3" } }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": 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://registry.npmjs.org/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.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", "esrecurse": "^4.1.0", "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } } }, "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, "requires": { - "estraverse": "^4.1.0", - "object-assign": "^4.0.1" + "estraverse": "^4.1.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "estree-walker": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true }, "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true }, "events": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true }, "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, "requires": { - "original": ">=0.0.5" + "original": "^1.0.0" } }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, "requires": { - "cross-spawn": "^5.0.1", + "cross-spawn": "^6.0.0", "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", @@ -2969,11 +3376,14 @@ }, "dependencies": { "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } @@ -2997,6 +3407,12 @@ "braces": "^0.1.2" }, "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, "braces": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", @@ -3031,63 +3447,125 @@ } }, "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" + "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://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, "requires": { "fill-range": "^2.1.0" - } - }, - "exports-loader": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.4.tgz", - "integrity": "sha1-1w/GEhl1s1/BKDDPUnVL4nQPyIY=", - "requires": { - "loader-utils": "^1.0.2", - "source-map": "0.5.x" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, "requires": { - "accepts": "~1.3.4", + "accepts": "~1.3.5", "array-flatten": "1.1.1", - "body-parser": "1.18.2", + "body-parser": "1.18.3", "content-disposition": "0.5.2", "content-type": "~1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.1", - "encodeurl": "~1.0.1", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.0", + "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.2", - "qs": "6.5.1", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "~1.3.1", - "type-is": "~1.6.15", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", "vary": "~1.1.2" }, @@ -3095,139 +3573,157 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true } } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, - "external-editor": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.5.tgz", - "integrity": "sha512-Msjo64WT5W+NhOpQXh0nOHm+n0RfU1QUwDnKYvJ8dEJ8zlwLrqXNTv5mSUTJpepf41PDJGyhueTw2vNZW+Fr/w==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, "requires": { - "iconv-lite": "^0.4.17", - "jschardet": "^1.4.2", - "tmp": "^0.0.33" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "extract-text-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.0.tgz", - "integrity": "sha1-kMqnkHvESfM1AF46x1MrQbAN5hI=", - "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" - } - }, - "extract-zip": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.5.tgz", - "integrity": "sha1-maBnNbbqIOqbcF13ms/8yHz/BEA=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "concat-stream": "1.6.0", - "debug": "2.2.0", - "mkdirp": "0.5.0", - "yauzl": "2.4.1" + "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": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "ms": "0.7.1" + "is-descriptor": "^1.0.0" } }, - "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "minimist": "0.0.8" + "is-extendable": "^0.1.0" } }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "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://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "dev": true, "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" + "websocket-driver": ">=0.5.1" } }, "file-loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.10.1.tgz", - "integrity": "sha1-gVA0EZiR/GRB+1pkwRvJPCLd2EI=", + "version": "1.1.11", + "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, "requires": { - "loader-utils": "^1.0.2" + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" } }, - "file-saver": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz", - "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true }, "fileset": { "version": "2.0.3", @@ -3240,69 +3736,110 @@ } }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { - "isarray": "1.0.0" + "is-extendable": "^0.1.0" } } } }, "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.1", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.2", - "statuses": "~1.3.1", + "statuses": "~1.4.0", "unpipe": "~1.0.0" } }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^2.0.0" } }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "follow-redirects": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", + "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, "requires": { "for-in": "^1.0.1" } @@ -3310,31 +3847,54 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } }, "fs-access": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -3342,263 +3902,159 @@ } }, "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "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://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, "optional": true, "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.36" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, + "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, + "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", "bundled": true, + "dev": true, "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "2.10.1", + "version": "1.0.0", "bundled": true, - "requires": { - "hoek": "2.x.x" - } + "dev": true }, "brace-expansion": { - "version": "1.1.7", + "version": "1.1.11", "bundled": true, + "dev": true, "requires": { - "balanced-match": "^0.4.1", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", + "chownr": { + "version": "1.0.1", "bundled": true, + "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", "bundled": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "~1.0.0" - } + "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.1", "bundled": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } + "dev": true, + "optional": true }, "debug": { - "version": "2.6.8", + "version": "2.6.9", "bundled": true, + "dev": true, "optional": true, "requires": { "ms": "2.0.0" } }, "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true, + "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, "delegates": { "version": "1.0.0", "bundled": true, + "dev": true, "optional": true }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", + "detect-libc": { + "version": "1.0.3", "bundled": true, + "dev": true, "optional": true }, - "form-data": { - "version": "2.1.4", + "fs-minipass": { + "version": "1.2.5", "bundled": true, + "dev": true, "optional": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" + "minipass": "^2.2.1" } }, "fs.realpath": { "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", "bundled": true, - "optional": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } + "dev": true, + "optional": true }, "gauge": { "version": "2.7.4", "bundled": true, + "dev": true, "optional": true, "requires": { "aproba": "^1.0.3", @@ -3611,24 +4067,11 @@ "wide-align": "^1.1.0" } }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, "glob": { "version": "7.1.2", "bundled": true, + "dev": true, + "optional": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3638,57 +4081,35 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, "has-unicode": { "version": "2.0.1", "bundled": true, + "dev": true, "optional": true }, - "hawk": { - "version": "3.1.3", + "iconv-lite": { + "version": "0.4.21", "bundled": true, + "dev": true, "optional": true, "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" + "safer-buffer": "^2.1.0" } }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", + "ignore-walk": { + "version": "3.0.1", "bundled": true, + "dev": true, "optional": true, "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", "bundled": true, + "dev": true, + "optional": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3696,122 +4117,64 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "dev": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, + "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "optional": true, + "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, "isarray": { "version": "1.0.0", - "bundled": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", "bundled": true, + "dev": true, "optional": true }, - "jodid25519": { - "version": "1.0.2", + "minimatch": { + "version": "3.0.4", "bundled": true, - "optional": true, + "dev": true, "requires": { - "jsbn": "~0.1.0" + "brace-expansion": "^1.1.7" } }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", + "minimist": { + "version": "0.0.8", "bundled": true, - "optional": true + "dev": true }, - "json-stable-stringify": { - "version": "1.0.1", + "minipass": { + "version": "2.2.4", "bundled": true, - "optional": true, + "dev": true, "requires": { - "jsonify": "~0.0.0" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", + "minizlib": { + "version": "1.1.0", "bundled": true, + "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "~1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" + "minipass": "^2.2.1" } }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, "mkdirp": { "version": "0.5.1", "bundled": true, + "dev": true, "requires": { "minimist": "0.0.8" } @@ -3819,36 +4182,68 @@ "ms": { "version": "2.0.0", "bundled": true, + "dev": true, "optional": true }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, "node-pre-gyp": { - "version": "0.6.36", + "version": "0.10.0", "bundled": true, + "dev": 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", - "request": "^2.81.0", "rimraf": "^2.6.1", "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.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.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, "npmlog": { - "version": "4.1.0", + "version": "4.1.2", "bundled": true, + "dev": true, "optional": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -3860,21 +4255,18 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "optional": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", "bundled": true, + "dev": true, "optional": true }, "once": { "version": "1.4.0", "bundled": true, + "dev": true, "requires": { "wrappy": "1" } @@ -3882,16 +4274,19 @@ "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.4", + "version": "0.1.5", "bundled": true, + "dev": true, "optional": true, "requires": { "os-homedir": "^1.0.0", @@ -3900,33 +4295,23 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", "bundled": true, + "dev": true, "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", + "version": "2.0.0", "bundled": true, + "dev": true, "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.7", "bundled": true, + "dev": true, "optional": true, "requires": { - "deep-extend": "~0.4.0", + "deep-extend": "^0.5.1", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -3935,113 +4320,74 @@ "minimist": { "version": "1.2.0", "bundled": true, + "dev": true, "optional": true } } }, "readable-stream": { - "version": "2.2.9", + "version": "2.3.6", "bundled": true, + "dev": true, + "optional": true, "requires": { - "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, - "request": { - "version": "2.81.0", - "bundled": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "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", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, "rimraf": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, + "dev": true, + "optional": true, "requires": { "glob": "^7.0.5" } }, "safe-buffer": { - "version": "5.0.1", - "bundled": true + "version": "5.1.1", + "bundled": true, + "dev": 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.3.0", + "version": "5.5.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 }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": true, - "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", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, "string-width": { "version": "1.0.2", "bundled": true, - "optional": true, + "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4049,20 +4395,18 @@ } }, "string_decoder": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, + "dev": true, + "optional": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, "strip-ansi": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4070,70 +4414,48 @@ "strip-json-comments": { "version": "2.0.1", "bundled": true, + "dev": true, "optional": true }, "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.4.0", + "version": "4.4.1", "bundled": true, + "dev": true, "optional": true, "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" + "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" } }, - "tough-cookie": { - "version": "2.3.2", + "util-deprecate": { + "version": "1.0.2", "bundled": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } + "dev": true, + "optional": true }, - "tunnel-agent": { - "version": "0.6.0", + "wide-align": { + "version": "1.1.2", "bundled": true, + "dev": true, "optional": true, "requires": { - "safe-buffer": "^5.0.1" + "string-width": "^1.0.2" } }, - "tweetnacl": { - "version": "0.14.5", + "wrappy": { + "version": "1.0.2", "bundled": true, - "optional": true + "dev": true }, - "uid-number": { - "version": "0.0.6", + "yallist": { + "version": "3.0.2", "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } + "dev": true } } }, @@ -4141,6 +4463,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4151,12 +4474,14 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -4166,64 +4491,55 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } } }, "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", - "optional": true, + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, "requires": { "globule": "^1.0.0" } }, "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4237,131 +4553,243 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, "requires": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } } }, "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, "requires": { - "is-glob": "^2.0.0" - } - }, - "globals": { - "version": "9.18.0", + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "globals": { + "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, "requires": { "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" } }, "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", - "optional": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, "requires": { "glob": "~7.1.1", - "lodash": "~4.17.4", + "lodash": "~4.17.10", "minimatch": "~3.0.2" } }, + "got": { + "version": "6.7.1", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true }, "handle-thing": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" + "resolved": "http://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true }, "handlebars": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.3.0.tgz", - "integrity": "sha1-npsTCpPjiUkTItl1zz7BgYw3zjQ=", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, "requires": { - "optimist": "~0.3", - "uglify-js": "~2.3" + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "optional": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "optional": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, "requires": { - "amdefine": ">=0.0.4" + "lodash": "^4.17.10" } }, - "uglify-js": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", - "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=", - "optional": true, - "requires": { - "async": "~0.2.6", - "optimist": "~0.3.5", - "source-map": "~0.1.7" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "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://registry.npmjs.org/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://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + } } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { - "function-bind": "^1.0.2" + "function-bind": "^1.1.1" } }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", "dev": true, "requires": { - "isarray": "0.0.1" + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } } }, "has-cors": { @@ -4371,193 +4799,151 @@ "dev": true }, "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, "requires": { - "inherits": "^2.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, "requires": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" - }, - "heimdalljs": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/heimdalljs/-/heimdalljs-0.2.5.tgz", - "integrity": "sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw=", - "requires": { - "rsvp": "~3.2.1" - }, - "dependencies": { - "rsvp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", - "integrity": "sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo=" - } - } - }, - "heimdalljs-logger": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz", - "integrity": "sha1-12raTkW3u294b8nAEKaOsuL68XY=", - "requires": { - "debug": "^2.2.0", - "heimdalljs": "^0.2.0" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, "requires": { "inherits": "^2.0.1", "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" - }, "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true }, "html-minifier": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.5.tgz", - "integrity": "sha512-g+1+NBycQI0fGnggd52JM8TRUweG7+9W2wrtjGitMAqc4G7maweAHvVAAjz9veHseIH3tYKE2lk2USGSoewIrQ==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, "requires": { "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.11.x", - "he": "1.1.x", - "ncname": "1.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", "param-case": "2.1.x", "relateurl": "0.2.x", - "uglify-js": "3.1.x" + "uglify-js": "3.4.x" } }, "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "version": "3.2.0", + "resolved": "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, "requires": { - "bluebird": "^3.4.7", "html-minifier": "^3.2.3", "loader-utils": "^0.2.16", "lodash": "^4.17.3", "pretty-error": "^2.0.2", - "toposort": "^1.0.0" + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" }, "dependencies": { "loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, "requires": { "big.js": "^3.1.3", "emojis-list": "^2.0.0", @@ -4569,8 +4955,9 @@ }, "htmlparser2": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, "requires": { "domelementtype": "1", "domhandler": "2.1", @@ -4582,79 +4969,89 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, "requires": { "domelementtype": "1" } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": 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://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true } } }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true }, "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, "requires": { - "depd": "1.1.1", + "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - }, - "dependencies": { - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - } + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" } }, "http-parser-js": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.8.tgz", - "integrity": "sha512-jmHp99g6/fLx0pRNJqzsQgjsclCHAY7NhIeA3/U+bsGNvgbvUCQFQY9m5AYpqpAxY/2VcikfbKpjQozSTiz0jA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "dev": true }, "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, "requires": { - "eventemitter3": "1.x.x", - "requires-port": "1.x.x" + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "version": "0.18.0", + "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, "requires": { "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" - }, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" } }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -4662,116 +5059,198 @@ } }, "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true }, "https-proxy-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "dev": true, "requires": { - "agent-base": "2", - "debug": "2", - "extend": "3" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "requires": { - "postcss": "^6.0.1" + "agent-base": "^4.1.0", + "debug": "^3.1.0" }, "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.12.tgz", - "integrity": "sha512-K6SLofXEK43FBSyZ6/ExQV7ji24OEw4tEY6x1CAf7+tcoMWJoO24Rf3rVFVpk+5IQL1e1Cy3sTKfg7hXuLzafg==", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, "requires": { - "chalk": "^2.1.0", - "source-map": "^0.5.7", - "supports-color": "^4.4.0" + "ms": "^2.1.1" } }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "^2.0.0" - } + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, "optional": true }, - "img-stats": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/img-stats/-/img-stats-0.5.2.tgz", - "integrity": "sha1-wgNJbELy2esuWrgjL6dWurMsnis=", + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, "requires": { - "xmldom": "^0.1.19" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "in-publish": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "optional": true + "dev": true }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, "requires": { "repeating": "^2.0.0" } }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -4780,67 +5259,36 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } + "injection-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.2.1.tgz", + "integrity": "sha512-zHI+E+dM0PXix5FFTO1Y4/UOyAzE7zG1l/QwAn4jchTThOoBq+UYRFK4AVG7lQgFL+go62SbrzSsjXy9DFEZUg==", + "dev": true }, "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "dev": true, "requires": { - "meow": "^3.3.0" + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" } }, - "interpret": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", - "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=" - }, "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -4848,63 +5296,154 @@ "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true }, "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, "requires": { "binary-extensions": "^1.0.0" } }, "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/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://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "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://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, "requires": { "is-primitive": "^2.0.0" } @@ -4912,72 +5451,119 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, + "is-obj": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, "requires": { "is-path-inside": "^1.0.0" } }, "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/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://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "requires": { "isobject": "^3.0.1" } @@ -4985,323 +5571,345 @@ "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, "requires": { - "html-comment-regex": "^1.1.0" + "has-symbols": "^1.0.0" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, - "istanbul-api": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.2.tgz", - "integrity": "sha512-kH5YRdqdbs5hiH4/Rr1Q0cSAGgjh3jTtg8vu9NLebBAoK3adVO4jk81J+TYOkTr2+Q4NLeb1ACvmEt65iG/Vbw==", - "dev": true, - "requires": { - "async": "^2.1.4", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.1.2", - "istanbul-lib-hook": "^1.1.0", - "istanbul-lib-instrument": "^1.9.2", - "istanbul-lib-report": "^1.1.3", - "istanbul-lib-source-maps": "^1.2.3", - "istanbul-reports": "^1.1.4", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-api": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.0.6.tgz", + "integrity": "sha512-8W5oeAGWXhtTJjAyVfvavOLVyZCTNCKsyF6GON/INKlBdO7uJ/bv3qnPj5M6ERKzmMCJS1kntnjjGuJ86fn3rQ==", + "dev": true, + "requires": { + "async": "^2.6.1", + "compare-versions": "^3.2.1", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.1", + "istanbul-lib-hook": "^2.0.1", + "istanbul-lib-instrument": "^3.0.0", + "istanbul-lib-report": "^2.0.2", + "istanbul-lib-source-maps": "^2.0.1", + "istanbul-reports": "^2.0.1", + "js-yaml": "^3.12.0", + "make-dir": "^1.3.0", "once": "^1.4.0" }, "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, "istanbul-lib-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz", - "integrity": "sha512-tZYA0v5A7qBSsOzcebJJ/z3lk3oSzH62puG78DbBA1+zupipX2CakDyiPV3pOb8He+jBwVimuwB0dTnh38hX0w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", "dev": true }, "istanbul-lib-instrument": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz", - "integrity": "sha512-nz8t4HQ2206a/3AXi+NHFWEa844DMpPsgbcUteJbt1j8LX1xg56H9rOMnhvcvVvPbW60qAIyrSk44H8ZDqaSSA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", + "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", "dev": true, "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.1.2", - "semver": "^5.3.0" + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.1", + "semver": "^5.5.0" } } } }, "istanbul-instrumenter-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz", - "integrity": "sha1-5UkpAKsLuoNe+oAkywC+mz7qJwA=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, "requires": { - "convert-source-map": "^1.3.0", - "istanbul-lib-instrument": "^1.1.3", - "loader-utils": "^0.2.16", - "object-assign": "^4.1.0" + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" }, "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "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://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" } } } }, "istanbul-lib-coverage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true }, "istanbul-lib-hook": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", - "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz", + "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", "dev": true, "requires": { - "append-transform": "^0.4.0" + "append-transform": "^1.0.0" } }, "istanbul-lib-instrument": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", - "integrity": "sha1-ZvbJQhzJ7EcE928tsIS6kHiitTI=", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, "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.1.1", + "istanbul-lib-coverage": "^1.2.1", "semver": "^5.3.0" } }, "istanbul-lib-report": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz", - "integrity": "sha512-D4jVbMDtT2dPmloPJS/rmeP626N5Pr3Rp+SovrPn1+zPChGHcggd/0sL29jnbm4oK9W0wHjCRsdch9oLd7cm6g==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", + "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", "dev": true, "requires": { - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "supports-color": "^5.4.0" }, "dependencies": { "istanbul-lib-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz", - "integrity": "sha512-tZYA0v5A7qBSsOzcebJJ/z3lk3oSzH62puG78DbBA1+zupipX2CakDyiPV3pOb8He+jBwVimuwB0dTnh38hX0w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", "dev": true } } }, "istanbul-lib-source-maps": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", + "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", "dev": true, "requires": { "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "istanbul-lib-coverage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz", - "integrity": "sha512-tZYA0v5A7qBSsOzcebJJ/z3lk3oSzH62puG78DbBA1+zupipX2CakDyiPV3pOb8He+jBwVimuwB0dTnh38hX0w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "istanbul-reports": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.4.tgz", - "integrity": "sha512-DfSTVOTkuO+kRmbO8Gk650Wqm1WRGr6lrdi2EwDK1vxpS71vdlLd613EpzOKdIFioB5f/scJTjeWBnvd1FWejg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", + "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", "dev": true, "requires": { - "handlebars": "^4.0.3" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/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://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/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" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/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://registry.npmjs.org/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://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/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" - } - } + "handlebars": "^4.0.11" } }, "jasmine": { @@ -5324,116 +5932,127 @@ } }, "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "version": "2.99.1", + "resolved": "http://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", "dev": true }, + "jasmine-diff": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/jasmine-diff/-/jasmine-diff-0.1.3.tgz", + "integrity": "sha1-k8zC3MQQKMXd1GBlWAdIOfLe6qg=", + "dev": true, + "requires": { + "diff": "^3.2.0" + } + }, "jasmine-spec-reporter": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", - "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", "dev": true, "requires": { "colors": "1.1.2" } }, "jasminewd2": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.1.0.tgz", - "integrity": "sha1-2llSddGuYx3nNqwKfH2Fyfc+9lI=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", "dev": true }, "js-base64": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", - "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==" + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", + "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", + "dev": true }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, "requires": { "argparse": "^1.0.7", - "esprima": "^2.6.0" + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jschardet": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", - "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==" + "dev": true }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true }, "json5": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, "requires": { "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -5441,15 +6060,68 @@ "verror": "1.10.0" } }, + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "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": "http://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "http://registry.npmjs.org/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://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "karma": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-3.0.0.tgz", + "integrity": "sha512-ZTjyuDXVXhXsvJ1E4CnZzbCjSxD6sEdzEsFYogLuZM0yqvg/mgz+O+R1jb0J7uAQeuzdY8kJgx6hSNXLwFuHIQ==", "dev": true, "requires": { "bluebird": "^3.3.0", "body-parser": "^1.16.1", - "chokidar": "^1.4.1", + "chokidar": "^2.0.3", "colors": "^1.1.0", "combine-lists": "^1.0.0", "connect": "^3.6.0", @@ -5461,45 +6133,32 @@ "graceful-fs": "^4.1.2", "http-proxy": "^1.13.0", "isbinaryfile": "^3.0.0", - "lodash": "^3.8.0", - "log4js": "^0.6.31", - "mime": "^1.3.4", + "lodash": "^4.17.4", + "log4js": "^3.0.0", + "mime": "^2.3.1", "minimatch": "^3.0.2", "optimist": "^0.6.1", "qjobs": "^1.1.4", "range-parser": "^1.2.0", "rimraf": "^2.6.0", "safe-buffer": "^5.0.1", - "socket.io": "1.7.3", - "source-map": "^0.5.3", - "tmp": "0.0.31", - "useragent": "^2.1.12" + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.2.1" }, "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", "dev": true }, - "optimist": { + "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -5513,173 +6172,188 @@ "which": "^1.2.1" } }, - "karma-cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", - "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, "karma-coverage-istanbul-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.1.tgz", - "integrity": "sha512-5og0toMjgLvsL9+TzGH4Rk1D0nr7pMIRJBg29xP4mHMKy/1KUJ12UzoqI6mBNCRFa4nDvZS2MRrN7p+RkZNWxQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz", + "integrity": "sha512-xJS7QSQIVU6VK9HuJ/ieE5yynxKhjCCkd96NLY/BX/HXsx0CskU9JJiMQbd4cHALiddMwI4OWh1IIzeWrsavJw==", "dev": true, "requires": { - "istanbul-api": "^1.1.14", + "istanbul-api": "^2.0.5", "minimatch": "^3.0.4" } }, "karma-jasmine": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz", - "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", "dev": true }, "karma-jasmine-html-reporter": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "resolved": "http://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", "dev": true, "requires": { "karma-jasmine": "^1.0.2" } }, - "karma-junit-reporter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-1.2.0.tgz", - "integrity": "sha1-T5xAzt+xo5X4rvh2q/lhiZF8Y5Y=", - "dev": true, - "requires": { - "path-is-absolute": "^1.0.0", - "xmlbuilder": "8.2.2" - }, - "dependencies": { - "xmlbuilder": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", - "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", - "dev": true - } - } - }, - "karma-phantomjs-launcher": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", - "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", + "karma-source-map-support": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", "dev": true, "requires": { - "lodash": "^4.0.1", - "phantomjs-prebuilt": "^2.1.7" + "source-map-support": "^0.5.5" } }, - "karma-source-map-support": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", - "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", - "requires": { - "source-map-support": "^0.4.1" - } - }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", "dev": true }, "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "graceful-fs": "^4.1.9" + "package-json": "^4.0.0" } }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, "requires": { "invert-kv": "^1.0.0" } }, "less": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz", - "integrity": "sha1-No1sxz4fsDmBGDKAkYdDxdz5s98=", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz", + "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==", + "dev": true, "requires": { + "clone": "^2.1.2", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", - "mime": "^1.2.11", + "mime": "^1.4.1", "mkdirp": "^0.5.0", "promise": "^7.1.1", - "request": "^2.72.0", - "source-map": "^0.5.3" + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } } }, "less-loader": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.0.5.tgz", - "integrity": "sha1-rhVadAbKxqzSk9eFWH/P8PR4xN0=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "dev": true, "requires": { "clone": "^2.1.1", "loader-utils": "^1.1.0", - "pify": "^2.3.0" + "pify": "^3.0.0" + } + }, + "less-plugin-npm-import": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", + "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", + "dev": true, + "requires": { + "promise": "~7.0.1", + "resolve": "~1.1.6" }, "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "promise": { + "version": "7.0.4", + "resolved": "http://registry.npmjs.org/promise/-/promise-7.0.4.tgz", + "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", + "dev": true, + "requires": { + "asap": "~2.0.3" + } } } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "license-webpack-plugin": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-0.5.1.tgz", - "integrity": "sha1-aNivEDSGqcTrzt237V071h84O+Q=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-Of/H79rZqm2aeg4RnP9SMSh19qkKemoLT5VaJV58uH5AxeYWEcBgGFs753JEJ/Hm6BPvQVfIlrrjoBwYj8p7Tw==", + "dev": true, + "requires": { + "ejs": "^2.5.7" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, "requires": { - "object-assign": "^4.1.0" + "immediate": "~3.0.5" } }, "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", "pinkie-promise": "^2.0.0", "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", + "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "dev": true }, "loader-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, "requires": { "big.js": "^3.1.3", "emojis-list": "^2.0.0", @@ -5690,95 +6364,104 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "optional": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + "dev": true }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true }, "lodash.mergewith": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", - "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", - "optional": true + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", + "dev": true }, "lodash.tail": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true }, "log4js": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", + "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", "dev": true, "requires": { - "readable-stream": "~1.0.2", - "semver": "~4.3.3" + "circular-json": "^0.5.5", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "rfdc": "^1.1.2", + "streamroller": "0.7.0" }, "dependencies": { - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" @@ -5787,129 +6470,134 @@ "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true }, "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, - "macaddress": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" - }, "magic-string": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", - "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.1" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, "requires": { - "vlq": "^0.2.1" + "pify": "^3.0.0" } }, "make-error": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.3.tgz", - "integrity": "sha512-j3dZCri3cCd23wgPqK/0/KvTN8R+W6fXDqQe8BNLbTpONjbA8SPaRr+q0BQq9bx3Q/+g68/gDIh9FW3by702Tg==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", + "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true }, - "matcher-collection": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.0.5.tgz", - "integrity": "sha512-nUCmzKipcJEwYsBVAFh5P+d7JBuhJaW1xs85Hara9xuMLqtCVUrW6DSC0JVIkluxEH2W45nPBM/wjHtBXa/tYA==", + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, "requires": { - "minimatch": "^3.0.2" + "object-visit": "^1.0.0" } }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true }, "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, "requires": { "hash-base": "^3.0.0", - "inherits": "^2.0.1" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - } + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true }, "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" } }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", @@ -5925,100 +6613,177 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true }, "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "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://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true }, "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true }, "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, "requires": { - "mime-db": "~1.30.0" + "mime-db": "~1.37.0" } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz", + "integrity": "sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } }, "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "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": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } }, "mixin-object": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, "requires": { "for-in": "^0.1.3", "is-extendable": "^0.1.1" @@ -6027,215 +6792,385 @@ "for-in": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true } } }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } }, - "mobx": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-3.6.2.tgz", - "integrity": "sha512-Dq3boJFLpZEvuh5a/MbHLUIyN9XobKWIb0dBfkNOJffNkE3vtuY0C9kSDVpfH8BB0BPkVw8g22qCv7d05LEhKg==" - }, - "mobx-angular": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mobx-angular/-/mobx-angular-2.1.1.tgz", - "integrity": "sha1-1eNlOayyABht1aEXCAa0d2uai4g=" + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "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://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "multicast-dns": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", - "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, "requires": { - "dns-packet": "^1.0.1", - "thunky": "^0.1.0" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, "multicast-dns-service-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true }, "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", - "optional": true + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "dev": true }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, "requires": { - "xml-char-classes": "^1.0.0" + "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://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true }, - "ng2-codemirror": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ng2-codemirror/-/ng2-codemirror-1.1.3.tgz", - "integrity": "sha512-aqBTOTCo1poOMKxh1hil4ehCN7NgnaxGKG0Hu6Mwe9ya7yN3SQpPUCznw0kWBdN8ir1esbn13vh8y1bSewim4A==", - "requires": { - "codemirror": "^5.22.2" - } + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true }, - "ng2-dragula": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ng2-dragula/-/ng2-dragula-1.5.0.tgz", - "integrity": "sha512-uSVq66Rv+ZhDLBGYCGZ7mTaseP7rvYJOijiQZlzfy8dxL614Sw7rhtnLqvK8nqa3tI/wVv8CEGZaZkMnWJokwQ==", - "optional": true, + "ng-packagr": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-4.4.0.tgz", + "integrity": "sha512-dLpC/kmQsdbkL96ZclGjNRhq/J4MwpPKwPYNom74lvXqFC2jbbT/fnwmxX9WKXjvE8MEGsg2D2x8MsRURiNscg==", + "dev": true, "requires": { - "dragula": "^3.7.2" - } - }, - "ngx-bootstrap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ngx-bootstrap/-/ngx-bootstrap-2.0.2.tgz", - "integrity": "sha512-4ZTltcStUED2JzI9Hd1+FDaMQmukzbeBSS02hdTvuUJ+9hNtGLMSPGdPNRIniIyItzv3v3emJrAAtKkvOMxyCA==" - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "@ngtools/json-schema": "^1.1.0", + "autoprefixer": "^9.0.0", + "browserslist": "^4.0.0", + "chalk": "^2.3.1", + "chokidar": "^2.0.3", + "clean-css": "^4.1.11", + "commander": "^2.12.0", + "fs-extra": "^7.0.0", + "glob": "^7.1.2", + "injection-js": "^2.2.1", + "less": "^3.8.0", + "less-plugin-npm-import": "^2.1.0", + "node-sass": "^4.9.3", + "node-sass-tilde-importer": "^1.0.0", + "postcss": "^7.0.0", + "postcss-url": "^8.0.0", + "read-pkg-up": "^4.0.0", + "rimraf": "^2.6.1", + "rollup": "^0.66.0", + "rollup-plugin-commonjs": "^9.1.3", + "rollup-plugin-json": "^3.1.0", + "rollup-plugin-node-resolve": "^3.0.0", + "rollup-plugin-sourcemaps": "^0.4.2", + "rxjs": "^6.0.0", + "stylus": "^0.54.5", + "uglify-js": "^3.0.7", + "update-notifier": "^2.3.0" + }, + "dependencies": { + "autoprefixer": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.3.1.tgz", + "integrity": "sha512-DY9gOh8z3tnCbJ13JIWaeQsoYncTGdsrgCceBaQSIL4nvdrLxgbRSBPevg2XbX7u4QCSfLheSJEEIUUSlkbx6Q==", + "dev": true, + "requires": { + "browserslist": "^4.3.3", + "caniuse-lite": "^1.0.30000898", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.5", + "postcss-value-parser": "^3.3.1" + } + }, + "browserslist": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", + "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000899", + "electron-to-chromium": "^1.3.82", + "node-releases": "^1.0.1" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", + "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.5.0" + } + }, + "postcss-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", + "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", + "dev": true, + "requires": { + "mime": "^2.3.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^7.0.2", + "xxhashjs": "^0.2.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, "requires": { "lower-case": "^1.1.1" } }, "node-forge": { - "version": "0.6.33", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", - "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=" + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true }, "node-gyp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", - "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", - "optional": true, + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", "mkdirp": "^0.5.0", "nopt": "2 || 3", "npmlog": "0 || 1 || 2 || 3 || 4", "osenv": "0", - "request": "2", + "request": "^2.87.0", "rimraf": "2", "semver": "~5.3.0", "tar": "^2.0.0", "which": "1" }, "dependencies": { - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "optional": true, - "requires": { - "abbrev": "1" - } - }, "semver": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "optional": true + "dev": true } } }, "node-libs-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, "requires": { "assert": "^1.1.1", - "browserify-zlib": "^0.1.4", + "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": "^1.0.0", - "https-browserify": "0.0.1", - "os-browserify": "^0.2.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "^0.11.0", + "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", - "readable-stream": "^2.0.5", + "readable-stream": "^2.3.3", "stream-browserify": "^2.0.1", - "stream-http": "^2.3.1", - "string_decoder": "^0.10.25", - "timers-browserify": "^2.0.2", + "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.10.3", "vm-browserify": "0.0.4" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true } } }, - "node-modules-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", - "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=" + "node-releases": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.3.tgz", + "integrity": "sha512-ZaZWMsbuDcetpHmYeKWPO6e63pSXLb50M7lJgCbcM2nC/nQC3daNifmtp5a2kp7EWwYfhuvH6zLPWkrF8IiDdw==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } }, "node-sass": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", - "integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=", - "optional": true, + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.10.0.tgz", + "integrity": "sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==", + "dev": true, "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", @@ -6249,19 +7184,26 @@ "lodash.mergewith": "^4.6.0", "meow": "^3.7.0", "mkdirp": "^0.5.1", - "nan": "^2.3.2", - "node-gyp": "^3.3.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", "npmlog": "^4.0.0", - "request": "^2.79.0", - "sass-graph": "^2.1.1", - "stdout-stream": "^1.4.0" + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "optional": true, + "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -6274,23 +7216,33 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "optional": true + "dev": true } } }, + "node-sass-tilde-importer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", + "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", + "dev": true, + "requires": { + "find-parent-dir": "^0.3.0" + } + }, "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1" } }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", @@ -6302,6 +7254,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -6309,23 +7262,46 @@ "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-registry-client": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", + "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, "requires": { "path-key": "^2.0.0" } @@ -6334,6 +7310,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -6342,9 +7319,10 @@ } }, "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, "requires": { "boolbase": "~1.0.0" } @@ -6358,22 +7336,26 @@ "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "object-component": { "version": "0.0.3", @@ -6381,10 +7363,67 @@ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "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://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, "requires": { "for-own": "^0.1.4", "is-extendable": "^0.1.1" @@ -6394,21 +7433,33 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, "requires": { "for-in": "^1.0.1" } } } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "obuf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, "requires": { "ee-first": "1.1.1" } @@ -6416,111 +7467,137 @@ "on-headers": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "dev": true, "requires": { "is-wsl": "^1.1.0" } }, "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/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://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } } }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": 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" + } }, "original": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, "requires": { - "url-parse": "1.0.x" - }, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", - "requires": { - "querystringify": "0.0.x", - "requires-port": "1.0.x" - } - } + "url-parse": "^1.4.3" } }, "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, "requires": { "lcid": "^1.0.0" } }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true }, - "p-limit": { + "p-is-promise": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true }, - "p-locate": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "requires": { "p-limit": "^1.1.0" } @@ -6528,1119 +7605,358 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "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" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true }, - "parse-passwd": { + "p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "patternfly": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/patternfly/-/patternfly-3.41.0.tgz", - "integrity": "sha1-zJajW5b1BGcZRrxWXVi/Olre8Cs=", - "requires": { - "bootstrap": "~3.3.7", - "bootstrap-datepicker": "^1.7.1", - "bootstrap-sass": "^3.3.7", - "bootstrap-select": "^1.12.2", - "bootstrap-slider": "^9.9.0", - "bootstrap-switch": "~3.3.4", - "bootstrap-touchspin": "~3.1.1", - "c3": "~0.4.11", - "d3": "~3.5.17", - "datatables.net": "^1.10.15", - "datatables.net-colreorder": "^1.4.1", - "datatables.net-colreorder-bs": "~1.3.2", - "datatables.net-select": "~1.2.0", - "drmonty-datatables-colvis": "~1.1.2", - "eonasdan-bootstrap-datetimepicker": "^4.17.47", - "font-awesome": "^4.7.0", - "font-awesome-sass": "^4.7.0", - "google-code-prettify": "~1.0.5", - "jquery": "~3.2.1", - "jquery-match-height": "^0.7.2", - "moment": "^2.19.1", - "moment-timezone": "^0.4.1", - "patternfly-bootstrap-combobox": "~1.1.7", - "patternfly-bootstrap-treeview": "~2.1.0" - }, - "dependencies": { - "bootstrap": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", - "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" - }, - "bootstrap-datepicker": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.7.1.tgz", - "integrity": "sha1-Tuf680iI2+x4NPv52+fEJ34B3a8=", - "optional": true, - "requires": { - "jquery": ">=1.7.1 <4.0.0" - } - }, - "bootstrap-sass": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.3.7.tgz", - "integrity": "sha1-ZZbHq0D2Y3OTMjqwvIDQZPxjBJg=", - "optional": true - }, - "bootstrap-select": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.12.4.tgz", - "integrity": "sha1-fxXTwM6XiGjZwJxw+WYk9V+gLuE=", - "optional": true, - "requires": { - "jquery": ">=1.8" - } - }, - "bootstrap-slider": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz", - "integrity": "sha1-EQPWvADPv6jPyaJZmrUYxVZD2j8=", - "optional": true - }, - "bootstrap-switch": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/bootstrap-switch/-/bootstrap-switch-3.3.4.tgz", - "integrity": "sha1-cOCusqh3wNx2aZHeEI4hcPwpov8=", - "optional": true - }, - "bootstrap-touchspin": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bootstrap-touchspin/-/bootstrap-touchspin-3.1.1.tgz", - "integrity": "sha1-l3nerHKq9Xfl52K4USx0fIcdlZc=", - "optional": true - }, - "c3": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/c3/-/c3-0.4.18.tgz", - "integrity": "sha512-37TiFeCrbe69gg7SxFpTBOLDwulnk+opKp1AFDi43mONtErpRoUIZfGSimGiSYQmNu6Zh9W2yNOx0066UikqSg==", - "optional": true, - "requires": { - "d3": "~3.5.0" - } - }, - "d3": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", - "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", - "optional": true - }, - "datatables.net": { - "version": "1.10.16", - "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.16.tgz", - "integrity": "sha1-SwUtEIKCQmG2ju2dInQbcR09JGk=", - "requires": { - "jquery": ">=1.7" - } - }, - "datatables.net-bs": { - "version": "1.10.16", - "resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.10.16.tgz", - "integrity": "sha1-sIVPWzdPcTrj20FWx86op2DD3nY=", - "optional": true, - "requires": { - "datatables.net": "1.10.16", - "jquery": ">=1.7" - } - }, - "datatables.net-colreorder": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-1.4.1.tgz", - "integrity": "sha1-OJ5LGidOIDl5o3GNhsWITQoBZrY=", - "optional": true, - "requires": { - "datatables.net": "^1.10.15", - "jquery": ">=1.7" - } - }, - "datatables.net-colreorder-bs": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/datatables.net-colreorder-bs/-/datatables.net-colreorder-bs-1.3.3.tgz", - "integrity": "sha1-Op3LCN7r612FQHlZHgbkk615OlM=", - "optional": true, - "requires": { - "datatables.net-bs": ">=1.10.9", - "datatables.net-colreorder": ">=1.2.0", - "jquery": ">=1.7" - } - }, - "datatables.net-select": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-1.2.3.tgz", - "integrity": "sha1-fCcugXMqQSFOEBtlb1Ul037Dcog=", - "optional": true, - "requires": { - "datatables.net": "^1.10.15", - "jquery": ">=1.7" - } - }, - "drmonty-datatables-colvis": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz", - "integrity": "sha1-lque37SGQ8wu3aP4e4iTPN7oEnw=", - "optional": true, - "requires": { - "jquery": ">=1.7.0" - } - }, - "eonasdan-bootstrap-datetimepicker": { - "version": "4.17.47", - "resolved": "https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz", - "integrity": "sha1-ekmXAEQGUnbnll79Fvgic1IZ5zU=", - "optional": true, - "requires": { - "bootstrap": "^3.3", - "jquery": "^1.8.3 || ^2.0 || ^3.0", - "moment": "^2.10", - "moment-timezone": "^0.4.0" - } - }, - "font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" - }, - "font-awesome-sass": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome-sass/-/font-awesome-sass-4.7.0.tgz", - "integrity": "sha1-TtppPpFQCc4Asijglk3F7Km8NOE=", - "optional": true - }, - "google-code-prettify": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/google-code-prettify/-/google-code-prettify-1.0.5.tgz", - "integrity": "sha1-n0d/Ik2/piNy5e+AOn4VdBBAAIQ=", - "optional": true - }, - "jquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" - }, - "jquery-match-height": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/jquery-match-height/-/jquery-match-height-0.7.2.tgz", - "integrity": "sha1-+NnzulMU2qsQnPB0CGdL4gS+Xw4=", - "optional": true - }, - "moment": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", - "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" - }, - "moment-timezone": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz", - "integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=", - "optional": true, - "requires": { - "moment": ">= 2.6.0" - } - }, - "patternfly-bootstrap-combobox": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/patternfly-bootstrap-combobox/-/patternfly-bootstrap-combobox-1.1.7.tgz", - "integrity": "sha1-al48zRFwwhs8S0qhaKdBPh3btuE=", - "optional": true - }, - "patternfly-bootstrap-treeview": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/patternfly-bootstrap-treeview/-/patternfly-bootstrap-treeview-2.1.5.tgz", - "integrity": "sha1-TCnyWC+4ovKPCpKPLw0yTSHWmQ0=", - "optional": true, - "requires": { - "bootstrap": "3.3.x", - "jquery": ">= 2.1.x" - } - } - } - }, - "patternfly-ng": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/patternfly-ng/-/patternfly-ng-3.3.4.tgz", - "integrity": "sha512-h5rbauuxTRN5JBMtQuTr/N6MD3dtXEFG+gBUL9RXKzhAhap3p7KVnFJLXV9pUe1Tvk5fZPecS6HkRxbRTRJQ7g==", - "requires": { - "@swimlane/ngx-datatable": "^11.1.7", - "angular-tree-component": "^6.0.0 || ^7.0.0", - "c3": "^0.4.15", - "lodash": "^4.17.4", - "ng2-dragula": "^1.5.0", - "ngx-bootstrap": "^1.8.0 || ^2.0.0", - "patternfly": "^3.28.0" - } - }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "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" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "phantomjs-prebuilt": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.15.tgz", - "integrity": "sha1-IPhugtM0nFBZF1J3RbekEeCLOQM=", + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { - "es6-promise": "~4.0.3", - "extract-zip": "~1.6.5", - "fs-extra": "~1.0.0", - "hasha": "~2.2.0", - "kew": "~0.7.0", - "progress": "~1.1.8", - "request": "~2.81.0", - "request-progress": "~2.0.1", - "which": "~1.2.10" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "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", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", - "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - } - } - }, - "postcss": { - "version": "5.2.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/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" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "requires": { - "postcss": "^5.0.14" - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "requires": { - "postcss": "^5.0.4" - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "requires": { - "postcss": "^5.0.14" - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "requires": { - "postcss": "^5.0.16" - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - } - }, - "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", - "requires": { - "postcss": "^5.0.4", - "uniqid": "^4.0.0" - } - }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" - } - }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", - "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" - } - }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", - "requires": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" - } - }, - "postcss-loader": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-1.3.3.tgz", - "integrity": "sha1-piHqH6KQYqg5cqRvVEhncTAZFus=", - "requires": { - "loader-utils": "^1.0.2", - "object-assign": "^4.1.1", - "postcss": "^5.2.15", - "postcss-load-config": "^1.2.0" - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "requires": { - "postcss": "^5.0.4" - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" + "no-case": "^2.2.0" } }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "parse-asn1": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, "requires": { - "postcss": "^6.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" }, "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.12.tgz", - "integrity": "sha512-K6SLofXEK43FBSyZ6/ExQV7ji24OEw4tEY6x1CAf7+tcoMWJoO24Rf3rVFVpk+5IQL1e1Cy3sTKfg7hXuLzafg==", - "requires": { - "chalk": "^2.1.0", - "source-map": "^0.5.7", - "supports-color": "^4.4.0" - } + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, "requires": { - "has-flag": "^2.0.0" + "is-extglob": "^1.0.0" } } } }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.12.tgz", - "integrity": "sha512-K6SLofXEK43FBSyZ6/ExQV7ji24OEw4tEY6x1CAf7+tcoMWJoO24Rf3rVFVpk+5IQL1e1Cy3sTKfg7hXuLzafg==", - "requires": { - "chalk": "^2.1.0", - "source-map": "^0.5.7", - "supports-color": "^4.4.0" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "^2.0.0" - } - } + "error-ex": "^1.2.0" } }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.12.tgz", - "integrity": "sha512-K6SLofXEK43FBSyZ6/ExQV7ji24OEw4tEY6x1CAf7+tcoMWJoO24Rf3rVFVpk+5IQL1e1Cy3sTKfg7hXuLzafg==", - "requires": { - "chalk": "^2.1.0", - "source-map": "^0.5.7", - "supports-color": "^4.4.0" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "^2.0.0" - } - } + "better-assert": "~1.0.0" } }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "postcss": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.12.tgz", - "integrity": "sha512-K6SLofXEK43FBSyZ6/ExQV7ji24OEw4tEY6x1CAf7+tcoMWJoO24Rf3rVFVpk+5IQL1e1Cy3sTKfg7hXuLzafg==", - "requires": { - "chalk": "^2.1.0", - "source-map": "^0.5.7", - "supports-color": "^4.4.0" - } - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "^2.0.0" - } - } + "better-assert": "~1.0.0" } }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, "requires": { - "postcss": "^5.0.5" + "pify": "^3.0.0" } }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" + "pinkie": "^2.0.0" } }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "find-up": "^2.1.0" } }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "portfinder": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.19.tgz", + "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==", + "dev": true, "requires": { - "postcss": "^5.0.4" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" } }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "postcss-import": { + "version": "11.1.0", + "resolved": "http://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", + "dev": true, "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" } }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "postcss-load-config": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", + "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", + "dev": true, "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" + "cosmiconfig": "^4.0.0", + "import-cwd": "^2.0.0" } }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "postcss-loader": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", + "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", + "dev": true, "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^0.4.0" } }, "postcss-url": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-5.1.2.tgz", - "integrity": "sha1-mLMWW+jVkkccsMqt3iwNH4MvEz4=", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz", + "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", + "dev": true, "requires": { - "directory-encoder": "^0.7.2", - "js-base64": "^2.1.5", - "mime": "^1.2.11", - "minimatch": "^3.0.0", + "mime": "^1.4.1", + "minimatch": "^3.0.4", "mkdirp": "^0.5.0", - "path-is-absolute": "^1.0.0", - "postcss": "^5.0.0" + "postcss": "^6.0.1", + "xxhashjs": "^0.2.1" } }, "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - } + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, "requires": { "renderkid": "^2.0.1", "utila": "~0.4" @@ -7649,54 +7965,70 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, "optional": true, "requires": { "asap": "~2.0.3" } }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, "protractor": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz", - "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.1.tgz", + "integrity": "sha512-ORey5ewQMYiXQxcQohsqEiKYOg/r5yJoJbt0tuROmmgajdg/CA3gTOZNIFJncUVMAJIk5YFqBBLUjKVmQO6tfA==", "dev": true, "requires": { "@types/node": "^6.0.46", "@types/q": "^0.0.32", - "@types/selenium-webdriver": "~2.53.39", - "blocking-proxy": "0.0.5", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", "chalk": "^1.1.3", "glob": "^7.0.3", - "jasmine": "^2.5.3", + "jasmine": "2.8.0", "jasminewd2": "^2.1.0", "optimist": "~0.6.0", "q": "1.4.1", - "saucelabs": "~1.3.0", - "selenium-webdriver": "3.0.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", "source-map-support": "~0.4.0", - "webdriver-js-extender": "^1.0.0", + "webdriver-js-extender": "2.1.0", "webdriver-manager": "^12.0.6" }, "dependencies": { + "@types/node": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.1.tgz", + "integrity": "sha512-lfydm+Ul6buYjF6AmcenFjqVYB+tpNlGlwWLr43J1Cok4ybLQimrM8rdB1MdrjtyWdYRceZNgsAeSRZhFxNajQ==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -7736,22 +8068,27 @@ "pinkie-promise": "^2.0.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "source-map": "^0.5.6" } }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -7759,515 +8096,794 @@ "dev": true }, "webdriver-manager": { - "version": "12.0.6", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz", - "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", + "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", "dev": true, "requires": { - "adm-zip": "^0.4.7", + "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.78.0", + "request": "^2.87.0", "rimraf": "^2.5.2", "semver": "^5.3.0", "xml2js": "^0.4.17" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } } } } }, "proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.5.2" + "ipaddr.js": "1.8.0" } }, "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, "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" + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "q": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true }, "qjobs": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", - "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true }, "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true }, "querystringify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "dev": true }, "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/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://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true } } }, "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, "requires": { "safe-buffer": "^5.1.0" } }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, "requires": { "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" } }, "raw-loader": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=" + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": 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", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } } }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "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" } }, "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" } }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "requires": { - "balanced-match": "^0.4.2" - } - }, "reflect-metadata": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", - "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", + "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", + "dev": true }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true }, "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, "requires": { "is-equal-shallow": "^0.1.3" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, "regexpu-core": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/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" } }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, "regjsgen": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true }, "regjsparser": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, "requires": { "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } } }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", + "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", + "dev": true, "requires": { "css-select": "^1.1.0", - "dom-converter": "~0.1", + "dom-converter": "~0.2", "htmlparser2": "~3.3.0", "strip-ansi": "^3.0.0", - "utila": "~0.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" - } + "utila": "^0.4.0" } }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, "requires": { "is-finite": "^1.0.0" } }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "hawk": "~6.0.2", + "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.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "stringstream": "~0.0.5", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "requires": { - "throttleit": "^1.0.0" + "uuid": "^3.3.2" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "requires": { - "path-parse": "^1.0.5" - } + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true }, - "restore-cursor": { + "resolve-cwd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "resolve-from": "^3.0.0" } }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "rfdc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", + "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "dev": true }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "^7.0.5" } }, "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, "requires": { - "hash-base": "^2.0.0", + "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" + "rollup": { + "version": "0.66.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.66.6.tgz", + "integrity": "sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "*" + } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "rollup-plugin-commonjs": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.2.0.tgz", + "integrity": "sha512-0RM5U4Vd6iHjL6rLvr3lKBwnPsaVml+qxOGaaNUWN1lSq6S33KhITOfHmvxV3z2vy9Mk4t0g4rNlVaJJsNQPWA==", + "dev": true, "requires": { - "is-promise": "^2.1.0" + "estree-walker": "^0.5.2", + "magic-string": "^0.25.1", + "resolve": "^1.8.1", + "rollup-pluginutils": "^2.3.3" + }, + "dependencies": { + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + } } }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + "rollup-plugin-json": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-3.1.0.tgz", + "integrity": "sha512-BlYk5VspvGpjz7lAwArVzBXR60JK+4EKtPkCHouAWg39obk9S61hZYJDBfMK+oitPdoe11i69TlxKlMQNFC/Uw==", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.3.1" + } }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + "rollup-plugin-node-resolve": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", + "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", + "dev": true, + "requires": { + "builtin-modules": "^2.0.0", + "is-module": "^1.0.0", + "resolve": "^1.1.6" + }, + "dependencies": { + "builtin-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", + "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", + "dev": true + } + } }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "rollup-plugin-sourcemaps": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", + "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.0.1", + "source-map-resolve": "^0.5.0" + } + }, + "rollup-pluginutils": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz", + "integrity": "sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA==", + "dev": true, + "requires": { + "estree-walker": "^0.5.2", + "micromatch": "^2.3.11" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, "requires": { - "rx-lite": "*" + "aproba": "^1.1.1" } }, "rxjs": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", - "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", + "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", "requires": { - "symbol-observable": "1.0.1" + "tslib": "^1.9.0" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "sass-graph": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "optional": true, + "dev": true, "requires": { "glob": "^7.0.0", "lodash": "^4.0.0", @@ -8276,59 +8892,49 @@ } }, "sass-loader": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.6.tgz", - "integrity": "sha512-c3/Zc+iW+qqDip6kXPYLEgsAu2lf4xz0EZDplB7EmSUMda12U1sGJPetH55B/j9eu0bTtKzKlNPWWyYC7wFNyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "dev": true, "requires": { - "async": "^2.1.5", - "clone-deep": "^0.3.0", + "clone-deep": "^2.0.1", "loader-utils": "^1.0.1", "lodash.tail": "^4.1.1", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" } }, "saucelabs": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", - "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", "dev": true, "requires": { - "https-proxy-agent": "^1.0.0" + "https-proxy-agent": "^2.2.1" } }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "0.5.8", + "resolved": "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true }, "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "requires": { - "ajv": "^5.0.0" - } - }, - "script-loader": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.1.tgz", - "integrity": "sha512-upPXlUIIRY1o1ba8w8nOLm3ZEndtpczyPmA3HJ4ZdktyMNct3wxj3VTl+0/PENtYSKJdzdVhWrLiHhBIEOiFqg==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, "requires": { - "raw-loader": "~0.5.1" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } }, "scss-tokenizer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "optional": true, + "dev": true, "requires": { "js-base64": "^2.1.8", "source-map": "^0.4.2" @@ -8338,7 +8944,7 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "optional": true, + "dev": true, "requires": { "amdefine": ">=0.0.4" } @@ -8348,15 +8954,16 @@ "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true }, "selenium-webdriver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz", - "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", "dev": true, "requires": { - "adm-zip": "^0.4.7", + "jszip": "^3.1.3", "rimraf": "^2.5.4", "tmp": "0.0.30", "xml2js": "^0.4.17" @@ -8374,17 +8981,28 @@ } }, "selfsigned": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", - "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, "requires": { - "node-forge": "0.6.33" + "node-forge": "0.7.5" } }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } }, "semver-dsl": { "version": "1.0.1", @@ -8395,15 +9013,25 @@ "semver": "^5.3.0" } }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.1", + "depd": "~1.1.2", "destroy": "~1.0.4", - "encodeurl": "~1.0.1", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", @@ -8412,13 +9040,28 @@ "ms": "2.0.0", "on-finished": "~2.3.0", "range-parser": "~1.2.0", - "statuses": "~1.3.1" + "statuses": "~1.4.0" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } } }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -8430,63 +9073,84 @@ } }, "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, "requires": { - "encodeurl": "~1.0.1", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.2", - "send": "0.16.1" + "send": "0.16.2" } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "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://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true }, "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, "requires": { "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", + "kind-of": "^5.0.0", "mixin-object": "^2.0.1" }, "dependencies": { "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "requires": { - "is-buffer": "^1.0.2" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -8494,6 +9158,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -8501,288 +9166,389 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, - "silent-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", - "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", - "requires": { - "debug": "^2.2.0" - } + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true }, - "sntp": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", - "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, "requires": { - "hoek": "4.x.x" + "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://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "socket.io": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "debug": "2.3.3", - "engine.io": "1.8.3", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.3", - "socket.io-parser": "2.3.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "ms": "0.7.2" + "is-descriptor": "^1.0.0" } }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", "dev": true, "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" }, "dependencies": { "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.7.2" + "ms": "2.0.0" } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true } } }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, "socket.io-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", "dev": true, "requires": { "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.3", - "has-binary": "0.1.7", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", + "parseqs": "0.0.5", "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", + "socket.io-parser": "~3.2.0", "to-array": "0.1.4" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.7.2" + "ms": "2.0.0" } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true } } }, "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "version": "3.2.0", + "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", "dev": true, "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" }, "dependencies": { "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.7.1" + "ms": "2.0.0" } }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true } } }, "sockjs": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, "requires": { "faye-websocket": "^0.10.0", - "uuid": "^2.0.2" - }, - "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - } + "uuid": "^3.0.1" } }, "sockjs-client": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", - "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, "requires": { - "debug": "^2.2.0", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", "json3": "^3.3.2", - "url-parse": "^1.1.1" + "url-parse": "^1.4.3" }, "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "faye-websocket": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, "requires": { "websocket-driver": ">=0.5.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/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.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "source-map-loader": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.1.tgz", - "integrity": "sha1-SBJr6SML1H+tBeRqjDwuPS2r5Qc=", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, "requires": { - "async": "^0.9.0", - "loader-utils": "~0.2.2", - "source-map": "~0.1.33" + "async": "^2.5.0", + "loader-utils": "^1.1.0" }, "dependencies": { "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, "requires": { - "amdefine": ">=0.0.4" + "lodash": "^4.17.10" } } } }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "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.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, "requires": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.3.tgz", + "integrity": "sha512-vFrY/x/NdsD7Yc8mpTJXuao9S8lq08Z/kOITHz6b7YbfI9xL8Spe5EvSQUHOI7SbpY8bRPr0U3kKSsPuqEGSfA==", + "dev": true + }, "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "dev": true, "requires": { - "spdx-license-ids": "^1.0.2" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } }, "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "dev": true }, "spdy": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, "requires": { "debug": "^2.6.8", "handle-thing": "^1.2.5", @@ -8793,9 +9559,10 @@ } }, "spdy-transport": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", - "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", + "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", + "dev": true, "requires": { "debug": "^2.6.8", "detect-node": "^2.0.3", @@ -8804,46 +9571,28 @@ "readable-stream": "^2.2.9", "safe-buffer": "^5.0.1", "wbuf": "^1.7.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", + "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -8852,177 +9601,157 @@ "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } }, - "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", - "optional": true, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, "requires": { - "readable-stream": "^2.0.1" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "optional": true, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "is-descriptor": "^0.1.0" } } } }, + "stats-webpack-plugin": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.6.2.tgz", + "integrity": "sha1-LFlJtTHgf4eojm6k3PrFOqjHWis=", + "dev": true, + "requires": { + "lodash": "^4.17.4" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", - "readable-stream": "^2.2.6", + "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -9031,19 +9760,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, "requires": { "is-utf8": "^0.2.0" } }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, "requires": { "get-stdin": "^4.0.1" } @@ -9055,17 +9787,20 @@ "dev": true }, "style-loader": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", - "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", + "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", + "dev": true, "requires": { - "loader-utils": "^1.0.2" + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" } }, "stylus": { "version": "0.54.5", "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, "requires": { "css-parse": "1.7.x", "debug": "*", @@ -9079,6 +9814,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9088,15 +9824,11 @@ "path-is-absolute": "^1.0.0" } }, - "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" - }, "source-map": { "version": "0.1.43", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, "requires": { "amdefine": ">=0.0.4" } @@ -9104,9 +9836,10 @@ } }, "stylus-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.1.tgz", - "integrity": "sha1-d/SzT9Aw0lsmF7z1UT21sHMMQIk=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, "requires": { "loader-utils": "^1.0.2", "lodash.clonedeep": "^4.5.0", @@ -9114,95 +9847,107 @@ } }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" + "has-flag": "^3.0.0" } }, "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true }, "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", + "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "dev": true }, "tar": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "optional": true, + "dev": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", "inherits": "2" } }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, "requires": { - "os-tmpdir": "^1.0.0", - "rimraf": "~2.2.6" + "execa": "^0.7.0" }, "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } } } }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, - "thunky": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", - "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=" + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } }, - "ticky": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ticky/-/ticky-1.0.1.tgz", - "integrity": "sha1-t8+nHnaPHJAAxJe5FRswlHxQ5G0=", - "optional": true + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true }, "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, "requires": { "setimmediate": "^1.0.4" } @@ -9211,6 +9956,7 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -9224,281 +9970,490 @@ "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "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://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } }, "toposort": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.4.tgz", - "integrity": "sha1-qGEHaQy+6MrkOzSdL2AWJQCSTfw=" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true }, "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } }, "ts-node": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", - "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", "dev": true, "requires": { "arrify": "^1.0.0", - "chalk": "^2.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.4.0", - "tsconfig": "^6.0.0", - "v8flags": "^3.0.0", + "source-map-support": "^0.5.6", "yn": "^2.0.0" }, "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, - "tsconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, "tsickle": { - "version": "0.21.6", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.21.6.tgz", - "integrity": "sha1-U7Abl5xcE/2xOvs/uVgXflmRWI0=", + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.32.1.tgz", + "integrity": "sha512-JW9j+W0SaMSZGejIFZBk0AiPfnhljK3oLx5SaqxrJhjlvzFyPml5zqG1/PuScUj6yTe1muEqwk5CnDK0cOZmKw==", + "dev": true, "requires": { + "jasmine-diff": "^0.1.3", "minimist": "^1.2.0", "mkdirp": "^0.5.1", - "source-map": "^0.5.6", - "source-map-support": "^0.4.2" + "source-map": "^0.6.0", + "source-map-support": "^0.5.0" }, "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, "tslib": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", - "integrity": "sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg==" + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tslint": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.8.0.tgz", - "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", + "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", "dev": true, "requires": { "babel-code-frame": "^6.22.0", "builtin-modules": "^1.1.1", - "chalk": "^2.1.0", - "commander": "^2.9.0", + "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.7.1", - "tsutils": "^2.12.1" + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + }, + "dependencies": { + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "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://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } } }, - "tsutils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.12.1.tgz", - "integrity": "sha1-9Nlc4zkciXHkblTEzw7bCiHdWyQ=", + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "tslib": "^1.7.1" + "unique-slug": "^2.0.0" } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "imurmurhash": "^0.1.4" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.15" + "crypto-random-string": "^1.0.0" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, - "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" - }, - "uglify-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.2.tgz", - "integrity": "sha512-kKJ8zg7Ivw3DG9Ytgp4+iiSHq3HaHjEQMvyT2x2Bs8kSUwVemj6bPGFp6YWL81f5NAIOLVUKPxBSvqLRGXMpdw==", - "requires": { - "commander": "~2.11.0", - "source-map": "~0.5.1" - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } } }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true } } }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", "dev": true }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, "requires": { - "macaddress": "^0.2.8" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -9507,42 +10462,66 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true } } }, "url-loader": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", - "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, "requires": { - "loader-utils": "^1.0.2", - "mime": "1.3.x" + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" }, "dependencies": { "mime": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", - "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } } } }, "url-parse": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", - "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "dev": true, "requires": { - "querystringify": "~1.0.0", - "requires-port": "1.0.x" - }, - "dependencies": { - "querystringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=" - } + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" } }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "useragent": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", @@ -9562,92 +10541,89 @@ } }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } + "inherits": "2.0.3" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true }, - "v8flags": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", - "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" + "builtins": "^1.0.3" } }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vendors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=" + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "vkbeautify": { - "version": "0.99.3", - "resolved": "https://registry.npmjs.org/vkbeautify/-/vkbeautify-0.99.3.tgz", - "integrity": "sha512-2ozZEFfmVvQcHWoHLNuiKlUfDKlhh4KGsy54U0UrlLMR1SO+XKAIDqBxtBwHgNrekurlJwE8A9K6L49T78ZQ9Q==" - }, - "vlq": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.2.tgz", - "integrity": "sha1-4xbVJXtAuGu0PLjV/qXX9U1rDKE=" - }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, "requires": { "indexof": "0.0.1" } @@ -9658,386 +10634,400 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, - "walk-sync": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.3.2.tgz", - "integrity": "sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ==", - "requires": { - "ensure-posix-path": "^1.0.0", - "matcher-collection": "^1.0.0" - } - }, "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, "requires": { - "async": "^2.1.2", - "chokidar": "^1.7.0", - "graceful-fs": "^4.1.2" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "wbuf": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", - "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, "requires": { "minimalistic-assert": "^1.0.0" } }, - "webcola": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/webcola/-/webcola-3.3.8.tgz", - "integrity": "sha512-WVDTdHS1SaqYCUJGPdbOhqj44mchDyTC78tozUdqJllwYeJ2554+BWkJfc5kNphT8foip2StCMw1FWsIvGmv9w==", + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, "requires": { - "d3-dispatch": "^1.0.3", - "d3-drag": "^1.0.4", - "d3-timer": "^1.0.5" + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" } }, - "webdriver-js-extender": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", - "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", + "webpack": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.4.tgz", + "integrity": "sha512-RqUfwp4qMqv3oFwBQQOoK69C2tdu2FHJEqPABPqgjGDvOIOLqkTOhmmdJjpiRabzNAAH1ahmkA3z4xowlHN+VA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/wasm-edit": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" + } + }, + "webpack-dev-middleware": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", "dev": true, "requires": { - "@types/selenium-webdriver": "^2.53.35", - "selenium-webdriver": "^2.53.2" + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" }, "dependencies": { - "adm-zip": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", - "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz", + "integrity": "sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.18.0", + "import-local": "^2.0.0", + "internal-ip": "^3.0.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^3.4.1", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "3.4.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "sax": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", - "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, - "selenium-webdriver": { - "version": "2.53.3", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", - "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "adm-zip": "0.4.4", - "rimraf": "^2.2.8", - "tmp": "0.0.24", - "ws": "^1.0.1", - "xml2js": "0.4.4" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, - "tmp": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", - "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", - "dev": true + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } }, - "xml2js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", - "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", "dev": true, "requires": { - "sax": "0.6.x", - "xmlbuilder": ">=1.0.0" + "xregexp": "4.0.0" } - } - } - }, - "webpack": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.4.1.tgz", - "integrity": "sha1-TD9PP7MYFVpNsMtqNv8FxWl0GPQ=", - "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^5.1.5", - "ajv-keywords": "^2.0.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "^3.0.0" } }, - "has-flag": { + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, - "load-json-file": { + "lcid": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "path-type": { + "p-limit": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, "requires": { - "pify": "^2.0.0" + "p-try": "^2.0.0" } }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "p-limit": "^2.0.0" } }, - "read-pkg-up": { + "p-try": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { - "has-flag": "^2.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true }, "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", + "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", - "yargs-parser": "^7.0.0" + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" } }, "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, "requires": { "camelcase": "^4.1.0" } } } }, - "webpack-dev-middleware": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", - "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", - "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.3.4", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.1.tgz", - "integrity": "sha1-oC5yaoe7YD211xq7fW0mSb8Qx2k=", + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^1.6.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "del": "^3.0.0", - "express": "^4.13.3", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.17.4", - "internal-ip": "^1.2.0", - "opn": "4.0.2", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", - "sockjs": "0.3.18", - "sockjs-client": "1.1.2", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.0", - "supports-color": "^3.1.1", - "webpack-dev-middleware": "^1.11.0", - "yargs": "^6.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/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" - } - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "requires": { - "camelcase": "^3.0.0" - } - } + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" } }, "webpack-merge": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.0.tgz", - "integrity": "sha1-atciI7PguDflMeRZfBmfkJNhUR4=", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", + "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", + "dev": true, "requires": { - "lodash": "^4.17.4" + "lodash": "^4.17.5" } }, "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, "requires": { "source-list-map": "^2.0.0", - "source-map": "~0.5.3" + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.0.tgz", + "integrity": "sha512-qR2AwKMOjqOSsk4cTuZlRjYXfvAo7/FreL44AG5R5Vn7qHAE78BOdbPPVk9fZonMIiSKYQsIO2aC61JVJC60AQ==", + "dev": true, + "requires": { + "webpack-sources": "^1.3.0" } }, "websocket-driver": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, "requires": { "http-parser-js": ">=0.4.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz", - "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=" + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true }, "when": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", - "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=" - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -10045,108 +11035,118 @@ "which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true }, "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^2.1.1" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^3.0.0" } } } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", - "dev": true - }, - "x2js": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/x2js/-/x2js-3.2.1.tgz", - "integrity": "sha512-+6gQGmMKbAHmapedjI/r+cPQNdFqQ0OE1VJvv3A6GPVlEJAsFq9JyNVgfwgnceMiUtpt38VOUEtEF7S3SxZkMQ==", + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, "requires": { - "xmldom": "^0.1.19" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=" + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true }, "xml2js": { "version": "0.4.19", @@ -10156,45 +11156,66 @@ "requires": { "sax": ">=0.6.0", "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } } }, "xmlbuilder": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", - "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=", + "version": "9.0.7", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" - }, "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", "dev": true }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yargs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "optional": true, + "dev": true, "requires": { "camelcase": "^3.0.0", "cliui": "^3.2.0", @@ -10215,27 +11236,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true } } }, @@ -10243,7 +11250,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "optional": true, + "dev": true, "requires": { "camelcase": "^3.0.0" }, @@ -10252,19 +11259,10 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "optional": true + "dev": true } } }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", @@ -10278,9 +11276,9 @@ "dev": true }, "zone.js": { - "version": "0.8.20", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.20.tgz", - "integrity": "sha512-FXlA37ErSXCMy5RNBcGFgCI/Zivqzr0D19GuvDxhcYIJc7xkFp6c29DKyODJu0Zo+EMyur/WPPgcBh1EHjB9jA==" + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", + "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==" } } } diff --git a/ui/package.json b/ui/package.json index 0b4afdc6..212b0121 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,65 +1,55 @@ { - "name": "beetle-studio", + "name": "ui", "version": "0.0.0", - "license": "MIT", "scripts": { "ng": "ng", + "start": "ng serve", "build": "ng build", - "start": "./start.sh", + "build_lib": "ng build beetle-lib", + "npm_pack": "cd dist/beetle-lib && npm pack", + "package": "npm run build_lib && npm run npm_pack", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e" }, "private": true, "dependencies": { - "@angular/animations": "^4.4.6", - "@angular/cli": "1.3.2", - "@angular/common": "^4.4.6", - "@angular/compiler": "^4.4.6", - "@angular/compiler-cli": "^4.4.6", - "@angular/core": "^4.4.6", - "@angular/forms": "^4.4.6", - "@angular/http": "^4.4.6", - "@angular/language-service": "^4.4.6", - "@angular/platform-browser": "^4.4.6", - "@angular/platform-browser-dynamic": "^4.4.6", - "@angular/router": "^4.4.6", - "angular-tree-component": "^7.1.0", - "core-js": "^2.5.3", - "d3": "^5.5.0", - "express": "^4.16.2", - "file-saver": "1.3.3", - "lodash": "^4.17.10", - "ng2-codemirror": "^1.1.3", - "ngx-bootstrap": "^2.0.2", - "osenv": "^0.1.5", - "patternfly": "^3.41.0", - "patternfly-ng": "3.3.4", - "rxjs": "^5.5.6", - "vkbeautify": "^0.99.3", - "webcola": "^3.3.8", - "x2js": "^3.2.1", - "zone.js": "^0.8.20" + "@angular/animations": "^6.1.0", + "@angular/common": "^6.1.0", + "@angular/compiler": "^6.1.0", + "@angular/core": "^6.1.0", + "@angular/forms": "^6.1.0", + "@angular/http": "^6.1.0", + "@angular/platform-browser": "^6.1.0", + "@angular/platform-browser-dynamic": "^6.1.0", + "@angular/router": "^6.1.0", + "core-js": "^2.5.4", + "rxjs": "~6.2.0", + "zone.js": "~0.8.26" }, "devDependencies": { - "@types/d3": "^5.0.0", - "@types/jasmine": "~2.5.53", - "@types/jasminewd2": "~2.0.2", - "@types/node": "^6.0.101", - "codelyzer": "~4.0.0", - "jasmine-core": "~2.8.0", - "jasmine-spec-reporter": "~4.1.0", - "karma": "~1.7.0", + "@angular-devkit/build-angular": "~0.8.0", + "@angular-devkit/build-ng-packagr": "~0.8.0", + "@angular/cli": "~6.2.7", + "@angular/compiler-cli": "^6.1.0", + "@angular/language-service": "^6.1.0", + "@types/jasmine": "~2.8.8", + "@types/jasminewd2": "~2.0.3", + "@types/node": "~8.9.4", + "codelyzer": "~4.3.0", + "jasmine-core": "~2.99.1", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~3.0.0", "karma-chrome-launcher": "~2.2.0", - "karma-cli": "~1.0.1", - "karma-coverage-istanbul-reporter": "^1.4.1", - "karma-jasmine": "^1.1.1", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~1.1.2", "karma-jasmine-html-reporter": "^0.2.2", - "karma-junit-reporter": "^1.2.0", - "karma-phantomjs-launcher": "^1.0.4", - "protractor": "~5.1.2", - "ts-node": "~3.2.0", - "tslint": "~5.8.0", - "typescript": "~2.6.2" + "ng-packagr": "^4.1.0", + "protractor": "~5.4.0", + "ts-node": "~7.0.0", + "tsickle": ">=0.29.0", + "tslib": "^1.9.0", + "tslint": "~5.11.0", + "typescript": "~2.9.2" } } diff --git a/ui/pom.xml b/ui/pom.xml deleted file mode 100644 index 37c9bc70..00000000 --- a/ui/pom.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - org.teiid - komodo-parent - 0.0.5-SNAPSHOT - ../pom.xml - - - - - 4.0.0 - beetle-studio - Web tooling supporting the Teiid project. - BeETLe Studio - war - 0.0.5-SNAPSHOT - - - - - - - Mark Drilling - mdrillin - mdrillin@redhat.com - Red Hat - - Project Lead - Developer - - -6 - - - Dan Florian - elvisisking - dflorian@redhat.com - Red Hat - - Developer - - -6 - - - Ted Jones - tejones - tejones@redhat.com - Red Hat - - Developer - - -6 - - - - - - - - ${basedir}/target/copy-src - yyyy-MM-dd HH:mm:ss - UTF-8 - ${maven.build.timestamp} - 1.5.0 - 1.8 - 3.0.0 - 3.5.1 - 2.7 - 2.6 - beetle-studio - - - - - - - ${finalName} - - - - - maven-resources-plugin - org.apache.maven.plugins - ${version.maven-resources-plugin} - - - copy-angular-sources - validate - - copy-resources - - - ${target.src.dir} - - - ${basedir} - - **/* - - - **/node_modules/** - - - - - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - ${version.maven-antrun-plugin} - - - chmod-ng-cmd - process-resources - - run - - - - run chmod in ${basedir} - - - - - - - - - - exec-maven-plugin - org.codehaus.mojo - ${version.exec-maven-plugin} - - - npm-install - - exec - - generate-resources - - npm - - install - - ${target.src.dir} - - - - - - - - - angular-cli-build - - exec - - compile - - node_modules/@angular/cli/bin/ng - - build - --prod - --bh - ./ - - ${target.src.dir} - - - - - - karmaTest - - exec - - test - - ng - - test - - ${target.src.dir} - - - - - - - - maven-war-plugin - org.apache.maven.plugins - ${version.maven-war-plugin} - - false - - - ${target.src.dir}/dist - - **/*.* - - - - - - - - diff --git a/ui/projects/beetle-lib/karma.conf.js b/ui/projects/beetle-lib/karma.conf.js new file mode 100644 index 00000000..4c5f8d03 --- /dev/null +++ b/ui/projects/beetle-lib/karma.conf.js @@ -0,0 +1,31 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/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 + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage'), + reports: ['html', 'lcovonly'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/ui/projects/beetle-lib/ng-package.json b/ui/projects/beetle-lib/ng-package.json new file mode 100644 index 00000000..dbbd6092 --- /dev/null +++ b/ui/projects/beetle-lib/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/beetle-lib", + "lib": { + "entryFile": "src/public_api.ts" + } +} \ No newline at end of file diff --git a/ui/projects/beetle-lib/package.json b/ui/projects/beetle-lib/package.json new file mode 100644 index 00000000..6e409631 --- /dev/null +++ b/ui/projects/beetle-lib/package.json @@ -0,0 +1,8 @@ +{ + "name": "beetle-lib", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^6.0.0-rc.0 || ^6.0.0", + "@angular/core": "^6.0.0-rc.0 || ^6.0.0" + } +} \ No newline at end of file diff --git a/ui/projects/beetle-lib/src/lib/beetle-lib.component.spec.ts b/ui/projects/beetle-lib/src/lib/beetle-lib.component.spec.ts new file mode 100644 index 00000000..2552c715 --- /dev/null +++ b/ui/projects/beetle-lib/src/lib/beetle-lib.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BeetleLibComponent } from './beetle-lib.component'; + +describe('BeetleLibComponent', () => { + let component: BeetleLibComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BeetleLibComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BeetleLibComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/ui/projects/beetle-lib/src/lib/beetle-lib.component.ts b/ui/projects/beetle-lib/src/lib/beetle-lib.component.ts new file mode 100644 index 00000000..27cd7bca --- /dev/null +++ b/ui/projects/beetle-lib/src/lib/beetle-lib.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'btl-beetle-lib', + template: ` +

+ beetle-lib works! +

+ `, + styles: [] +}) +export class BeetleLibComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/ui/projects/beetle-lib/src/lib/beetle-lib.module.ts b/ui/projects/beetle-lib/src/lib/beetle-lib.module.ts new file mode 100644 index 00000000..1991f095 --- /dev/null +++ b/ui/projects/beetle-lib/src/lib/beetle-lib.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { BeetleLibComponent } from './beetle-lib.component'; + +@NgModule({ + imports: [ + ], + declarations: [BeetleLibComponent], + exports: [BeetleLibComponent] +}) +export class BeetleLibModule { } diff --git a/ui/projects/beetle-lib/src/lib/beetle-lib.service.spec.ts b/ui/projects/beetle-lib/src/lib/beetle-lib.service.spec.ts new file mode 100644 index 00000000..b88f0426 --- /dev/null +++ b/ui/projects/beetle-lib/src/lib/beetle-lib.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { BeetleLibService } from './beetle-lib.service'; + +describe('BeetleLibService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: BeetleLibService = TestBed.get(BeetleLibService); + expect(service).toBeTruthy(); + }); +}); diff --git a/ui/projects/beetle-lib/src/lib/beetle-lib.service.ts b/ui/projects/beetle-lib/src/lib/beetle-lib.service.ts new file mode 100644 index 00000000..1d074843 --- /dev/null +++ b/ui/projects/beetle-lib/src/lib/beetle-lib.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class BeetleLibService { + + constructor() { } +} diff --git a/ui/projects/beetle-lib/src/public_api.ts b/ui/projects/beetle-lib/src/public_api.ts new file mode 100644 index 00000000..296c3412 --- /dev/null +++ b/ui/projects/beetle-lib/src/public_api.ts @@ -0,0 +1,7 @@ +/* + * Public API Surface of beetle-lib + */ + +export * from './lib/beetle-lib.service'; +export * from './lib/beetle-lib.component'; +export * from './lib/beetle-lib.module'; diff --git a/ui/projects/beetle-lib/src/test.ts b/ui/projects/beetle-lib/src/test.ts new file mode 100644 index 00000000..e11ff1c9 --- /dev/null +++ b/ui/projects/beetle-lib/src/test.ts @@ -0,0 +1,22 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'core-js/es7/reflect'; +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/ui/projects/beetle-lib/tsconfig.lib.json b/ui/projects/beetle-lib/tsconfig.lib.json new file mode 100644 index 00000000..89a9991c --- /dev/null +++ b/ui/projects/beetle-lib/tsconfig.lib.json @@ -0,0 +1,32 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2015", + "module": "es2015", + "moduleResolution": "node", + "declaration": true, + "sourceMap": true, + "inlineSources": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "types": [], + "lib": [ + "dom", + "es2015" + ] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/ui/projects/beetle-lib/tsconfig.spec.json b/ui/projects/beetle-lib/tsconfig.spec.json new file mode 100644 index 00000000..16da33db --- /dev/null +++ b/ui/projects/beetle-lib/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/ui/projects/beetle-lib/tslint.json b/ui/projects/beetle-lib/tslint.json new file mode 100644 index 00000000..eff39f53 --- /dev/null +++ b/ui/projects/beetle-lib/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "btl", + "camelCase" + ], + "component-selector": [ + true, + "element", + "btl", + "kebab-case" + ] + } +} diff --git a/ui/server.js b/ui/server.js deleted file mode 100644 index d4854d9c..00000000 --- a/ui/server.js +++ /dev/null @@ -1,31 +0,0 @@ -var express = require("express"); -var bodyParser = require("body-parser"); - -var app = express(); -app.use(bodyParser.json()); - -// Create link to Angular build directory -var distDir = __dirname + "/dist/"; - -// -// Serves all the dist directory as a web application -// -app.use(express.static(distDir)); - -// -// Catch-all route that ensures any paths added to the host -// in the address bar, eg. example.com/dataservices, are passed -// on to the angular app to handle. -// -// Ensures that manually entered addresses are handled by -// angular and express remains a simple passthrough. -// -app.get('*', function (req, res) { - res.sendFile(distDir + '/index.html'); -}); - -// Initialize the app. -var server = app.listen(process.env.PORT || 8080, function () { - var port = server.address().port; - console.log("App now running on port", port); -}); diff --git a/ui/src/app/app-routing.module.ts b/ui/src/app/app-routing.module.ts deleted file mode 100644 index e6757aaa..00000000 --- a/ui/src/app/app-routing.module.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from "@angular/core"; -import { RouterModule } from "@angular/router"; -import { Routes } from "@angular/router"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; -import { environment } from "@environments/environment"; -import { PageNotFoundComponent } from "@shared/page-not-found/page-not-found.component"; - -const appRoutes: Routes = [ - { path: "", redirectTo: environment.homePagePath, pathMatch: "full" }, - { path: ConnectionsConstants.connectionsRootRoute, loadChildren: "@connections/connections.module#ConnectionsModule" }, - { path: DataservicesConstants.dataservicesRootRoute, loadChildren: "@dataservices/dataservices.module#DataservicesModule" }, - { path: "**", component: PageNotFoundComponent }, // always last -]; - -@NgModule({ - imports: [ - RouterModule.forRoot( appRoutes ) - ], - exports: [ - RouterModule - ] -}) -export class AppRoutingModule {} diff --git a/ui/src/app/app.component.html b/ui/src/app/app.component.html index fabc530c..45f99625 100644 --- a/ui/src/app/app.component.html +++ b/ui/src/app/app.component.html @@ -1,3 +1,8 @@ -
- + +
+

+ Welcome to {{ title }}! +

+ Angular Logo
+ diff --git a/ui/src/app/app.component.spec.ts b/ui/src/app/app.component.spec.ts index 4719131d..187cfe91 100644 --- a/ui/src/app/app.component.spec.ts +++ b/ui/src/app/app.component.spec.ts @@ -1,31 +1,31 @@ -import { async, TestBed } from "@angular/core/testing"; -import { RouterTestingModule } from "@angular/router/testing"; -import { AppSettingsService } from "@core/app-settings.service"; -import { CoreModule } from "@core/core.module"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { ModalModule } from "ngx-bootstrap"; -import { AppComponent } from "./app.component"; +import { TestBed, async } from '@angular/core/testing'; +import { AppComponent } from './app.component'; -describe("AppComponent", () => { +describe('AppComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [ CoreModule, RouterTestingModule, ModalModule.forRoot() ], declarations: [ AppComponent ], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService } - ] - }).compileComponents().then(() => { - // nothing to do - }); + }).compileComponents(); })); - it("should create the app", async(() => { - console.log("========== [AppComponent] should be created"); + it('should create the app', () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.debugElement.componentInstance; expect(app).toBeTruthy(); - })); + }); + it(`should have as title 'ui'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('ui'); + }); + + it('should render title in a h1 tag', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('Welcome to ui!'); + }); }); diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts index 3310a076..7c40e4ea 100644 --- a/ui/src/app/app.component.ts +++ b/ui/src/app/app.component.ts @@ -1,32 +1,10 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component } from "@angular/core"; +import { Component } from '@angular/core'; @Component({ - moduleId: module.id, - selector: "app-root", - templateUrl: "./app.component.html", - styleUrls: ["./app.component.css"] + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] }) export class AppComponent { - - constructor() { - // nothing to do - } - + title = 'ui'; } diff --git a/ui/src/app/app.module.ts b/ui/src/app/app.module.ts index a5548801..39793806 100644 --- a/ui/src/app/app.module.ts +++ b/ui/src/app/app.module.ts @@ -1,31 +1,8 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; -import { NgModule } from "@angular/core"; -import { BrowserModule } from "@angular/platform-browser"; -import { RouterModule } from "@angular/router"; -import { AppRoutingModule } from "@app/app-routing.module"; -import { AppComponent } from "@app/app.component"; -import { ConnectionsRoutingModule } from "@connections/connections-routing.module"; -import { ConnectionsModule } from "@connections/connections.module"; -import { CoreModule } from "@core/core.module"; -import { DataservicesRoutingModule } from "@dataservices/dataservices-routing.module"; -import { DataservicesModule } from "@dataservices/dataservices.module"; -import { SharedModule } from "@shared/shared.module"; +import { AppComponent } from './app.component'; +import { BeetleLibModule } from '../../projects/beetle-lib/src/lib/beetle-lib.module'; @NgModule({ declarations: [ @@ -33,14 +10,7 @@ import { SharedModule } from "@shared/shared.module"; ], imports: [ BrowserModule, - ConnectionsModule, - CoreModule, - DataservicesModule, - RouterModule, - SharedModule, - ConnectionsRoutingModule, - DataservicesRoutingModule, - AppRoutingModule // last so its routes are check after all other routes + BeetleLibModule ], providers: [], bootstrap: [AppComponent] diff --git a/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.css b/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.css deleted file mode 100644 index 4f30547f..00000000 --- a/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.css +++ /dev/null @@ -1,30 +0,0 @@ -.add-connection-form { - padding: 15px -} - -.add-connection-form /*.form-instructions*/ { - font-size: 15px; - padding-top: 10px -} - -.add-connection-form .form-instructions ol { - padding-left: 20px; -} - -.wizard-pf-failed-icon { - color: #9c3535; - font-size: 67px; - line-height: 67px; -} - -.modal-header { - background-color: #fff; -} - -.wizard-pf-body { - background: var(--page-background-color); -} - -.wizard-pf-steps-indicator { - border-top: 0; -} diff --git a/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.html b/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.html deleted file mode 100644 index fe8a7cbd..00000000 --- a/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - -
-
-
- -
-
-

- - Step Initialization Error -

-
-
-

- Could not load the connection types. Please Try relaunching the wizard or check the console log. -

-
-
-

{{ step1InstructionMessage }}

- - -
- - - - - - - -
-
-
-
- - -
-
-

{{ step2InstructionMessage }}

-
-
- -
- -
{{ nameValidationError }}
-
-
-
- -
- -
-
-
- -
- -
-
- -
-
-
- -
- -
{{ selectServiceCatalogSourceErrorMsg }}
-
-
- -
-
-
-
-
- - -
- -
-
-

{{ finalPageTitle }}

-

{{ finalPageMessage }}

-
- -
-
-

{{ finalPageTitle }}

-

{{ finalPageMessage }}

- View All Connections -
- -
-
-

{{ finalPageTitle }}

-
- {{ finalPageMessage }} -
-
{{ errorDetails }}
-
-
-
-
-
-
diff --git a/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.spec.ts b/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.spec.ts deleted file mode 100644 index 078e0877..00000000 --- a/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { RouterTestingModule } from "@angular/router/testing"; -import { ConnectionTypeCardComponent } from "@connections/connection-type-cards/connection-type-card/connection-type-card.component"; -import { ConnectionTypeCardsComponent } from "@connections/connection-type-cards/connection-type-cards.component"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { CoreModule } from "@core/core.module"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { PropertyFormPropertyComponent } from "@shared/property-form/property-form-property/property-form-property.component"; -import { PropertyFormComponent } from "@shared/property-form/property-form.component"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule } from "patternfly-ng"; -import { AddConnectionWizardComponent } from "./add-connection-wizard.component"; -import { SelectionService } from "@core/selection.service"; - -describe("AddConnectionWizardComponent", () => { - let component: AddConnectionWizardComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - CoreModule, - FormsModule, - ReactiveFormsModule, - RouterTestingModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule - ], - declarations: [ AddConnectionWizardComponent, PropertyFormComponent, PropertyFormPropertyComponent, - ConnectionTypeCardComponent, ConnectionTypeCardsComponent ], - providers: [ - SelectionService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: ConnectionService, useClass: MockConnectionService }, - NotifierService, - { provide: VdbService, useClass: MockVdbService } - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AddConnectionWizardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [AddConnectionWizardComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.ts b/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.ts deleted file mode 100644 index 34069984..00000000 --- a/ui/src/app/connections/add-connection-wizard/add-connection-wizard.component.ts +++ /dev/null @@ -1,624 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - Component, - OnInit, - ViewChild, - ViewEncapsulation, -} from "@angular/core"; - -import { FormControl, FormGroup } from "@angular/forms"; -import { AbstractControl } from "@angular/forms"; -import { Router } from "@angular/router"; -import { ConnectionType } from "@connections/shared/connection-type.model"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { NewConnection } from "@connections/shared/new-connection.model"; -import { ServiceCatalogSource } from "@connections/shared/service-catalog-source.model"; -import { LoggerService } from "@core/logger.service"; -import { NotificationType, WizardEvent } from "patternfly-ng"; -import { WizardStepConfig } from "patternfly-ng"; -import { WizardConfig } from "patternfly-ng"; -import { WizardComponent } from "patternfly-ng"; -import { SelectionService } from "@core/selection.service"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-add-connection-wizard", - templateUrl: "./add-connection-wizard.component.html", - styleUrls: ["./add-connection-wizard.component.css"] -}) -export class AddConnectionWizardComponent implements OnInit { - public readonly connectionSummaryLink: string = ConnectionsConstants.connectionsRootPath; - public emptyServiceCatalogSource = new ServiceCatalogSource(); // a bogus service catalog source used in drop down to give instructions - public readonly selectServiceCatalogSourceErrorMsg = "A service catalog source must be selected"; - - // Wizard Config - public wizardConfig: WizardConfig; - - public connectionBasicPropertyForm: FormGroup; - public createComplete = true; - public createSuccessful = false; - public connectionTypesLoading = true; - public connectionTypesLoadSuccess = false; - public serviceCatalogSourcesLoading = true; - public serviceCatalogSourcesLoadSuccess = false; - public nameValidationError = ""; - public selectedServiceCatalogSource: ServiceCatalogSource; - - // Wizard Step 1 - public step1Config: WizardStepConfig; - - // Wizard Step 2 - public step2Config: WizardStepConfig; - public step2aConfig: WizardStepConfig; - public step2bConfig: WizardStepConfig; - public noSourcesNotificationDismissable = false; - public noSourcesNotificationHeader = "No Sources Available"; - public noSourcesNotificationMessage = "No Sources of the correct type to select. "; - public noSourcesNotificationType = NotificationType.DANGER; - - @ViewChild("wizard") public wizard: WizardComponent; - - private connectionService: ConnectionService; - private selectionService: SelectionService; - private selectedConnTypes: ConnectionType[] = []; - private connTypes: ConnectionType[] = []; - private serviceCatSources: ServiceCatalogSource[] = []; - private logger: LoggerService; - private router: Router; - private errorDetailMessage: string; - private theFinalPageTitle = ""; - private theFinalPageMessage = ""; - - constructor( router: Router, connectionService: ConnectionService, - selectionService: SelectionService, logger: LoggerService ) { - this.connectionService = connectionService; - this.selectionService = selectionService; - this.router = router; - this.logger = logger; - this.emptyServiceCatalogSource.setId( " -- select catalog source -- " ); - this.selectedServiceCatalogSource = this.emptyServiceCatalogSource; - this.createConnectionBasicPropertyForm(); - } - - /* - * Initialization - */ - public ngOnInit(): void { - // Step 1 - Basic Properties - this.step1Config = { - id: "step1", - priority: 0, - title: "Connection Type", - allowClickNav: false - } as WizardStepConfig; - - // Step 3 - Review and Create - this.step2Config = { - id: "step2", - priority: 0, - title: "Connection Definition", - allowClickNav: false - } as WizardStepConfig; - this.step2aConfig = { - id: "step2a", - priority: 0, - title: "Define", - allowClickNav: false - } as WizardStepConfig; - this.step2bConfig = { - id: "step2b", - priority: 1, - title: "Review", - allowClickNav: false - } as WizardStepConfig; - - // Wizard Configuration - this.wizardConfig = { - embedInPage: true, - loadingTitle: "Add Connection Wizard loading", - loadingSecondaryInfo: "Please wait for the wizard to finish loading...", - contentHeight: "500px", - done: false - } as WizardConfig; - - // Load the available connection types for the first step - this.connTypes = this.connectionService.getConnectionTypes(); - this.connectionTypesLoadSuccess = true; - this.connectionTypesLoading = false; - - // Select connection type if editing - if ( this.selectionService.hasSelectedConnection ) { - const selectedConnection = this.selectionService.getSelectedConnection(); - const connType = selectedConnection.getDriverName(); - for (const cType of this.connectionTypes) { - if (connType === cType.getName()) { - this.onConnectionTypeSelected(cType); - break; - } - } - } - } - - // ---------------- - // Public Methods - // ---------------- - - public handleNameChanged( input: AbstractControl ): void { - const self = this; - - this.connectionService.isValidName( input.value ).subscribe( - ( errorMsg ) => { - if ( errorMsg ) { - // only update if error has changed - if ( errorMsg !== self.nameValidationError ) { - self.nameValidationError = errorMsg; - } - } else { // name is valid - self.nameValidationError = ""; - } - self.updatePage2ValidStatus(); - }, - ( error ) => { - self.logger.error( "[handleNameChanged] Error: %o", error ); - } ); - } - - /* - * Return the name valid state - */ - public get nameValid(): boolean { - if ( this.selectionService.hasSelectedConnection ) { - return true; - } - return this.nameValidationError == null || this.nameValidationError.length === 0; - } - - /** - * Handles service catalog source change - * @param {string} newValue the new serviceCatalog source - */ - public selectedServiceCatalogSourceChanged( newValue ): void { - this.selectedServiceCatalogSource = this.serviceCatSources.find((src) => src.getId() === newValue); - if (!this.selectedServiceCatalogSource || this.selectedServiceCatalogSource === null) { - this.selectedServiceCatalogSource = this.emptyServiceCatalogSource; - } - this.updatePage2ValidStatus(); - } - - /* - * Determine if there are one or more service catalog sources - */ - public get hasServiceCatalogSources(): boolean { - return this.serviceCatSources.length > 0; - } - - /** - * @returns {boolean} `true` if a service catalog source has been selected - */ - public get hasSelectedServiceCatalogSource(): boolean { - return ( this.selectedServiceCatalogSource != null ) && ( this.selectedServiceCatalogSource !== this.emptyServiceCatalogSource ); - } - - /** - * @returns {boolean} `true` if the serviceCatalogSource is selected, but type is different than - * the selected connection type. - */ - public get serviceCatalogSelectedWrongType(): boolean { - if (!this.hasSelectedServiceCatalogSource) { - return false; - } - const selectedSvcCatSourceType = this.selectedServiceCatalogSource.getType(); - const selectedConnType = this.selectedConnTypes[0]; - - return selectedConnType.getName() !== selectedSvcCatSourceType; - } - - /** - * Gets the Title to be displayed on the final wizard page - * @returns {string} - */ - public get finalPageTitle(): string { - return this.theFinalPageTitle; - } - - /** - * Gets the message to be displayed on the final wizard page - * @returns {string} - */ - public get finalPageMessage(): string { - return this.theFinalPageMessage; - } - - /** - * @returns {string} the error details message - */ - public get errorDetails(): string { - return this.errorDetailMessage; - } - - /* - * Step 1 instruction message - */ - public get step1InstructionMessage(): string { - return "Please select a Connection type"; - } - - /* - * Step 2 instruction message - */ - public get step2InstructionMessage(): string { - if (this.serviceCatSources.length === 0) { - return "No sources available"; - } else if (!this.nameValid) { - return "Please enter a name for the Connection"; - } else if (!this.hasSelectedServiceCatalogSource) { - return "Please select a catalog source for the Connection"; - } else { - if (this.selectionService.hasSelectedConnection) { - return "Review selections. Click Update to update the Connection"; - } else { - return "When finished, click Create to create the Connection"; - } - } - } - - /* - * Return the name error message if invalid - */ - public getConnectionBasicPropertyErrorMessage( name: string ): string { - const control: AbstractControl = this.connectionBasicPropertyForm.controls[name]; - if (control.invalid) { - // The first error found is returned - if (control.errors.required) { - return name + " is a required property"; - } - } - return ""; - } - - /* - * Return the array of ConnectionTypes - */ - public get connectionTypes(): ConnectionType[] { - return this.connTypes; - } - - /* - * Return the currently selected ConnectionType - */ - public get selectedConnectionTypes(): ConnectionType[] { - return this.selectedConnTypes; - } - - /** - * Handles connection type selection - * @param {ConnectionType} connectionType the connection type - */ - public onConnectionTypeSelected(connectionType: ConnectionType): void { - // Only allow one item to be selected - this.selectedConnTypes.shift(); - this.selectedConnTypes.push(connectionType); - // Selecting type clears the serviceCatalog source selection - this.selectedServiceCatalogSource = this.emptyServiceCatalogSource; - this.updatePage1ValidStatus(); - } - - /** - * Handles connection type de-selection - * @param {ConnectionType} connectionType the connection type - */ - public onConnectionTypeDeselected(connectionType: ConnectionType): void { - // Only one item is selected at a time - this.selectedConnTypes.shift(); - } - - /* - * Return the array of ServiceCatalogSources - */ - public get serviceCatalogSources(): ServiceCatalogSource[] { - return this.serviceCatSources; - } - - public nextClicked($event: WizardEvent): void { - // When leaving page 1, load the available service catalog sources for the selected type - if ($event.step.config.id === "step1") { - // load the available catalog sources - this.loadServiceCatalogSources(this.selectedConnTypes[0]); - } - } - - public cancelClicked( ): void { - const link: string[] = [ ConnectionsConstants.connectionsRootPath ]; - this.logger.log("[AddConnectionWizardComponent] Navigating to: %o", link); - this.router.navigate(link).then(() => { - // nothing to do - }); - } - - /* - * Create the Connection via komodo REST interface, - * using the currently entered properties - */ - public createConnection(): void { - this.createComplete = false; - this.createSuccessful = false; - - const connection: NewConnection = new NewConnection(); - - // Connection basic properties - connection.setName(this.connectionName); - connection.setDescription(this.connectionDescription); - connection.setServiceCatalogSource(this.selectedServiceCatalogSource.getId()); - - if (this.selectionService.hasSelectedConnection) { - this.updateDeployConnection(connection); - } else { - this.createDeployConnection(connection); - } - } - - public stepChanged($event: WizardEvent): void { - if ($event.step.config.id === "step1") { - this.wizardConfig.nextTitle = "Next >"; - this.updatePage1ValidStatus(); - } else if ($event.step.config.id === "step2a") { - if (this.selectionService.hasSelectedConnection) { - this.wizardConfig.nextTitle = "Update"; - } else { - this.wizardConfig.nextTitle = "Create"; - } - this.updatePage2ValidStatus(); - } else if ($event.step.config.id === "step2b") { - this.step2Config.nextEnabled = false; - } else { - this.wizardConfig.nextTitle = "Next >"; - } - } - - /** - * @returns {string} the name of the connection - */ - public get connectionName(): string { - return this.connectionBasicPropertyForm.controls["name"].value; - } - - /** - * @returns {string} the description of the connection - */ - public get connectionDescription(): string { - return this.connectionBasicPropertyForm.controls["description"].value; - } - - // ---------------- - // Private Methods - // ---------------- - - /** - * Create the Connection Basic properties form - */ - private createConnectionBasicPropertyForm(): void { - this.connectionBasicPropertyForm = new FormGroup({ - name: new FormControl( "", this.handleNameChanged.bind( this ) ), - description: new FormControl(""), - }); - - // Initialize form values - if (!this.selectionService.hasSelectedConnection) { - this.connectionBasicPropertyForm.controls["name"].setValue(null); - this.connectionBasicPropertyForm.controls["description"].setValue(null); - } else { - const selectedConnection = this.selectionService.getSelectedConnection(); - this.connectionBasicPropertyForm.controls["name"].setValue(selectedConnection.name); - this.connectionBasicPropertyForm.controls["description"].setValue(selectedConnection.getDescription()); - this.connectionBasicPropertyForm.get("name").disable(); - } - - // Responds to basic property changes - updates the page status - this.connectionBasicPropertyForm.valueChanges.subscribe((val) => { - this.updatePage2ValidStatus( ); - }); - } - - /** - * Load the available service catalog sources for the supplied connection type - * @param {ConnectionType} connType the connection type - */ - private loadServiceCatalogSources(connType: ConnectionType): void { - // Load the available service catalog sources for the second step - this.serviceCatalogSourcesLoading = true; - this.serviceCatalogSourcesLoadSuccess = false; - - const self = this; - this.connectionService - .getAllServiceCatalogSources() - .subscribe( - (sources) => { - // Only keep the service catalog sources whose type matches the connectionType. empty source is always included. - self.serviceCatSources = []; - for ( const source of sources ) { - if ( source.getType() === connType.getName() ) { - self.serviceCatSources.push(source); - } - } - - // Create mode - if only one service catalog source available, pre-select it - if (!self.selectionService.hasSelectedConnection && self.serviceCatSources.length === 1) { - self.selectedServiceCatalogSource = self.serviceCatSources[0]; - } - - // Edit mode select the service catalog source - if (self.selectionService.hasSelectedConnection && (!self.hasSelectedServiceCatalogSource || self.serviceCatalogSelectedWrongType)) { - const selectedConnection = self.selectionService.getSelectedConnection(); - const connSvcSourceName = selectedConnection.getServiceCatalogSourceName(); - self.selectedServiceCatalogSource = this.emptyServiceCatalogSource; - for (const svcSource of self.serviceCatSources) { - if (svcSource.getId() === connSvcSourceName) { - self.selectedServiceCatalogSource = svcSource; - break; - } - } - } - - self.updatePage2ValidStatus(); - self.serviceCatalogSourcesLoading = false; - self.serviceCatalogSourcesLoadSuccess = true; - }, - (error) => { - // Creates the connection property form - this.createConnectionBasicPropertyForm(); - - self.logger.error("[AddConnectionWizardComponent] Error getting service catalog sources: %o", error); - self.updatePage2ValidStatus(); - self.serviceCatalogSourcesLoading = false; - self.serviceCatalogSourcesLoadSuccess = false; - } - ); - } - - /** - * Updates the page 1 status - */ - private updatePage1ValidStatus( ): void { - this.step1Config.nextEnabled = this.selectedConnTypes.length > 0; - } - - /** - * Updates the page 2 status - */ - private updatePage2ValidStatus( ): void { - if (!this.step2aConfig) { - return; - } - if (this.selectionService.hasSelectedConnection) { - this.step2aConfig.nextEnabled = this.connectionBasicPropertyForm.valid; - } else { - this.step2aConfig.nextEnabled = this.nameValid && this.hasSelectedServiceCatalogSource; - } - } - - /** - * Creates the workspace connection, binds to serviceCatalogSource, - * and deploys a corresponding connection VDB to teiid. - * @param {Connection} connection the new connection - */ - private createDeployConnection(connection: NewConnection): void { - const self = this; - // flag with selection service that this connection will need schema generated - this.selectionService.setConnectionIdForSchemaRegen(connection.getName()); - this.connectionService - .createDeployConnection(connection) - .subscribe( - (wasSuccess) => { - self.setFinalPageComplete(wasSuccess); - }, - (error) => { - self.logger.error("[AddConnectionWizardComponent] Error creating connection: %o", error); - self.setErrorDetails(error); - self.setFinalPageComplete(false); - } - ); - } - - /** - * Updates the workspace connection, binds to serviceCatalogSource, - * and re-deploys the corresponding connection VDB to teiid. - * @param {Connection} connection the new connection - */ - private updateDeployConnection(connection: NewConnection): void { - const self = this; - this.connectionService - .updateDeployConnection(connection) - .subscribe( - (wasSuccess) => { - self.setFinalPageComplete(wasSuccess); - }, - (error) => { - self.logger.error("[AddConnectionWizardComponent] Error updating connection: %o", error); - self.setErrorDetails(error); - self.setFinalPageComplete(false); - } - ); - } - - /** - * Sets the final page in progress status - */ - private setFinalPageInProgress(): void { - this.createComplete = false; - this.createSuccessful = false; - if (this.selectionService.hasSelectedConnection) { - this.theFinalPageTitle = "Update in progress"; - this.theFinalPageMessage = "The connection is being updated."; - } else { - this.theFinalPageTitle = "Creation in progress"; - this.theFinalPageMessage = "The connection is being created."; - } - this.step2bConfig.nextEnabled = false; - this.step2bConfig.previousEnabled = false; - } - - /** - * Sets the final page completion status - * @param {boolean} wasSuccessful 'true' if the create or update was successful - */ - private setFinalPageComplete(wasSuccessful: boolean): void { - this.createComplete = true; - this.createSuccessful = wasSuccessful; - this.step2bConfig.nextEnabled = false; - this.step2bConfig.previousEnabled = true; - if (wasSuccessful) { - if (this.selectionService.hasSelectedConnection) { - this.theFinalPageTitle = "Update was successful"; - this.theFinalPageMessage = "The connection was updated successfully. Click on the button to see all connections."; - } else { - this.theFinalPageTitle = "Creation was successful"; - this.theFinalPageMessage = "The connection was created successfully. Click on the button to see all connections."; - } - } else { - if (this.selectionService.hasSelectedConnection) { - this.theFinalPageTitle = "Update failed"; - this.theFinalPageMessage = "The connection update failed!"; - } else { - this.theFinalPageTitle = "Creation failed"; - this.theFinalPageMessage = "The connection creation failed!"; - } - } - } - - /** - * Sets the error details for the response - * @param resp the rest call response - */ - private setErrorDetails( resp: any ): void { - // Get the error from the response json - this.errorDetailMessage = ""; - if (resp) { - try { - this.errorDetailMessage = resp.json().error; - } catch ( e ) { - this.errorDetailMessage = resp.text(); - } - } - // Error visible if message has content - if (this.errorDetailMessage.length === 0) { - this.errorDetailMessage = "Please check data virtualization entries and retry"; - } - } -} diff --git a/ui/src/app/connections/add-connection/add-connection.component.css b/ui/src/app/connections/add-connection/add-connection.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/connections/add-connection/add-connection.component.html b/ui/src/app/connections/add-connection/add-connection.component.html deleted file mode 100644 index 5e98f415..00000000 --- a/ui/src/app/connections/add-connection/add-connection.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
-
- -
  • -
  • -
    -
    -
    -
    -

    Add Connection

    -
    - -
    - -
    -
    -
    - diff --git a/ui/src/app/connections/add-connection/add-connection.component.spec.ts b/ui/src/app/connections/add-connection/add-connection.component.spec.ts deleted file mode 100644 index 90595665..00000000 --- a/ui/src/app/connections/add-connection/add-connection.component.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { RouterTestingModule } from "@angular/router/testing"; -import { AddConnectionWizardComponent } from "@connections/add-connection-wizard/add-connection-wizard.component"; -import { ConnectionTypeCardComponent } from "@connections/connection-type-cards/connection-type-card/connection-type-card.component"; -import { ConnectionTypeCardsComponent } from "@connections/connection-type-cards/connection-type-cards.component"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { CoreModule } from "@core/core.module"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { SharedModule } from "@shared/shared.module"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule } from "patternfly-ng"; -import { AddConnectionComponent } from "./add-connection.component"; -import { SelectionService } from "@core/selection.service"; - -describe("AddConnectionComponent", () => { - let component: AddConnectionComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - CoreModule, - FormsModule, - ReactiveFormsModule, - RouterTestingModule, - SharedModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule - ], - declarations: [ AddConnectionComponent, AddConnectionWizardComponent, - ConnectionTypeCardComponent, ConnectionTypeCardsComponent ], - providers: [ - NotifierService, - SelectionService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: ConnectionService, useClass: MockConnectionService }, - { provide: VdbService, useClass: MockVdbService } - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AddConnectionComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [AddConnectionComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/connections/add-connection/add-connection.component.ts b/ui/src/app/connections/add-connection/add-connection.component.ts deleted file mode 100644 index 947a782d..00000000 --- a/ui/src/app/connections/add-connection/add-connection.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnInit } from "@angular/core"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; - -@Component({ - selector: "app-add-connection-page", - templateUrl: "./add-connection.component.html", - styleUrls: ["./add-connection.component.css"] -}) -export class AddConnectionComponent implements OnInit { - - public readonly connectionsLink = ConnectionsConstants.connectionsRootPath; - - public pageError: any = ""; - - constructor() { - // Nothing - } - - public ngOnInit(): void { - // Nothing - } - -} diff --git a/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.css b/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.css deleted file mode 100644 index 9080c320..00000000 --- a/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.css +++ /dev/null @@ -1,5 +0,0 @@ -/* Since no body on card get rid of margin */ -.object-card-selected .card-pf .card-pf-body, -.object-card .card-pf .card-pf-body { - margin: 0; -} diff --git a/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.html b/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.html deleted file mode 100644 index ad20e208..00000000 --- a/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.html +++ /dev/null @@ -1,16 +0,0 @@ - - -
    - {{imageAlt}} -
    -
    - {{ name }} -
    -
    -
    {{ description }}
    -
    -
    -
    diff --git a/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.spec.ts b/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.spec.ts deleted file mode 100644 index f12e2d55..00000000 --- a/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { RouterTestingModule } from "@angular/router/testing"; -import { ConnectionType } from "@connections/shared/connection-type.model"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule } from "patternfly-ng"; -import { ConnectionTypeCardComponent } from "./connection-type-card.component"; - -describe("ConnectionTypeCardComponent", () => { - let component: ConnectionTypeCardComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule - ], - declarations: [ ConnectionTypeCardComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ConnectionTypeCardComponent); - component = fixture.componentInstance; - - const connType = new ConnectionType(); - connType.setName("connType1"); - component.connectionType = connType; - - component.selectedConnectionTypes = []; - fixture.detectChanges(); - }); - - it("should be created", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.ts b/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.ts deleted file mode 100644 index d3cb6f56..00000000 --- a/ui/src/app/connections/connection-type-cards/connection-type-card/connection-type-card.component.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from "@angular/core"; -import { CardConfig } from "patternfly-ng"; -import { ConnectionType } from "../../shared/connection-type.model"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-connection-type-card", - templateUrl: "./connection-type-card.component.html", - styleUrls: ["./connection-type-card.component.css"] -}) -export class ConnectionTypeCardComponent implements OnInit { - - @Input() public connectionType: ConnectionType; - @Input() public selectedConnectionTypes: ConnectionType[]; - @Output() public cardEvent: EventEmitter< {} > = new EventEmitter< {} >(); - @Output() public selectEvent: EventEmitter< ConnectionType > = new EventEmitter< ConnectionType >(); - - public cardConfig: CardConfig; - - constructor() { - // nothing to do - } - - public ngOnInit(): void { - this.cardConfig = { - titleBorder: true, - noPadding: true, - topBorder: false - } as CardConfig; - } - - /** - * @returns {string} the ConnectionType name - */ - public get name(): string { - return this.connectionType.getName(); - } - - /** - * @returns {string} the ConnectionType description - */ - public get description(): string { - return this.connectionType.getDescription(); - } - - /** - * @returns {string} the ConnectionType image source - */ - public get imageSrc(): string { - return this.connectionType.getImageSrc(); - } - - /** - * @returns {string} the ConnectionType image alt text - */ - public get imageAlt(): string { - return this.connectionType.getImageAlt(); - } - - /** - * @returns {boolean} `true` if the ConnectionType represented by this card is selected - */ - public isSelected(): boolean { - return this.selectedConnectionTypes.indexOf( this.connectionType ) !== -1; - } - - /** - * An event handler for when the card is clicked. - */ - public onSelect(): void { - this.selectEvent.emit( this.connectionType ); - } - -} diff --git a/ui/src/app/connections/connection-type-cards/connection-type-cards.component.css b/ui/src/app/connections/connection-type-cards/connection-type-cards.component.css deleted file mode 100644 index 8abeffb9..00000000 --- a/ui/src/app/connections/connection-type-cards/connection-type-cards.component.css +++ /dev/null @@ -1,8 +0,0 @@ -.container-cards-pf { - padding: 0; - margin-top: 0; -} - -.row-cards-pf { - padding: 0; -} diff --git a/ui/src/app/connections/connection-type-cards/connection-type-cards.component.html b/ui/src/app/connections/connection-type-cards/connection-type-cards.component.html deleted file mode 100644 index 62bdabb5..00000000 --- a/ui/src/app/connections/connection-type-cards/connection-type-cards.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
    -
    - -
    -
    diff --git a/ui/src/app/connections/connection-type-cards/connection-type-cards.component.spec.ts b/ui/src/app/connections/connection-type-cards/connection-type-cards.component.spec.ts deleted file mode 100644 index caaab9ac..00000000 --- a/ui/src/app/connections/connection-type-cards/connection-type-cards.component.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { RouterTestingModule } from "@angular/router/testing"; -import { ConnectionTypeCardComponent } from "@connections/connection-type-cards/connection-type-card/connection-type-card.component"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule } from "patternfly-ng"; -import { ConnectionTypeCardsComponent } from "./connection-type-cards.component"; - -describe("ConnectionTypeCardsComponent", () => { - let component: ConnectionTypeCardsComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule - ], - declarations: [ ConnectionTypeCardComponent, ConnectionTypeCardsComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ConnectionTypeCardsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/connections/connection-type-cards/connection-type-cards.component.ts b/ui/src/app/connections/connection-type-cards/connection-type-cards.component.ts deleted file mode 100644 index 42a02a65..00000000 --- a/ui/src/app/connections/connection-type-cards/connection-type-cards.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, EventEmitter, Input, Output, ViewEncapsulation } from "@angular/core"; -import { ConnectionType } from "@connections/shared/connection-type.model"; - -@Component({ - moduleId: module.id, - encapsulation: ViewEncapsulation.None, - selector: "app-connection-type-cards", - templateUrl: "./connection-type-cards.component.html", - styleUrls: ["./connection-type-cards.component.css"] -}) - -export class ConnectionTypeCardsComponent { - - @Input() public connectionTypes: ConnectionType[]; - @Input() public selectedConnectionTypes: ConnectionType[]; - @Output() public connectionTypeSelected: EventEmitter = new EventEmitter(); - @Output() public connectionTypeDeselected: EventEmitter = new EventEmitter(); - - /** - * constructor - */ - constructor( ) { - // nothing to do - } - - public isSelected( connectionType: ConnectionType ): boolean { - return this.selectedConnectionTypes.indexOf( connectionType ) !== -1; - } - - public onSelectEvent( connectionType: ConnectionType ): void { - this.connectionTypeSelected.emit( connectionType ); - } - -} diff --git a/ui/src/app/connections/connections-cards/connection-card/connection-card.component.css b/ui/src/app/connections/connections-cards/connection-card/connection-card.component.css deleted file mode 100644 index 248aca9a..00000000 --- a/ui/src/app/connections/connections-cards/connection-card/connection-card.component.css +++ /dev/null @@ -1,23 +0,0 @@ -.card-toolbar .secondary-action[title="Activate"]:before { - color: var(--card-action-icon-color); - content: "\f1eb"; - font-family: "FontAwesome"; -} - -.object-card .list-pf, -.object-card-selected .list-pf { - border: none; -} - -.object-card .list-pf-item, -.object-card-selected .list-pf-item { - border: none; -} - -.object-card .list-pf-item:hover { - background-color: transparent; -} - -.object-card-selected .list-pf-item:hover { - background-color: transparent; -} diff --git a/ui/src/app/connections/connections-cards/connection-card/connection-card.component.html b/ui/src/app/connections/connections-cards/connection-card/connection-card.component.html deleted file mode 100644 index 91dbf8a1..00000000 --- a/ui/src/app/connections/connections-cards/connection-card/connection-card.component.html +++ /dev/null @@ -1,80 +0,0 @@ - - -
    -
    - - -
    - - - - - - - - - - - - -
    - -
    -
    {{ connection.getDescription() }}
    -
    -
    -
    -
    -
    Properties
    -
    -
    - - -
    -
    {{ item[ 0 ] }}
    -
    {{ item[ 1 ] }}
    -
    -
    -
    -
    -
    -
    -
    -
    diff --git a/ui/src/app/connections/connections-cards/connection-card/connection-card.component.spec.ts b/ui/src/app/connections/connections-cards/connection-card/connection-card.component.spec.ts deleted file mode 100644 index 15988489..00000000 --- a/ui/src/app/connections/connections-cards/connection-card/connection-card.component.spec.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { RouterTestingModule } from "@angular/router/testing"; -import { ConnectionStatus } from "@connections/shared/connection-status"; -import { Connection } from "@connections/shared/connection.model"; -import { LoggerService } from "@core/logger.service"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule } from "patternfly-ng"; -import { ConnectionCardComponent } from "./connection-card.component"; - -describe("ConnectionCardComponent", () => { - let component: ConnectionCardComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule - ], - declarations: [ ConnectionCardComponent ], - providers: [ LoggerService ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ConnectionCardComponent); - component = fixture.componentInstance; - - // Create a connection - const connection = new Connection(); - connection.setId( "MyConnection" ); - - // Set a status on the connection - const connStatus = ConnectionStatus.createLoadingStatus("MyConnection"); - connection.setStatus(connStatus); - - component.connection = connection; - component.selectedConnections = [ connection ]; - - fixture.detectChanges(); - }); - - it("should be created", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/connections/connections-cards/connection-card/connection-card.component.ts b/ui/src/app/connections/connections-cards/connection-card/connection-card.component.ts deleted file mode 100644 index 5e59ddc1..00000000 --- a/ui/src/app/connections/connections-cards/connection-card/connection-card.component.ts +++ /dev/null @@ -1,182 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, DoCheck, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from "@angular/core"; -import { Connection } from "@connections/shared/connection.model"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { LoggerService } from "@core/logger.service"; -import { Action, ActionConfig, CardAction, CardConfig, ListConfig } from "patternfly-ng"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-connection-card", - templateUrl: "./connection-card.component.html", - styleUrls: ["./connection-card.component.css"] -}) -export class ConnectionCardComponent implements DoCheck, OnInit { - - public static readonly activateConnectionEvent = "activate"; - public static readonly deleteConnectionEvent = "delete"; - public static readonly editConnectionEvent = "edit"; - - public readonly editEvent = ConnectionCardComponent.editConnectionEvent; - - @Input() public connection: Connection; - @Input() public selectedConnections: Connection[]; - @Output() public cardEvent: EventEmitter< {} > = new EventEmitter< {} >(); - @Output() public selectEvent: EventEmitter< Connection > = new EventEmitter< Connection >(); - - public actionConfig: ActionConfig; - public cardConfig: CardConfig; - public listConfig: ListConfig; - public showDetails = false; - - private readonly activateActionId = "activate"; - private readonly activateActionIndex = 0; // index in moreActions - private readonly deleteActionId = "delete"; - private readonly deleteActionIndex = 1; // index in moreActions - - private isLoading = false; - private logger: LoggerService; - - constructor( logger: LoggerService ) { - this.logger = logger; - } - - private get detailsIconStyle(): string { - return this.showDetails ? "fa fa-close card-footer-action-icon" : "fa fa-angle-right card-footer-action-icon"; - } - - /** - * Event handler for when a toolbar kebab action is clicked. - * @param {Action} action the action that was selected. - */ - public handleAction( action: Action ): void { - if ( action.id === this.activateActionId ) { - this.onClick( ConnectionCardComponent.activateConnectionEvent); - } else if ( action.id === this.deleteActionId ) { - this.onClick( ConnectionCardComponent.deleteConnectionEvent ); - } else { - this.logger.error( "Action '" + action.id + "' not handled." ); - } - } - - /** - * @returns {boolean} `true` if the connection represented by this card is selected - */ - public isSelected(): boolean { - return this.selectedConnections.indexOf( this.connection ) !== -1; - } - - public ngDoCheck(): void { - if ( this.isLoading !== this.connection.isLoading ) { - this.isLoading = this.connection.isLoading; - - this.actionConfig.moreActions[ this.activateActionIndex ].disabled = this.isLoading; - this.actionConfig.moreActions[ this.deleteActionIndex ].disabled = this.isLoading; - } - - this.cardConfig.action.iconStyleClass = this.detailsIconStyle; - } - - /** - * Initializes the ActionConfig, CardConfig, and ListConfig. - */ - public ngOnInit(): void { - this.actionConfig = { - primaryActions: [ - ], - moreActions: [ - { - id: this.activateActionId, - title: "Activate", - tooltip: "Activate" - }, - { - id: this.deleteActionId, - title: "Delete", - tooltip: "Delete" - } - ] - } as ActionConfig; - - this.cardConfig = { - action: { - id: "showDetails", - hypertext: this.showDetailsTitle, - iconStyleClass: this.detailsIconStyle - }, - titleBorder: true, - noPadding: true, - topBorder: false - } as CardConfig; - - this.listConfig = { - dblClick: false, - multiSelect: false, - selectItems: false, - selectedItems: this.selectedConnections, - showCheckbox: false, - useExpandItems: false - } as ListConfig; - } - - /** - * An event handler for when a toolbar action is invoked. - * @param {string} type the type of event being processed - */ - public onClick( type: string ): void { - this.cardEvent.emit( { eventType: type, connectionName: this.connection.getId() } ); - } - - /** - * An event handler for when the card is clicked. - */ - public onSelect(): void { - this.selectEvent.emit( this.connection ); - } - - /** - * An event handler for footer action link. - * @param {CardAction} $event the event being processed - */ - public onShowDetails( $event: CardAction ): void { - this.showDetails = !this.showDetails; - $event.hypertext = this.showDetailsTitle; - } - - /** - * @returns {string[][]} the properties of a connection - */ - public get properties(): string[][] { - const props = [ - [ ConnectionsConstants.jndiNamePropertyLabel, this.connection.getJndiName() ], - [ ConnectionsConstants.driverNamePropertyLabel, this.connection.getDriverName() ], - [ ConnectionsConstants.serviceCatalogSourceNameLabel, this.connection.getServiceCatalogSourceName() ], - ]; - - return props; - } - - /** - * @returns {string} the footer details action text - */ - public get showDetailsTitle(): string { - return this.showDetails ? "Less" : "More"; - } - -} diff --git a/ui/src/app/connections/connections-cards/connections-cards.component.css b/ui/src/app/connections/connections-cards/connections-cards.component.css deleted file mode 100644 index 7932f479..00000000 --- a/ui/src/app/connections/connections-cards/connections-cards.component.css +++ /dev/null @@ -1,4 +0,0 @@ -.connections-container { - height: 90vh; - overflow: auto; -} diff --git a/ui/src/app/connections/connections-cards/connections-cards.component.html b/ui/src/app/connections/connections-cards/connections-cards.component.html deleted file mode 100644 index d706febb..00000000 --- a/ui/src/app/connections/connections-cards/connections-cards.component.html +++ /dev/null @@ -1,8 +0,0 @@ -
    -
    - -
    -
    diff --git a/ui/src/app/connections/connections-cards/connections-cards.component.spec.ts b/ui/src/app/connections/connections-cards/connections-cards.component.spec.ts deleted file mode 100644 index a328495f..00000000 --- a/ui/src/app/connections/connections-cards/connections-cards.component.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { RouterTestingModule } from "@angular/router/testing"; -import { ConnectionCardComponent } from "@connections/connections-cards/connection-card/connection-card.component"; -import { ConnectionsCardsComponent } from "@connections/connections-cards/connections-cards.component"; -import { LoggerService } from "@core/logger.service"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule } from "patternfly-ng"; - -describe("ConnectionsCardsComponent", () => { - let component: ConnectionsCardsComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule - ], - declarations: [ ConnectionCardComponent, ConnectionsCardsComponent ], - providers: [ LoggerService ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ConnectionsCardsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [ConnectionCardsComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/connections/connections-cards/connections-cards.component.ts b/ui/src/app/connections/connections-cards/connections-cards.component.ts deleted file mode 100644 index a10e23ed..00000000 --- a/ui/src/app/connections/connections-cards/connections-cards.component.ts +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, EventEmitter, Input, Output } from "@angular/core"; -import { ConnectionCardComponent } from "@connections/connections-cards/connection-card/connection-card.component"; -import { Connection } from "@connections/shared/connection.model"; -import { LoggerService } from "@core/logger.service"; - -@Component({ - moduleId: module.id, - selector: "app-connections-cards", - templateUrl: "connections-cards.component.html", - styleUrls: ["connections-cards.component.css"] -}) -export class ConnectionsCardsComponent { - - @Input() public connections: Connection[]; - @Input() public selectedConnections: Connection[]; - - @Output() public connectionSelected: EventEmitter = new EventEmitter(); - @Output() public connectionDeselected: EventEmitter = new EventEmitter(); - @Output() public activateConnection: EventEmitter = new EventEmitter(); - @Output() public deleteConnection: EventEmitter = new EventEmitter(); - @Output() public editConnection: EventEmitter = new EventEmitter(); - - public logger: LoggerService; - - /** - * @param {LoggerService} logger the logging service - */ - constructor( logger: LoggerService ) { - this.logger = logger; - } - - public isSelected( connection: Connection ): boolean { - return this.selectedConnections.indexOf( connection ) !== -1; - } - - public onCardEvent( event: { eventType: string, - connectionName: string } ): void { - switch ( event.eventType ) { - case ConnectionCardComponent.deleteConnectionEvent: - this.deleteConnection.emit( event.connectionName ); - break; - case ConnectionCardComponent.activateConnectionEvent: - this.activateConnection.emit( event.connectionName ); - break; - case ConnectionCardComponent.editConnectionEvent: - this.editConnection.emit( event.connectionName ); - break; - default: - this.logger.error( "Unhandled event type of '" + event.eventType + "'" ); - break; - } - } - - public onSelectEvent( connection: Connection ): void { - this.connectionSelected.emit( connection ); - } - -} diff --git a/ui/src/app/connections/connections-list/connection-details.component.html b/ui/src/app/connections/connections-list/connection-details.component.html deleted file mode 100644 index 5b7bfe52..00000000 --- a/ui/src/app/connections/connections-list/connection-details.component.html +++ /dev/null @@ -1,12 +0,0 @@ - - -
    -
    {{ item[ 0 ] }}
    -
    {{ item[ 1 ] }}
    -
    -
    -
    diff --git a/ui/src/app/connections/connections-list/connection-details.component.ts b/ui/src/app/connections/connections-list/connection-details.component.ts deleted file mode 100644 index 1f1e53c7..00000000 --- a/ui/src/app/connections/connections-list/connection-details.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, Input, OnInit, ViewEncapsulation } from "@angular/core"; -import { Connection } from "@connections/shared/connection.model"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { ListConfig } from "patternfly-ng"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-connection-details", - templateUrl: "./connection-details.component.html" -}) -export class ConnectionDetailsComponent implements OnInit { - - public readonly driverLabel = ConnectionsConstants.driverNamePropertyLabel; - public readonly jndiLabel = ConnectionsConstants.jndiNamePropertyLabel; - public readonly serviceCatalogSourceLabel = ConnectionsConstants.serviceCatalogSourceNameLabel; - - @Input() public connection: Connection; - - public listConfig: ListConfig; - - constructor() { - // nothing to do - } - - public ngOnInit(): void { - this.listConfig = { - dblClick: false, - multiSelect: false, - selectItems: false, - showCheckbox: false, - useExpandItems: false - }; - } - - /** - * @returns {string[][]} the properties of a connection - */ - public get properties(): string[][] { - const props = [ - [ ConnectionsConstants.jndiNamePropertyLabel, this.connection.getJndiName() ], - [ ConnectionsConstants.driverNamePropertyLabel, this.connection.getDriverName() ], - [ ConnectionsConstants.serviceCatalogSourceNameLabel, this.connection.getServiceCatalogSourceName() ], - ]; - - return props; - } - -} diff --git a/ui/src/app/connections/connections-list/connections-list.component.css b/ui/src/app/connections/connections-list/connections-list.component.css deleted file mode 100644 index a5408545..00000000 --- a/ui/src/app/connections/connections-list/connections-list.component.css +++ /dev/null @@ -1,10 +0,0 @@ -/* Adds an icon to the left of the activate action item in dropdown of kebab. */ -.object-list .secondary-action[title*="Activate"]:before { - color: var(--card-action-icon-color); - content: "\f1eb"; - font-family: "FontAwesome"; -} - -.connection-details-properties { - padding-left: 40px; -} diff --git a/ui/src/app/connections/connections-list/connections-list.component.html b/ui/src/app/connections/connections-list/connections-list.component.html deleted file mode 100644 index de09212d..00000000 --- a/ui/src/app/connections/connections-list/connections-list.component.html +++ /dev/null @@ -1,53 +0,0 @@ -
    -
    -
    -
    - - -
    - -
    -
    -
    - - - - - {{ item.name }} -
    {{ getDescription(item) }}
    -
    -
    -
    - - - -  {{ action.title }} - - -  {{ action.title }} - - -  {{ action.title }} - - - - - - -
    -
    -
    -
    -
    diff --git a/ui/src/app/connections/connections-list/connections-list.component.spec.ts b/ui/src/app/connections/connections-list/connections-list.component.spec.ts deleted file mode 100644 index e7a5994d..00000000 --- a/ui/src/app/connections/connections-list/connections-list.component.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { RouterTestingModule } from "@angular/router/testing"; -import { ConnectionDetailsComponent } from "@connections/connections-list/connection-details.component"; -import { ConnectionsListComponent } from "@connections/connections-list/connections-list.component"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule -} from "patternfly-ng"; - -describe("ConnectionsListComponent", () => { - let component: ConnectionsListComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule - ], - declarations: [ ConnectionDetailsComponent, ConnectionsListComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ConnectionsListComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [ConnectionsListComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/connections/connections-list/connections-list.component.ts b/ui/src/app/connections/connections-list/connections-list.component.ts deleted file mode 100644 index dec9b139..00000000 --- a/ui/src/app/connections/connections-list/connections-list.component.ts +++ /dev/null @@ -1,187 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, EventEmitter, Input, OnInit, Output, TemplateRef, ViewEncapsulation } from "@angular/core"; -import { Router } from "@angular/router"; -import { Connection } from "@connections/shared/connection.model"; -import { Action, ActionConfig, ListConfig } from "patternfly-ng"; - -@Component({ - moduleId: module.id, - encapsulation: ViewEncapsulation.None, - selector: "app-connections-list", - templateUrl: "connections-list.component.html", - styleUrls: ["connections-list.component.css"] -}) -export class ConnectionsListComponent implements OnInit { - - @Input() public connections: Connection[]; - @Input() public selectedConnections: Connection[]; - - @Output() public connectionDeselected: EventEmitter = new EventEmitter(); - @Output() public connectionSelected: EventEmitter = new EventEmitter(); - @Output() public activateConnection: EventEmitter = new EventEmitter(); - @Output() public deleteConnection: EventEmitter = new EventEmitter(); - @Output() public editConnection: EventEmitter = new EventEmitter(); - - public listConfig: ListConfig; - private router: Router; - - private readonly activateActionId = "activateActionId"; - private readonly deleteActionId = "deleteActionId"; - private readonly editActionId = "editActionId"; - - /** - * Constructor. - */ - constructor(router: Router) { - this.router = router; - } - - /** - * Initializes the list config. - */ - public ngOnInit(): void { - this.listConfig = { - dblClick: false, - multiSelect: false, - selectItems: true, - selectedItems: this.selectedConnections, - selectionMatchProp: "name", - showCheckbox: false, - useExpandItems: true - } as ListConfig; - } - - /** - * Get the ActionConfig properties for each row. - * - * @param connection the connection represented by a row - * @param editActionTemplate {TemplateRef} the edit action template - * @param activateActionTemplate {TemplateRef} the activate action template - * @param deleteActionTemplate {TemplateRef} the delete action template - * @returns {ActionConfig} the actions configuration - */ - public getActionConfig( connection: Connection, - editActionTemplate: TemplateRef< any >, - activateActionTemplate: TemplateRef< any >, - deleteActionTemplate: TemplateRef< any > ): ActionConfig { - const actionConfig = { - primaryActions: [ - { - disabled: connection.isLoading, - id: this.editActionId, - template: editActionTemplate, - title: "Edit", - tooltip: "Edit this connection" - } - ], - moreActions: [ - { - disabled: connection.isLoading, - id: this.activateActionId, - template: activateActionTemplate, - title: "Activate", - tooltip: "Activate this connection" - }, - { - disabled: connection.isLoading, - id: this.deleteActionId, - template: deleteActionTemplate, - title: "Delete", - tooltip: "Delete this connection" - } - ], - moreActionsDisabled: false, - moreActionsVisible: true - } as ActionConfig; - - return actionConfig; - } - - public getDescription( conn: Connection ): string { - const description = conn.getDescription(); - - if ( description && description.length > 120 ) { - return description.slice( 0, 120 ) + " ... "; - } - - return description; - } - - /** - * Event handler for when a toolbar icon or kebab action is clicked. - * @param {Action} action the action that was selected. - * @param item this parameter is not used - */ - public handleAction( action: Action, - item: any ): void { - // first select the connection - this.connectionSelected.emit( item ); - - // now perform action - if ( action.id === this.deleteActionId ) { - this.onDeleteConnection( this.selectedConnections[ 0 ].getId() ); - } else if ( action.id === this.activateActionId ) { - this.onActivateConnection( this.selectedConnections[ 0 ].getId() ); - } else if ( action.id === this.editActionId ) { - this.onEditConnection( this.selectedConnections[ 0 ].getId() ); - } - } - - /** - * @returns {boolean} `true` if the connection row is selected in the list - */ - public isSelected( connection: Connection ): boolean { - return this.selectedConnections.indexOf( connection ) !== -1; - } - - /** - * @param {string} connectionName the name of the connection to activate - */ - public onActivateConnection(connectionName: string): void { - this.activateConnection.emit(connectionName); - } - - /** - * @param {string} connectionName the name of the connection to delete - */ - public onDeleteConnection(connectionName: string): void { - this.deleteConnection.emit(connectionName); - } - - /** - * @param {string} connectionName the name of the connection to edit - */ - public onEditConnection( connectionName: string ): void { - this.editConnection.emit( connectionName ); - } - - /** - * @param $event the list row selection event being handled - */ - public onSelect( $event ): void { - if ( $event.selectedItems.length === 0 ) { - if ( this.selectedConnections.length !== 0 ) { - this.connectionDeselected.emit( $event.selectedItems[ 0 ] ); - } - } else { - this.connectionSelected.emit( $event.selectedItems[ 0 ] ); - } - } - -} diff --git a/ui/src/app/connections/connections-routing.module.ts b/ui/src/app/connections/connections-routing.module.ts deleted file mode 100644 index 2ad68d98..00000000 --- a/ui/src/app/connections/connections-routing.module.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from "@angular/core"; -import { RouterModule } from "@angular/router"; -import { Routes } from "@angular/router"; -import { AddConnectionComponent } from "@connections/add-connection/add-connection.component"; -import { ConnectionsComponent } from "@connections/connections.component"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; - -const connectionsRoutes: Routes = [ - { path: ConnectionsConstants.connectionsRootRoute, component: ConnectionsComponent }, - { path: ConnectionsConstants.addConnectionRoute, component: AddConnectionComponent } -]; - -@NgModule({ - imports: [ - RouterModule.forChild( connectionsRoutes ) - ], - exports: [ - RouterModule - ] -}) -export class ConnectionsRoutingModule {} diff --git a/ui/src/app/connections/connections.component.css b/ui/src/app/connections/connections.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/connections/connections.component.html b/ui/src/app/connections/connections.component.html deleted file mode 100644 index 1942182c..00000000 --- a/ui/src/app/connections/connections.component.html +++ /dev/null @@ -1,88 +0,0 @@ -
    - -
    - -
  • -
    -
    - - - -
    -
    -

    Connections

    -
    -
    -
    -
    -
    - -
    -
    - -
    - -
    -
      -
    • -
    • -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    - - -
    -
    -
    -
    -
    -

    - Loading Connections... -

    -
    -
    -
    -
    -
    - - -
    - - -
    - -
    - -
    - -
    diff --git a/ui/src/app/connections/connections.component.spec.ts b/ui/src/app/connections/connections.component.spec.ts deleted file mode 100644 index d7c202cb..00000000 --- a/ui/src/app/connections/connections.component.spec.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { ComponentFixture, TestBed } from "@angular/core/testing"; -import { FormsModule } from "@angular/forms"; -import { HttpModule } from "@angular/http"; -import { By } from "@angular/platform-browser"; -import { RouterTestingModule } from "@angular/router/testing"; -import { ConnectionCardComponent } from "@connections/connections-cards/connection-card/connection-card.component"; -import { ConnectionsCardsComponent } from "@connections/connections-cards/connections-cards.component"; -import { ConnectionDetailsComponent } from "@connections/connections-list/connection-details.component"; -import { ConnectionsListComponent } from "@connections/connections-list/connections-list.component"; -import { ConnectionsComponent } from "@connections/connections.component"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { CoreModule } from "@core/core.module"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { SharedModule } from "@shared/shared.module"; -import { ModalModule } from "ngx-bootstrap"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule -} from "patternfly-ng"; -import { SelectionService } from "@core/selection.service"; - -describe("ConnectionsComponent", () => { - let component: ConnectionsComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - CoreModule, - FormsModule, - HttpModule, - ModalModule.forRoot(), - RouterTestingModule, - SharedModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule - ], - declarations: [ - ConnectionsComponent, - ConnectionDetailsComponent, - ConnectionsListComponent, - ConnectionCardComponent, - ConnectionsCardsComponent - ], - providers: [ - AppSettingsService, - NotifierService, - SelectionService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: ConnectionService, useClass: MockConnectionService }, - { provide: VdbService, useClass: MockVdbService } - ] - }); - - fixture = TestBed.createComponent(ConnectionsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [ConnectionsComponent] should be created"); - expect(component).toBeTruthy(); - }); - - it("should have Connections Title", () => { - console.log("========== [ConnectionsComponent] should have Connections Title"); - // query for the title

    by CSS element selector - const de = fixture.debugElement.query(By.css("h2")); - const el = de.nativeElement; - expect(el.textContent).toEqual("Connections"); - }); - - it("should have Toolbar", () => { - console.log("========== [ConnectionsComponent] should have Toolbar"); - // query for the toolbar by css classname - const de = fixture.debugElement.query(By.css(".toolbar-pf")); - expect(de).toBeDefined(); - }); - - it("should have Connections", () => { - console.log("========== [ConnectionsComponent] should have Connections"); - // Check component object - const connections = component.allConnections; - expect(connections.length).toEqual(2); - - // Check html has the same number of connection cards - const cardDebugElems = fixture.debugElement.queryAll(By.css(".object-card")); - expect(cardDebugElems).toBeDefined(); - expect(cardDebugElems.length).toEqual(2); - }); - - it("should have initial card layout", () => { - console.log("========== [ConnectionsComponent] should have initial card layout"); - // app-connections-cards should be present - let debugEl = fixture.debugElement.query(By.css("app-connections-cards")); - const element = debugEl.nativeElement; - expect(element).toBeDefined(); - - // app-connections-list should not be present - debugEl = fixture.debugElement.query(By.css("app-connections-list")); - expect(debugEl).toBeNull(); - }); - - it("should toggle layout", () => { - console.log("========== [ConnectionsComponent] should toggle layout"); - // Initial layout should be Card Layout - let cardDebugElem = fixture.debugElement.query(By.css("app-connections-cards")); - let listDebugElem = fixture.debugElement.query(By.css("app-connections-list")); - expect(cardDebugElem).toBeDefined(); - expect(listDebugElem).toBeNull(); - const cardElem = cardDebugElem.nativeElement; - expect(cardElem).toBeDefined(); - - // Change the layout to ListLayout - component.setListLayout(); - fixture.detectChanges(); - - // Verify that the layout has changed - cardDebugElem = fixture.debugElement.query(By.css("app-connections-cards")); - listDebugElem = fixture.debugElement.query(By.css("app-connections-list")); - expect(cardDebugElem).toBeNull(); - expect(listDebugElem).toBeDefined(); - const listElem = listDebugElem.nativeElement; - expect(listElem).toBeDefined(); - }); - - // it("should filter connections", () => { - // console.log("========== [ConnectionsComponent] should filter connections"); - // // Expect 3 connections initially. - // let connections = component.filteredConnections; - // expect(connections.length).toEqual(3); - // - // // Set a name filter which satisfies none of the connections - // component.nameFilter = "g"; - // component.filterConnections(); - // fixture.detectChanges(); - // - // // Now expect 0 connections match - // connections = component.filteredConnections; - // expect(connections.length).toEqual(0); - // }); - -}); diff --git a/ui/src/app/connections/connections.component.ts b/ui/src/app/connections/connections.component.ts deleted file mode 100644 index 691ba3d6..00000000 --- a/ui/src/app/connections/connections.component.ts +++ /dev/null @@ -1,507 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnInit } from "@angular/core"; -import { ActivatedRoute, Router } from "@angular/router"; -import { ConnectionStatus } from "@connections/shared/connection-status"; -import { Connection } from "@connections/shared/connection.model"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { AbstractPageComponent } from "@shared/abstract-page.component"; -import { ConfirmDialogComponent } from "@shared/confirm-dialog/confirm-dialog.component"; -import { LayoutType } from "@shared/layout-type.enum"; -import { BsModalService } from "ngx-bootstrap"; -import { SortField } from "patternfly-ng"; -import { SortEvent } from "patternfly-ng"; -import { FilterType } from "patternfly-ng"; -import { FilterEvent } from "patternfly-ng"; -import { SortConfig } from "patternfly-ng"; -import { FilterField } from "patternfly-ng"; -import { FilterConfig } from "patternfly-ng"; -import { ActionConfig, EmptyStateConfig, Filter } from "patternfly-ng"; -import { Subscription } from "rxjs/Subscription"; -import { SelectionService } from "@core/selection.service"; - -@Component({ - moduleId: module.id, - selector: "app-connections", - templateUrl: "./connections.component.html", - styleUrls: ["./connections.component.css"] -}) -export class ConnectionsComponent extends AbstractPageComponent implements OnInit { - - public connectionNameForDelete: string; - - public filterConfig: FilterConfig; - public filtersText = ""; - public items: Connection[]; - public sortConfig: SortConfig; - public currentSortField: SortField; - public isAscendingSort = true; - - private allConns: Connection[] = []; - private filteredConns: Connection[] = []; - private selectedConns: Connection[] = []; - private router: Router; - private noConnectionsConfig: EmptyStateConfig; - private appSettingsService: AppSettingsService; - private connectionService: ConnectionService; - private notifierService: NotifierService; - private selectionService: SelectionService; - private connectionStatusSubscription: Subscription; - private modalService: BsModalService; - - constructor(router: Router, route: ActivatedRoute, appSettingsService: AppSettingsService, - connectionService: ConnectionService, logger: LoggerService, - notifierService: NotifierService, modalService: BsModalService, selectionService: SelectionService ) { - super(route, logger); - this.router = router; - this.appSettingsService = appSettingsService; - this.connectionService = connectionService; - this.selectionService = selectionService; - this.notifierService = notifierService; - this.modalService = modalService; - // Register for connection status changes - this.connectionStatusSubscription = this.notifierService.getConnectionStatusMap().subscribe((connectionStatusMap) => { - this.onConnectionStatusChanged(connectionStatusMap); - }); - } - - public ngOnInit(): void { - - super.ngOnInit(); - - this.filterConfig = { - fields: [{ - id: "name", - title: "Name", - placeholder: "Filter by Name...", - type: FilterType.TEXT - }, { - id: "description", - title: "Description", - placeholder: "Filter by Description...", - type: FilterType.TEXT - }] as FilterField[], - resultsCount: this.filteredConns.length, - appliedFilters: [] - } as FilterConfig; - - this.sortConfig = { - fields: [{ - id: "name", - title: "Name", - sortType: "alpha" - }, { - id: "description", - title: "Description", - sortType: "alpha" - }], - isAscending: this.isAscendingSort - } as SortConfig; - } - - public get noConnectionsEmptyConfig(): EmptyStateConfig { - if ( !this.noConnectionsConfig ) { - const actionConfig = { - primaryActions: [ - { - id: "createConnectionActionId", - title: "Add Connection", - tooltip: "Add a connection" - } - ] - } as ActionConfig; - - this.noConnectionsConfig = { - actions: actionConfig, - iconStyleClass: "pficon-warning-triangle-o", - info: "No Connections were found. Please click below to create a connection. ", - title: "No Connections Available" - } as EmptyStateConfig; - } - - return this.noConnectionsConfig; - } - - public loadAsyncPageData(): void { - const self = this; - - this.connectionService - .getConnections(true, true) - .subscribe( - (connectionSummaries) => { - const conns = []; - // If there is a newly added connection, it has been flagged for schema regen - const newlyAddedConnName = self.selectionService.getConnectionIdForSchemaRegen(); - for ( const connSummary of connectionSummaries ) { - const conn = connSummary.getConnection(); - let status = connSummary.getStatus(); - // Newly added connection is given a loading status - if (conn.getId() === newlyAddedConnName) { - status = ConnectionStatus.createLoadingStatus(newlyAddedConnName); - } - conn.setStatus(status); - conns.push(conn); - } - self.allConns = conns; - self.filteredConns = conns; - self.connectionService.updateConnectionSchemaStates(); // triggers refresh to get latest connection states - self.loaded("connections"); - }, - (error) => { - self.error(error, "Error getting connections"); - } - ); - } - - /** - * @returns {boolean} true if connections are being represented by cards - */ - public get isCardLayout(): boolean { - return this.appSettingsService.connectionsPageLayout === LayoutType.CARD; - } - - /** - * @returns {boolean} true if connections are being represented by items in a list - */ - public get isListLayout(): boolean { - return this.appSettingsService.connectionsPageLayout === LayoutType.LIST; - } - - /** - * @returns {Connection[]} the array of all connections - */ - public get allConnections(): Connection[] { - return this.allConns; - } - - /** - * @returns {boolean} 'true' if any connections are available - */ - public get hasConnections(): boolean { - return this.allConns.length > 0; - } - - /** - * @returns {Connection[]} the array of filtered connections - */ - public get filteredConnections(): Connection[] { - return this.filteredConns; - } - - /** - * @returns {Connection[]} the array of selected connections - */ - public get selectedConnections(): Connection[] { - return this.selectedConns; - } - - public onSelected(connection: Connection): void { - // Only allow one item to be selected - this.selectedConns.shift(); - this.selectedConns.push(connection); - } - - public onDeselected(connection: Connection): void { - // Only one item is selected at a time - this.selectedConns.shift(); - // this.selectedConns.splice(this.selectedConns.indexOf(connection), 1); - } - - public onDelete(connName: string): void { - this.connectionNameForDelete = connName; - - // Dialog Content - const message = "Do you really want to delete Connection '" + connName + "'?"; - const initialState = { - title: "Confirm Delete", - bodyContent: message, - cancelButtonText: "Cancel", - confirmButtonText: "Delete" - }; - - // Show Dialog, act upon confirmation click - const modalRef = this.modalService.show(ConfirmDialogComponent, {initialState}); - modalRef.content.confirmAction.take(1).subscribe((value) => { - this.onDeleteConnection(); - }); - } - - public setListLayout(): void { - this.appSettingsService.connectionsPageLayout = LayoutType.LIST; - } - - public setCardLayout(): void { - this.appSettingsService.connectionsPageLayout = LayoutType.CARD; - } - - /** - * Handle request for new Connection - */ - public onNew(): void { - this.selectionService.setSelectedConnection(null); - - const link: string[] = [ ConnectionsConstants.addConnectionPath ]; - this.logger.debug("[ConnectionsComponent] Navigating to: %o", link); - this.router.navigate(link).then(() => { - // nothing to do - }); - } - - /** - * Handle Edit of the specified Connection - * @param {string} connName - */ - public onEdit(connName: string): void { - const selectedConnection = this.filteredConnections.find((x) => x.getId() === connName); - - // Sets the selected dataservice and edit mode before transferring - this.selectionService.setSelectedConnection(selectedConnection); - - const link: string[] = [ ConnectionsConstants.addConnectionPath ]; - this.logger.debug("[ConnectionsComponent] Navigating to: %o", link); - this.router.navigate(link).then(() => { - // nothing to do - }); - } - - /** - * Handle Activation of the specified Connection. The activate actions taken depend on the vdb - * and schema states. - * @param {string} connName - */ - public onActivate(connName: string): void { - const selectedConnection = this.filteredConnections.find((x) => x.getId() === connName); - - // If connection VDB missing or failed - redeploy the vdb and then generate schema - const deployVdb = selectedConnection.serverVdbMissing || selectedConnection.serverVdbFailed; - // If vdb deployment is required, flag the need to regen the schema - if (deployVdb) { - this.selectionService.setConnectionIdForSchemaRegen(connName); - } - - // Will trigger schema reload unless it is currently loading - const genSchema = !selectedConnection.schemaLoading; - - // Sets a spinner on the connection until everything is done - const connectionStatus: ConnectionStatus = ConnectionStatus.createLoadingStatus(connName); - selectedConnection.setStatus(connectionStatus); - - const self = this; - // Start the connection deployment - this.connectionService - .refreshConnectionSchema(connName, deployVdb, genSchema) - .subscribe( - (wasSuccess) => { - self.connectionService.updateConnectionSchemaStates(); - }, - (error) => { - self.connectionService.updateConnectionSchemaStates(); - } - ); - } - - /** - * Called to doDelete all selected APIs. - */ - public onDeleteConnection(): void { - const selectedConn = this.filteredConnections.find((x) => x.getId() === this.connectionNameForDelete); - - // Note: we can only doDelete selected items that we can see in the UI. - this.logger.debug("[ConnectionsPageComponent] Deleting selected Connection."); - const self = this; - this.connectionService - .deleteConnection(selectedConn.getId()) - .subscribe( - (wasSuccess) => { - self.deleteUndeployConnectionVdb(selectedConn.getId()); - self.removeConnectionFromList(selectedConn); - const link: string[] = [ ConnectionsConstants.connectionsRootPath ]; - self.logger.debug("[CreateApiPageComponent] Navigating to: %o", link); - self.router.navigate(link).then(() => { - // nothing to do - }); - }, - (error) => { - self.error(error, "Error deleting the connection"); - } - ); - } - - /** - * Filter functions - */ - public applyFilters(filters: Filter[]): void { - this.items = []; - if (filters && filters.length > 0) { - this.allConnections.forEach((item) => { - if (this.matchesFilters(item, filters)) { - this.items.push(item); - } - }); - } else { - this.items = this.allConnections; - } - this.filteredConns = this.items; - this.filterConfig.resultsCount = this.items.length; - } - - public filterChanged($event: FilterEvent): void { - this.filtersText = ""; - $event.appliedFilters.forEach((filter) => { - this.filtersText += filter.field.title + " : " + filter.value + "\n"; - }); - this.applyFilters($event.appliedFilters); - } - - public matchesFilter(item: Connection, filter: Filter): boolean { - let match = true; - if (filter.field.id === "name") { - match = item.getId().match(filter.value) !== null; - } else if (filter.field.id === "description") { - match = item.getDescription().match(filter.value) !== null; - } - return match; - } - - public matchesFilters(item: any, filters: Filter[]): boolean { - let matches = true; - filters.forEach((filter) => { - if (!this.matchesFilter(item, filter)) { - matches = false; - return matches; - } - }); - return matches; - } - - /** - * Sort functions - */ - public compare(item1: Connection, item2: Connection): number { - let compValue = 0; - if (this.currentSortField.id === "name") { - compValue = item1.getId().localeCompare(item2.getId()); - } else if (this.currentSortField.id === "description") { - compValue = item1.getDescription().localeCompare(item2.getDescription()); - } - - if (!this.isAscendingSort) { - compValue = compValue * -1; - } - return compValue; - } - - public sortChange($event: SortEvent): void { - this.currentSortField = $event.field; - this.isAscendingSort = $event.isAscending; - this.filteredConnections.sort((item1: Connection, item2: Connection) => this.compare(item1, item2)); - } - - /** - * Delete the specified connection's VDB from the repo (if it exists) and undeploy it from teiid (if it exists) - * @param {string} connectionId - */ - private deleteUndeployConnectionVdb(connectionId: string): void { - const self = this; - this.connectionService - .deleteUndeployConnectionVdb(connectionId) - .subscribe( - (wasSuccess) => { - self.connectionService.updateConnectionSchemaStates(); - }, - (error) => { - self.connectionService.updateConnectionSchemaStates(); - } - ); - } - - /** - * Remove the specified connection from the connections list - * @param {Connection} connection - */ - private removeConnectionFromList(connection: Connection): void { - this.allConns.splice(this.allConns.indexOf(connection), 1); - } - - /* - * Update the connection states using the provided status map - */ - private onConnectionStatusChanged(stateMap: Map): void { - // Get name of connection for schema regen (empty if none) - const connForSchemaRegen = this.selectionService.getConnectionIdForSchemaRegen(); - - // For displayed dataservices, update the State using supplied services - for ( const conn of this.filteredConns ) { - const connId = conn.getId(); - if (stateMap && stateMap.has(connId)) { - // If there is a schema marked for regen, it's status is ignored. regen will set it - if (connId !== connForSchemaRegen) { - conn.setStatus(stateMap.get(connId)); - } - } - } - - // If there is a newly added connection, initiate schema generation - if (this.selectionService.hasConnectionForSchemaRegen) { - this.initiateSchemaGeneration(connForSchemaRegen); - } - } - - /* - * Initiate schema generation for the specified connection, if it is found - */ - private initiateSchemaGeneration(connName: string): void { - const connectionExists = this.connectionExists(connName); - const self = this; - if (connectionExists) { - this.connectionService - .refreshConnectionSchema(connName, false, true) - .subscribe( - (wasSuccess) => { - self.selectionService.setConnectionIdForSchemaRegen(""); // reset connection for regen when done - self.connectionService.updateConnectionSchemaStates(); // triggers refresh to get latest connection states - }, - (error) => { - self.selectionService.setConnectionIdForSchemaRegen(""); // reset connection for regen when done - self.connectionService.updateConnectionSchemaStates(); // triggers refresh to get latest connection states - } - ); - } - } - - /** - * Determine if a connection with the supplied name exists in the current connections - * @param {string} connName the connection name - * @returns {boolean} 'true' if connection exists - */ - private connectionExists(connName: string): boolean { - let connFound = false; - for ( const conn of this.allConns ) { - const connId = conn.getId(); - if (connName === connId) { - connFound = true; - break; - } - } - return connFound; - } -} diff --git a/ui/src/app/connections/connections.module.ts b/ui/src/app/connections/connections.module.ts deleted file mode 100644 index 09a347f8..00000000 --- a/ui/src/app/connections/connections.module.ts +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommonModule } from "@angular/common"; -import { NgModule } from "@angular/core"; -import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { Http } from "@angular/http"; -import { RouterModule } from "@angular/router"; -import { AddConnectionWizardComponent } from "@connections/add-connection-wizard/add-connection-wizard.component"; -import { AddConnectionComponent } from "@connections/add-connection/add-connection.component"; -import { ConnectionCardComponent } from "@connections/connections-cards/connection-card/connection-card.component"; -import { ConnectionsCardsComponent } from "@connections/connections-cards/connections-cards.component"; -import { ConnectionDetailsComponent } from "@connections/connections-list/connection-details.component"; -import { ConnectionsListComponent } from "@connections/connections-list/connections-list.component"; -import { ConnectionsRoutingModule } from "@connections/connections-routing.module"; -import { ConnectionsComponent } from "@connections/connections.component"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { CoreModule } from "@core/core.module"; -import { LoggerService } from "@core/logger.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { environment } from "@environments/environment"; -import { ConfirmDialogComponent } from "@shared/confirm-dialog/confirm-dialog.component"; -import { SharedModule } from "@shared/shared.module"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule } from "patternfly-ng"; -import { ConnectionTypeCardComponent } from "./connection-type-cards/connection-type-card/connection-type-card.component"; -import { ConnectionTypeCardsComponent } from "./connection-type-cards/connection-type-cards.component"; - -@NgModule({ - imports: [ - ConnectionsRoutingModule, - CommonModule, - CoreModule, - SharedModule, - FormsModule, - ReactiveFormsModule, - RouterModule, - - // PatternFlyNg - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - WizardModule - ], - declarations: [ - ConnectionDetailsComponent, - ConnectionCardComponent, - ConnectionsCardsComponent, - ConnectionsComponent, - ConnectionsListComponent, - AddConnectionWizardComponent, - AddConnectionComponent, - ConnectionCardComponent, - ConnectionTypeCardsComponent, - ConnectionTypeCardComponent - ], - providers: [ - { - provide: ConnectionService, - useFactory: connectionServiceFactory, - deps: [ Http, VdbService, NotifierService, AppSettingsService, LoggerService ], - multi: false - }, - LoggerService - ], - exports: [ - ], - entryComponents: [ConfirmDialogComponent] -}) -export class ConnectionsModule { } - -/** - * A factory that produces the appropriate instande of the service based on current environment settings. - * - * @param {Http} http the HTTP service - * @param {VdbService} vdbService the vdb service - * @param {NotifierService} notifierService the notifier service - * @param {AppSettingsService} appSettings the app settings service - * @param {LoggerService} logger the logger - * @returns {ConnectionService} the requested service - */ -export function connectionServiceFactory( http: Http, - vdbService: VdbService, - notifierService: NotifierService, - appSettings: AppSettingsService, - logger: LoggerService ): ConnectionService { - return environment.production || !environment.uiDevMode ? new ConnectionService( http, - vdbService, - notifierService, - appSettings, - logger ) - : new MockConnectionService( http, - vdbService, - notifierService, - appSettings, - logger ); -} diff --git a/ui/src/app/connections/shared/connection-status.spec.ts b/ui/src/app/connections/shared/connection-status.spec.ts deleted file mode 100644 index 07b58a53..00000000 --- a/ui/src/app/connections/shared/connection-status.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { ConnectionStatus } from "@connections/shared/connection-status"; - -describe("ConnectionStatus", () => { - let connectionStatus: ConnectionStatus; - - beforeEach(() => { - connectionStatus = null; - }); - - it("should create", () => { - console.log("========== [ConnectionStatus] should create"); - connectionStatus = ConnectionStatus.create( - { - "connectionName": "PgConn", - "vdbState": "ACTIVE", - "schemaState": "ACTIVE", - "errors": [], - "schemaModelName": "pgconnschemamodel", - "schemaVdbName": "pgconnschemavdb", - "vdbName": "pgconnbtlconn" - } - ); - - expect(connectionStatus.getConnectionName()).toEqual("PgConn"); - expect(connectionStatus.getSchemaModelName()).toEqual("pgconnschemamodel"); - expect(connectionStatus.getSchemaVdbName()).toEqual("pgconnschemavdb"); - expect(connectionStatus.getServerVdbName()).toEqual("pgconnbtlconn"); - expect(connectionStatus.getErrors()).toEqual([]); - expect(connectionStatus.isServerVdbActive()).toEqual(true); - expect(connectionStatus.isServerVdbMissing()).toEqual(false); - expect(connectionStatus.isServerVdbLoading()).toEqual(false); - expect(connectionStatus.isServerVdbFailed()).toEqual(false); - }); - -}); diff --git a/ui/src/app/connections/shared/connection-status.ts b/ui/src/app/connections/shared/connection-status.ts deleted file mode 100644 index 39da3c47..00000000 --- a/ui/src/app/connections/shared/connection-status.ts +++ /dev/null @@ -1,166 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class ConnectionStatus { - - private readonly activeState = "ACTIVE"; - private readonly failedState = "FAILED"; - private readonly loadingState = "LOADING"; - private readonly missingState = "MISSING"; - - private connectionName: string; - private errors: string[]; - private schemaState: string; - private schemaModelName: string; - private schemaVdbName: string; - private vdbName: string; - private vdbState: string; - - /** - * @param {Object} json the JSON representation of a connection status - * @returns {ConnectionStatus} the new connection status (never null) - */ - public static create( json: object = {} ): ConnectionStatus { - const status = new ConnectionStatus(); - status.setValues( json ); - return status; - } - - /** - * Creates a Loading status - * @param {string} connName the connection name - * @returns {ConnectionStatus} the new connection status (never null) - */ - public static createLoadingStatus( connName: string ): ConnectionStatus { - const status = new ConnectionStatus(); - status.setValues( - { - "connectionName": connName, - "vdbState": "LOADING", - "schemaState": "MISSING", - "errors": [] - } ); - return status; - } - - /** - * @returns {string} the connection name or `null` if not set - */ - public getConnectionName(): string { - return this.connectionName; - } - - /** - * @returns {string[]} the errors or `null` if not set - */ - public getErrors(): string[] { - return this.errors; - } - - /** - * @returns {string} the schema model name or `null` if not set - */ - public getSchemaModelName(): string { - return this.schemaModelName; - } - - /** - * @returns {string} the schema VDB name or `null` if not set - */ - public getSchemaVdbName(): string { - return this.schemaVdbName; - } - - /** - * @returns {string} the deployed VDB name or `null` if not set - */ - public getServerVdbName(): string { - return this.vdbName; - } - - /** - * @returns {boolean} `true` if the workspace schema is available - */ - public isSchemaAvailable(): boolean { - return this.schemaState && this.schemaState.toUpperCase() === this.activeState; - } - - /** - * @returns {boolean} `true` if the workspace schema is in a failed state - */ - public isSchemaFailed(): boolean { - return this.schemaState && this.schemaState.toUpperCase() === this.failedState; - } - - /** - * @returns {boolean} `true` if the workspace schema is loading - */ - public isSchemaLoading(): boolean { - return this.schemaState && this.schemaState.toUpperCase() === this.loadingState; - } - - /** - * @returns {boolean} `true` if the workspace schema is missing - */ - public isSchemaMissing(): boolean { - return this.schemaState && this.schemaState.toUpperCase() === this.missingState; - } - - /** - * @returns {boolean} `true` if the server VDB is active - */ - public isServerVdbActive(): boolean { - return this.vdbState && this.vdbState.toUpperCase() === this.activeState; - } - - /** - * @returns {boolean} `true` if the server VDB is in a failed state - */ - public isServerVdbFailed(): boolean { - return this.vdbState && this.vdbState.toUpperCase() === this.failedState; - } - - /** - * @returns {boolean} `true` if the server VDB is loading - */ - public isServerVdbLoading(): boolean { - return this.vdbState && this.vdbState.toUpperCase() === this.loadingState; - } - - /** - * @returns {boolean} `true` if the server VDB is missing - */ - public isServerVdbMissing(): boolean { - return this.vdbState && this.vdbState.toUpperCase() === this.missingState; - } - - /** - * Set all object values using the supplied connection status JSON. - * @param {Object} json the JSON - */ - public setValues( json: object = {} ): void { - Object.assign( this, json ); - } - - /** - * Require the static create method to be called from outside this class. - */ - private constructor() { - // nothing to do - } - -} diff --git a/ui/src/app/connections/shared/connection-type.model.ts b/ui/src/app/connections/shared/connection-type.model.ts deleted file mode 100644 index 8cfbf9b2..00000000 --- a/ui/src/app/connections/shared/connection-type.model.ts +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ConnectionsConstants } from "@connections/shared/connections-constants"; - -export class ConnectionType { - private name: string; - private description: string; - - constructor() { - // nothing to do - } - - /** - * @returns {string} the ConnectionType name - */ - public getName(): string { - return this.name; - } - - /** - * @returns {string} the ConnectionType description - */ - public getDescription(): string { - return this.description; - } - - /** - * @returns {string} the alternate image text for the ConnectionType - */ - public getImageAlt(): string { - const name = this.getName(); - if (name === ConnectionsConstants.connectionType_mysql) { - return "MySQL database img"; - } else if (name === ConnectionsConstants.connectionType_postgresql) { - return "PostgeSQL database img"; - } else if (name === ConnectionsConstants.connectionType_mongodb) { - return "MongoDB database img"; - } else if (name === ConnectionsConstants.connectionType_mariadb) { - return "MariaDB database img"; - } else if (name === ConnectionsConstants.connectionType_salesforce) { - return "SalesForce img"; - } - return "unknown image"; - } - - /** - * @returns {string} the image location for the ConnectionType - */ - public getImageSrc(): string { - const name = this.getName(); - if (name === ConnectionsConstants.connectionType_mysql) { - return "assets/MySQL_70x40.png"; - } else if (name === ConnectionsConstants.connectionType_postgresql) { - return "assets/PostgresSql_70x40.png"; - } else if (name === ConnectionsConstants.connectionType_mongodb) { - return "assets/MongoDB_70x40.png"; - } else if (name === ConnectionsConstants.connectionType_mariadb) { - return "assets/MongoDB_70x40.png"; - } else if (name === ConnectionsConstants.connectionType_salesforce) { - return "assets/salesforce_40x40.png"; - } - return ""; - } - - /** - * @param {string} name the ConnectionType name - */ - public setName( name?: string ): void { - this.name = name ? name : null; - } - - /** - * @param {string} description the ConnectionType description - */ - public setDescription( description?: string ): void { - this.description = description ? description : null; - } - -} diff --git a/ui/src/app/connections/shared/connection.model.spec.ts b/ui/src/app/connections/shared/connection.model.spec.ts deleted file mode 100644 index 68db8c61..00000000 --- a/ui/src/app/connections/shared/connection.model.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Connection } from "@connections/shared/connection.model"; - -describe("Connection", () => { - let connection: Connection; - - beforeEach(() => { - connection = null; - }); - - it("should create", () => { - console.log("========== [Connection] should create"); - connection = Connection.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "keng__id": "PgConn", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/PgConn", - "keng__kType": "Connection", - "keng__hasChildren": true, - "dv__jndiName": "java:/postgresql-persistent-jq7wz", - "dv__driverName": "postgresql", - "dv__type": true, - "keng__properties": [ - { - "name": "description", - "value": "customer db on postgres" - }, - { - "name": "serviceCatalogSource", - "value": "postgresql-persistent-jq7wz" - } - ], - "keng___links": [ - { - "rel": "self", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/connections/PgConn" - }, - { - "rel": "parent", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/connections" - }, - { - "rel": "children", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/search%2Fadmin%2FPgConn" - } - ] - } - ); - - expect(connection.getId()).toEqual("PgConn"); - expect(connection.getDescription()).toEqual("customer db on postgres"); - expect(connection.getDriverName()).toEqual("postgresql"); - expect(connection.getJndiName()).toEqual("java:/postgresql-persistent-jq7wz"); - expect(connection.getServiceCatalogSourceName()).toEqual("postgresql-persistent-jq7wz"); - expect(connection.getDataPath()).toEqual("/tko:komodo/tko:workspace/admin/PgConn"); - }); - -}); diff --git a/ui/src/app/connections/shared/connection.model.ts b/ui/src/app/connections/shared/connection.model.ts deleted file mode 100644 index 21a6bb58..00000000 --- a/ui/src/app/connections/shared/connection.model.ts +++ /dev/null @@ -1,366 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ConnectionStatus } from "@connections/shared/connection-status"; -import { VdbsConstants } from "@dataservices/shared/vdbs-constants"; -import { Identifiable } from "@shared/identifiable"; -import { SortDirection } from "@shared/sort-direction.enum"; - -export class Connection implements Identifiable< string > { - - public static descriptionProp = "description"; - public static serviceCatalogSourceProp = "serviceCatalogSource"; - - private keng__id: string; - private keng__dataPath: string; - private dv__jndiName: string; - private dv__driverName: string; - private dv__type: boolean; - private keng__properties: object[] = []; - private status: ConnectionStatus; - - /** - * @param {Object} json the JSON representation of a Connection - * @returns {Connection} the new Connection (never null) - */ - public static create( json: object = {} ): Connection { - const conn = new Connection(); - conn.setValues( json ); - return conn; - } - - /** - * @param {Connection[]} connections the connections being sorted - * @param {SortDirection} sortDirection the sort direction - */ - public static sort( connections: Connection[], - sortDirection: SortDirection ): void { - connections.sort( ( thisConnection: Connection, thatConnection: Connection ) => { - const result = thisConnection.compareTo( thatConnection ); - - if ( sortDirection === SortDirection.DESC ) { - return result * -1; - } - - return result; - } ); - } - - constructor() { - // nothing to do - } - - /** - * See {Identifiable}. - */ - public compareTo( that: Connection ): number { - let result = 0; - - if ( this.getId() ) { - if ( that.getId() ) { - // both have an ID - result = this.getId().localeCompare( that.getId() ); - } else { - // thatItem does not have an ID - result = 1; - } - } else if ( that.getId() ) { - // thisItem does not have an ID and thatItem does - result = -1; - } - - return result; - } - - /** - * @returns {string} the connection name - */ - public get name(): string { - return this.keng__id; - } - - /** - * @returns {string} the connection description - */ - public getDescription(): string { - let description: string = null; - for (const propMap of this.keng__properties) { - if (propMap["name"] === Connection.descriptionProp) { - description = propMap["value"]; - break; - } - } - return description; - } - - /** - * @returns {string} the connection driver name (can be null) - */ - public getDriverName(): string { - return this.dv__driverName; - } - - /** - * @returns {string} the connection identifier (can be null) - */ - public getId(): string { - return this.keng__id; - } - - /** - * @returns {string} the connection data path (can be null) - */ - public getDataPath(): string { - return this.keng__dataPath; - } - - /** - * @returns {string} the connection JNDI name (can be null) - */ - public getJndiName(): string { - return this.dv__jndiName; - } - - /** - * @returns {boolean} the jdbc status (true == jdbc) - */ - public isJdbc(): boolean { - return this.dv__type; - } - - /** - * @returns {string} the service catalog source name - */ - public getServiceCatalogSourceName(): string { - let serviceCatalogName: string = null; - for (const propMap of this.keng__properties) { - if (propMap["name"] === Connection.serviceCatalogSourceProp) { - serviceCatalogName = propMap["value"]; - break; - } - } - return serviceCatalogName; - } - - /** - * Accessor to determine if connection overall status is active - * @returns {boolean} `true` if the overall status is active - */ - public get isActive(): boolean { - // vdb and schema status must both be active - return this.serverVdbActive && this.schemaActive; - } - - /** - * Accessor to determine if connection overall status is inactive - * @returns {boolean} `true` if the overall status is inactive - */ - public get isInactive(): boolean { - // If vdb is missing or vdb active and schema missing - overall status is inactive - return (this.serverVdbMissing || (this.serverVdbActive && this.schemaMissing)); - } - - /** - * Accessor to determine if connection overall status is loading - * @returns {boolean} `true` if the overall status is loading - */ - public get isLoading(): boolean { - // If either the vdb or schema are loading - overall status is loading - return (this.serverVdbLoading || (this.serverVdbActive && this.schemaLoading)); - } - - /** - * Accessor to determine if connection overall status is failed - * @returns {boolean} `true` if the overall status is failed - */ - public get isFailed(): boolean { - return (this.serverVdbFailed || (this.serverVdbActive && this.schemaFailed)); - } - - /** - * Accessor to determine if connection schema is active - * @returns {boolean} `true` if the schema is active - */ - public get schemaActive(): boolean { - return this.status.isSchemaAvailable(); - } - - /** - * Accessor to determine if connection schema is missing - * @returns {boolean} `true` if the connection schema is missing - */ - public get schemaMissing(): boolean { - return this.status.isSchemaMissing(); - } - - /** - * Accessor to determine if connection schema is loading - * @returns {boolean} `true` if the connection schema is loading - */ - public get schemaLoading(): boolean { - return this.status.isSchemaLoading(); - } - - /** - * Accessor to determine if connection schema is failed - * @returns {boolean} `true` if the connection schema is in a failed state - */ - public get schemaFailed(): boolean { - return this.status.isSchemaFailed(); - } - - /** - * @returns {boolean} `true` if the connection server VDB is in an active state - */ - public get serverVdbActive(): boolean { - return this.status.isServerVdbActive(); - } - - /** - * @returns {boolean} `true` if the connection server VDB is in a failed state - */ - public get serverVdbFailed(): boolean { - return this.status.isServerVdbFailed(); - } - - /** - * @returns {boolean} `true` if the connection server VDB is loading - */ - public get serverVdbLoading(): boolean { - return this.status.isServerVdbLoading(); - } - - /** - * @returns {boolean} `true` if the server VDB is missing - */ - public get serverVdbMissing(): boolean { - return this.status.isServerVdbMissing(); - } - - /** - * @returns {string} the connection schema vdb name - */ - public get schemaVdbName(): string { - if (this.status && !(this.status == null)) { - return this.status.getSchemaVdbName(); - } - return this.deriveSchemaVdbName(); - } - - /** - * @returns {string} the connection schema vdb model name - */ - public get schemaVdbModelName(): string { - if (this.status && !(this.status == null)) { - return this.status.getSchemaModelName(); - } - return this.deriveSchemaVdbModelName(); - } - - /** - * @returns {string} the connection schema vdb model source name - */ - public get schemaVdbModelSourceName(): string { - return this.deriveSchemaVdbModelSourceName(); - } - - /** - * @param {string} driverName the connection driver name (optional) - */ - public setDriverName( driverName?: string ): void { - this.dv__driverName = driverName ? driverName : null; - } - - /** - * @param {string} id the connection identifier (optional) - */ - public setId( id?: string ): void { - this.keng__id = id ? id : null; - } - - /** - * @param {string} jndiName the connection JNDI name (optional) - */ - public setJndiName( jndiName?: string ): void { - this.dv__jndiName = jndiName ? jndiName : null; - } - - /** - * @param {boolean} jdbc the jdbc state - */ - public setJdbc( jdbc: boolean ): void { - this.dv__type = jdbc; - } - - /** - * @param {string} serviceCatalog the service catalog source name - */ - public setServiceCatalogSourceName( serviceCatalog: string ): void { - interface IProp { - name?: string; - value?: string; - } - const prop: IProp = {}; - prop.name = Connection.serviceCatalogSourceProp; - prop.value = serviceCatalog; - - this.keng__properties.push(prop); - } - - /** - * @param {ConnectionStatus} status the connection status - */ - public setStatus( status: ConnectionStatus ): void { - this.status = status; - } - - /** - * Set all object values using the supplied Connection json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - - /** - * Derive the schema VDB name for this connection - * @returns {string} the default schema VDB name - */ - private deriveSchemaVdbName( ): string { - const name = this.getId() + VdbsConstants.SCHEMA_VDB_SUFFIX; - return name.toLowerCase(); - } - - /** - * Derive the schema VDB model name for this connection - * @returns {string} the default schema VDB model name - */ - private deriveSchemaVdbModelName( ): string { - const name = this.getId() + VdbsConstants.SCHEMA_MODEL_SUFFIX; - return name.toLowerCase(); - } - - /** - * Derive the schema VDB model source name for this connection - * @returns {string} - */ - private deriveSchemaVdbModelSourceName( ): string { - return this.getServiceCatalogSourceName() ? - this.getServiceCatalogSourceName() : this.getId().toLowerCase(); - } - -} diff --git a/ui/src/app/connections/shared/connection.service.spec.ts b/ui/src/app/connections/shared/connection.service.spec.ts deleted file mode 100644 index 0cd00920..00000000 --- a/ui/src/app/connections/shared/connection.service.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; -import { HttpModule } from "@angular/http"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; - -describe("ConnectionService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ HttpModule ], - providers: [AppSettingsService, ConnectionService, LoggerService, NotifierService, VdbService] - }); - }); - - it("should be created", inject([ConnectionService, AppSettingsService, LoggerService], - (service: ConnectionService ) => { - expect(service).toBeTruthy(); - })); -}); diff --git a/ui/src/app/connections/shared/connection.service.ts b/ui/src/app/connections/shared/connection.service.ts deleted file mode 100644 index a8c6c588..00000000 --- a/ui/src/app/connections/shared/connection.service.ts +++ /dev/null @@ -1,415 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable } from "@angular/core"; -import { Http, RequestOptions } from "@angular/http"; -import { ConnectionStatus } from "@connections/shared/connection-status"; -import { ConnectionType } from "@connections/shared/connection-type.model"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { NewConnection } from "@connections/shared/new-connection.model"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { ServiceCatalogSource } from "@connections/shared/service-catalog-source.model"; -import { ApiService } from "@core/api.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { ConnectionSummary } from "@dataservices/shared/connection-summary.model"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { environment } from "@environments/environment"; -import { Observable } from "rxjs/Observable"; -import { Subscription } from "rxjs/Subscription"; -import { VdbsConstants } from "@dataservices/shared/vdbs-constants"; -import { Column } from "@dataservices/shared/column.model"; - -@Injectable() -export class ConnectionService extends ApiService { - - private static readonly nameValidationUrl = environment.komodoWorkspaceUrl - + ConnectionsConstants.connectionsRootPath - + "/nameValidation/"; - private static readonly refreshConnectionSchemaUrl = environment.komodoWorkspaceUrl - + ConnectionsConstants.connectionsRootPath - + "/refresh-schema/"; - - private http: Http; - private updatesSubscription: Subscription; - private notifierService: NotifierService; - private vdbService: VdbService; - private cachedConnectionStatuses: Map = new Map(); - - constructor( http: Http, vdbService: VdbService, notifierService: NotifierService, - appSettings: AppSettingsService, logger: LoggerService ) { - super( appSettings, logger ); - this.http = http; - this.vdbService = vdbService; - this.notifierService = notifierService; - // Polls to fire Connection VDB state updates every 15 sec - this.pollConnectionSchemaStatus(15); - } - - /** - * Validates the specified connection name. If the name contains valid characters and the name is unique, the - * service returns 'null'. Otherwise, a 'string' containing an error message is returned. - * - * @param {string} name the connection name - * @returns {Observable} - */ - public isValidName( name: string ): Observable< string > { - if ( !name || name.length === 0 ) { - return Observable.of( "Connection name cannot be empty" ); - } - - const url = ConnectionService.nameValidationUrl + encodeURIComponent( name ); - - return this.http.get( url, this.getAuthRequestOptions() ) - .map( ( response ) => { - if ( response.ok ) { - if ( response.text() ) { - return response.text(); - } - - return ""; - } } ) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Get the connection summaries from the komodo rest interface. The supplied parameters determine what portions - * of the ConnectionSummary are returned. - * - include-connection=true (include connection [default=true]) - * - include-schema-status=true (include schema vdb status [default=false]) - * @param {boolean} includeConnection 'true' to include connection - * @param {boolean} includeSchemaStatus 'true' to include connection schema status - * @returns {Observable} - */ - public getConnections(includeConnection: boolean, includeSchemaStatus: boolean): Observable { - // Build the url with parameters - const connectionsUrl = this.buildGetConnectionsUrl(includeConnection, includeSchemaStatus); - - return this.http - .get(connectionsUrl, this.getAuthRequestOptions()) - .map((response) => { - const connectionSummaries = response.json(); - return connectionSummaries.map((connectionSummary) => ConnectionSummary.create( connectionSummary )); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Deployes the connection server VDB if one does not already exists. If a server VDB has already been deployed, one - * can be redeployed. A schema can only be generated if it doesn't exist and there is already a deployed server VDB. - * @param {string} connectionName the name of the connection being refreshed - * @param {boolean} redeployServerVdb `true` if the server VDB should be deployed if one exists (defaults to `false`) - * @param {boolean} generateSchema `true` if the schema should be generated if one does not exist (defaults to `true`) - * @returns {Observable} - */ - public refreshConnectionSchema(connectionName: string, - redeployServerVdb = false, - generateSchema = true): Observable { - if ( !connectionName || connectionName.length === 0 ) { - return Observable.of( false ); - } - - const url = ConnectionService.refreshConnectionSchemaUrl + encodeURIComponent( connectionName ); - - // setup query parameters - const queryParams = { - params: { - "redeploy": redeployServerVdb, - "generate-schema": generateSchema - } - }; - const options = new RequestOptions( queryParams ); - - return this.http - .post( url, this.getAuthRequestOptions().merge( options ) ) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Bind a service catalog source via the komodo rest interface - * @param {string} serviceCatalogSourceName - * @returns {Observable} - */ - public bindServiceCatalogSource(serviceCatalogSourceName: string): Observable { - return this.http - .post(environment.komodoTeiidUrl + ConnectionsConstants.serviceCatalogSourcesRootPath, - { name: serviceCatalogSourceName}, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Delete a connection via the komodo rest interface - * @param {string} connectionId - * @returns {Observable} - */ - public deleteConnection(connectionId: string): Observable { - return this.http - .delete(environment.komodoWorkspaceUrl + ConnectionsConstants.connectionsRootPath + "/" + connectionId, - this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Get the connection types from the komodo rest interface - * @returns {ConnectionType[]} - */ - public getConnectionTypes(): ConnectionType[] { - const connectionTypes: ConnectionType[] = []; - const connType1: ConnectionType = new ConnectionType(); - connType1.setName(ConnectionsConstants.connectionType_postgresql); - connType1.setDescription(ConnectionsConstants.connectionTypeDescription_postgresql); - const connType2: ConnectionType = new ConnectionType(); - connType2.setName(ConnectionsConstants.connectionType_mysql); - connType2.setDescription(ConnectionsConstants.connectionTypeDescription_mysql); - const connType3: ConnectionType = new ConnectionType(); - connType3.setName(ConnectionsConstants.connectionType_mongodb); - connType3.setDescription(ConnectionsConstants.connectionTypeDescription_mongodb); - const connType4: ConnectionType = new ConnectionType(); - connType4.setName(ConnectionsConstants.connectionType_salesforce); - connType4.setDescription(ConnectionsConstants.connectionTypeDescription_salesforce); - - // const connType4: ConnectionType = new ConnectionType(); - // connType4.setName(ConnectionsConstants.connectionType_mariadb); - // connType4.setDescription(ConnectionsConstants.connectionTypeDescription_mariadb); - - connectionTypes.push(connType1); - connectionTypes.push(connType2); - connectionTypes.push(connType3); - connectionTypes.push(connType4); - - return connectionTypes; - } - - /** - * Get the available ServiceCatalogSources from the komodo rest interface - * @returns {Observable} - */ - public getAllServiceCatalogSources(): Observable { - return this.http - .get(environment.komodoTeiidUrl + ConnectionsConstants.serviceCatalogSourcesRootPath, this.getAuthRequestOptions()) - .map((response) => { - const catalogSources = response.json(); - return catalogSources.map((catSource) => ServiceCatalogSource.create( catSource )); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Get the schema for the specified connection. The connection must be ACTIVE, otherwise the schema - * will be empty. - * @param {string} connectionId the connection id - * @returns {Observable} - */ - public getConnectionSchema(connectionId: string): Observable { - return this.http - .get( environment.komodoWorkspaceUrl + ConnectionsConstants.connectionsRootPath - + "/" + connectionId + "/schema", this.getAuthRequestOptions()) - .map((response) => { - const schemaNodes = response.json(); - return schemaNodes.map((schemaNode) => SchemaNode.create( schemaNode )); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Get the columns for the specified connection and table. The connection must be ACTIVE, otherwise the schema - * will be empty. - * @param {string} connectionId the connection id - * @param {string} tableOption the table option (eg. schema=public/table=customer) - * @returns {Observable} - */ - public getConnectionSchemaColumns(connectionId: string, tableOption: string): Observable { - // setup query parameters - const tableParam = { - params: { - "tableOption": tableOption - } - }; - const options = new RequestOptions( tableParam ); - - return this.http - .get( environment.komodoWorkspaceUrl + ConnectionsConstants.connectionsRootPath - + "/" + connectionId + "/schema-columns", this.getAuthRequestOptions().merge(options)) - .map((response) => { - const columns = response.json(); - return columns.map((column) => Column.create( column )); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Create a connection in the Komodo repo - also binds the specified serviceCatalogSource - * @param {NewConnection} connection the connection object - * @returns {Observable} - */ - public createAndBindConnection(connection: NewConnection): Observable { - return this.http - .post(environment.komodoWorkspaceUrl + ConnectionsConstants.connectionsRootPath + "/" + connection.getName(), - connection, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Update a connection in the Komodo repo - also binds the specified serviceCatalogSource. - * @param {NewConnection} connection the connection object - * @returns {Observable} - */ - public updateAndBindConnection(connection: NewConnection): Observable { - return this.http - .put(environment.komodoWorkspaceUrl + ConnectionsConstants.connectionsRootPath + "/" + connection.getName(), - connection, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Creates a workspace Connection, binds it to the specified serviceCatalogSource, and initiates - * a refresh of the connection schema. - * @param {NewConnection} connection the connection object - * @returns {Observable} - */ - public createDeployConnection(connection: NewConnection): Observable { - return this.createAndBindConnection(connection) - .flatMap((res) => this.refreshConnectionSchema(connection.getName())) - .flatMap((res) => this.refreshPreviewVdb(VdbsConstants.PREVIEW_VDB_NAME)); - } - - /** - * Updates a workspace Connection, binds it to the specified serviceCatalogSource, and initiates - * a refresh of the connection schema. - * @param {NewConnection} connection the connection object - * @returns {Observable} - */ - public updateDeployConnection(connection: NewConnection): Observable { - return this.updateAndBindConnection(connection) - .flatMap((res) => this.refreshConnectionSchema(connection.getName())) - .flatMap((res) => this.refreshPreviewVdb(VdbsConstants.PREVIEW_VDB_NAME)); - } - - /** - * Delete the repo Connection VDB (if it exists) and undeploy the Connection VDB - * (if exists) - * @param {string} connectionId - * @returns {Observable} - */ - public deleteUndeployConnectionVdb(connectionId: string): Observable { - const vdbName = connectionId + "BtlConn"; - return this.vdbService.deleteVdbIfFound(vdbName) - .flatMap((res) => this.vdbService.undeployVdb(vdbName)) - .flatMap((res) => this.refreshPreviewVdb(VdbsConstants.PREVIEW_VDB_NAME)); - } - - /** - * Update the preview VDB and re-deploy it if needed. - * @param {string} vdbName - * @returns {Observable} - */ - public refreshPreviewVdb(vdbName: string): Observable { - const url = environment.komodoTeiidUrl + "/refreshPreviewVdb/" + vdbName; - return this.http - .post(url, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Updates the current Connecton VDB states - triggers update to be broadcast to interested components - */ - public updateConnectionSchemaStates(): void { - const self = this; - this.getConnections(false, true) - .subscribe( - (connectionSummaries) => { - self.cachedConnectionStatuses = self.createConnectionStatusMap(connectionSummaries); - this.notifierService.sendConnectionStatusMap(self.cachedConnectionStatuses); - }, - (error) => { - // On error, broadcast the cached states - this.notifierService.sendConnectionStatusMap(self.cachedConnectionStatuses); - } - ); - } - - /** - * Polls the server and sends Connection schema state updates at the specified interval - * @param {number} pollIntervalSec the interval (sec) between polling attempts - */ - public pollConnectionSchemaStatus(pollIntervalSec: number): void { - const pollIntervalMillis = pollIntervalSec * 1000; - - const self = this; - // start the timer - const timer = Observable.timer(500, pollIntervalMillis); - this.updatesSubscription = timer.subscribe((t: any) => { - self.updateConnectionSchemaStates(); - }); - } - - /** - * Build the getConnection Url based on the supplied parameters. - * @param {boolean} includeConnection 'true' to include connection, 'false' to omit - * @param {boolean} includeSchemaStatus 'true' to include connection schema status, 'false' to omit - */ - private buildGetConnectionsUrl(includeConnection: boolean, includeSchemaStatus: boolean): string { - // Base getConnections service url - const connectionsUrl = environment.komodoWorkspaceUrl + ConnectionsConstants.connectionsRootPath; - - // Additional parameters - const urlParams = "?" + ConnectionsConstants.includeConnectionParameter + "=" + String(includeConnection) + - "&" + ConnectionsConstants.includeSchemaStatusParameter + "=" + String(includeSchemaStatus); - - return connectionsUrl + urlParams; - } - - /* - * Creates a Map of connection name to ConnectionStatus - * @param {ConnectionSummary[]} connectionSummaries the array of ConnectionSummary objects - * @returns {Map} the map of connection name to ConnectionStatus - */ - private createConnectionStatusMap(connectionSummaries: ConnectionSummary[]): Map { - const connStatusMap: Map = new Map(); - - // For each connection, determine its status. Add the map entry - for ( const connectionSummary of connectionSummaries ) { - if (connectionSummary.hasStatus()) { - const status = connectionSummary.getStatus(); - const connName = status.getConnectionName(); - connStatusMap.set( connName, status ); - } - } - - return connStatusMap; - } - -} diff --git a/ui/src/app/connections/shared/connections-constants.ts b/ui/src/app/connections/shared/connections-constants.ts deleted file mode 100644 index 90320e94..00000000 --- a/ui/src/app/connections/shared/connections-constants.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, / - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NavigationItemConfig } from "patternfly-ng"; - -export class ConnectionsConstants { - - public static readonly connectionsRootRoute = "connections"; - public static readonly connectionsRootPath = "/" + ConnectionsConstants.connectionsRootRoute; - - public static readonly connectionRootRoute = "connection"; - public static readonly connectionRootPath = "/" + ConnectionsConstants.connectionRootRoute; - - public static readonly addConnectionRoute = ConnectionsConstants.connectionsRootRoute + "/add-connection"; - public static readonly addConnectionPath = ConnectionsConstants.connectionsRootPath + "/add-connection"; - - public static readonly serviceCatalogSourcesRootRoute = "serviceCatalogSources"; - public static readonly serviceCatalogSourcesRootPath = "/" + ConnectionsConstants.serviceCatalogSourcesRootRoute; - - public static readonly connectionType_postgresql = "postgresql"; - public static readonly connectionType_mysql = "mysql"; - public static readonly connectionType_mongodb = "mongodb"; - public static readonly connectionType_mariadb = "mariadb"; - public static readonly connectionType_salesforce = "salesforce"; - - public static readonly connectionTypeDescription_postgresql = "PostgreSQL database"; - public static readonly connectionTypeDescription_mysql = "MySQL database"; - public static readonly connectionTypeDescription_mongodb = "MongoDB database"; - public static readonly connectionTypeDescription_mariadb = "MariaDB database"; - public static readonly connectionTypeDescription_salesforce = "SalesForce"; - - public static readonly schemaNodeType_connection = "connection"; - - public static readonly includeConnectionParameter = "include-connection"; - public static readonly includeSchemaStatusParameter = "include-schema-status"; - - public static driverNamePropertyLabel = "Driver Name"; - public static jndiNamePropertyLabel = "JNDI Name"; - public static serviceCatalogSourceNameLabel = "Service Catalog Source"; - - public static readonly connectionsNavItem: NavigationItemConfig = { - title: "Connections", - iconStyleClass: "fa fa-fw fa-plug", - url: ConnectionsConstants.connectionsRootPath - }; - -} diff --git a/ui/src/app/connections/shared/mock-connection.service.ts b/ui/src/app/connections/shared/mock-connection.service.ts deleted file mode 100644 index 4aa684e8..00000000 --- a/ui/src/app/connections/shared/mock-connection.service.ts +++ /dev/null @@ -1,200 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable, ReflectiveInjector } from "@angular/core"; -import { Http } from "@angular/http"; -import { Connection } from "@connections/shared/connection.model"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { NewConnection } from "@connections/shared/new-connection.model"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { ServiceCatalogSource } from "@connections/shared/service-catalog-source.model"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { ConnectionSummary } from "@dataservices/shared/connection-summary.model"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { TestDataService } from "@shared/test-data.service"; -import "rxjs/add/observable/of"; -import "rxjs/add/observable/throw"; -import "rxjs/add/operator/catch"; -import "rxjs/add/operator/map"; -import { Observable } from "rxjs/Observable"; -import { Column } from "@dataservices/shared/column.model"; - -@Injectable() -export class MockConnectionService extends ConnectionService { - - private connections: Connection[]; - private readonly serviceCatalogSources: ServiceCatalogSource[]; - private connectionSchemaMap = new Map(); - private connectionSchemaColumnsMap = new Map(); - private testDataService: TestDataService; - - constructor( http: Http, vdbService: VdbService, notifierService: NotifierService, - appSettings: AppSettingsService, logger: LoggerService ) { - super(http, vdbService, notifierService, appSettings, logger); - - // Inject service for test data - const injector = ReflectiveInjector.resolveAndCreate([TestDataService]); - this.testDataService = injector.get(TestDataService); - - // Get test data - const conns: Connection[] = []; - const connSummaries: ConnectionSummary[] = this.testDataService.getConnectionSummaries(true, true); - for ( const connSummary of connSummaries ) { - conns.push(connSummary.getConnection()); - } - this.connections = conns; - this.serviceCatalogSources = this.testDataService.getServiceCatalogSources(); - this.connectionSchemaMap = this.testDataService.getConnectionSchemaMap(); - this.connectionSchemaColumnsMap = this.testDataService.getConnectionSchemaColumnsMap(); - } - - public isValidName( name: string ): Observable< string > { - if ( !name || name.length === 0 ) { - return Observable.of( "Connection name cannot be empty" ); - } - - // make sure no dataservice exists with that name - for ( const conn of this.connections ) { - if ( conn.getId() === name ) { - return Observable.of( "Connection with that name already exists" ); - } - } - - // just implement a case where no special characters allowed - for ( let i = 0; i < name.length; i++ ) { - const c = name.charAt( i ); - - // special characters have the same upper and lower case values - if ( c.toUpperCase() === c.toLowerCase() ) { - return Observable.of( "No special characters allowed" ); - } - } - - // valid - return Observable.of( "" ); - } - - /** - * Get the connection summaries from the komodo rest interface. The supplied parameters determine what portions - * of the ConnectionSummary are returned. - * - include-connection=true (include connection [default=true]) - * - include-schema-status=true (include schema vdb status [default=false]) - * @param {boolean} includeConnection 'true' to include connection - * @param {boolean} includeSchemaStatus 'true' to include connection schema status - * @returns {Observable} - */ - public getConnections(includeConnection: boolean, includeSchemaStatus: boolean): Observable { - return Observable.of(this.testDataService.getConnectionSummaries(includeConnection, includeSchemaStatus)); - } - - /** - * Delete a connection via the komodo rest interface - * @param {string} connectionId - * @returns {Observable} - */ - public deleteConnection(connectionId: string): Observable { - const size = this.connections.length; - this.connections = this.connections.filter( ( conn ) => conn.getId() !== connectionId ); - return Observable.of( size === this.connections.length ); - } - - /** - * Get the available ServiceCatalogSources from the komodo rest interface - * @returns {Observable} - */ - public getAllServiceCatalogSources(): Observable { - return Observable.of(this.serviceCatalogSources); - } - - /** - * Get the root SchemaNodes for the specified Connection - * @param {string} connectionName the connection name - * @returns {Observable} - */ - public getConnectionSchema( connectionName: string ): Observable< SchemaNode[] > { - return Observable.of( this.connectionSchemaMap.get( connectionName ) ); - } - - /** - * Get the columns for the specified connection and table. The connection must be ACTIVE, otherwise the schema - * will be empty. - * @param {string} connectionName the connection id - * @param {string} tableOption the table option (eg. schema=public/table=customer) - * @returns {Observable} - */ - public getConnectionSchemaColumns(connectionName: string, tableOption: string): Observable { - return Observable.of( this.connectionSchemaColumnsMap.get( connectionName + ":" + tableOption )); - } - - /** - * Create a connection in the Komodo repo - also binds the specified serviceCatalogSource - * @param {NewConnection} connection the connection object - * @returns {Observable} - */ - public createAndBindConnection(connection: NewConnection): Observable { - return Observable.of(true); - } - - /** - * Update a connection in the Komodo repo - also binds the specified serviceCatalogSource. - * @param {NewConnection} connection the connection object - * @returns {Observable} - */ - public updateAndBindConnection(connection: NewConnection): Observable { - return Observable.of(true); - } - - /** - * Update the preview VDB and re-deploy it if needed. - * @param {string} vdbName - * @returns {Observable} - */ - public refreshPreviewVdb(vdbName: string): Observable { - return Observable.of(true); - } - - /** - * Initiates a refresh of the connection schema via the komodo rest interface - * @param {string} connectionName - * @returns {Observable} - */ - public refreshConnectionSchema(connectionName: string): Observable { - if ( !connectionName || connectionName.length === 0 ) { - return Observable.of( false ); - } - - return Observable.of( true ); - } - - /** - * Updates the current Connection schema states - triggers update to be broadcast to interested components - */ - public updateConnectionSchemaStates(): void { - // Nothing to do - } - - /** - * Polls the server and sends Connection state updates at the specified interval - * @param {number} pollIntervalSec the interval (sec) between polling attempts - */ - public pollConnectionSchemaStatus(pollIntervalSec: number): void { - // Nothing to do - } - -} diff --git a/ui/src/app/connections/shared/new-connection.model.ts b/ui/src/app/connections/shared/new-connection.model.ts deleted file mode 100644 index 56371500..00000000 --- a/ui/src/app/connections/shared/new-connection.model.ts +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class NewConnection { - - private name: string; - private description = ""; - private serviceCatalogSource: string; - - /** - * Constructor - */ - constructor() { - // nothing to do - } - - /** - * @returns {string} the connection name (can be null) - */ - public getName(): string { - return this.name; - } - - /** - * @returns {string} the connection description (can be null) - */ - public getDescription(): string { - return this.description; - } - - /** - * @returns {string} the connection serviceCatalog source name (can be null) - */ - public getServiceCatalogSource(): string { - return this.serviceCatalogSource; - } - - /** - * @param {string} name the connection name (optional) - */ - public setName( name?: string ): void { - this.name = name ? name : null; - } - - /** - * @param {string} description the connection description (optional) - */ - public setDescription( description?: string ): void { - this.description = description ? description : ""; - } - - /** - * @param {string} serviceCatalogSource the serviceCatalogSource - */ - public setServiceCatalogSource( serviceCatalogSource?: string ): void { - this.serviceCatalogSource = serviceCatalogSource ? serviceCatalogSource : null; - } - - // overrides toJSON - we do not want the name supplied in the json body. - public toJSON(): {} { - return { - description: this.description, - serviceCatalogSource: this.serviceCatalogSource, - }; - } - -} diff --git a/ui/src/app/connections/shared/schema-node.model.spec.ts b/ui/src/app/connections/shared/schema-node.model.spec.ts deleted file mode 100644 index fba9a11c..00000000 --- a/ui/src/app/connections/shared/schema-node.model.spec.ts +++ /dev/null @@ -1,215 +0,0 @@ -import { SchemaNode } from "@connections/shared/schema-node.model"; - -describe("SchemaNode", () => { - let schemaNode: SchemaNode; - - beforeEach(() => { - schemaNode = null; - }); - - it("should create, root only", () => { - console.log("========== [SchemaNode] should create, root only"); - schemaNode = SchemaNode.create( - { - "name": "restaurants", - "type": "collection", - "path": "collection=restaurants", - "connectionName": "conn1", - "queryable": true, - "children": [ - ], - }); - - expect(schemaNode.getName()).toEqual("restaurants"); - expect(schemaNode.getType()).toEqual("collection"); - expect(schemaNode.getPath()).toEqual("collection=restaurants"); - expect(schemaNode.getConnectionName()).toEqual("conn1"); - expect(schemaNode.isQueryable()).toEqual(true); - expect(schemaNode.getMaxLevels()).toEqual(1); - }); - - it("should create, root with 2 children", () => { - console.log("========== [SchemaNode] should create, root with 2 children"); - schemaNode = SchemaNode.create( - { - "name": "restaurants", - "type": "collection", - "path": "collection=restaurants", - "connectionName": "conn1", - "queryable": true, - "children": [ - { - "name": "grades", - "type": "embedded", - "path": "collection=restaurants/embedded=grades", - "connectionName": "conn1", - "queryable": true, - "children": [] - }, - { - "name": "address", - "type": "embedded", - "path": "collection=restaurants/embedded=address", - "connectionName": "conn1", - "queryable": true, - "children": [] - }, - ], - }); - - expect(schemaNode.getName()).toEqual("restaurants"); - expect(schemaNode.getType()).toEqual("collection"); - expect(schemaNode.getPath()).toEqual("collection=restaurants"); - expect(schemaNode.getConnectionName()).toEqual("conn1"); - expect(schemaNode.isQueryable()).toEqual(true); - expect(schemaNode.getMaxLevels()).toEqual(2); - expect(schemaNode.getChildren().length).toEqual(2); - - expect(schemaNode.getChildren()[0].getName()).toEqual("grades"); - expect(schemaNode.getChildren()[0].getType()).toEqual("embedded"); - expect(schemaNode.getChildren()[0].getPath()).toEqual("collection=restaurants/embedded=grades"); - expect(schemaNode.getChildren()[0].getConnectionName()).toEqual("conn1"); - expect(schemaNode.getChildren()[0].isQueryable()).toEqual(true); - expect(schemaNode.getChildren()[0].getMaxLevels()).toEqual(1); - expect(schemaNode.getChildren()[0].getChildren().length).toEqual(0); - - expect(schemaNode.getChildren()[1].getName()).toEqual("address"); - expect(schemaNode.getChildren()[1].getType()).toEqual("embedded"); - expect(schemaNode.getChildren()[1].getPath()).toEqual("collection=restaurants/embedded=address"); - expect(schemaNode.getChildren()[1].getConnectionName()).toEqual("conn1"); - expect(schemaNode.getChildren()[1].isQueryable()).toEqual(true); - expect(schemaNode.getChildren()[1].getMaxLevels()).toEqual(1); - expect(schemaNode.getChildren()[1].getChildren().length).toEqual(0); - }); - - it("should create, root with 3 levels", () => { - console.log("========== [SchemaNode] should create, root with 3 levels"); - schemaNode = SchemaNode.create( - { - "name": "myCatalog", - "type": "catalog", - "path": "catalog=myCatalog", - "connectionName": "conn1", - "queryable": false, - "children": [ - { - "name": "mySchema1", - "type": "schema", - "path": "catalog=myCatalog/schema=mySchema1", - "connectionName": "conn1", - "queryable": false, - "children": [ - { - "name": "myTable1", - "type": "table", - "path": "catalog=myCatalog/schema=mySchema1/table=myTable1", - "connectionName": "conn1", - "queryable": true, - "children": [] - }, - { - "name": "myTable2", - "type": "table", - "path": "catalog=myCatalog/schema=mySchema1/table=myTable2", - "connectionName": "conn1", - "queryable": true, - "children": [] - } - ] - }, - { - "name": "mySchema2", - "type": "schema", - "path": "catalog=myCatalog/schema=mySchema2", - "connectionName": "conn1", - "queryable": false, - "children": [ - { - "name": "myTableA", - "type": "table", - "path": "catalog=myCatalog/schema=mySchema2/table=myTableA", - "connectionName": "conn1", - "queryable": true, - "children": [] - }, - { - "name": "myTableB", - "type": "table", - "path": "catalog=myCatalog/schema=mySchema2/table=myTableB", - "connectionName": "conn1", - "queryable": true, - "children": [] - }, - { - "name": "myTableC", - "type": "table", - "path": "catalog=myCatalog/schema=mySchema2/table=myTableC", - "connectionName": "conn1", - "queryable": true, - "children": [] - } - ] - }, - ], - }); - - // Root Node (myCatalog) - expect(schemaNode.getName()).toEqual("myCatalog"); - expect(schemaNode.getType()).toEqual("catalog"); - expect(schemaNode.getPath()).toEqual("catalog=myCatalog"); - expect(schemaNode.getConnectionName()).toEqual("conn1"); - expect(schemaNode.isQueryable()).toEqual(false); - expect(schemaNode.getMaxLevels()).toEqual(3); - expect(schemaNode.getChildren().length).toEqual(2); - - // Root Child 1 (mySchema1) - const schema1: SchemaNode = schemaNode.getChildren()[0]; - expect(schema1.getName()).toEqual("mySchema1"); - expect(schema1.getType()).toEqual("schema"); - expect(schema1.getPath()).toEqual("catalog=myCatalog/schema=mySchema1"); - expect(schema1.getConnectionName()).toEqual("conn1"); - expect(schema1.isQueryable()).toEqual(false); - expect(schema1.getMaxLevels()).toEqual(2); - expect(schema1.getChildren().length).toEqual(2); - - // Root Child 2 (mySchema2) - const schema2: SchemaNode = schemaNode.getChildren()[1]; - expect(schema2.getName()).toEqual("mySchema2"); - expect(schema2.getType()).toEqual("schema"); - expect(schema2.getPath()).toEqual("catalog=myCatalog/schema=mySchema2"); - expect(schema2.getConnectionName()).toEqual("conn1"); - expect(schema2.isQueryable()).toEqual(false); - expect(schema2.getMaxLevels()).toEqual(2); - expect(schema2.getChildren().length).toEqual(3); - - // mySchema2 children - const tableA: SchemaNode = schema2.getChildren()[0]; - const tableB: SchemaNode = schema2.getChildren()[1]; - const tableC: SchemaNode = schema2.getChildren()[2]; - - expect(tableA.getName()).toEqual("myTableA"); - expect(tableA.getType()).toEqual("table"); - expect(tableA.getPath()).toEqual("catalog=myCatalog/schema=mySchema2/table=myTableA"); - expect(tableA.getConnectionName()).toEqual("conn1"); - expect(tableA.isQueryable()).toEqual(true); - expect(tableA.getMaxLevels()).toEqual(1); - expect(tableA.getChildren().length).toEqual(0); - - expect(tableB.getName()).toEqual("myTableB"); - expect(tableB.getType()).toEqual("table"); - expect(tableB.getPath()).toEqual("catalog=myCatalog/schema=mySchema2/table=myTableB"); - expect(tableB.getConnectionName()).toEqual("conn1"); - expect(tableB.isQueryable()).toEqual(true); - expect(tableB.getMaxLevels()).toEqual(1); - expect(tableB.getChildren().length).toEqual(0); - - expect(tableC.getName()).toEqual("myTableC"); - expect(tableC.getType()).toEqual("table"); - expect(tableC.getPath()).toEqual("catalog=myCatalog/schema=mySchema2/table=myTableC"); - expect(tableC.getConnectionName()).toEqual("conn1"); - expect(tableC.isQueryable()).toEqual(true); - expect(tableC.getMaxLevels()).toEqual(1); - expect(tableC.getChildren().length).toEqual(0); - }); - -}); diff --git a/ui/src/app/connections/shared/schema-node.model.ts b/ui/src/app/connections/shared/schema-node.model.ts deleted file mode 100644 index e7dbdea8..00000000 --- a/ui/src/app/connections/shared/schema-node.model.ts +++ /dev/null @@ -1,195 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class SchemaNode { - private name: string; - private type: string; - private path: string; - private connectionName: string; - private queryable = false; - private isSelected = true; - private hasChildren = false; - private children: SchemaNode[]; - - /** - * @param {Object} json the JSON representation of a SchemaNode - * @returns {SchemaNode} the new SchemaNode (never null) - */ - public static create( json: object = {} ): SchemaNode { - const schemaNode = new SchemaNode(); - for (const field of Object.keys(json)) { - if (field === "children") { - const jsonKids = json[field]; - const kids: SchemaNode[] = []; - for (const kid of jsonKids) { - const k = SchemaNode.create(kid); - kids.push(k); - } - schemaNode.setChildren(kids); - } else if (field === "name") { - schemaNode.setName(json[field]); - } else if (field === "type") { - schemaNode.setType(json[field]); - } else if (field === "path") { - schemaNode.setPath(json[field]); - } else if (field === "queryable") { - schemaNode.setQueryable(json[field]); - } else if (field === "connectionName") { - schemaNode.setConnectionName(json[field]); - } - } - return schemaNode; - } - - constructor() { - // nothing to do - } - - /** - * @returns {string} the node name - */ - public getName(): string { - return this.name; - } - - /** - * @returns {string} the node type - */ - public getType(): string { - return this.type; - } - - /** - * Get the path, for example: ( schema=public/table=customer ). It is assumed that the path here does NOT include - * the connection. - * @returns {string} the node path - */ - public getPath(): string { - return this.path; - } - - /** - * @returns {string} the nodes connection - */ - public getConnectionName(): string { - return this.connectionName; - } - - /** - * @param {string} name the node name - */ - public setName( name?: string ): void { - this.name = name ? name : null; - } - - /** - * @param {string} type the node type - */ - public setType( type?: string ): void { - this.type = type ? type : null; - } - - /** - * Set the path, for example: ( schema=public/table=customer ). It is assumed that the path here does NOT include - * the connection. - * @param {string} path the node path - */ - public setPath( path?: string ): void { - this.path = path ? path : null; - } - - /** - * @param {string} connectionName the nodes connection name - */ - public setConnectionName( connectionName?: string ): void { - this.connectionName = connectionName ? connectionName : null; - } - - /** - * @returns {boolean} true if queryable - */ - public isQueryable(): boolean { - return this.queryable; - } - - /** - * @param {boolean} queryable 'true' if queryable - */ - public setQueryable(queryable: boolean ): void { - this.queryable = queryable; - } - - /** - * @param {boolean} hasChildren 'true' if has children - */ - public setHasChildren(hasChildren: boolean ): void { - this.hasChildren = hasChildren; - } - - /** - * @returns {SchemaNode[]} the child SchemaNode array - */ - public getChildren(): SchemaNode[] { - return this.children; - } - - /** - * @param {SchemaNode[]} children SchemaNode children - */ - public setChildren( children: SchemaNode[] ): void { - this.children = children; - } - - /** - * Get selected state - * @returns {boolean} the selected state - */ - public get selected( ): boolean { - return this.isSelected; - } - - /** - * Set selected status - * @param {boolean} isSelected the selected state - */ - public set selected( isSelected: boolean ) { - this.isSelected = isSelected; - } - - /** - * Determine the max number of levels in the tree structure, including this node. - * @returns {number} the max number of levels, including this node - */ - public getMaxLevels(): number { - let maxChildLevel = 0; - if (this.children && this.children != null) { - for (const child of this.children) { - maxChildLevel = Math.max(maxChildLevel, child.getMaxLevels()); - } - } - return maxChildLevel + 1; - } - - /** - * Set all object values using the supplied View json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/connections/shared/service-catalog-source.model.spec.ts b/ui/src/app/connections/shared/service-catalog-source.model.spec.ts deleted file mode 100644 index 85f1ae39..00000000 --- a/ui/src/app/connections/shared/service-catalog-source.model.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { ServiceCatalogSource } from "@connections/shared/service-catalog-source.model"; - -describe("ServiceCatalogSource", () => { - let serviceCatSrc: ServiceCatalogSource; - - beforeEach(() => { - serviceCatSrc = null; - }); - - it("should create", () => { - console.log("========== [ServiceCatalogSource] should create"); - serviceCatSrc = ServiceCatalogSource.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "keng__id": "mongodb-persistent-762zc", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/2018-05-17_20-35-29-543", - "keng__kType": "ServiceCatalogDataSource", - "keng__hasChildren": false, - "sc__name": "mongodb-persistent-762zc", - "sc__type": "mongodb", - "sc__bound": true, - "sc__translator": "mongodb", - "keng___links": [ - { - "rel": "self", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/metadata/connections/mongodb-persistent-762zc" - }, - { - "rel": "parent", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/metadata/connections" - }, - { - "rel": "children", - "href": "http://das-beetle-studio.192.168.42.1154.nip.ip/xxx" - } - ] - } - ); - - expect(serviceCatSrc.getName()).toEqual("mongodb-persistent-762zc"); - expect(serviceCatSrc.getType()).toEqual("mongodb"); - expect(serviceCatSrc.isBound()).toEqual(true); - }); - -}); diff --git a/ui/src/app/connections/shared/service-catalog-source.model.ts b/ui/src/app/connections/shared/service-catalog-source.model.ts deleted file mode 100644 index 840f9def..00000000 --- a/ui/src/app/connections/shared/service-catalog-source.model.ts +++ /dev/null @@ -1,155 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Identifiable } from "@shared/identifiable"; -import { SortDirection } from "@shared/sort-direction.enum"; - -export class ServiceCatalogSource implements Identifiable< string > { - - private keng__id: string; - private sc__name: string; - private sc__type: string; - private sc__bound: boolean; - - /** - * Create a ServiceCatalogSource from its json representation - * @param {Object} json the JSON representation of a ServiceCatalogSource - * @returns {ServiceCatalogSource} the new ServiceCatalogSource (never null) - */ - public static create( json: object = {} ): ServiceCatalogSource { - const conn = new ServiceCatalogSource(); - conn.setValues( json ); - return conn; - } - - /** - * Sorts the provided catalog sources in the specified sort direction - * @param {ServiceCatalogSource[]} catalogSources the catalog sources being sorted - * @param {SortDirection} sortDirection the sort direction - */ - public static sort( catalogSources: ServiceCatalogSource[], - sortDirection: SortDirection ): void { - catalogSources.sort( ( thisSource: ServiceCatalogSource, thatSource: ServiceCatalogSource ) => { - const result = thisSource.compareTo( thatSource ); - - if ( sortDirection === SortDirection.DESC ) { - return result * -1; - } - - return result; - } ); - } - - constructor() { - // nothing to do - } - - /** - * See {Identifiable}. - */ - public compareTo( that: ServiceCatalogSource ): number { - let result = 0; - - if ( this.getId() ) { - if ( that.getId() ) { - // both have an ID - result = this.getId().localeCompare( that.getId() ); - } else { - // thatItem does not have an ID - result = 1; - } - } else if ( that.getId() ) { - // thisItem does not have an ID and thatItem does - result = -1; - } - - return result; - } - - /** - * Get the catalog source type - * @returns {string} the catalog source type name (can be null) - */ - public getType(): string { - return this.sc__type; - } - - /** - * Get the catalog source id - * @returns {string} the catalog source identifier (can be null) - */ - public getId(): string { - return this.keng__id; - } - - /** - * Get the catalog source name - * @returns {string} the catalog source name (can be null) - */ - public getName(): string { - return this.sc__name; - } - - /** - * Get the bound status of the catalog source - * @returns {boolean} the bound status (true == bound) - */ - public isBound(): boolean { - return this.sc__bound; - } - - /** - * Set the catalog source type - * @param {string} typeName the catalog source type (optional) - */ - public setType( typeName?: string ): void { - this.sc__type = typeName ? typeName : null; - } - - /** - * Set the catalog source id - * @param {string} id the catalog source identifier (optional) - */ - public setId( id?: string ): void { - this.keng__id = id ? id : null; - } - - /** - * Set the catalog source name - * @param {string} name the catalog source name (optional) - */ - public setName( name?: string ): void { - this.sc__name = name ? name : null; - } - - /** - * Set the bound state of the catalog source - * @param {boolean} bound the bound state - */ - public setBound( bound: boolean ): void { - this.sc__bound = bound; - } - - /** - * Set all object values using the supplied catalog source json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/core/about-dialog/about-dialog.component.css b/ui/src/app/core/about-dialog/about-dialog.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/core/about-dialog/about-dialog.component.html b/ui/src/app/core/about-dialog/about-dialog.component.html deleted file mode 100644 index 916a796f..00000000 --- a/ui/src/app/core/about-dialog/about-dialog.component.html +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/ui/src/app/core/about-dialog/about-dialog.component.spec.ts b/ui/src/app/core/about-dialog/about-dialog.component.spec.ts deleted file mode 100644 index 1f87927c..00000000 --- a/ui/src/app/core/about-dialog/about-dialog.component.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { HttpModule } from "@angular/http"; -import { About } from "@core/about-dialog/about.model"; -import { AboutService } from "@core/about-dialog/about.service"; -import { MockAboutService } from "@core/about-dialog/mock-about.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { ModalModule } from "patternfly-ng"; -import { AboutDialogComponent } from "./about-dialog.component"; - -describe("AboutDialogComponent", () => { - let component: AboutDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AboutDialogComponent ], - imports: [ HttpModule, ModalModule ], - providers: [ - AboutService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - LoggerService ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AboutDialogComponent); - component = fixture.componentInstance; - component.info = About.create( MockAboutService.json ); - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [AboutDialogComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/core/about-dialog/about-dialog.component.ts b/ui/src/app/core/about-dialog/about-dialog.component.ts deleted file mode 100644 index 1e891ed0..00000000 --- a/ui/src/app/core/about-dialog/about-dialog.component.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from "@angular/core"; -import { AboutService } from "@core/about-dialog/about.service"; -import { LoggerService } from "@core/logger.service"; -import { AboutEvent } from "app/core/about-dialog/about-event"; -import { About } from "app/core/about-dialog/about.model"; -import { AboutModalConfig } from "patternfly-ng/modal"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-about-dialog", - templateUrl: "./about-dialog.component.html", - styleUrls: ["./about-dialog.component.css"] -}) -export class AboutDialogComponent implements OnInit { - - /** - * The Event is emitted when modal is closed - */ - @Output( "onCancel" ) public onCancel = new EventEmitter(); - - /** - * The about information. - */ - @Input() public info: About; - - public aboutConfig: AboutModalConfig; - private aboutService: AboutService; - private logger: LoggerService; - - /** - * The default contructor - */ - constructor(logger: LoggerService, - aboutService: AboutService) { - this.aboutService = aboutService; - this.logger = logger; - } - - public ngOnInit(): void { - - const self = this; - - this.aboutService.getAboutInformation().subscribe( - ( result ) => { - this.aboutConfig = { - additionalInfo: result.appDescription, - copyright: result.copyright, - logoImageAlt: this.appImageAlt, - logoImageSrc: this.appImageSrc, - title: result.appTitle, - productInfo: [ - { name: "Version", value: result.appVersion }, - { name: "Server Name", value: "Localhost_update_me" }, - { name: "User Name", value: "admin_update_me" }, - { name: "User Role", value: "Administrator_update_me" }] - } as AboutModalConfig; - }, - ( error ) => { - self.logger.error( error, "Error getting about information."); - } - ); - } - - public get appImageAlt(): string { - return "Beetle Studio image"; - } - - public get appImageSrc(): string { - return "assets/teiid-lizard-gradient-bgd.png"; - } - - public close(): void { - this.onCancel.emit( { - close: true - } as AboutEvent ); - } - - public get logoImageAlt(): string { - return "Red Hat Logo image"; - } - - public get logoImageSrc(): string { - return "assets/redhat-iot.png"; - } - -} diff --git a/ui/src/app/core/about-dialog/about-event.ts b/ui/src/app/core/about-dialog/about-event.ts deleted file mode 100644 index c409bdc5..00000000 --- a/ui/src/app/core/about-dialog/about-event.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class AboutEvent { - - /** - * Flag indicating Modal is open - */ - public close?: boolean; - -} diff --git a/ui/src/app/core/about-dialog/about.model.ts b/ui/src/app/core/about-dialog/about.model.ts deleted file mode 100644 index 24e6da10..00000000 --- a/ui/src/app/core/about-dialog/about.model.ts +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class About { - - // Here is the JSON returned from REST: - // - // { - // "Information": { - // "App Name": "vdb-builder", - // "App Title": "Vdb Builder", - // "copyright": "2017-1018", - // "App Description": "A tool that allows creating, editing and managing dynamic VDBs and their contents", - // "App Version": "0.0.4-SNAPSHOT", - // "Repository Workspace": "komodoLocalWorkspace", - // "Repository Configuration": "vfs:/dirLocation/komodo-core-0.0.4-SNAPSHOT.jar/org/komodo/repository/local-repository-config.json", - // "Repository Vdb Total": "1" - // } - // } - - private Information: {}; - - public static create( json: object = {} ): About { - const about = new About(); - about.setValues( json ); - return about; - } - - public get appDescription(): string { - if ( this.Information && this.Information[ "App Description" ] != null ) { - return this.Information[ "App Description" ]; - } - - return "App description not found"; - } - - public get appName(): string { - if ( this.Information && this.Information[ "App Name" ] ) { - return this.Information[ "App Name" ]; - } - - return "App name not found"; - } - - public get appTitle(): string { - if ( this.Information && this.Information[ "App Title" ] ) { - return this.Information[ "App Title" ]; - } - - return "App title not found"; - } - - public get appVersion(): string { - if ( this.Information && this.Information[ "App Version" ] ) { - return this.Information[ "App Version" ]; - } - - return "App version not found"; - } - - public get copyright(): string { - if ( this.Information && this.Information[ "App Copyright" ] ) { - return this.Information[ "App Copyright" ]; - } - - return "2017-2018 Red Hat, Inc."; - } - - /** - * Set all object values using the supplied JSON. - * @param {Object} values - */ - public setValues( values: object = {} ): void { - Object.assign( this, values ); - } - -} diff --git a/ui/src/app/core/about-dialog/about.service.spec.ts b/ui/src/app/core/about-dialog/about.service.spec.ts deleted file mode 100644 index a5730cfe..00000000 --- a/ui/src/app/core/about-dialog/about.service.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; -import { HttpModule } from "@angular/http"; -import { AboutService } from "@core/about-dialog/about.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; - -describe("AboutService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ HttpModule ], - providers: [ - AboutService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - LoggerService ] - }); - }); - - it("should be created", - inject([ AboutService, AppSettingsService, LoggerService ], - ( service: AboutService ) => { - console.log("========== [AboutService] should be created"); - expect( service ).toBeTruthy(); - })); -}); diff --git a/ui/src/app/core/about-dialog/about.service.ts b/ui/src/app/core/about-dialog/about.service.ts deleted file mode 100644 index f1a49faa..00000000 --- a/ui/src/app/core/about-dialog/about.service.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable } from "@angular/core"; -import { Http } from "@angular/http"; -import { About } from "@core/about-dialog/about.model"; -import { ApiService } from "@core/api.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { environment } from "@environments/environment"; -import { Observable } from "rxjs/Observable"; - -@Injectable() -export class AboutService extends ApiService { - - private static readonly aboutUrl = environment.komodoServiceUrl + "/about"; - - private http: Http; - - constructor( http: Http, - appSettings: AppSettingsService, - logger: LoggerService ) { - super( appSettings, logger ); - this.http = http; - } - - public getAboutInformation(): Observable { - return this.http.get( AboutService.aboutUrl, this.getAuthRequestOptions() ) - .map( ( response ) => { - const aboutInfo = response.json(); - return About.create( aboutInfo ); - } ) - .catch( ( error ) => this.handleError( error ) ); - } -} diff --git a/ui/src/app/core/about-dialog/mock-about.service.ts b/ui/src/app/core/about-dialog/mock-about.service.ts deleted file mode 100644 index 0ddc5223..00000000 --- a/ui/src/app/core/about-dialog/mock-about.service.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from "@angular/core"; -import { Http } from "@angular/http"; -import { About } from "@core/about-dialog/about.model"; -import { AboutService } from "@core/about-dialog/about.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { Observable } from "rxjs/Observable"; - -@Injectable() -export class MockAboutService extends AboutService { - - public static readonly json = { - "Information": { - "App Name": "vdb-builder", - "App Title": "Vdb Builder", - "App Description": "A tool that allows creating, editing and managing dynamic VDBs and their contents", - "App Version": "0.0.4-SNAPSHOT" - } - }; - - constructor( http: Http, - appSettings: AppSettingsService, - logger: LoggerService ) { - super( http, appSettings, logger ); - } - - public getAboutInformation(): Observable< About > { - const about = About.create( MockAboutService.json ); - return Observable.of( about ); - } - -} diff --git a/ui/src/app/core/api.service.spec.ts b/ui/src/app/core/api.service.spec.ts deleted file mode 100644 index 0b43471e..00000000 --- a/ui/src/app/core/api.service.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; -import { HttpModule } from "@angular/http"; -import { ApiService } from "@core/api.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; - -describe("ApiService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpModule], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService }, - LoggerService] - }); - }); - - it("should be created", inject([LoggerService], - (service: MockService ) => { - console.log("========== [ApiService] should be created"); - expect(service).toBeTruthy(); - })); -}); - -class MockService extends ApiService { - - constructor( appSettings: AppSettingsService, logger: LoggerService ) { - super( appSettings, logger ); - } - -} diff --git a/ui/src/app/core/api.service.ts b/ui/src/app/core/api.service.ts deleted file mode 100644 index d294cf62..00000000 --- a/ui/src/app/core/api.service.ts +++ /dev/null @@ -1,167 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { RequestOptions, Response } from "@angular/http"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import "rxjs/add/observable/throw"; -import "rxjs/add/operator/catch"; -import "rxjs/add/operator/map"; -import { Observable } from "rxjs/Observable"; -import { ErrorObservable } from "rxjs/observable/ErrorObservable"; -import * as X2JS from 'x2js'; - -export abstract class ApiService { - - protected appSettings: AppSettingsService; - protected logger: LoggerService; - - protected constructor( appSettings: AppSettingsService, logger: LoggerService) { - this.appSettings = appSettings; - this.logger = logger; - } - - /** - * @returns the base url of the application - */ - protected getBaseUrl(): string { - return window.location.protocol + "://" + window.location.hostname; - } - - /** - * Get the Auth RequestOptions if any - * Note: Since usage of the oauth-proxy no additional auth request options are necessary - * - * @returns {RequestOptions} - */ - protected getAuthRequestOptions(): RequestOptions { - return this.appSettings.getAuthRequestOptions(); - } - - /** - * Get the current user workspace path - * @returns {string} the current user workspace path - */ - protected getKomodoUserWorkspacePath(): string { - return this.appSettings.getKomodoUserWorkspacePath(); - } - - public isXML(xml: string): boolean { - try { - const parser = new X2JS(); - const xmlDoc = parser.xml2js(xml); // is valid XML - return xmlDoc != null; - } catch (err) { - // was not XML - return false; - } - } - - public tryXMLParse(xml: string): any { - try { - const parser = new X2JS(); - const xmlDoc = parser.xml2js(xml); // is valid XML - return xmlDoc; - } catch (err) { - // Do nothing - } - - return null; - } - - public tryNumberParse(jsonString: string): number { - try { - const n = parseInt(jsonString, 10); - if (n) { - return n; - } - } catch (e) { - // Do nothing - } - - return null; - } - - /** - * Try to parse the given string and if parseable - * then return the object - */ - public tryJsonParse(jsonString: string): any { - try { - const o = JSON.parse(jsonString); - - // Handle non-exception-throwing cases: - // Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking, - // but... JSON.parse(null) returns null, and typeof null === "object", - // so we must check for that, too. Thankfully, null is falsey, so this suffices: - if (o && typeof o === "object") { - return o; - } - } catch (e) { - // Do nothing - } - - return null; - } - - /** - * @returns true if the item is parseable - */ - public isJSON(item: string): boolean { - try { - item = JSON.parse(item); - } catch (e) { - return false; - } - - if (typeof item === "object" && item !== null) { - return true; - } - - return false; - } - - protected msgFromResponse(response: Response): string { - let msg = ""; - - if (! this.isJSON(response.text())) { - msg = response.text(); - } else { - const body = response.json(); - - if (body.message) { - msg = body.message; - } else if (body.error) { - msg = body.error; - } else if (body.Information && body.Information.ErrorMessage1) { - msg = body.Information.ErrorMessage1; - } - } - - if (msg.length === 0 ) { - return "unknown error"; - } - - return msg; - } - - protected handleError(error: Response): ErrorObservable { - this.logger.error( this.constructor.name + "::handleError => " + this.msgFromResponse(error)); - return Observable.throw(error); - } - -} diff --git a/ui/src/app/core/app-settings.service.spec.ts b/ui/src/app/core/app-settings.service.spec.ts deleted file mode 100644 index 078da512..00000000 --- a/ui/src/app/core/app-settings.service.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; -import { HttpModule } from "@angular/http"; -import { LoggerService } from "@core/logger.service"; -import { AppSettingsService } from "./app-settings.service"; - -describe("AppSettingsService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ HttpModule ], - providers: [ - AppSettingsService, - LoggerService - ] - }); - }); - - it("should be created", inject([AppSettingsService], (service: AppSettingsService) => { - console.log("========== [AppSettingsService] should be created"); - expect(service).toBeTruthy(); - })); -}); diff --git a/ui/src/app/core/app-settings.service.ts b/ui/src/app/core/app-settings.service.ts deleted file mode 100644 index 06174755..00000000 --- a/ui/src/app/core/app-settings.service.ts +++ /dev/null @@ -1,181 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable } from "@angular/core"; -import { Headers, Http, RequestOptions, Response } from "@angular/http"; -import { LoggerService } from "@core/logger.service"; -import { environment } from "@environments/environment"; -import { LayoutType } from "@shared/layout-type.enum"; -import { Observable } from "rxjs/Observable"; -import { ErrorObservable } from "rxjs/observable/ErrorObservable"; - -@Injectable() -export class AppSettingsService { - - // ** Dont change git keys - must match Komodo rest call parameters ** - public readonly GIT_REPO_BRANCH_KEY = "repo-branch-property"; - public readonly GIT_REPO_AUTHOR_NAME_KEY = "author-name-property"; - public readonly GIT_REPO_AUTHOR_EMAIL_KEY = "author-email-property"; - public readonly GIT_REPO_USERNAME_KEY = "repo-username-property"; - public readonly GIT_REPO_PASSWORD_KEY = "repo-password-property"; - public readonly GIT_REPO_PATH_KEY = "repo-path-property"; - public readonly GIT_REPO_FILE_PATH_KEY = "file-path-property"; - - protected userProfile: object; - - // Map to maintain the target git repository properties - private readonly gitRepoProperties: Map; - - // page layouts - private svcPageLayout: LayoutType = LayoutType.CARD; - private connPageLayout: LayoutType = LayoutType.CARD; - - private http: Http; - private logger: LoggerService; - - constructor(http: Http, logger: LoggerService) { - this.http = http; - this.logger = logger; - - // TODO: The git repository properties will be picked up based on the Openshift install location - this.gitRepoProperties = new Map(); - this.gitRepoProperties.set(this.GIT_REPO_PATH_KEY, "https://github.com/GIT_USER/GIT_REPO"); - this.gitRepoProperties.set(this.GIT_REPO_BRANCH_KEY, "master"); - this.gitRepoProperties.set(this.GIT_REPO_USERNAME_KEY, "MY_USER"); - this.gitRepoProperties.set(this.GIT_REPO_PASSWORD_KEY, "MY_PASS"); - this.gitRepoProperties.set(this.GIT_REPO_AUTHOR_NAME_KEY, "MY_USER"); - this.gitRepoProperties.set(this.GIT_REPO_AUTHOR_EMAIL_KEY, "USER@SOMEWHERE.COM"); - - this.initUserProfile(); - } - - public initUserProfile(): void { - // - // Do a call to fetch the user profile on init of service. - // The fetchProfile method returns an observable - // which we subscribe to and on completion assigns the variable - // values accordingly - // - this.fetchUserProfile().subscribe( - ( profile ) => { - this.userProfile = profile; - }, - ( error ) => { - this.logger.error( "[fetchUserProfile] Error:", error ); - } ); - } - - protected fetchUserProfile(): Observable { - return this.http.get(environment.userProfileUrl, this.getAuthRequestOptions()) - .map((response) => { - const userInfo = response.json(); - return userInfo.Information; - }) - .catch((error) => this.handleError(error)); - } - - /** - * Get the Auth RequestOptions if any - * Note: Since usage of the oauth-proxy no additional auth request options are necessary - * - * @returns {RequestOptions} - */ - public getAuthRequestOptions(): RequestOptions { - const headers = new Headers({}); - return new RequestOptions({ headers }); - } - - /* - * Get the logged in komodo user - * @returns {string} the komodo user - */ - public getKomodoUser(): string { - if (! this.userProfile) { - throw new Error( "Failed to retrieve the user profile so cannot provide a user name" ); - } - - const komodoUser = this.userProfile["User Name"]; - if (! komodoUser) { - throw new Error( "Failed to retrieve the user name from the user profile" ); - } - - return komodoUser; - } - - /* - * Get the komodo workspace path for the current user - * @returns {string} the komodo workspace path - */ - public getKomodoUserWorkspacePath(): string { - if (! this.userProfile) { - throw new Error( "Failed to retrieve the user profile so cannot provide a workspace path" ); - } - - const workspace = this.userProfile["Workspace"]; - if (! workspace) { - throw new Error( "Failed to retrieve the workspace path from the user profile" ); - } - - return workspace; - } - - /* - * Get the git repository property for the supplied property key - * @returns {string} the git repository property - */ - public getGitRepoProperty(propertyKey: string): string { - return this.gitRepoProperties.get(propertyKey); - } - - /* - * Get the LayoutType for the connections summary page - * @returns {LayoutType} the connections page layout - */ - public get connectionsPageLayout( ): LayoutType { - return this.connPageLayout; - } - - /* - * Sets the LayoutType for the connections summary page - * @param {LayoutType} layout the connections page layout - */ - public set connectionsPageLayout( layout: LayoutType ) { - this.connPageLayout = layout; - } - - /* - * Get the LayoutType for the dataservices summary page - * @returns {LayoutType} the dataservices page layout - */ - public get dataservicesPageLayout( ): LayoutType { - return this.svcPageLayout; - } - - /* - * Sets the LayoutType for the dataservices summary page - * @param {LayoutType} layout the dataservices page layout - */ - public set dataservicesPageLayout( layout: LayoutType ) { - this.svcPageLayout = layout; - } - - private handleError(error: Response): ErrorObservable { - this.logger.error( this.constructor.name + "::handleError" ); - return Observable.throw(error); - } - -} diff --git a/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.css b/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.css deleted file mode 100644 index 5f1b677d..00000000 --- a/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.css +++ /dev/null @@ -1,5 +0,0 @@ -/* -.studio-breadcrumb { - color: inherit; -} -*/ diff --git a/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.html b/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.html deleted file mode 100644 index 708dbf0f..00000000 --- a/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.html +++ /dev/null @@ -1,2 +0,0 @@ -{{ label }} -{{ label }} diff --git a/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.spec.ts b/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.spec.ts deleted file mode 100644 index 591b67e8..00000000 --- a/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { RouterTestingModule } from "@angular/router/testing"; -import { BreadcrumbComponent } from "./breadcrumb.component"; - -describe("BreadcrumbComponent", () => { - let component: BreadcrumbComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ RouterTestingModule ], - declarations: [ BreadcrumbComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(BreadcrumbComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [BreadcrumbComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.ts b/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.ts deleted file mode 100644 index de3cf5de..00000000 --- a/ui/src/app/core/breadcrumbs/breadcrumb/breadcrumb.component.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, Input } from "@angular/core"; - -@Component({ - moduleId: module.id, - selector: "[app-breadcrumb]", - templateUrl: "breadcrumb.component.html", - styleUrls: ["breadcrumb.component.css"] -}) -export class BreadcrumbComponent { - - @Input() public label: string; - @Input() public icon: string; - @Input() public route: string[]; - -} diff --git a/ui/src/app/core/breadcrumbs/breadcrumbs.component.css b/ui/src/app/core/breadcrumbs/breadcrumbs.component.css deleted file mode 100644 index 6119a67d..00000000 --- a/ui/src/app/core/breadcrumbs/breadcrumbs.component.css +++ /dev/null @@ -1,7 +0,0 @@ -.studio-breadcrumbs { - float: left; -} -.studio-breadcrumbs .breadcrumb { - margin-bottom: 0; - float: left; -} diff --git a/ui/src/app/core/breadcrumbs/breadcrumbs.component.html b/ui/src/app/core/breadcrumbs/breadcrumbs.component.html deleted file mode 100644 index 2f1e707c..00000000 --- a/ui/src/app/core/breadcrumbs/breadcrumbs.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
    -
    - -
    -
    diff --git a/ui/src/app/core/breadcrumbs/breadcrumbs.component.spec.ts b/ui/src/app/core/breadcrumbs/breadcrumbs.component.spec.ts deleted file mode 100644 index a33ff528..00000000 --- a/ui/src/app/core/breadcrumbs/breadcrumbs.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { BreadcrumbsComponent } from "./breadcrumbs.component"; - -describe("BreadcrumbsComponent", () => { - let component: BreadcrumbsComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ BreadcrumbsComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(BreadcrumbsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [BreadcrumbsComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/core/breadcrumbs/breadcrumbs.component.ts b/ui/src/app/core/breadcrumbs/breadcrumbs.component.ts deleted file mode 100644 index 2dfca8c4..00000000 --- a/ui/src/app/core/breadcrumbs/breadcrumbs.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component } from "@angular/core"; - -@Component({ - moduleId: module.id, - selector: "app-breadcrumbs", - templateUrl: "breadcrumbs.component.html", - styleUrls: ["breadcrumbs.component.css"] -}) -export class BreadcrumbsComponent {} diff --git a/ui/src/app/core/core.less b/ui/src/app/core/core.less deleted file mode 100644 index c04e4b38..00000000 --- a/ui/src/app/core/core.less +++ /dev/null @@ -1,2 +0,0 @@ -@navbar-height: 48px; -@navbar-logo-size: 32px; diff --git a/ui/src/app/core/core.module.ts b/ui/src/app/core/core.module.ts deleted file mode 100644 index c231e385..00000000 --- a/ui/src/app/core/core.module.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommonModule } from "@angular/common"; -import { NgModule, Optional, SkipSelf } from "@angular/core"; -import { Http, HttpModule } from "@angular/http"; -import { RouterModule } from "@angular/router"; -import { AboutDialogComponent } from "@core/about-dialog/about-dialog.component"; -import { AboutService } from "@core/about-dialog/about.service"; -import { MockAboutService } from "@core/about-dialog/mock-about.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { BreadcrumbComponent } from "@core/breadcrumbs/breadcrumb/breadcrumb.component"; -import { BreadcrumbsComponent } from "@core/breadcrumbs/breadcrumbs.component"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { VerticalNavComponent } from "@core/vertical-nav/vertical-nav.component"; -import { environment } from "@environments/environment"; -import { ModalModule } from "ngx-bootstrap/modal"; -import { BsModalService } from "ngx-bootstrap/modal"; -import { ModalModule as PfngModalModule, NavigationModule as PfngNavigationModule } from "patternfly-ng"; - -@NgModule({ - imports: [ - CommonModule, - HttpModule, - ModalModule, - PfngModalModule, - PfngNavigationModule, - RouterModule - ], - declarations: [ - AboutDialogComponent, - BreadcrumbComponent, - BreadcrumbsComponent, - VerticalNavComponent - ], - exports: [ - BreadcrumbComponent, - BreadcrumbsComponent, - VerticalNavComponent - ], - providers: [ - AboutService, - { - provide: AppSettingsService, - useFactory: appSettingsServiceFactory, - deps: [ Http, LoggerService ], - multi: false - }, - { - provide: AboutService, - useFactory: aboutServiceFactory, - deps: [ Http, AppSettingsService, LoggerService], - multi: false - }, - LoggerService, - BsModalService - ] -}) -export class CoreModule { - - constructor( @Optional() @SkipSelf() parentModule: CoreModule ) { - if ( parentModule ) { - throw new Error( "CoreModule is already loaded and should only be mported by the AppModule." ); - } - } - -} - -/** - * A factory that produces the appropriate instande of the service based on current environment settings. - * - * @param {Http} http the HTTP service - * @param {LoggerService} logger the logger - * @returns {AppSettingsService} the requested service - */ -export function appSettingsServiceFactory( http: Http, - logger: LoggerService ): AppSettingsService { - return environment.production || !environment.uiDevMode ? new AppSettingsService( http, logger ) - : new MockAppSettingsService( http, logger ); -} - -/** - * A factory that produces the appropriate instance of the service based on current environment settings. - * - * @param {Http} http the HTTP service - * @param {AppSettingsService} appSettings the app settings - * @param {LoggerService} logger the logger - * @returns {AboutService} the requested service - */ -export function aboutServiceFactory( http: Http, - appSettings: AppSettingsService, - logger: LoggerService ): AboutService { - return environment.production || !environment.uiDevMode ? new AboutService( http, appSettings, logger ) - : new MockAboutService( http, appSettings, logger ); -} diff --git a/ui/src/app/core/logger.service.spec.ts b/ui/src/app/core/logger.service.spec.ts deleted file mode 100644 index 97db9569..00000000 --- a/ui/src/app/core/logger.service.spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; -import { LoggerService } from "@core/logger.service"; - -describe("LoggerService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [LoggerService] - }); - }); - - it("should be created", inject([LoggerService], ( service: LoggerService) => { - console.log("========== [LoggerService] should be created"); - expect(service).toBeTruthy(); - })); -}); diff --git a/ui/src/app/core/logger.service.ts b/ui/src/app/core/logger.service.ts deleted file mode 100644 index edfdaa7f..00000000 --- a/ui/src/app/core/logger.service.ts +++ /dev/null @@ -1,74 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable } from "@angular/core"; -import { environment } from "@environments/environment"; - -@Injectable() -export class LoggerService { - - constructor() { - // nothing to do - } - - /** - * Logs a debug console message only if not in production mode. - * - * @param {string} msg the message being logged - * @param optional any optional parameters - */ - public debug( msg: string, ...optional: any[] ): void { - if ( !environment.production ) { - console.error( msg, optional ); - } - } - - /** - * @param {string} msg the error message being logged - * @param optional any optional parameters - */ - public error( msg: string, ...optional: any[] ): void { - console.error( msg, optional ); - } - - /** - * Same as log method. - * - * @param {string} msg the info message being logged - * @param optional any optional parameters - */ - public info( msg: string, ...optional: any[] ): void { - this.log( msg, optional ); - } - - /** - * @param {string} msg the message being logged - * @param optional any optional parameters - */ - public log( msg: string, ...optional: any[] ): void { - console.log( msg, optional ); - } - - /** - * @param {string} msg the warning message being logged - * @param optional any optional parameters - */ - public warn( msg: string, ...optional: any[] ): void { - console.warn( msg, optional ); - } - -} diff --git a/ui/src/app/core/mock-app-settings.service.ts b/ui/src/app/core/mock-app-settings.service.ts deleted file mode 100644 index dc4206d5..00000000 --- a/ui/src/app/core/mock-app-settings.service.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Injectable, OnInit } from "@angular/core"; -import { Http } from "@angular/http"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { environment } from "@environments/environment"; -import { Observable } from "rxjs/Observable"; - -@Injectable() -export class MockAppSettingsService extends AppSettingsService implements OnInit { - - protected readonly userNameProperty = "User Name"; - protected readonly workspaceProperty = "Workspace"; - - protected readonly userProfile = { - userNameProperty: "dsbUser", - workspaceProperty: environment.komodoWorkspaceUrl + "/dsbUser" - }; - - constructor( http: Http, - logger: LoggerService) { - super( http, logger ); - } - - protected fetchUserProfile(): Observable< object > { - return Observable.of( this.userProfile ); - } - - public getKomodoUser(): string { - return this.userProfile[ this.userNameProperty ]; - } - - public getKomodoUserWorkspacePath(): string { - return this.userProfile[ this.workspaceProperty ]; - } - - public ngOnInit(): void { - // nothing to do - } - -} diff --git a/ui/src/app/core/selection.service.spec.ts b/ui/src/app/core/selection.service.spec.ts deleted file mode 100644 index 8c15db44..00000000 --- a/ui/src/app/core/selection.service.spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; - -import { SelectionService } from "./selection.service"; - -describe("SelectionService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [SelectionService] - }); - }); - - it("should be created", inject([SelectionService], (service: SelectionService) => { - expect(service).toBeTruthy(); - })); -}); diff --git a/ui/src/app/core/selection.service.ts b/ui/src/app/core/selection.service.ts deleted file mode 100644 index 312cb58b..00000000 --- a/ui/src/app/core/selection.service.ts +++ /dev/null @@ -1,154 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable } from "@angular/core"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { Connection } from "@connections/shared/connection.model"; -import { ViewDefinition } from "@dataservices/shared/view-definition.model"; -import { SqlView } from "@dataservices/shared/sql-view.model"; - -@Injectable() -export class SelectionService { - - private selectedConnection: Connection; - private selectedVirtualization: Dataservice; - private selectedViewDefinition: ViewDefinition; - private connectionForSchemaRegen = ""; - - constructor() { - // nothing to do - } - - /** - * Gets the selected virtualization - * @returns {Dataservice} the selected virtualization - */ - public getSelectedVirtualization(): Dataservice { - return this.selectedVirtualization; - } - - /** - * Sets the selected dataservice - * @param {Dataservice} virtualization the selected virtualization - */ - public setSelectedVirtualization(virtualization: Dataservice): void { - this.selectedVirtualization = virtualization; - } - - /** - * Determine if there is a selected virtualization - * @returns {boolean} 'true' if a virtualization is selected - */ - public get hasSelectedVirtualization(): boolean { - return this.selectedVirtualization && this.selectedVirtualization !== null; - } - - /** - * Get the current Virtualization selection's views.View - * The ViewDefinition name is currently set to the full "modelName"."viewName" of the view. - * @returns {SqlView[]} the selected Dataservice view definitions - */ - public getSelectedVirtualizationViewNames( ): SqlView[] { - if ( !this.hasSelectedVirtualization ) { - return []; - } - - const modelName = this.selectedVirtualization.getServiceViewModel(); - const serviceViews = this.selectedVirtualization.getServiceViewNames(); - - const allViewNames: SqlView[] = []; - for ( const serviceView of serviceViews ) { - allViewNames.push(new SqlView(modelName + "." + serviceView)); - } - - return allViewNames; - } - - /** - * Gets the selected connection - * @returns {Connection} the selected connection - */ - public getSelectedConnection(): Connection { - return this.selectedConnection; - } - - /** - * Sets the selected connection - * @param {Connection} connection the selected connection - */ - public setSelectedConnection(connection: Connection): void { - this.selectedConnection = connection; - } - - /** - * Determine if there is a selected connection - * @returns {boolean} 'true' if a connection is selected - */ - public get hasSelectedConnection(): boolean { - return this.selectedConnection && this.selectedConnection !== null; - } - - /** - * Gets the selected view definition - * @returns {ViewDefinition} the selected view definition - */ - public getSelectedViewDefinition(): ViewDefinition { - return this.selectedViewDefinition; - } - - /** - * Sets the selected view definition - * @param {ViewDefinition} view the selected view definition - */ - public setSelectedViewDefinition(virtualization: Dataservice, viewDefn: ViewDefinition): void { - this.selectedVirtualization = virtualization; - this.selectedViewDefinition = viewDefn; - } - - /** - * Determine if there is a selected view definition - * @returns {boolean} 'true' if a view definition is selected - */ - public get hasSelectedViewDefinition(): boolean { - return this.selectedViewDefinition && this.selectedViewDefinition !== null; - } - - /** - * Determine if has a connection which needs its schema regenerated - * @returns {boolean} 'true' if there is a connection needing schema regen - */ - public get hasConnectionForSchemaRegen(): boolean { - return this.connectionForSchemaRegen && this.connectionForSchemaRegen.length > 0; - } - - /** - * Gets the connection id which needs its schema regenerated - * @returns {string} the connection id needing schema regen - */ - public getConnectionIdForSchemaRegen(): string { - return this.connectionForSchemaRegen; - } - - /** - * Sets the connection id which needs its schema regenerated - * @param {string} connectionName the connection id which needs its schema regenerated - */ - public setConnectionIdForSchemaRegen(connectionName: string): void { - this.connectionForSchemaRegen = connectionName !== null ? connectionName : ""; - } - -} diff --git a/ui/src/app/core/utils/array-utils.ts b/ui/src/app/core/utils/array-utils.ts deleted file mode 100644 index 8ee19662..00000000 --- a/ui/src/app/core/utils/array-utils.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class ArrayUtils { - - /** - * @param a the array being searched - * @param item the item being searched for - * @return {boolean} true if the given item is contained in the given array - */ - public static contains( a: any[], item: any ): boolean { - for ( const aitem of a ) { - if ( aitem === item ) { - return true; - } - } - return false; - } - - /** - * @param {any[]} a1 the first array - * @param {any[]} a2 the second array - * @returns {any[]} the intersection of two arrays - */ - public static intersect( a1: any[], a2: any[] ): any[] { - const rval: any[] = []; - for ( const item of a1 ) { - if ( ArrayUtils.contains( a2, item ) ) { - rval.push( item ); - } - } - return rval; - } - -} diff --git a/ui/src/app/core/utils/object-utils.ts b/ui/src/app/core/utils/object-utils.ts deleted file mode 100644 index 80d78d31..00000000 --- a/ui/src/app/core/utils/object-utils.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class ObjectUtils { - - public static isNullOrUndefined( object: any ): boolean { - return object === undefined || object === null; - } - - public static objectEquals( x: any, y: any ): boolean { - if ( x === null || x === undefined || y === null || y === undefined ) { - return x === y; - } - // after this just checking type of one would be enough - if ( x.constructor !== y.constructor ) { - return false; - } - // if they are functions, they should exactly refer to same one (because of closures) - if ( x instanceof Function ) { - return x === y; - } - // if they are regexps, they should exactly refer to same one (it is hard to better equality check on current ES) - if ( x instanceof RegExp ) { - return x === y; - } - if ( x === y || x.valueOf() === y.valueOf() ) { - return true; - } - if ( Array.isArray( x ) && x.length !== y.length ) { - return false; - } - - // if they are dates, they must had equal valueOf - if ( x instanceof Date ) { - return false; - } - - // if they are strictly equal, they both need to be object at least - if ( !(x instanceof Object) ) { - return false; - } - if ( !(y instanceof Object) ) { - return false; - } - - const p = Object.keys( x ); - return Object.keys( y ).every( (i) => p.indexOf( i ) !== -1 ) && - p.every( (i) => ObjectUtils.objectEquals( x[ i ], y[ i ] ) ); - } - -} diff --git a/ui/src/app/core/vertical-nav/vertical-nav.component.css b/ui/src/app/core/vertical-nav/vertical-nav.component.css deleted file mode 100644 index 957b6a58..00000000 --- a/ui/src/app/core/vertical-nav/vertical-nav.component.css +++ /dev/null @@ -1,26 +0,0 @@ -.vertical-navbar-layout { - background-color: white; - position: fixed; - width: 100%; -} - -/* the page content area to the right of the vertical navbar */ -.app-feature-content { - margin-top: 60px; -} - -.app-feature-content.container-fluid { - padding-left: 5px; - padding-right: 5px; -} - -.app-feature-title { - margin: 0 0 10px 0; - padding: 0; -} - -.navbar-brand-title { - margin-top: 5px; - font-size: 2em; - color: white; -} diff --git a/ui/src/app/core/vertical-nav/vertical-nav.component.html b/ui/src/app/core/vertical-nav/vertical-nav.component.html deleted file mode 100644 index b6f3a089..00000000 --- a/ui/src/app/core/vertical-nav/vertical-nav.component.html +++ /dev/null @@ -1,39 +0,0 @@ -
    - -
    - - -
    - -
    -
    -
    -
    - -
    -
    -
    -
    diff --git a/ui/src/app/core/vertical-nav/vertical-nav.component.spec.ts b/ui/src/app/core/vertical-nav/vertical-nav.component.spec.ts deleted file mode 100644 index fe0c8afc..00000000 --- a/ui/src/app/core/vertical-nav/vertical-nav.component.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { async, ComponentFixture, inject, TestBed } from "@angular/core/testing"; -import { HttpModule } from "@angular/http"; -import { RouterTestingModule } from "@angular/router/testing"; -import { AboutDialogComponent } from "@core/about-dialog/about-dialog.component"; -import { AboutService } from "@core/about-dialog/about.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { VerticalNavComponent } from "@core/vertical-nav/vertical-nav.component"; -import { BsModalService, ModalModule } from "ngx-bootstrap"; -import { ModalModule as PfngModalModule, NavigationModule as PfngNavigationModule } from "patternfly-ng"; - -describe("VerticalNavComponent", () => { - let component: VerticalNavComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule, - ModalModule.forRoot(), - RouterTestingModule, - PfngModalModule, - PfngNavigationModule - ], - declarations: [ VerticalNavComponent, AboutDialogComponent ], - providers: [ - AboutService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - BsModalService, - LoggerService ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(VerticalNavComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", inject([ LoggerService ], - (logger: LoggerService ) => { - console.log("========== [VerticalNavComponent] should be created"); - expect(component).toBeTruthy(); - })); -}); diff --git a/ui/src/app/core/vertical-nav/vertical-nav.component.ts b/ui/src/app/core/vertical-nav/vertical-nav.component.ts deleted file mode 100644 index f751c0da..00000000 --- a/ui/src/app/core/vertical-nav/vertical-nav.component.ts +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, Input, OnInit, TemplateRef, ViewEncapsulation } from "@angular/core"; -import { Router } from "@angular/router"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { AboutEvent } from "@core/about-dialog/about-event"; -import { About } from "@core/about-dialog/about.model"; -import { LoggerService } from "@core/logger.service"; -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; -import { BsModalService } from "ngx-bootstrap/modal"; -import { BsModalRef } from "ngx-bootstrap/modal/bs-modal-ref.service"; -import { NavigationItemConfig } from "patternfly-ng"; - -@Component({ - moduleId: module.id, - encapsulation: ViewEncapsulation.None, - selector: "app-vertical-nav", - templateUrl: "./vertical-nav.component.html", - styleUrls: ["./vertical-nav.component.css"] -}) - -export class VerticalNavComponent implements OnInit { - - /** - * The about information. - */ - @Input() public info: About; - - public aboutInfo: About; - public navigationItems: NavigationItemConfig[]; - - private aboutRef: BsModalRef; - private logger: LoggerService; - private modalService: BsModalService; - private router: Router; - - constructor( router: Router, - logger: LoggerService, - modalService: BsModalService ) { - this.router = router; - this.logger = logger; - this.modalService = modalService; - } - - public closeAbout( $event: AboutEvent ): void { - this.aboutRef.hide(); - } - - public ngOnInit(): void { - // uncomment to debug router events - // this.router.events.subscribe((event) => { - // console.error( event ); - // }); - - this.navigationItems = [ DataservicesConstants.dataservicesNavItem, ConnectionsConstants.connectionsNavItem ]; - } - - public onNavigation( $event: NavigationItemConfig ): void { - const link: string[] = [ $event.url ]; - this.router.navigate( link ).then(() => { - // nothing to do - }); - } - - public openAbout( template: TemplateRef< any > ): void { - this.aboutRef = this.modalService.show( template ); - } - -} diff --git a/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.css b/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.css deleted file mode 100644 index 94bfa236..00000000 --- a/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.css +++ /dev/null @@ -1,39 +0,0 @@ -.message-div { - margin-top: 20px; - margin-bottom: 10px; -} - -.connections-list { - padding-left: 0; - padding-right: 0; - min-height: 300px; - max-height: 300px; - border: 1px inset lightgrey; - overflow-y: auto; -} - -#views-table { - padding-left: 0; - padding-right: 0; - min-height: 300px; - max-height: 300px; - border: 1px inset lightgrey; - overflow-y: auto; -} - -/* - * Style the empty state component so that it is centered and extends the entire width. - */ -#views-table .blank-slate-pf { - background-color: inherit; - min-width: 200px; - border: none; - padding: 0; -} - -/* - * Style text in blank slate for table - */ -#views-table h1, .h1 { - font-size: 14px; -} diff --git a/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.html b/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.html deleted file mode 100644 index 7ceb8b9b..00000000 --- a/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - diff --git a/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.spec.ts b/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.spec.ts deleted file mode 100644 index 88699bd0..00000000 --- a/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { CreateViewsDialogComponent } from "./create-views-dialog.component"; -import { HttpModule } from "@angular/http"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { BsModalRef, ModalModule } from "ngx-bootstrap"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; - -describe("CreateViewsDialogComponent", () => { - let component: CreateViewsDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule, - FormsModule, - ReactiveFormsModule, - ModalModule.forRoot(), - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ CreateViewsDialogComponent ], - providers: [ AppSettingsService, BsModalRef, LoggerService, NotifierService, - { provide: ConnectionService, useClass: MockConnectionService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - { provide: VdbService, useClass: MockVdbService } - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(CreateViewsDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.ts b/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.ts deleted file mode 100644 index 6ba9e649..00000000 --- a/ui/src/app/dataservices/create-views-dialog/create-views-dialog.component.ts +++ /dev/null @@ -1,407 +0,0 @@ -import { Component, EventEmitter, OnInit, Output } from '@angular/core'; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { BsModalRef } from "ngx-bootstrap"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { LoggerService } from "@core/logger.service"; -import { LoadingState } from "@shared/loading-state.enum"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { - EmptyStateConfig, - ListConfig, - ListEvent, - NotificationType, - TableConfig -} from "patternfly-ng"; -import { NewView } from "@dataservices/create-views-dialog/new-view.model"; -import { TableEvent } from "patternfly-ng"; -import { AbstractControl, FormControl, FormGroup } from "@angular/forms"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { CreateViewsResult } from "@dataservices/create-views-dialog/create-views-result.model"; - -@Component({ - selector: 'app-create-views-dialog', - templateUrl: './create-views-dialog.component.html', - styleUrls: ['./create-views-dialog.component.css'] -}) -/** - * CreateViews Dialog. Invoke this from another component as follows: - * - * this.modalRef = this.modalService.show(CreateViewsDialogComponent, {initialState}); - * this.modalRef.content.okAction.take(1).subscribe((dialogResult) => { - * // do something with dialogResult (CreateViewsResult) - * }); - * - * The expected initial state is as follows: - * const initialState = { - * title: "The dialog title", - * cancelButtonText: "Text for cancel button", - * confirmButtonText: "Text for confirm button" - * }; - */ -export class CreateViewsDialogComponent implements OnInit { - - @Output() public okAction: EventEmitter = new EventEmitter(); - - public readonly title = ViewEditorI18n.createViewsDialogNewVirtualizationTitle; - public readonly message = ViewEditorI18n.createViewsDialogMessage; - public readonly cancelButtonText = ViewEditorI18n.cancelButtonText; - public readonly okButtonText = ViewEditorI18n.okButtonText; - public okButtonEnabled = false; - public bsModalRef: BsModalRef; - public connections: SchemaNode[] = []; - public allViews: NewView[] = []; - public listConfig: ListConfig; - public tableColumns: any[] = []; - public tableConfig: TableConfig; - public virtNameValidationError = ""; - public virtualizationPropertyForm: FormGroup; - public readonly connectionsLoadFailedHeader = "Loading Failed: "; - public readonly connectionsLoadFailedMsg = "Connections failed to load!"; - public readonly connectionsLoadFailedType = NotificationType.DANGER; - public readonly viewsLoadFailedHeader = "Loading Failed: "; - public readonly viewsLoadFailedMsg = "Views failed to load!"; - public readonly viewsLoadFailedType = NotificationType.DANGER; - - private connectionService: ConnectionService; - private dataserviceService: DataserviceService; - private selectedConnections: SchemaNode[] = []; - private selectedViews: NewView[] = []; - private loggerService: LoggerService; - private connectionsLoadingState: LoadingState = LoadingState.LOADING; - private viewsLoadingState: LoadingState = LoadingState.LOADED_VALID; - private emptyStateConfig: EmptyStateConfig; - - constructor(bsModalRef: BsModalRef, dataserviceService: DataserviceService, - connectionService: ConnectionService, logger: LoggerService) { - this.bsModalRef = bsModalRef; - this.connectionService = connectionService; - this.dataserviceService = dataserviceService; - this.loggerService = logger; - this.createPropertyForm(); - } - - public ngOnInit(): void { - // List configuration - this.listConfig = { - dblClick: false, - multiSelect: false, - selectItems: false, - showCheckbox: true - }; - - // ---------------------------------- - // View Table configurations - // ---------------------------------- - this.tableColumns = [ - { - draggable: false, - name: "Connection", - prop: "connection", - resizeable: true, - sortable: false, - width: "100" - }, - { - draggable: false, - name: "View Name", - prop: "view", - resizeable: true, - sortable: false, - width: "100" - }, - { - draggable: false, - name: "Source Node", - prop: "path", - resizeable: true, - sortable: false, - width: "100" - } - ]; - - this.emptyStateConfig = { - title: ViewEditorI18n.noViewsDisplayedMessage - } as EmptyStateConfig; - - this.tableConfig = { - showCheckbox: true, - emptyStateConfig: this.emptyStateConfig - } as TableConfig; - - // Init virtualization name and description - this.virtualizationPropertyForm.controls["virtName"].setValue(""); - this.virtualizationPropertyForm.controls["virtDescription"].setValue(""); - - // Load the connections - this.connectionsLoadingState = LoadingState.LOADING; - const self = this; - this.connectionService - .getConnections(true, true) - .subscribe( - (connectionSummaries) => { - const conns = []; - const treeNodes = []; - for ( const connectionSummary of connectionSummaries ) { - const connStatus = connectionSummary.getStatus(); - const conn = connectionSummary.getConnection(); - conn.setStatus(connStatus); - conns.push(conn); - // Add active connection to tree root nodes - if (conn.isActive) { - const node = new SchemaNode(); - node.setName(conn.getId()); - node.setType(ConnectionsConstants.schemaNodeType_connection); - node.selected = false; - this.connections.push(node); - } - } - self.connectionsLoadingState = LoadingState.LOADED_VALID; - }, - (error) => { - self.loggerService.error("[ConnectionTableDialogComponent] Error getting connections: %o", error); - self.connectionsLoadingState = LoadingState.LOADED_INVALID; - } - ); - } - - /* - * Creates the view property form - */ - private createPropertyForm(): void { - this.virtualizationPropertyForm = new FormGroup({ - virtName: new FormControl( "", this.handleVirtNameChanged.bind( this ) ), - virtDescription: new FormControl(""), - }); - } - - /** - * Handler for virtualization name changes. - * @param {AbstractControl} input - */ - public handleVirtNameChanged( input: AbstractControl ): void { - const self = this; - - this.dataserviceService.isValidName( input.value ).subscribe( - ( errorMsg ) => { - if ( errorMsg ) { - // only update if error has changed - if ( errorMsg !== self.virtNameValidationError ) { - self.virtNameValidationError = errorMsg; - } - } else { // name is valid - self.virtNameValidationError = ""; - } - self.setOkButtonEnablement(); - }, - ( error ) => { - self.loggerService.error( "[handleNameChanged] Error: %o", error ); - self.virtNameValidationError = "Error validating view name"; - self.setOkButtonEnablement(); - } ); - } - - /* - * Return the virtualization name valid state - */ - public get virtNameValid(): boolean { - return this.virtNameValidationError == null || this.virtNameValidationError.length === 0; - } - - /** - * Handles change in connection selection - * @param {ListEvent} $event the list selection event - */ - public handleConnectionSelectionChange($event: ListEvent): void { - const newSelections = $event.selectedItems; - const numberNewSelections = newSelections.length; - // Find new selection that was added - if (numberNewSelections > this.selectedConnections.length) { - newSelections.forEach( ( newConn ) => { - const index = this.selectedConnections.findIndex( ( conn ) => conn.getName() === newConn.getName() ); - - if ( index === -1 ) { - this.onConnectionSelected(newConn); - } - } ); - // Find existing selection that was removed - } else { - for (const selectedConn of this.selectedConnections) { - const index = newSelections.findIndex( ( conn ) => conn.getName() === selectedConn.getName() ); - - if ( index === -1 ) { - this.onConnectionDeselected(selectedConn); - break; - } - } - } - this.selectedConnections = newSelections; - } - - /** - * Handler for connection selection - * @param {SchemaNode} conn the connection node - */ - private onConnectionSelected(conn: SchemaNode): void { - this.generateConnectionViewInfos(conn.getName()); - } - - /** - * Handler for connection deselection - * @param {SchemaNode} conn the connection node - */ - private onConnectionDeselected(conn: SchemaNode): void { - let i = this.allViews.length; - while (i--) { - if (this.allViews[i].getConnectionName() === conn.getName()) { - this.allViews.splice(i, 1); - } - } - this.allViews = [...this.allViews]; - } - - /** - * Handles change in View selections - * @param {TableEvent} $event the table selection event - */ - public handleViewSelectionChange($event: TableEvent): void { - this.selectedViews = $event.selectedRows; - this.setOkButtonEnablement(); - } - - /** - * Determine if connections are loading - * @returns {boolean} - */ - public get connectionsLoading( ): boolean { - return ( this.connectionsLoadingState === LoadingState.LOADING ); - } - - /** - * Determine if connections loading completed, and was successful - * @returns {boolean} - */ - public get connectionsLoadedSuccess( ): boolean { - return ( this.connectionsLoadingState === LoadingState.LOADED_VALID ); - } - - /** - * Determine if connections loading completed, but failed - * @returns {boolean} - */ - public get connectionsLoadedFailed( ): boolean { - return ( this.connectionsLoadingState === LoadingState.LOADED_INVALID ); - } - - /** - * Determine if views are loading - * @returns {boolean} - */ - public get viewsLoading( ): boolean { - return ( this.viewsLoadingState === LoadingState.LOADING ); - } - - /** - * Determine if views loading completed, and was successful - * @returns {boolean} - */ - public get viewsLoadedSuccess( ): boolean { - return ( this.viewsLoadingState === LoadingState.LOADED_VALID ); - } - - /** - * Determine if views loading completed, but failed - * @returns {boolean} - */ - public get viewsLoadedFailed( ): boolean { - return ( this.viewsLoadingState === LoadingState.LOADED_INVALID ); - } - - /** - * OK selected. The array of selected SchemaNodes is emiited, then modal is closed - */ - public onOkSelected(): void { - const virtName = this.virtualizationPropertyForm.controls["virtName"].value; - const virtDescr = this.virtualizationPropertyForm.controls["virtDescription"].value; - const result = new CreateViewsResult(); - result.setVirtualizationName(virtName); - result.setVirtualizationDescription(virtDescr); - result.setViews(this.selectedViews); - - this.bsModalRef.hide(); - this.okAction.emit(result); - } - - /** - * Cancel selected. The modal is closed. - */ - public onCancelSelected(): void { - this.bsModalRef.hide(); - } - - /** - * Sets the OK button enablement, based upon the view selections - */ - private setOkButtonEnablement(): void { - if (this.virtNameValid && this.selectedViews.length > 0) { - this.okButtonEnabled = true; - } else { - this.okButtonEnabled = false; - } - } - - /** - * Generate the view infos for the supplied connection name - * @param {string} connName the connection name - */ - public generateConnectionViewInfos(connName: string): void { - // Load the connections - this.viewsLoadingState = LoadingState.LOADING; - const self = this; - this.connectionService - .getConnectionSchema(connName) - .subscribe( - (schemaNodes) => { - const newViews: NewView[] = []; - for ( const schemaNode of schemaNodes ) { - const nodePath: string[] = []; - self.generateViewInfos(connName, schemaNode, nodePath, newViews); - } - for (const newView of newViews) { - self.allViews.push(newView); - } - self.allViews = [...self.allViews]; - self.viewsLoadingState = LoadingState.LOADED_VALID; - }, - (error) => { - self.loggerService.error("[ConnectionTableDialogComponent] Error getting connections: %o", error); - self.viewsLoadingState = LoadingState.LOADED_INVALID; - } - ); - } - - /** - * Recursively generate the view infos for this node and its children - * @param {SchemaNode} schemaNode the schema node - */ - private generateViewInfos(connName: string, schemaNode: SchemaNode, nodePath: string[], viewInfos: NewView[]): void { - const sourcePath: string[] = []; - for (const seg of nodePath) { - sourcePath.push(seg); - } - if ( schemaNode.isQueryable() ) { - const newView: NewView = new NewView(); - newView.setConnectionName(connName); - newView.setViewSourceNode(schemaNode); - newView.setNodePath(sourcePath); - const viewName = connName + "_" + schemaNode.getName(); - newView.setViewName(viewName); - viewInfos.push(newView); - } - sourcePath.push(schemaNode.getName()); - for (const childNode of schemaNode.getChildren()) { - this.generateViewInfos(connName, childNode, sourcePath, viewInfos); - } - } - -} diff --git a/ui/src/app/dataservices/create-views-dialog/create-views-result.model.ts b/ui/src/app/dataservices/create-views-dialog/create-views-result.model.ts deleted file mode 100644 index f7fb16ea..00000000 --- a/ui/src/app/dataservices/create-views-dialog/create-views-result.model.ts +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NewView } from "@dataservices/create-views-dialog/new-view.model"; - -/** - * CreateViewsResult model - to hold the results of the CreateViewsDialog entry - */ -export class CreateViewsResult { - - private virtName: string; - private virtDescription = ""; - private views: NewView[] = []; - - constructor() { - // nothing to do - } - - /** - * @returns {string} the virtualization name - */ - public getVirtualizationName(): string { - return this.virtName; - } - - /** - * @param {string} name the virtualization name - */ - public setVirtualizationName( name?: string ): void { - this.virtName = name ? name : null; - } - - /** - * @returns {string} the virtualization description - */ - public getVirtualizationDescription(): string { - return this.virtDescription; - } - - /** - * @param {string} description the virtualization description - */ - public setVirtualizationDescription( description?: string ): void { - this.virtDescription = description ? description : ""; - } - - /** - * @returns {NewView[]} the views - */ - public getViews(): NewView[] { - return this.views; - } - - /** - * @param {NewView[]} views the views to create - */ - public setViews( views: NewView[] ): void { - this.views = views; - } - -} diff --git a/ui/src/app/dataservices/create-views-dialog/new-view.model.ts b/ui/src/app/dataservices/create-views-dialog/new-view.model.ts deleted file mode 100644 index 37dca688..00000000 --- a/ui/src/app/dataservices/create-views-dialog/new-view.model.ts +++ /dev/null @@ -1,120 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { SchemaNode } from "@connections/shared/schema-node.model"; - -/** - * NewView model - to hold the NewView objects - */ -export class NewView { - - private connection: string; - private view: string; - private viewDescription = ""; - private viewSourceNode: SchemaNode; - private nodePath: string[] = []; - - constructor() { - // nothing to do - } - - /** - * @returns {string} the connection name - */ - public getConnectionName(): string { - return this.connection; - } - - /** - * @param {string} name the connection name - */ - public setConnectionName( name?: string ): void { - this.connection = name ? name : null; - } - - /** - * @returns {string} the view name - */ - public getViewName(): string { - return this.view; - } - - /** - * @param {string} name the view name - */ - public setViewName( name?: string ): void { - this.view = name ? name : null; - } - - /** - * @returns {string} the view description - */ - public getViewDescription(): string { - return this.viewDescription; - } - - /** - * @param {string} description the view description - */ - public setViewDescription( description?: string ): void { - this.viewDescription = description ? description : ""; - } - - /** - * @returns {SchemaNode} the view source node - */ - public getViewSourceNode(): SchemaNode { - return this.viewSourceNode; - } - - /** - * @param {SchemaNode} node the view source node - */ - public setViewSourceNode( node: SchemaNode ): void { - this.viewSourceNode = node; - } - - /** - * @returns {string} the stringified node path - */ - public get path(): string { - let path = ""; - const segLength = this.nodePath.length; - for ( let i = 0; i < segLength; i++ ) { - path += this.nodePath[i]; - if ( i !== segLength - 1 ) { - path += "."; - } - } - if (path.length === 0) { - return this.viewSourceNode.getName(); - } else { - return path + "." + this.viewSourceNode.getName(); - } - } - - /** - * @param {string[]} path the node path - */ - public setNodePath( path: string[] ): void { - this.nodePath = []; - for (const segment of path) { - this.nodePath.push(segment); - } - } - -} diff --git a/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.css b/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.css deleted file mode 100644 index 41a300dc..00000000 --- a/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.css +++ /dev/null @@ -1,97 +0,0 @@ -.card-toolbar .secondary-action[title="Activate"]:before { - color: var(--card-action-icon-color); - content: "\f1eb"; - font-family: "FontAwesome"; -} - -.card-toolbar .secondary-action[title="Publish"]:before { - color: var(--card-action-icon-color); - content: "\f085"; - font-family: "FontAwesome"; -} - -.card-toolbar .secondary-action[title="Refresh"]:before { - color: var(--card-action-icon-color); - content: "\f021"; - font-family: "FontAwesome"; -} - -.card-toolbar .secondary-action[title="Download"]:before { - color: var(--card-action-icon-color); - content: "\f019"; - font-family: "FontAwesome"; -} - -.object-card .list-pf, -.object-card-selected .list-pf { - border: none; -} - -.object-card .list-pf-item, -.object-card-selected .list-pf-item { - border: none; -} - -.object-card .list-pf-item:hover { - background-color: transparent; -} - -.object-card-selected .list-pf-item:hover { - background-color: transparent; -} - -a.list-pf-title.view-name { - cursor: pointer; - color: var(--card-body-color); - margin-left: 10px !important; -} - -.list-pf-container { - -ms-flex-align: start; - align-items: flex-start; - display: -ms-flexbox; - display: flex; - padding: 3px; -} - -.odata-card-icon { - width: 16px; - height: 16px; - padding-left: 4px; - padding-right: 4px; - background-size: 16px 16px; - background-repeat: no-repeat; - background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALlJREFUeNpi/N/D4MDAwLCfgQLAAmc5TmBgEDPAVHFlAYTWScCUe3UBaH0BkiEgA2TsMRU+PgChsclBAeOod4aUd0CGsQtAbPn5gUTvgIAH0Ona8RD2z48MDDuAXrizgYHBqoGBwbIeU/eTgwwMKx3QvAMzAATY+SHhBDLk4wOIBmxhguISkBfQAZ88hL66AIJxACY4C2QbNucSARCGfAIasiMREhZg/kNw9BEDqJbYQKHjSIkhAAEGAHmtTMAm); -} - -#publishing-card-icons div[slide-in-content] h3 { - color: #3f88ce; -} - -#publishing-card-icons .CodeMirror { - height: 80vh; -} - -.views-details { - background-color: transparent; -} -.views-details:hover { - background-color: transparent; -} - -.views-details .blank-slate-pf { - background-color: transparent; - min-width: 200px; - border: none; - padding: 0; -} - -.views-details h1, .h1 { - font-size: 14px; -} - -.dataservice-card-edit-icon { - color: var(--card-action-icon-color); - cursor: pointer; - margin-left: 7px; -} diff --git a/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.html b/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.html deleted file mode 100644 index 8fe3596f..00000000 --- a/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.html +++ /dev/null @@ -1,201 +0,0 @@ - - -
    -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - - - - - - - - - - - - -
    -
    -
    -

    Publishing Logs for '{{dataservice.getId()}}'

    - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    {{ description }}
    -
    -
    - - - Virtualization Not Published
    (Click to view log) -
    - - Virtualization Publishing Failed
    (Click to view log) -
    - - Virtualization Submitted
    (Click to view log) -
    - - Virtualization Configuring
    (Click to view log) -
    - - Virtualization Building
    (Click to view log) -
    - - Virtualization Deploying
    (Click to view log) -
    - - Virtualization Published
    (Click to view log) -
    - -
    -
    -
    Views
    -
    -
    - - -
    - - {{ item }} -
    -
    -
    -
    -
    -
    -
    -
    diff --git a/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.spec.ts b/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.spec.ts deleted file mode 100644 index 615c6651..00000000 --- a/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.spec.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { FormsModule } from "@angular/forms"; -import { RouterTestingModule } from "@angular/router/testing"; -import { LoggerService } from "@core/logger.service"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { DataserviceCardComponent } from "@dataservices/dataservices-cards/dataservice-card/dataservice-card.component"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { SharedModule } from "@shared/shared.module"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule -} from "patternfly-ng"; -import { TooltipModule } from 'ngx-bootstrap'; -import { CodemirrorModule } from "ng2-codemirror"; -import { HttpModule } from "@angular/http"; - -describe("DataserviceCardComponent", () => { - let component: DataserviceCardComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - TooltipModule, - CodemirrorModule, - FormsModule, - HttpModule, - SharedModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ DataserviceCardComponent ], - providers: [ - LoggerService, DataserviceService, NotifierService, - { provide: VdbService, useClass: MockVdbService }, - { provide: AppSettingsService, useClass: MockAppSettingsService } - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DataserviceCardComponent); - component = fixture.componentInstance; - - const ds = new Dataservice(); - ds.setId("serv1"); - component.dataservice = ds; - - component.selectedDataservices = []; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [DataserviceCardComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.ts b/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.ts deleted file mode 100644 index d4ed6e5a..00000000 --- a/ui/src/app/dataservices/dataservices-cards/dataservice-card/dataservice-card.component.ts +++ /dev/null @@ -1,351 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - Component, DoCheck, EventEmitter, Input, OnInit, Output, ViewEncapsulation, ViewChild -} from "@angular/core"; -import * as _ from "lodash"; -import { LoggerService } from "@core/logger.service"; -import { Action, ActionConfig, CardAction, CardConfig, EmptyStateConfig, ListConfig } from "patternfly-ng"; -import { Observable } from "rxjs/Observable"; -import { Subscription } from "rxjs/Subscription"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { Connection } from "@connections/shared/connection.model"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-dataservice-card-component", - templateUrl: "./dataservice-card.component.html", - styleUrls: ["./dataservice-card.component.css"] -}) -export class DataserviceCardComponent implements DoCheck, OnInit { - - public static readonly activateDataserviceEvent = "activate"; - public static readonly deleteDataserviceEvent = "delete"; - public static readonly editDataserviceEvent = "edit"; - public static readonly publishDataserviceEvent = "publish"; - public static readonly quickLookDataserviceEvent = "quickLook"; - public static readonly testDataserviceEvent = "test"; - public static readonly downloadDataserviceEvent = "download"; - public static readonly odataLookDataserviceEvent = "odataLook"; - public static readonly editDescriptionDataserviceEvent = "editDescription"; - - public readonly editEvent = DataserviceCardComponent.editDataserviceEvent; - public readonly quickLookEvent = DataserviceCardComponent.quickLookDataserviceEvent; - public readonly testEvent = DataserviceCardComponent.testDataserviceEvent; - public readonly downloadEvent = DataserviceCardComponent.downloadDataserviceEvent; - public readonly odataLookEvent = DataserviceCardComponent.odataLookDataserviceEvent; - public readonly editDescriptionEvent = DataserviceCardComponent.editDescriptionDataserviceEvent; - - @Input() public dataservice: Dataservice; - @Input() public selectedDataservices: Dataservice[]; - @Output() public cardEvent: EventEmitter< {} > = new EventEmitter< {} >(); - @Output() public selectEvent: EventEmitter< Dataservice > = new EventEmitter< Dataservice >(); - - @ViewChild('publishLogsEditor') private logEditor: any; - - public actionConfig: ActionConfig; - public cardConfig: CardConfig; - public listConfig: ListConfig; - public showDetails = false; - - private readonly activateActionId = "activate"; - private readonly activateActionIndex = 0; // index in moreActions - private readonly deleteActionId = "delete"; - private readonly deleteActionIndex = 2; // index in moreActions - private readonly publishActionId = "publish"; - private readonly publishActionIndex = 1; // index in moreActions - private readonly downloadActionId = "download"; - private readonly downloadActionIndex = 3; // index in moreActions - - private isLoading = true; - private logger: LoggerService; - private dataserviceService: DataserviceService; - private emptyStateConfig: EmptyStateConfig; - - public publishLogsEditorConfig = { - lineNumbers: true, - lineWrapping: true, - readOnly: true, - styleActiveLine: true, - placeholder: 'Awaiting Logs ...', - tabSize: 2, - showCursorWhenSelecting: true, - theme: "neat" - }; - - public publishLogs = 'No log available'; - private logMonitor: Subscription = null; - - constructor( logger: LoggerService, dataserviceService: DataserviceService ) { - this.logger = logger; - this.dataserviceService = dataserviceService; - } - - /** - * @returns {string} the dataservice description - */ - public get description(): string { - return this.dataservice.getDescription(); - } - - private get detailsIconStyle(): string { - return this.showDetails ? "fa fa-close card-footer-action-icon" : "fa fa-angle-right card-footer-action-icon"; - } - - /** - * @param {string} view the view whose connections are being requested - * @returns {Connection[]} the connections of the dataservice represented by this card - */ - public getConnections( view: string ): Connection[] { - // TODO rewrite when REST functionality has been implemented - const result: Connection[] = []; - - const c1 = new Connection(); - c1.setId( "ConnectionOne" ); - result.push( c1 ); - - const c2 = new Connection(); - c2.setId( "ConnectionTwo" ); - result.push( c2 ); - - const c3 = new Connection(); - c3.setId( "ConnectionThree" ); - result.push( c3 ); - - return result; - } - - /** - * @returns {string[]} the names of the views - */ - public getViews(): string[] { - return this.dataservice.getServiceViewNames(); - } - - /** - * Event handler for when a toolbar kebab action is clicked. - * @param {Action} action the action that was selected. - */ - public handleAction( action: Action ): void { - if ( action.id === this.activateActionId ) { - this.onClick( DataserviceCardComponent.activateDataserviceEvent ); - } else if ( action.id === this.deleteActionId ) { - this.onClick( DataserviceCardComponent.deleteDataserviceEvent ); - } else if ( action.id === this.publishActionId ) { - this.onClick( DataserviceCardComponent.publishDataserviceEvent ); - } else if ( action.id === this.downloadActionId ) { - this.onClick( DataserviceCardComponent.downloadDataserviceEvent ); - } else { - this.logger.error( "Action '" + action.id + "' not handled." ); - } - } - - /** - * @returns {boolean} `true` if the dataservice represented by this card is selected - */ - public isSelected(): boolean { - return this.selectedDataservices.indexOf( this.dataservice ) !== -1; - } - - public ngDoCheck(): void { - if ( this.isLoading !== this.dataservice.serviceDeploymentLoading ) { - this.isLoading = this.dataservice.serviceDeploymentLoading; - - this.actionConfig.moreActions[ this.activateActionIndex ].disabled = this.isLoading; - this.actionConfig.moreActions[ this.deleteActionIndex ].disabled = this.isLoading; - this.actionConfig.moreActions[ this.publishActionIndex ].disabled = this.isLoading; - this.actionConfig.moreActions[ this.downloadActionIndex ].disabled = this.isLoading; - } - - this.cardConfig.action.iconStyleClass = this.detailsIconStyle; - } - - public ngOnInit(): void { - this.actionConfig = { - primaryActions: [ - ], - moreActions: [ - { - disabled: true, - id: this.activateActionId, - title: "Activate", - tooltip: "Activate" - }, - { - disabled: true, - id: this.publishActionId, - title: "Publish", - tooltip: "Publish" - }, - { - disabled: true, - id: this.downloadActionId, - title: "Download", - tooltip: "Download" - }, - { - disabled: true, - id: this.deleteActionId, - title: "Delete", - tooltip: "Delete" - } - ] - } as ActionConfig; - - this.cardConfig = { - action: { - id: "showDetails", - hypertext: this.showDetailsTitle, - iconStyleClass: this.detailsIconStyle - }, - titleBorder: true, - noPadding: true, - topBorder: false - } as CardConfig; - - this.emptyStateConfig = { - title: ViewEditorI18n.noViewsDefined - } as EmptyStateConfig; - - this.listConfig = { - dblClick: false, - multiSelect: false, - selectItems: false, - showCheckbox: false, - useExpandItems: false, - emptyStateConfig: this.emptyStateConfig - } as ListConfig; - - } - - /** - * An event handler for when a toolbar action is invoked. - * @param {string} type the type of event being processed - */ - public onClick( type: string ): void { - this.cardEvent.emit( { eventType: type, dataserviceName: this.dataservice.getId() } ); - } - - /** - * An event handler for when edit view is invoked. - * @param {string} vName the name of the view in the selected dataservice - */ - public onEditView( vName: string ): void { - this.cardEvent.emit( { - eventType: DataserviceCardComponent.editDataserviceEvent, - dataserviceName: this.dataservice.getId(), - viewName: vName - } ); - } - - /** - * An event handler for when the card is clicked. - */ - public onSelect(): void { - this.selectEvent.emit( this.dataservice ); - } - - /** - * An event handler for footer action link. - * @param {CardAction} $event the event being processed - */ - public onShowDetails( $event: CardAction ): void { - this.showDetails = !this.showDetails; - $event.hypertext = this.showDetailsTitle; - } - - /** - * @returns {string} the footer details action text - */ - public get showDetailsTitle(): string { - return this.showDetails ? "Less" : "More"; - } - - /** - * Fetches the logs accrued by the publishing operation - * for the current dataservice - */ - private fetchPublishLogs(): void { - this.dataserviceService.publishLogsGet(this.dataservice) - .subscribe( - (response) => { - if (_.isEmpty(response) || _.isEmpty(response.Information) || _.isEmpty(response.Information.log)) { - this.publishLogs = "No log available"; - return; - } - - this.publishLogs = response.Information.log; - this.refreshEditor(); - }, - (error) => { - this.publishLogs = error; - } - ); - } - - /** - * Fetch the publishing logs initially then - * at intervals thereafter in order to - * update the logs. - */ - public initPublishLogs(): void { - // - // Initial fetch of the publish logs - // - this.fetchPublishLogs(); - - // - // Refresh them every 10 seconds - // - this.logMonitor = Observable.interval(10000).subscribe( - (val) => { - this.fetchPublishLogs(); - } - ); - } - - /** - * Fixes the CodeMirror editor not displaying - * any content after intially being unhidden on - * opening of the slide-in. - */ - public refreshEditor(): void { - if (_.isEmpty(this.logEditor)) - return; - - if (_.isEmpty(this.logEditor.instance)) - return; - - const instance = this.logEditor.instance; - setTimeout(() => { - instance.refresh(); - }, 1000); - } - - /** - * Tidy up the Observable subscription - * when the slide-in is closed. - */ - public disposePublishLogs(): void { - if (this.logMonitor) { - this.logMonitor.unsubscribe(); - } - } -} diff --git a/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.css b/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.css deleted file mode 100644 index f247f498..00000000 --- a/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.css +++ /dev/null @@ -1,4 +0,0 @@ -.dataservices-container { - height: 90vh; - overflow: auto; -} diff --git a/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.html b/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.html deleted file mode 100644 index 190b077a..00000000 --- a/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.html +++ /dev/null @@ -1,8 +0,0 @@ -
    -
    - -
    -
    diff --git a/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.spec.ts b/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.spec.ts deleted file mode 100644 index 97674f8e..00000000 --- a/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { RouterTestingModule } from "@angular/router/testing"; -import { FormsModule } from "@angular/forms"; -import { LoggerService } from "@core/logger.service"; -import { DataserviceCardComponent } from "@dataservices/dataservices-cards/dataservice-card/dataservice-card.component"; -import { DataservicesCardsComponent } from "@dataservices/dataservices-cards/dataservices-cards.component"; -import { SharedModule } from "@shared/shared.module"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { TooltipModule } from 'ngx-bootstrap'; -import { CodemirrorModule } from "ng2-codemirror"; - -describe("DataservicesCardsComponent", () => { - let component: DataservicesCardsComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - TooltipModule, - CodemirrorModule, - FormsModule, - SharedModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ DataservicesCardsComponent, DataserviceCardComponent ], - providers: [ LoggerService ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DataservicesCardsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [DataservicesCardsComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.ts b/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.ts deleted file mode 100644 index 27abf798..00000000 --- a/ui/src/app/dataservices/dataservices-cards/dataservices-cards.component.ts +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, EventEmitter, Input, Output, ViewEncapsulation } from "@angular/core"; -import { LoggerService } from "@core/logger.service"; -import { DataserviceCardComponent } from "@dataservices/dataservices-cards/dataservice-card/dataservice-card.component"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { NameValue } from "@dataservices/shared/name-value.model"; - -@Component({ - moduleId: module.id, - encapsulation: ViewEncapsulation.None, - selector: "app-dataservices-cards", - templateUrl: "dataservices-cards.component.html", - styleUrls: ["dataservices-cards.component.css"] -}) -export class DataservicesCardsComponent { - - @Input() public dataservices: Dataservice[]; - @Input() public selectedDataservices: Dataservice[]; - @Output() public dataserviceSelected: EventEmitter = new EventEmitter(); - @Output() public dataserviceDeselected: EventEmitter = new EventEmitter(); - @Output() public activateDataservice: EventEmitter = new EventEmitter(); - @Output() public testDataservice: EventEmitter = new EventEmitter(); - @Output() public publishDataservice: EventEmitter = new EventEmitter(); - @Output() public deleteDataservice: EventEmitter = new EventEmitter(); - @Output() public editDataservice: EventEmitter = new EventEmitter(); - @Output() public quickLookDataservice: EventEmitter = new EventEmitter(); - @Output() public downloadDataservice: EventEmitter = new EventEmitter(); - @Output() public odataLookDataservice: EventEmitter = new EventEmitter(); - @Output() public editDescriptionDataservice: EventEmitter = new EventEmitter(); - - public logger: LoggerService; - - /** - * @param {LoggerService} logger the logging service - */ - constructor( logger: LoggerService ) { - this.logger = logger; - } - - public isSelected( dataservice: Dataservice ): boolean { - return this.selectedDataservices.indexOf( dataservice ) !== -1; - } - - public onCardEvent( event: { eventType: string, dataserviceName: string, viewName: string } ): void { - switch ( event.eventType ) { - case DataserviceCardComponent.deleteDataserviceEvent: - this.deleteDataservice.emit( event.dataserviceName ); - break; - case DataserviceCardComponent.editDataserviceEvent: - const dsName = event.dataserviceName; - const viewName = event.viewName; - const nameVal = new NameValue(dsName, viewName); - this.editDataservice.emit( nameVal ); - break; - case DataserviceCardComponent.publishDataserviceEvent: - this.publishDataservice.emit( event.dataserviceName ); - break; - case DataserviceCardComponent.quickLookDataserviceEvent: - this.quickLookDataservice.emit( event.dataserviceName ); - break; - case DataserviceCardComponent.activateDataserviceEvent: - this.activateDataservice.emit( event.dataserviceName ); - break; - case DataserviceCardComponent.testDataserviceEvent: - this.testDataservice.emit( event.dataserviceName ); - break; - case DataserviceCardComponent.downloadDataserviceEvent: - this.downloadDataservice.emit ( event.dataserviceName ); - break; - case DataserviceCardComponent.odataLookDataserviceEvent: - this.odataLookDataservice.emit( event.dataserviceName ); - break; - case DataserviceCardComponent.editDescriptionDataserviceEvent: - this.editDescriptionDataservice.emit( event.dataserviceName ); - break; - default: - this.logger.error( "Unhandled event type of '" + event.eventType + "'" ); - break; - } - } - - public onSelectEvent( dataservice: Dataservice ): void { - this.dataserviceSelected.emit( dataservice ); - } - -} diff --git a/ui/src/app/dataservices/dataservices-list/dataservices-details.component.html b/ui/src/app/dataservices/dataservices-list/dataservices-details.component.html deleted file mode 100644 index 9d534b20..00000000 --- a/ui/src/app/dataservices/dataservices-list/dataservices-details.component.html +++ /dev/null @@ -1,12 +0,0 @@ - - -
    -
    {{ item[ 0 ] }}
    -
    {{ item[ 1 ] }}
    -
    -
    -
    diff --git a/ui/src/app/dataservices/dataservices-list/dataservices-details.component.ts b/ui/src/app/dataservices/dataservices-list/dataservices-details.component.ts deleted file mode 100644 index 86a2d541..00000000 --- a/ui/src/app/dataservices/dataservices-list/dataservices-details.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, Input, OnInit, ViewEncapsulation } from "@angular/core"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { ListConfig } from "patternfly-ng"; -import { DataservicesConstants } from "../shared/dataservices-constants"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-dataservices-details", - templateUrl: "dataservices-details.component.html" -}) -export class DataservicesDetailsComponent implements OnInit { - @Input() public virtualization: Dataservice; - - public listConfig: ListConfig; - - constructor() { - // nothing to do - } - - public ngOnInit(): void { - this.listConfig = { - dblClick: false, - multiSelect: false, - selectItems: false, - showCheckbox: false, - useExpandItems: false - }; - } - - /** - * @returns {string[][]} the properties of a dataservice - */ - public get properties(): string[][] { - const props = [ - [ DataservicesConstants.dataserviceNameLabel, this.virtualization.getId() ], - [ DataservicesConstants.descriptionLabel, this.virtualization.getDescription() ] - ]; - - return props; - } - -} diff --git a/ui/src/app/dataservices/dataservices-list/dataservices-list.component.css b/ui/src/app/dataservices/dataservices-list/dataservices-list.component.css deleted file mode 100644 index 3b9c0018..00000000 --- a/ui/src/app/dataservices/dataservices-list/dataservices-list.component.css +++ /dev/null @@ -1,59 +0,0 @@ -/* Adds an icon to the left of the delete action item in dropdown of kebab. */ -.object-list .secondary-action[title*="Activate"]:before { - color: var(--card-action-icon-color); - content: "\f1eb"; - font-family: "FontAwesome"; -} - -/* Adds an icon to the left of the download action item in dropdown of kebab. */ -.object-list .secondary-action[title*="Download"]:before { - color: var(--card-action-icon-color); - content: "\f019"; - font-family: "FontAwesome"; -} - -/* Adds an icon to the left of the publish action item in dropdown of kebab. */ -.object-list .secondary-action[title*="Publish"]:before { - color: var(--card-action-icon-color); - content: "\f085"; - font-family: "FontAwesome"; -} - -/* Adds an icon to the left of the refresh action item in dropdown of kebab. */ -.object-list .secondary-action[title*="Refresh"]:before { - color: var(--card-action-icon-color); - content: "\f021"; - font-family: "FontAwesome"; -} - -a.list-pf-title.view-name { - cursor: pointer; - color: var(--card-body-color); - margin-left: 10px !important; -} - -.dataservices-details-properties { - padding-left: 40px; -} - -.list-pf:not(.list-pf-stacked) .list-pf-main-content > * + * { - margin-left: 10px; -} - -.odata-list-icon { - width: 16px; - height: 16px; - padding-left: 8px; - padding-right: 8px; - background-size: 16px 16px; - background-repeat: no-repeat; - background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALlJREFUeNpi/N/D4MDAwLCfgQLAAmc5TmBgEDPAVHFlAYTWScCUe3UBaH0BkiEgA2TsMRU+PgChsclBAeOod4aUd0CGsQtAbPn5gUTvgIAH0Ona8RD2z48MDDuAXrizgYHBqoGBwbIeU/eTgwwMKx3QvAMzAATY+SHhBDLk4wOIBmxhguISkBfQAZ88hL66AIJxACY4C2QbNucSARCGfAIasiMREhZg/kNw9BEDqJbYQKHjSIkhAAEGAHmtTMAm); -} - -#publishing-list-icons div[slide-in-content] h3 { - color: #3f88ce; -} - -#publishing-list-icons .CodeMirror { - height: 80vh; -} diff --git a/ui/src/app/dataservices/dataservices-list/dataservices-list.component.html b/ui/src/app/dataservices/dataservices-list/dataservices-list.component.html deleted file mode 100644 index fba8d2eb..00000000 --- a/ui/src/app/dataservices/dataservices-list/dataservices-list.component.html +++ /dev/null @@ -1,185 +0,0 @@ -
    -
    -
    -
    - - -
    - -
    -
    -
    - - - - - - - - - - - -
    - -
    - - - - - - - - - - - - - - -
    -
    -
    -

    Publishing Logs for '{{item.getId()}}'

    - -
    -
    -
    -
    - {{ item.getId() }} -
    - - {{ getDescription( item ) }} -
    -
    -
    - - - - Views - - -
    -
    -
    - - - Virtualization Not Published
    (Click to view log) -
    - - Virtualization Publishing Failed
    (Click to view log) -
    - - Virtualization Submitted
    (Click to view log) -
    - - Virtualization Configuring
    (Click to view log) -
    - - Virtualization Building
    (Click to view log) -
    - - Virtualization Deploying
    (Click to view log) -
    - - Virtualization Published
    (Click to view log) -
    - - - - -  {{ action.title }} - - -  {{ action.title }} - - -  {{ action.title }} - - -  {{ action.title }} - - -  {{ action.title }} - - -  {{ action.title }} - - -  {{ action.title }} - - -   - - - - - - - -
    -
    -
    -
    -
    diff --git a/ui/src/app/dataservices/dataservices-list/dataservices-list.component.spec.ts b/ui/src/app/dataservices/dataservices-list/dataservices-list.component.spec.ts deleted file mode 100644 index 3bedb0a0..00000000 --- a/ui/src/app/dataservices/dataservices-list/dataservices-list.component.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { FormsModule } from "@angular/forms"; -import { RouterTestingModule } from "@angular/router/testing"; -import { LoggerService } from "@core/logger.service"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { DataservicesDetailsComponent } from "@dataservices/dataservices-list/dataservices-details.component"; -import { DataservicesListComponent } from "@dataservices/dataservices-list/dataservices-list.component"; -import { ViewsContentComponent } from "@dataservices/dataservices-list/views-content.component"; -import { SharedModule } from "@shared/shared.module"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { TooltipModule } from 'ngx-bootstrap'; -import { CodemirrorModule } from "ng2-codemirror"; -import { HttpModule } from "@angular/http"; - -describe("DataservicesListComponent", () => { - let component: DataservicesListComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - TooltipModule, - CodemirrorModule, - FormsModule, - HttpModule, - SharedModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ DataservicesDetailsComponent, DataservicesListComponent, ViewsContentComponent ], - providers: [ - LoggerService, DataserviceService, NotifierService, - { provide: VdbService, useClass: MockVdbService }, - { provide: AppSettingsService, useClass: MockAppSettingsService } - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DataservicesListComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [DataservicesListComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/dataservices-list/dataservices-list.component.ts b/ui/src/app/dataservices/dataservices-list/dataservices-list.component.ts deleted file mode 100644 index d2fdb2df..00000000 --- a/ui/src/app/dataservices/dataservices-list/dataservices-list.component.ts +++ /dev/null @@ -1,374 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - Component, - EventEmitter, - Input, - OnInit, - Output, TemplateRef, - ViewEncapsulation, - ViewChild -} from "@angular/core"; -import { LoggerService } from "@core/logger.service"; -import { Action, ActionConfig, ListConfig } from "patternfly-ng"; -import { Observable } from "rxjs/Observable"; -import { Subscription } from "rxjs/Subscription"; -import * as _ from "lodash"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { NameValue } from "@dataservices/shared/name-value.model"; - -@Component({ - encapsulation: ViewEncapsulation.None, - moduleId: module.id, - selector: "app-dataservices-list", - templateUrl: "dataservices-list.component.html", - styleUrls: ["dataservices-list.component.css"] - }) -export class DataservicesListComponent implements OnInit { - - private static readonly activateActionId = "activate"; - private static readonly deleteActionId = "delete"; - private static readonly editActionId = "edit"; - private static readonly previewActionId = "preview"; - private static readonly publishActionId = "publish"; - private static readonly downloadActionId = "download"; - private static readonly testActionId = "test"; - private static readonly odataLookActionId = "odata-test"; - - public items: Dataservice[]; - public listConfig: ListConfig; - - @Input() public dataservices: Dataservice[]; - @Input() public selectedDataservices: Dataservice[]; - - @Output() public dataserviceSelected: EventEmitter = new EventEmitter(); - @Output() public dataserviceDeselected: EventEmitter = new EventEmitter(); - @Output() public tagSelected: EventEmitter = new EventEmitter(); - @Output() public activateDataservice: EventEmitter = new EventEmitter(); - @Output() public testDataservice: EventEmitter = new EventEmitter(); - @Output() public publishDataservice: EventEmitter = new EventEmitter(); - @Output() public downloadDataservice: EventEmitter = new EventEmitter(); - @Output() public deleteDataservice: EventEmitter = new EventEmitter(); - @Output() public editDataservice: EventEmitter = new EventEmitter(); - @Output() public quickLookDataservice: EventEmitter = new EventEmitter(); - @Output() public odataLookDataservice: EventEmitter = new EventEmitter(); - @Output() public editDescriptionDataservice: EventEmitter = new EventEmitter(); - - @ViewChild('publishLogsEditor') private logEditor: any; - - public logger: LoggerService; - private dataserviceService: DataserviceService; - - public publishLogsEditorConfig = { - lineNumbers: true, - lineWrapping: true, - readOnly: true, - styleActiveLine: true, - placeholder: 'Awaiting Logs ...', - tabSize: 2, - showCursorWhenSelecting: true, - theme: "neat" - }; - - public publishLogs = 'No log available'; - private logMonitor: Subscription = null; - - /** - * @param {LoggerService} logger the logging service - */ - constructor( logger: LoggerService, dataserviceService: DataserviceService ) { - this.logger = logger; - this.dataserviceService = dataserviceService; - } - - /** - * Get the ActionConfig properties for each row. Note: currently PatternFly does not support templates for - * "moreActions" but I added in the hope that they will be supported in the future. - * - * @param ds the dataservice represented by a row - * @param editActionTemplate {TemplateRef} the edit action template - * @param testActionTemplate {TemplateRef} the test action template - * @param quickLookActionTemplate {TemplateRef} the preview action template - * @param activateActionTemplate {TemplateRef} the activate action template - * @param publishActionTemplate {TemplateRef} the publish action template - * @param downloadActionTemplate {TemplateRef} the download action template - * @param deleteActionTemplate {TemplateRef} the delete action template - * @param odataLookActionTemplate {TemplateRef} the odata preview action template - * @returns {ActionConfig} the actions configuration - */ - public getActionConfig( ds: Dataservice, - editActionTemplate: TemplateRef< any >, - testActionTemplate: TemplateRef< any >, - quickLookActionTemplate: TemplateRef< any >, - activateActionTemplate: TemplateRef< any >, - publishActionTemplate: TemplateRef< any >, - downloadActionTemplate: TemplateRef< any >, - deleteActionTemplate: TemplateRef< any >, - odataLookActionTemplate: TemplateRef< any > ): ActionConfig { - const actionConfig = { - primaryActions: [ - { - visible: ds.servicePublished, - id: DataservicesListComponent.odataLookActionId, - template: odataLookActionTemplate, - title: "Odata Test", - tooltip: "Test the published virtualization" - }, - { - disabled: ds.serviceDeploymentLoading, - id: DataservicesListComponent.editActionId, - template: editActionTemplate, - title: "Edit", - tooltip: "Edit this data service" - }, - { - disabled: !ds.serviceDeploymentActive, - id: DataservicesListComponent.previewActionId, - template: quickLookActionTemplate, - title: "Preview", - tooltip: "Preview this data service" - }, - { - disabled: !ds.serviceDeploymentActive, - id: DataservicesListComponent.testActionId, - template: testActionTemplate, - title: "Test", - tooltip: "Test this data service" - } - ], - moreActions: [ - { - disabled: ds.serviceDeploymentLoading, - id: DataservicesListComponent.activateActionId, - template: activateActionTemplate, - title: "Activate", - tooltip: "Activate this data service" - }, - { - disabled: ds.serviceDeploymentLoading, - id: DataservicesListComponent.publishActionId, - template: publishActionTemplate, - title: "Publish", - tooltip: "Publish this data service" - }, - { - disabled: ds.serviceDeploymentLoading, - id: DataservicesListComponent.downloadActionId, - template: downloadActionTemplate, - title: "Download", - tooltip: "Download this data service" - }, - { - disabled: ds.serviceDeploymentLoading, - id: DataservicesListComponent.deleteActionId, - template: deleteActionTemplate, - title: "Delete", - tooltip: "Delete this data service" - } - ], - } as ActionConfig; - - return actionConfig; - } - - /** - * @param {Dataservice} dataservice the dataservice whose description is being requested - * @returns {string} the description (truncated to 120 characters if needed) - */ - public getDescription( dataservice: Dataservice ): string { - const description = dataservice.getDescription(); - - if ( description && description.length > 120 ) { - return description.slice( 0, 120 ) + " ... "; - } - - return description; - } - - public ngOnInit(): void { - this.listConfig = { - dblClick: false, - multiSelect: false, - selectItems: true, - showCheckbox: false, - useExpandItems: true - } as ListConfig; - } - - public isSelected(dataservice: Dataservice): boolean { - return this.selectedDataservices.indexOf(dataservice) !== -1; - } - - public onActivateDataservice(dataserviceName: string): void { - this.activateDataservice.emit(dataserviceName); - } - - /** - * @param $event the list row selection event being handled - */ - public onSelect( $event ): void { - if ( $event.selectedItems.length === 0 ) { - if ( this.selectedDataservices.length !== 0 ) { - this.dataserviceDeselected.emit( $event.selectedItems[ 0 ] ); - } - } else { - this.dataserviceSelected.emit( $event.selectedItems[ 0 ] ); - } - } - - public onTestDataservice(dataserviceName: string): void { - this.testDataservice.emit(dataserviceName); - } - - public onPublishDataservice(dataserviceName: string): void { - this.publishDataservice.emit(dataserviceName); - } - - public onDownloadDataservice(dataserviceName: string): void { - this.downloadDataservice.emit(dataserviceName); - } - - public onDeleteDataservice(dataserviceName: string): void { - this.deleteDataservice.emit(dataserviceName); - } - - public onEditDataservice(dataserviceName: string): void { - const nameVal = new NameValue(dataserviceName, null); - this.editDataservice.emit(nameVal); - } - - public onEditDescription(dataserviceName: string): void { - this.editDescriptionDataservice.emit(dataserviceName); - } - - public onEditView(dsNameView: NameValue): void { - this.editDataservice.emit(dsNameView); - } - - public onPreviewDataservice( dataserviceName: string): void { - this.quickLookDataservice.emit(dataserviceName); - } - - public onOdataLookDataservice( dataserviceName: string): void { - this.odataLookDataservice.emit(dataserviceName); - } - - public handleAction($event: Action, item: any): void { - switch ( $event.id ) { - case DataservicesListComponent.activateActionId: - this.onActivateDataservice( item.getId() ); - break; - case DataservicesListComponent.deleteActionId: - this.onDeleteDataservice( item.getId() ); - break; - case DataservicesListComponent.downloadActionId: - this.onDownloadDataservice( item.getId() ); - break; - case DataservicesListComponent.editActionId: - this.onEditDataservice( item.getId() ); - break; - case DataservicesListComponent.publishActionId: - this.onPublishDataservice( item.getId() ); - break; - case DataservicesListComponent.previewActionId: - this.onPreviewDataservice( item.getId() ); - break; - case DataservicesListComponent.testActionId: - this.onTestDataservice( item.getId() ); - break; - case DataservicesListComponent.odataLookActionId: - this.onOdataLookDataservice( item.getId() ); - break; - default: - this.logger.error( "Unhandled event type of '" + $event.title + "'" ); - break; - } - } - - /** - * Fetches the logs accrued by the publishing operation - * for the current dataservice - */ - private fetchPublishLogs(dataservice: Dataservice): void { - this.dataserviceService.publishLogsGet(dataservice) - .subscribe( - (response) => { - if (_.isEmpty(response) || _.isEmpty(response.Information) || _.isEmpty(response.Information.log)) { - this.publishLogs = "No log available"; - return; - } - - this.publishLogs = response.Information.log; - this.refreshEditor(); - }, - (error) => { - this.publishLogs = error; - } - ); - } - - /** - * Fetch the publishing logs initially then - * at intervals thereafter in order to - * update the logs. - */ - public initPublishLogs(dataservice: Dataservice): void { - // - // Initial fetch of the publish logs - // - this.fetchPublishLogs(dataservice); - - // - // Refresh them every 10 seconds - // - this.logMonitor = Observable.interval(10000).subscribe( - (val) => { - this.fetchPublishLogs(dataservice); - } - ); - } - - /** - * Fixes the CodeMirror editor not displaying - * any content after intially being unhidden on - * opening of the slide-in. - */ - public refreshEditor(): void { - if (_.isEmpty(this.logEditor)) - return; - - if (_.isEmpty(this.logEditor.instance)) - return; - - const instance = this.logEditor.instance; - setTimeout(() => { - instance.refresh(); - }, 1000); - } - - /** - * Tidy up the Observable subscription - * when the slide-in is closed. - */ - public disposePublishLogs(): void { - if (this.logMonitor) { - this.logMonitor.unsubscribe(); - } - } -} diff --git a/ui/src/app/dataservices/dataservices-list/views-content.component.html b/ui/src/app/dataservices/dataservices-list/views-content.component.html deleted file mode 100644 index 54f242d2..00000000 --- a/ui/src/app/dataservices/dataservices-list/views-content.component.html +++ /dev/null @@ -1,25 +0,0 @@ -
    -
    -
    - - -
    - - {{ item }} -
    -
    - -
    -
    - {{ connection.getId() }} -
    -
    -
    -
    -
    -
    -
    diff --git a/ui/src/app/dataservices/dataservices-list/views-content.component.ts b/ui/src/app/dataservices/dataservices-list/views-content.component.ts deleted file mode 100644 index f90e9bb9..00000000 --- a/ui/src/app/dataservices/dataservices-list/views-content.component.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from "@angular/core"; -import { Connection } from "@connections/shared/connection.model"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { ListConfig } from "patternfly-ng"; -import { NameValue } from "@dataservices/shared/name-value.model"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-views-content", - templateUrl: "./views-content.component.html" -}) -export class ViewsContentComponent implements OnInit { - - @Input() public virtualization: Dataservice; - @Output() public editDataservice: EventEmitter = new EventEmitter(); - - public listConfig: ListConfig; - - constructor() { - // nothing to do - } - - /** - * @param {string} view the view whose connections are being requested - * @returns {Connection[]} the connections of the dataservice represented by this card - */ - public getConnections( view: string ): Connection[] { - // TODO rewrite when REST functionality has been implemented - const result: Connection[] = []; - - const c1 = new Connection(); - c1.setId( "ConnectionOne" ); - result.push( c1 ); - - const c2 = new Connection(); - c2.setId( "ConnectionTwo" ); - result.push( c2 ); - - const c3 = new Connection(); - c3.setId( "ConnectionThree" ); - result.push( c3 ); - - return result; - } - - /** - * @param {Dataservice} ds the dataservice whose views are being requested - * @returns {string[]} the names of the views - */ - public getViews( ds: Dataservice ): string[] { - const result: string[] = []; - - for (const viewName of ds.getServiceViewNames()) { - result.push(viewName); - } - - return result; - } - - public ngOnInit(): void { - this.listConfig = { - dblClick: false, - multiSelect: false, - selectItems: false, - showCheckbox: false, - useExpandItems: false - } as ListConfig; - } - - /** - * An event handler for when edit view is invoked. - * @param {string} vName the name of the view in the selected dataservice - */ - public onEditView( vName: string ): void { - const nameVal = new NameValue(this.virtualization.getId(), vName); - this.editDataservice.emit(nameVal); - } - -} diff --git a/ui/src/app/dataservices/dataservices-routing.module.ts b/ui/src/app/dataservices/dataservices-routing.module.ts deleted file mode 100644 index 62894f5b..00000000 --- a/ui/src/app/dataservices/dataservices-routing.module.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from "@angular/core"; -import { RouterModule } from "@angular/router"; -import { Routes } from "@angular/router"; -import { DataservicesComponent } from "@dataservices/dataservices.component"; -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; -import { TestDataserviceComponent } from "@dataservices/test-dataservice/test-dataservice.component"; -import { ViewEditorComponent } from "@dataservices/virtualization/view-editor/view-editor.component"; - -const dataservicesRoutes: Routes = [ - { path: DataservicesConstants.dataservicesRootRoute, component: DataservicesComponent }, - { path: DataservicesConstants.viewRoute, component: ViewEditorComponent }, - { path: DataservicesConstants.testDataserviceRoute, component: TestDataserviceComponent } -]; - -@NgModule({ - imports: [ - RouterModule.forChild( dataservicesRoutes ) - ], - exports: [ - RouterModule - ] -}) -export class DataservicesRoutingModule {} diff --git a/ui/src/app/dataservices/dataservices.component.css b/ui/src/app/dataservices/dataservices.component.css deleted file mode 100644 index aab83d6d..00000000 --- a/ui/src/app/dataservices/dataservices.component.css +++ /dev/null @@ -1,49 +0,0 @@ -.dataservice-summary-top-area-with-results { - height: 20vh; - overflow-y: auto; - overflow-x: hidden; -} - -.dataservice-summary-bottom-area-with-results { - height: 50vh; -} - -.dataservice-summary-top-area-no-results { -} - -.dataservice-summary-bottom-area-no-results { -} - -.dataservice-results-hr { - height: 3px; - border: none; - color: darkgray; - background-color: darkgray; -} - -.dataservice-results-action-icon-close { - cursor: pointer; - color: darkred; - font-size: 1.5em; -} - -.dataservice-results-action-icon-refresh { - cursor: pointer; - font-size: 1.5em; - margin-left: 10px; -} - -.dataservice-results-action-icon { - cursor: pointer; - font-size: 1.5em; -} - -.quicklook-title { - margin-left: 50px; - font-size: 1.25em; - font-weight: bold; -} - -.dataservices-toast { - margin-top: 0.5em; -} diff --git a/ui/src/app/dataservices/dataservices.component.html b/ui/src/app/dataservices/dataservices.component.html deleted file mode 100644 index 47282e0c..00000000 --- a/ui/src/app/dataservices/dataservices.component.html +++ /dev/null @@ -1,128 +0,0 @@ -
    - -
    - -
  • -
    -
    - - - -
    -
    -

    Data Virtualizations

    -
    -
    -
    -
    -
    - -
    -
    - -
    - -
    -
      -
    • -
    • -
    -
    -
    -
    -
    - -
    -
    - - - -
    - -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    -
    -
    -
    -

    - Loading Data Virtualizations... -

    -
    -
    -
    -
    -
    - - -
    -
    - - - - -
    -
    -
    -
    -
    - - - Quick Look Results for Data Virtualization '{{ quickLookServiceName }}' - -
    -
    - -
    -
    -
    -
    -
    - Odata Results for Published Virtualization Service '{{ odataServiceName }}' - -
    -
    - -
    -
    -
    - -
    - -
    diff --git a/ui/src/app/dataservices/dataservices.component.spec.ts b/ui/src/app/dataservices/dataservices.component.spec.ts deleted file mode 100644 index a92126ef..00000000 --- a/ui/src/app/dataservices/dataservices.component.spec.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { ComponentFixture, TestBed } from "@angular/core/testing"; -import { FormsModule } from "@angular/forms"; -import { HttpModule } from "@angular/http"; -import { By } from "@angular/platform-browser"; -import { RouterTestingModule } from "@angular/router/testing"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { CoreModule } from "@core/core.module"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { DataserviceCardComponent } from "@dataservices/dataservices-cards/dataservice-card/dataservice-card.component"; -import { DataservicesCardsComponent } from "@dataservices/dataservices-cards/dataservices-cards.component"; -import { DataservicesDetailsComponent } from "@dataservices/dataservices-list/dataservices-details.component"; -import { DataservicesListComponent } from "@dataservices/dataservices-list/dataservices-list.component"; -import { ViewsContentComponent } from "@dataservices/dataservices-list/views-content.component"; -import { DataservicesComponent } from "@dataservices/dataservices.component"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { SqlControlComponent } from "@dataservices/sql-control/sql-control.component"; -import { OdataControlComponent } from "@dataservices/odata-control/odata-control.component"; -import { SharedModule } from "@shared/shared.module"; -import { CodemirrorModule } from "ng2-codemirror"; -import { ModalModule } from "ngx-bootstrap"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { AccordionModule } from 'ngx-bootstrap'; -import { TooltipModule } from 'ngx-bootstrap'; -import { SelectionService } from "@core/selection.service"; - -describe("DataservicesComponent", () => { - let component: DataservicesComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - CoreModule, - FormsModule, - HttpModule, - ModalModule.forRoot(), - RouterTestingModule, - SharedModule, - CodemirrorModule, - AccordionModule.forRoot(), - TooltipModule.forRoot(), - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ DataservicesDetailsComponent, - DataservicesComponent, - DataservicesListComponent, - DataservicesCardsComponent, - DataserviceCardComponent, - SqlControlComponent, - OdataControlComponent, - ViewsContentComponent ], - providers: [ - NotifierService, - SelectionService, - SelectionService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: ConnectionService, useClass: MockConnectionService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - { provide: VdbService, useClass: MockVdbService } - ] - }); - - fixture = TestBed.createComponent(DataservicesComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [DataservicesComponent] should be created"); - expect(component).toBeTruthy(); - }); - - it("should have Data Virtualizations Title", () => { - console.log("========== [DataservicesComponent] should have Data Virtualizations Title"); - // query for the title

    by CSS element selector - const de = fixture.debugElement.query(By.css("h2")); - const el = de.nativeElement; - expect(el.textContent).toEqual("Data Virtualizations"); - }); - - it("should have Toolbar", () => { - console.log("========== [DataservicesComponent] should have Toolbar"); - // query for the toolbar by css classname - const de = fixture.debugElement.query(By.css(".toolbar-pf")); - expect(de).toBeDefined(); - }); - - it("should have Dataservices", () => { - console.log("========== [DataservicesComponent] should have Dataservices"); - // Check component object - const dataservices = component.allDataservices; - expect(dataservices.length).toEqual(3); - - // Check html has the same number of dataservice cards - const cardDebugElems = fixture.debugElement.queryAll(By.css(".object-card")); - expect(cardDebugElems).toBeDefined(); - expect(cardDebugElems.length).toEqual(3); - }); - - it("should have initial card layout", () => { - console.log("========== [DataservicesComponent] should have initial card layout"); - // app-dataservices-cards should be present - let debugEl = fixture.debugElement.query(By.css("app-dataservices-cards")); - const element = debugEl.nativeElement; - expect(element).toBeDefined(); - - // app-dataservices-list should not be present - debugEl = fixture.debugElement.query(By.css("app-dataservices-list")); - expect(debugEl).toBeNull(); - }); - - it("should toggle layout", () => { - console.log("========== [DataservicesComponent] should toggle layout"); - // Initial layout should be Card Layout - let cardDebugElem = fixture.debugElement.query(By.css("app-dataservices-cards")); - let listDebugElem = fixture.debugElement.query(By.css("app-dataservices-list")); - expect(cardDebugElem).toBeDefined(); - expect(listDebugElem).toBeNull(); - const cardElem = cardDebugElem.nativeElement; - expect(cardElem).toBeDefined(); - - // Change the layout to ListLayout - component.setListLayout(); - fixture.detectChanges(); - - // Verify that the layout has changed - cardDebugElem = fixture.debugElement.query(By.css("app-dataservices-cards")); - listDebugElem = fixture.debugElement.query(By.css("app-dataservices-list")); - expect(cardDebugElem).toBeNull(); - expect(listDebugElem).toBeDefined(); - const listElem = listDebugElem.nativeElement; - expect(listElem).toBeDefined(); - }); - - // it("should filter dataservices", () => { - // console.log("========== [DataservicesComponent] should filter dataservices"); - // // Expect 3 dataservices initially. - // let dataservices = component.filteredDataservices; - // expect(dataservices.length).toEqual(3); - // - // // Set a name filter which satisfies none of the dataservices - // component.nameFilter = "g"; - // component.filterDataservices(); - // fixture.detectChanges(); - // - // // Now expect 0 services match - // dataservices = component.filteredDataservices; - // expect(dataservices.length).toEqual(0); - // }); - -}); diff --git a/ui/src/app/dataservices/dataservices.component.ts b/ui/src/app/dataservices/dataservices.component.ts deleted file mode 100644 index 7e80c2bc..00000000 --- a/ui/src/app/dataservices/dataservices.component.ts +++ /dev/null @@ -1,1047 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnInit, ViewChild } from "@angular/core"; -import { ActivatedRoute, Router } from "@angular/router"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { SelectionService } from "@core/selection.service"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; -import { DeploymentState } from "@dataservices/shared/deployment-state.enum"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { PublishState } from "@dataservices/shared/publish-state.enum"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { Virtualization } from "@dataservices/shared/virtualization.model"; -import { SqlControlComponent } from "@dataservices/sql-control/sql-control.component"; -import { AbstractPageComponent } from "@shared/abstract-page.component"; -import { ConfirmDialogComponent } from "@shared/confirm-dialog/confirm-dialog.component"; -import { LayoutType } from "@shared/layout-type.enum"; -import { SortDirection } from "@shared/sort-direction.enum"; -import { BsModalService } from "ngx-bootstrap"; -import { - ActionConfig, - EmptyStateConfig, - Filter, - FilterConfig, - FilterEvent, - FilterField, - FilterType, - NotificationType, - SortConfig, - SortEvent, - SortField -} from "patternfly-ng"; -import { Subscription } from "rxjs/Subscription"; -import { SqlView } from "@dataservices/shared/sql-view.model"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { ViewDefinition } from "@dataservices/shared/view-definition.model"; -import { ViewEditorState } from "@dataservices/shared/view-editor-state.model"; -import { NameValue } from "@dataservices/shared/name-value.model"; -import { CreateViewsDialogComponent } from "@dataservices/create-views-dialog/create-views-dialog.component"; -import { SetDescriptionDialogComponent } from "@dataservices/set-description-dialog/set-description-dialog.component"; - -@Component({ - moduleId: module.id, - selector: "app-dataservices", - templateUrl: "./dataservices.component.html", - styleUrls: ["./dataservices.component.css"] -}) -export class DataservicesComponent extends AbstractPageComponent implements OnInit { - - public readonly connectionsLoadedTag = "connections"; - - public filterConfig: FilterConfig; - public filtersText = ""; - public items: Dataservice[]; - public sortConfig: SortConfig; - public currentSortField: SortField; - public isAscendingSort = true; - - private connectionsExist = false; - private noConnectionsConfig: EmptyStateConfig; - private noDataservicesConfig: EmptyStateConfig; - - private cardListAreaCss = "dataservice-summary-top-area-no-results"; - private resultsAreaCss = "dataservice-summary-bottom-area-no-results"; - private resultsShowing = false; - private odataEditorShowing = false; - private quickLookSvcName: string; - private odataSvcName: string; - private quickLookQueryText: string; - - private allServices: Dataservice[] = []; - private connectionService: ConnectionService; - private filteredServices: Dataservice[] = []; - private selectedServices: Dataservice[] = []; - private dataserviceNameForDelete: string; - private router: Router; - private appSettingsService: AppSettingsService; - private dataserviceService: DataserviceService; - private vdbService: VdbService; - private sortDirection: SortDirection = SortDirection.ASC; - private toastNotificationHeader: string; - private toastNotificationMessage: string; - private toastNotificationType = NotificationType.SUCCESS; - private toastNotificationVisible = false; - private dataserviceDeployStateSubscription: Subscription; - private dataservicePublishStateSubscription: Subscription; - private notifierService: NotifierService; - private selectedSvcViewNames: SqlView[] = []; - private allSvcViewNames: SqlView[] = []; - private modalService: BsModalService; - private selectionService: SelectionService; - - @ViewChild(SqlControlComponent) private sqlControlComponent: SqlControlComponent; - - constructor(router: Router, route: ActivatedRoute, dataserviceService: DataserviceService, - logger: LoggerService, appSettingsService: AppSettingsService, - notifierService: NotifierService, vdbService: VdbService, connectionService: ConnectionService, - selectionService: SelectionService, modalService: BsModalService) { - super(route, logger); - this.router = router; - this.appSettingsService = appSettingsService; - this.dataserviceService = dataserviceService; - this.vdbService = vdbService; - this.notifierService = notifierService; - this.modalService = modalService; - this.selectionService = selectionService; - // Register for dataservice deployment state changes - this.dataserviceDeployStateSubscription = this.notifierService.getDataserviceDeployStateMap().subscribe((serviceStateMap) => { - this.onDataserviceDeploymentStateChanged(serviceStateMap); - }); - // Register for dataservice state changes - this.dataservicePublishStateSubscription = this.notifierService.getDataserviceVirtualizationMap().subscribe((serviceStateMap) => { - this.onDataservicePublishStateChanged(serviceStateMap); - }); - this.connectionService = connectionService; - } - - public ngOnInit(): void { - super.ngOnInit(); - - this.filterConfig = { - fields: [{ - id: "name", - title: "Name", - placeholder: "Filter by Name...", - type: FilterType.TEXT - }, { - id: "description", - title: "Description", - placeholder: "Filter by Description...", - type: FilterType.TEXT - }] as FilterField[], - resultsCount: this.filteredDataservices.length, - appliedFilters: [] - } as FilterConfig; - - this.sortConfig = { - fields: [{ - id: "name", - title: "Name", - sortType: "alpha" - }, { - id: "description", - title: "Description", - sortType: "alpha" - }], - isAscending: this.isAscendingSort - } as SortConfig; - } - - public get noConnectionsEmptyConfig(): EmptyStateConfig { - if ( !this.noConnectionsConfig ) { - const actionConfig = { - primaryActions: [ - { - id: "createConnectionActionId", - title: "Add Connection", - tooltip: "Add a connection" - } - ] - } as ActionConfig; - - this.noConnectionsConfig = { - actions: actionConfig, - iconStyleClass: "pficon-warning-triangle-o", - info: "No Data virtualizations were found. In order to create a virtualization, you must first create a connection. " - + "Please click below to create a connection.", - title: "No Data Virtualizations Available" - } as EmptyStateConfig; - } - - return this.noConnectionsConfig; - } - - public get noDataservicesEmptyConfig(): EmptyStateConfig { - if ( !this.noDataservicesConfig ) { - const actionConfig = { - primaryActions: [ - { - id: "createDataserviceActionId", - title: "Add Data Virtualization", - tooltip: "Add a data virtualization" - } - ] - } as ActionConfig; - - this.noDataservicesConfig = { - actions: actionConfig, - iconStyleClass: "pficon-warning-triangle-o", - info: "No Data virtualizations were found. Please click below to create a virtualization.", - title: "No Data Virtualizations Available" - } as EmptyStateConfig; - } - - return this.noDataservicesConfig; - } - - public get hasConnections(): boolean { - return this.isLoaded( this.connectionsLoadedTag ) && this.connectionsExist; - } - - public onNewConnection(): void { - this.selectionService.setSelectedConnection(null); - - const link: string[] = [ ConnectionsConstants.addConnectionPath ]; - this.logger.debug( "[DataservicesPageComponent] Navigating to: %o", link ); - this.router.navigate( link ).then(() => { - // nothing to do - } ); - } - - public loadAsyncPageData(): void { - const self = this; - this.dataserviceService - .getAllDataservices() - .subscribe( - (dataservices) => { - self.allServices = dataservices; - self.filteredServices = dataservices; - self.dataserviceService.updateDataserviceStates(); // trigger refresh in event of new deployment - self.loaded("dataservices"); - }, - (error) => { - self.error(error, "Error getting dataservices"); - } - ); - - this.connectionService - .getConnections(true, false) - .subscribe( - ( connectionSummaries ) => { - const connections = []; - for ( const connectionSummary of connectionSummaries ) { - connections.push(connectionSummary.getConnection()); - } - self.connectionsExist = connections.length !== 0; - self.loaded( self.connectionsLoadedTag ); - }, - ( error ) => { - self.error( error, "Error getting connections" ); - } - ); - } - - public setOdataEditorPanelOpenState(openState: boolean): void { - if (openState) { - this.cardListAreaCss = "dataservice-summary-top-area-with-results"; - this.resultsAreaCss = "dataservice-summary-bottom-area-with-results"; - - // - // Make the preview panel and odata panels mutually exclusive - // - this.resultsShowing = false; - this.odataEditorShowing = true; - } else { - this.cardListAreaCss = "dataservice-summary-top-area-no-results"; - this.resultsAreaCss = "dataservice-summary-bottom-area-no-results"; - this.odataEditorShowing = false; - } - } - - /** - * Sets the open state of the quick look panel - * @param {boolean} openState true if quick look panel is to be shown - */ - public setQuickLookPanelOpenState(openState: boolean): void { - if (openState) { - this.cardListAreaCss = "dataservice-summary-top-area-with-results"; - this.resultsAreaCss = "dataservice-summary-bottom-area-with-results"; - - // - // Make the preview panel and odata panels mutually exclusive - // - this.odataEditorShowing = false; - this.resultsShowing = true; - } else { - this.cardListAreaCss = "dataservice-summary-top-area-no-results"; - this.resultsAreaCss = "dataservice-summary-bottom-area-no-results"; - this.resultsShowing = false; - } - } - - /** - * Closes both the quick look and odate editor panels - * if either of them are open - */ - public closeLookPanels(): void { - this.setQuickLookPanelOpenState(false); - this.setOdataEditorPanelOpenState(false); - } - - /** - * @returns {boolean} true if dataservice results panel is to be shown - */ - public get showResults(): boolean { - return this.resultsShowing; - } - - /** - * @returns {boolean} true if dataservice odate editor panel is to be shown - */ - public get showOdataEditor(): boolean { - return this.odataEditorShowing; - } - - /** - * @returns {boolean} true if dataservice toast notification is to be shown - */ - public get showToastNotification(): boolean { - return this.toastNotificationVisible; - } - - /** - * @returns {boolean} true if dataservices are being represented by cards - */ - public get isCardLayout(): boolean { - return this.appSettingsService.dataservicesPageLayout === LayoutType.CARD; - } - - /** - * @returns {boolean} true if dataservices are being represented by items in a list - */ - public get isListLayout(): boolean { - return this.appSettingsService.dataservicesPageLayout === LayoutType.LIST; - } - - /** - * @returns {boolean} true if sorting dataservice names in ascending order - */ - public get isSortAscending(): boolean { - return this.sortDirection === SortDirection.ASC; - } - - /** - * @returns {boolean} true if sorting dataservice names in descending order - */ - public get isSortDescending(): boolean { - return this.sortDirection === SortDirection.DESC; - } - - /** - * @returns {Dataservice[]} the array of all dataservices - */ - public get allDataservices(): Dataservice[] { - return this.allServices; - } - - /** - * @returns {boolean} 'true' if any dataservices are available - */ - public get hasDataservices(): boolean { - return this.allServices.length > 0; - } - - /** - * @returns {Dataservice[]} the array of filtered dataservices - */ - public get filteredDataservices(): Dataservice[] { - return this.filteredServices; - } - - /** - * @returns {Dataservice[]} the array of selected dataservices - */ - public get selectedDataservices(): Dataservice[] { - return this.selectedServices; - } - - /** - * Accessor for all available service view names - */ - public get allServiceViewNames( ): SqlView[] { - return this.allSvcViewNames; - } - - /** - * Accessor for selected service view names - */ - public get selectedViewNames( ): SqlView[] { - return this.selectedSvcViewNames; - } - - /** - * @returns {string} the odata service name - */ - public get odataServiceName(): string { - return this.odataSvcName; - } - - /** - * @returns {string} the quick look service name - */ - public get quickLookServiceName(): string { - return this.quickLookSvcName; - } - - /** - * @returns {string} the quick look service name - */ - public get quickLookSql(): string { - return this.quickLookQueryText; - } - - public onSelected(dataservice: Dataservice): void { - // Only allow one item to be selected - this.selectedServices.shift(); - this.selectedServices.push(dataservice); - } - - public onDeselected(dataservice: Dataservice): void { - // Only one item is selected at a time - this.selectedServices.shift(); - // this.selectedServices.splice(this.selectedServices.indexOf(dataservice), 1); - } - - public onActivate(svcName: string): void { - const selectedService = this.filteredDataservices.find((x) => x.getId() === svcName); - selectedService.setServiceDeploymentState(DeploymentState.LOADING); - - this.closeLookPanels(); - - const self = this; - // Start the deployment and then redirect to the dataservice summary page - this.dataserviceService - .deployDataservice(svcName) - .subscribe( - (wasSuccess) => { - self.dataserviceService.updateDataserviceStates(); - }, - (error) => { - self.dataserviceService.updateDataserviceStates(); - } - ); - } - - public onTest(svcName: string): void { - const selectedService = this.filteredDataservices.find((x) => x.getId() === svcName); - this.selectionService.setSelectedVirtualization(selectedService); - this.allSvcViewNames = this.selectionService.getSelectedVirtualizationViewNames(); - this.selectedSvcViewNames = []; - this.selectedSvcViewNames.push(this.allServiceViewNames[0]); - - this.closeLookPanels(); - - const link: string[] = [ DataservicesConstants.testDataservicePath ]; - this.logger.debug("[DataservicesPageComponent] Navigating to: %o", link); - this.router.navigate(link).then(() => { - // nothing to do - }); - } - - /** - * Handle Download of the specified Dataservice - * @param {string} svcName - */ - public onDownload(svcName: string): void { - this.closeLookPanels(); - - this.setToastNotification(Toast.Type.Download, Toast.State.InProgress, svcName); - this.toastNotificationVisible = true; - this.logger.debug("[DataservicesPageComponent] Downloading Dataservice: " + svcName); - const self = this; - this.dataserviceService - .downloadDataservice(svcName) - .subscribe( - (wasSuccess) => { - self.setToastNotification(Toast.Type.Download, Toast.State.Successful, svcName); - // Dismiss toast notification after 8 sec - setTimeout(() => self.toastNotificationVisible = false, 8000); - this.logger.debug("[DataservicesPageComponent] Download Dataservice was successful"); - }, - (error) => { - self.setToastNotification(Toast.Type.Download, Toast.State.Failed, svcName); - // Dismiss toast notification after 8 sec - setTimeout(() => self.toastNotificationVisible = false, 8000); - this.logger.error("[DataservicesPageComponent] Download dataservice " + svcName + " failed."); - } - ); - } - - /** - * Set the toast notification details based on state and type. - * @param {Toast.Type} type the type of toast message (Toast.Type.xyz) - * @param {Toast.State} state the state of the progress (Toast.State.xyz) - * @param {string} virtualizationName the name of the virtualization - */ - private setToastNotification( type: Toast.Type, state: Toast.State, virtualizationName: string ): void { - // Set InProgress Toast details - if ( state === Toast.State.InProgress ) { - this.toastNotificationType = NotificationType.INFO; - if ( type === Toast.Type.Download ) { - this.toastNotificationHeader = "Downloading: "; - this.toastNotificationMessage = "Downloading " + virtualizationName + "..."; - } else if ( type === Toast.Type.Publish ) { - this.toastNotificationHeader = "Publishing: "; - this.toastNotificationMessage = "Publishing " + virtualizationName + "..."; - } else if ( type === Toast.Type.NewVirtualization ) { - this.toastNotificationHeader = "Creating: "; - this.toastNotificationMessage = "Creating " + virtualizationName + "..."; - } - // Set Successful Toast details - } else if ( state === Toast.State.Successful ) { - this.toastNotificationType = NotificationType.SUCCESS; - if ( type === Toast.Type.Download ) { - this.toastNotificationHeader = "Download Succeeded: "; - this.toastNotificationMessage = " " + virtualizationName + " was downloaded successfully!"; - } else if ( type === Toast.Type.Publish ) { - this.toastNotificationHeader = "Publishing Started: "; - this.toastNotificationMessage = " " + virtualizationName + " publishing successfully initiated."; - } else if ( type === Toast.Type.NewVirtualization ) { - this.toastNotificationHeader = "Create Succeeded: "; - this.toastNotificationMessage = " " + virtualizationName + " was created successfully!"; - } - // Set Failed Toast details - } else if ( state === Toast.State.Failed ) { - this.toastNotificationType = NotificationType.DANGER; - if ( type === Toast.Type.Download ) { - this.toastNotificationHeader = "Download Failed: "; - this.toastNotificationMessage = " Failed to download dataservice " + virtualizationName; - } else if ( type === Toast.Type.Publish ) { - this.toastNotificationHeader = "Publishing Failed: "; - this.toastNotificationMessage = " Failed to publish dataservice " + virtualizationName + "."; - } else if ( type === Toast.Type.NewVirtualization ) { - this.toastNotificationHeader = "Create Failed: "; - this.toastNotificationMessage = " Failed to create dataservice " + virtualizationName; - } - } - } - - public onPublish(svcName: string): void { - const selectedService = this.filteredDataservices.find((x) => x.getId() === svcName); - const virtual: Virtualization = new Virtualization(selectedService.getServiceVdbName(), PublishState.SUBMITTED); - selectedService.setServiceVirtualization(virtual); - this.closeLookPanels(); - - this.setToastNotification(Toast.Type.Publish, Toast.State.InProgress, svcName); - this.toastNotificationVisible = true; - this.logger.debug("[DataservicesPageComponent] Publishing Dataservice: " + svcName); - const self = this; - this.dataserviceService - .publishDataservice(svcName) - .subscribe( - (status) => { - self.setToastNotification(Toast.Type.Publish, Toast.State.Successful, svcName); - // Dismiss toast notification after 8 sec - setTimeout(() => self.toastNotificationVisible = false, 8000); - this.logger.debug("[DataservicesPageComponent] Initiated publishing of dataservice"); - }, - (error) => { - self.setToastNotification(Toast.Type.Publish, Toast.State.Failed, svcName); - // Dismiss toast notification after 8 sec - setTimeout(() => self.toastNotificationVisible = false, 8000); - this.logger.error("[DataservicesPageComponent] Publish dataservice " + svcName + " failed."); - } - ); - } - - /** - * Handle Delete of the specified Dataservice - * @param {string} svcName - */ - public onDelete(svcName: string): void { - this.closeLookPanels(); - - this.dataserviceNameForDelete = svcName; - - // Dialog Content - const message = "Do you really want to delete Virtualization '" + svcName + "'?"; - const initialState = { - title: "Confirm Delete", - bodyContent: message, - cancelButtonText: "Cancel", - confirmButtonText: "Delete" - }; - - // Show Dialog, act upon confirmation click - const modalRef = this.modalService.show(ConfirmDialogComponent, {initialState}); - modalRef.content.confirmAction.take(1).subscribe((value) => { - this.onDeleteDataservice(); - }); - } - - /** - * Handle request for new Virtualization - */ - public onNew(): void { - // Open New Virtualization dialog - const initialState = { - title: ViewEditorI18n.createViewsDialogNewVirtualizationTitle, - cancelButtonText: ViewEditorI18n.cancelButtonText, - okButtonText: ViewEditorI18n.okButtonText - }; - - // Show Dialog, act upon confirmation click - const modalRef = this.modalService.show(CreateViewsDialogComponent, {initialState, class: 'modal-lg'}); - modalRef.content.okAction.take(1).subscribe((dialogResult) => { - - // Create the new virtualization and view. - const virtName = dialogResult.getVirtualizationName(); - const virtDescr = dialogResult.getVirtualizationDescription(); - const newViews = dialogResult.getViews(); - const viewDefns: ViewDefinition[] = []; - for (const newView of newViews) { - const viewDefn = new ViewDefinition(); - viewDefn.setName(newView.getViewName()); - viewDefn.setDescription(newView.getViewDescription()); - const srcNode = newView.getViewSourceNode(); - const srcPath = "connection=" + newView.getConnectionName() + "/" + srcNode.getPath(); - const srcPaths: string[] = []; - srcPaths.push(srcPath); - viewDefn.addSourcePaths(srcPaths); - viewDefns.push(viewDefn); - } - - // Display Toast notification - this.setToastNotification(Toast.Type.NewVirtualization, Toast.State.InProgress, virtName); - this.toastNotificationVisible = true; - - // Create the new virtualization - const newVirtualization = this.dataserviceService.newDataserviceInstance(virtName, virtDescr); - const self = this; - this.dataserviceService - .createDataservice(newVirtualization) - .subscribe( - (wasSuccess) => { - // Set the current virtualization to the newly created virtualization - self.selectVirtualizationCreateViews(virtName, viewDefns); - }, - (error) => { - self.logger.error("[VirtualizationComponent] Error creating virtualization: %o", error); - // Display Toast notification - self.setToastNotification(Toast.Type.NewVirtualization, Toast.State.Failed, virtName); - // Dismiss toast notification after 8 sec - setTimeout(() => self.toastNotificationVisible = false, 8000); - } - ); - - }); - - } - - /* - * Select the specified Dataservice. create views under it - * @param {string} dsName the name of the dataservice - * @param {ViewDefinition[]} viewDefns the array of view definitions to create - */ - private selectVirtualizationCreateViews(virtName: string, viewDefns: ViewDefinition[]): void { - const self = this; - this.dataserviceService - .getAllDataservices() - .subscribe( - (dataservices) => { - for (const ds of dataservices) { - if (ds.getId() === virtName) { - self.selectionService.setSelectedVirtualization(ds); - self.createViews(ds, viewDefns); - } - } - }, - (error) => { - self.logger.error("[VirtualizationComponent] Error selecting the virtualization: %o", error); - // Display Toast notification - self.setToastNotification(Toast.Type.NewVirtualization, Toast.State.Failed, virtName); - // Dismiss toast notification after 8 sec - setTimeout(() => self.toastNotificationVisible = false, 8000); - } - ); - } - - private createViews(dataservice: Dataservice, viewDefns: ViewDefinition[]): void { - const selectedDs = this.selectionService.getSelectedVirtualization(); - if (!selectedDs || selectedDs === null) { - return; - } - // Create the array of ViewEditorStates - const editorStates: ViewEditorState[] = []; - for (const viewDefn of viewDefns) { - const editorId = this.getEditorStateId(selectedDs, viewDefn); - - // Create new editor state to save - const editorState = new ViewEditorState(); - editorState.setId(editorId); - editorState.setViewDefinition(viewDefn); - - editorStates.push(editorState); - } - - const virtName = selectedDs.getId(); - const self = this; - this.dataserviceService - .saveViewEditorStatesRefreshViews(editorStates, selectedDs.getId()) - .subscribe( - (wasSuccess) => { - // Dismiss toast since navigating away - self.toastNotificationVisible = false; - - // transfer control to the viewEditor - const link: string[] = [ DataservicesConstants.viewPath ]; - this.logger.debug("[DataservicesPageComponent] Navigating to: %o", link); - this.router.navigate(link).then(() => { - // nothing to do - }); - }, - (error) => { - self.logger.error("[VirtualizationComponent] Error saving the editor state: %o", error); - // Display Toast notification - self.setToastNotification(Toast.Type.NewVirtualization, Toast.State.Failed, virtName); - // Dismiss toast notification after 8 sec - setTimeout(() => self.toastNotificationVisible = false, 8000); - } - ); - } - - /** - * Construct id for the editor state - * @param {Dataservice} dataservice the dataservice - * @param {ViewDefinition} viewDefn the view definition - * @returns {string} the ID used to persist the editor state - */ - private getEditorStateId(dataservice: Dataservice, viewDefn: ViewDefinition): string { - return dataservice.getServiceVdbName().toLowerCase() + "." + viewDefn.getName(); - } - - /** - * Handle Edit of the specified Dataservice and View - * @param {string} svcName - */ - public onEdit(svcNameView: NameValue): void { - const virtName = svcNameView.getName(); - const selectedService = this.filteredDataservices.find((x) => x.getId() === virtName); - this.selectionService.setSelectedVirtualization(selectedService); - - const viewName = svcNameView.getValue(); - let viewDefn: ViewDefinition = null; - if (viewName && viewName !== null) { - viewDefn = new ViewDefinition(); - viewDefn.setName(viewName); - } - this.selectionService.setSelectedViewDefinition(selectedService, viewDefn); - - this.closeLookPanels(); - - const link: string[] = [ DataservicesConstants.viewPath ]; - this.logger.debug("[DataservicesPageComponent] Navigating to: %o", link); - this.router.navigate(link).then(() => { - // nothing to do - }); - } - - /* - * Handle showing the QuickLook panel for the specified Dataservice - */ - public onQuickLook(svcName: string): void { - const selectedService = this.filteredDataservices.find((x) => x.getId() === svcName); - this.selectionService.setSelectedVirtualization(selectedService); - this.allSvcViewNames = this.selectionService.getSelectedVirtualizationViewNames(); - this.selectedSvcViewNames = []; - this.selectedSvcViewNames.push(this.allServiceViewNames[0]); - const viewName = this.selectedSvcViewNames[0]; - this.quickLookQueryText = "SELECT * FROM " + viewName + ";"; - - if (!this.resultsShowing) { - this.setQuickLookPanelOpenState(true); - } - this.setQuickLookResults(svcName); - - // - // Not available until opened - // - if (this.sqlControlComponent) { - this.sqlControlComponent.queryText = this.quickLookQueryText; - this.sqlControlComponent.submitCurrentQuery(); - } - } - - /* - * Handle showing the Odata QuickLook panel for the specified Dataservice - */ - public onOdataLook(svcName: string): void { - const selectedService = this.filteredDataservices.find((x) => x.getId() === svcName); - this.selectionService.setSelectedVirtualization(selectedService); - - if (!this.odataEditorShowing) { - this.setOdataEditorPanelOpenState(true); - } - - this.setOdataServiceName(svcName); - } - - /* - * Handle edit of the specified Dataservice description - */ - public onEditDescription(svcName: string): void { - const selectedService = this.filteredDataservices.find((x) => x.getId() === svcName); - this.selectionService.setSelectedVirtualization(selectedService); - const virtName = selectedService.getId(); - const descr = selectedService.getDescription(); - - // Open Dialog to set new description - const initialState = { - title: ViewEditorI18n.setDescriptionDialogTitle, - cancelButtonText: ViewEditorI18n.cancelButtonText, - okButtonText: ViewEditorI18n.okButtonText, - description: descr - }; - - // Show Dialog, act upon confirmation click - const modalRef = this.modalService.show(SetDescriptionDialogComponent, {initialState}); - modalRef.content.okAction.take(1).subscribe((newDesc) => { - if (newDesc !== descr) { - selectedService.setDescription(newDesc); - // update the repo virtualization description - const updVirt = this.dataserviceService.newDataserviceInstance(virtName, newDesc); - const self = this; - this.dataserviceService - .updateDataservice(updVirt) - .subscribe( - (wasSuccess) => { - this.logger.debug("[DataservicesComponent] Updated the Dataservice."); - }, - (error) => { - self.error(error, "Error updating the dataservice"); - } - ); - } - }); - } - - /** - * Set the layout to list type - */ - public setListLayout(): void { - this.closeLookPanels(); - this.appSettingsService.dataservicesPageLayout = LayoutType.LIST; - } - - /** - * Set the layout to card type - */ - public setCardLayout(): void { - this.closeLookPanels(); - this.appSettingsService.dataservicesPageLayout = LayoutType.CARD; - } - - /** - * Called to doDelete all selected APIs. - */ - public onDeleteDataservice(): void { - const selectedService = this.filteredDataservices.find((x) => x.getId() === this.dataserviceNameForDelete); - - // const itemsToDelete: Dataservice[] = ArrayUtils.intersect(this.selectedServices, this.filteredServices); - // const selectedService = itemsToDelete[0]; - - // Note: we can only doDelete selected items that we can see in the UI. - this.logger.debug("[DataservicesPageComponent] Deleting selected Dataservice."); - const self = this; - this.dataserviceService - .deleteDataservice(selectedService.getId()) - .subscribe( - (wasSuccess) => { - self.undeployVdb(selectedService.getServiceVdbName()); - self.removeDataserviceFromList(selectedService); - }, - (error) => { - self.error(error, "Error deleting the dataservice"); - } - ); - } - - /** - * Called to submit the quick look query - */ - public onSubmitQuickLookQuery(): void { - this.sqlControlComponent.submitCurrentQuery(); - } - - /** - * Filter functions - */ - public applyFilters(filters: Filter[]): void { - this.items = []; - if (filters && filters.length > 0) { - this.allDataservices.forEach((item) => { - if (this.matchesFilters(item, filters)) { - this.items.push(item); - } - }); - } else { - this.items = this.allDataservices; - } - this.filteredServices = this.items; - this.filterConfig.resultsCount = this.items.length; - } - - public filterChanged($event: FilterEvent): void { - this.filtersText = ""; - $event.appliedFilters.forEach((filter) => { - this.filtersText += filter.field.title + " : " + filter.value + "\n"; - }); - this.applyFilters($event.appliedFilters); - } - - public matchesFilter(item: any, filter: Filter): boolean { - let match = true; - if (filter.field.id === "name") { - match = item.getId().match(filter.value) !== null; - } else if (filter.field.id === "description") { - match = item.getDescription().match(filter.value) !== null; - } - return match; - } - - public matchesFilters(item: any, filters: Filter[]): boolean { - let matches = true; - filters.forEach((filter) => { - if (!this.matchesFilter(item, filter)) { - matches = false; - return matches; - } - }); - return matches; - } - - /** - * Sort functions - */ - public compare(item1: any, item2: any): number { - let compValue = 0; - if (this.currentSortField.id === "name") { - compValue = item1.getId().localeCompare(item2.getId()); - } else if (this.currentSortField.id === "description") { - compValue = item1.getDescription().localeCompare(item2.getDescription()); - } - - if (!this.isAscendingSort) { - compValue = compValue * -1; - } - return compValue; - } - - public sortChange($event: SortEvent): void { - this.currentSortField = $event.field; - this.isAscendingSort = $event.isAscending; - this.filteredServices.sort((item1: any, item2: any) => this.compare(item1, item2)); - } - - /* - * Undeploy the Vdb with the specified name - * @param {string} vdbName the name of the Vdb - */ - private undeployVdb(vdbName: string): void { - this.vdbService - .undeployVdb(vdbName) - .subscribe( - (wasSuccess) => { - // nothing to do - }, - (error) => { - // nothing to do - } - ); - } - - /* - * Remove the specified Dataservice from the list of dataservices - */ - private removeDataserviceFromList(dataservice: Dataservice): void { - this.allServices.splice(this.allServices.indexOf(dataservice), 1); - } - - /* - * Update the displayed dataservice deployment states using the provided states - */ - private onDataserviceDeploymentStateChanged(stateMap: Map): void { - // For displayed dataservices, update the Deployment State using supplied services - for ( const dService of this.filteredDataservices ) { - const serviceId = dService.getId(); - if (stateMap && stateMap.has(serviceId)) { - dService.setServiceDeploymentState(stateMap.get(serviceId)); - } - } - } - - /* - * Update the displayed dataservice publish states using the provided states - */ - private onDataservicePublishStateChanged(stateMap: Map): void { - // For displayed dataservices, update the Publish State using supplied services - for ( const dService of this.filteredDataservices ) { - const serviceId = dService.getId(); - if (stateMap && stateMap.has(serviceId)) { - dService.setServiceVirtualization(stateMap.get(serviceId)); - } - } - } - - /* - * Update quick look results using the supplied dataservice - * @param {string} svcName the dataservice name - */ - private setQuickLookResults(svcName): void { - this.quickLookSvcName = svcName; - } - - /* - * Update odata editor using the supplied dataservice - * @param {string} svcName the dataservice name - */ - private setOdataServiceName(svcName): void { - this.odataSvcName = svcName; - } -} - -/** - * Internal enums for Toast Notifications - */ -export namespace Toast { - export enum State { - InProgress, - Successful, - Failed - } - export enum Type { - Download, - Publish, - NewVirtualization - } -} diff --git a/ui/src/app/dataservices/dataservices.module.ts b/ui/src/app/dataservices/dataservices.module.ts deleted file mode 100644 index 875abbaf..00000000 --- a/ui/src/app/dataservices/dataservices.module.ts +++ /dev/null @@ -1,213 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommonModule } from "@angular/common"; -import { NgModule } from "@angular/core"; -import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { Http } from "@angular/http"; -import { RouterModule } from "@angular/router"; -import { AppSettingsService } from "@core/app-settings.service"; -import { CoreModule } from "@core/core.module"; -import { LoggerService } from "@core/logger.service"; -import { DataserviceCardComponent } from "@dataservices/dataservices-cards/dataservice-card/dataservice-card.component"; -import { SelectionService } from "@core/selection.service"; -import { DataservicesCardsComponent } from "@dataservices/dataservices-cards/dataservices-cards.component"; -import { DataservicesDetailsComponent } from "@dataservices/dataservices-list/dataservices-details.component"; -import { DataservicesListComponent } from "@dataservices/dataservices-list/dataservices-list.component"; -import { ViewsContentComponent } from "@dataservices/dataservices-list/views-content.component"; -import { DataservicesRoutingModule } from "@dataservices/dataservices-routing.module"; -import { DataservicesComponent } from "@dataservices/dataservices.component"; -import { SelectedNodeComponent } from "@dataservices/selected-node/selected-node.component"; -import { SelectedNodesListComponent } from "@dataservices/selected-nodes-list/selected-nodes-list.component"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { SqlControlComponent } from "@dataservices/sql-control/sql-control.component"; -import { TestDataserviceComponent } from "@dataservices/test-dataservice/test-dataservice.component"; -import { ViewCanvasComponent } from "@dataservices/virtualization/view-editor/view-canvas/view-canvas.component"; -import { ViewEditorHeaderComponent } from "@dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component"; -import { ViewEditorComponent } from "@dataservices/virtualization/view-editor/view-editor.component"; -import { ViewPreviewComponent } from "@dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component"; -import { EditorViewsComponent } from '@dataservices/virtualization/view-editor/editor-views/editor-views.component'; -import { MessageLogComponent } from '@dataservices/virtualization/view-editor/editor-views/message-log/message-log.component'; -import { CanvasService } from '@dataservices/virtualization/view-editor/view-canvas/canvas.service'; -import { GraphVisualComponent, NodeVisualComponent, LinkVisualComponent } from '@dataservices/virtualization/view-editor/view-canvas/visuals'; - -import { environment } from "@environments/environment"; -import { ConfirmDialogComponent } from "@shared/confirm-dialog/confirm-dialog.component"; -import { SharedModule } from "@shared/shared.module"; -import { TreeModule } from "angular-tree-component"; -import { CodemirrorModule } from "ng2-codemirror"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - ToolbarModule, - WizardModule } from "patternfly-ng"; -import { OdataControlComponent } from "./odata-control/odata-control.component"; -import { AccordionModule, BsDropdownModule, TabsModule, TooltipModule } from 'ngx-bootstrap'; -import { ConnectionTreeSelectorComponent } from './virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component'; -import { ConnectionTableDialogComponent } from './virtualization/view-editor/connection-table-dialog/connection-table-dialog.component'; -import { ProgressDialogComponent } from "@shared/progress-dialog/progress-dialog.component"; -import { ViewPropertyEditorsComponent } from './virtualization/view-editor/view-property-editors/view-property-editors.component'; -import { AddCompositionWizardComponent } from './virtualization/view-editor/add-composition-wizard/add-composition-wizard.component'; -import { CreateViewDialogComponent } from './virtualization/view-editor/create-view-dialog/create-view-dialog.component'; -import { CreateViewsDialogComponent } from './create-views-dialog/create-views-dialog.component'; -import { SetDescriptionDialogComponent } from "@dataservices/set-description-dialog/set-description-dialog.component"; -import { PropertyEditorComponent } from './virtualization/view-editor/view-property-editors/property-editor/property-editor.component'; -import { ProjectedColumnsEditorComponent } from './virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component'; -import { ViewsListComponent} from './virtualization/view-editor/views-list/views-list.component'; - -@NgModule({ - imports: [ - DataservicesRoutingModule, - CommonModule, - CoreModule, - SharedModule, - FormsModule, - ReactiveFormsModule, - RouterModule, - CodemirrorModule, - TreeModule, - BsDropdownModule.forRoot(), - AccordionModule.forRoot(), - TooltipModule.forRoot(), - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - ToolbarModule, - WizardModule, - TabsModule.forRoot() - ], - declarations: [ - DataservicesDetailsComponent, - ViewsContentComponent, - DataservicesCardsComponent, - DataservicesComponent, - DataservicesListComponent, - TestDataserviceComponent, - SqlControlComponent, - SelectedNodeComponent, - OdataControlComponent, - DataserviceCardComponent, - SelectedNodesListComponent, - ViewEditorComponent, - ViewPreviewComponent, - ViewEditorHeaderComponent, - ViewCanvasComponent, - MessageLogComponent, - EditorViewsComponent, - ConnectionTreeSelectorComponent, - ConnectionTableDialogComponent, - ViewPropertyEditorsComponent, - GraphVisualComponent, - NodeVisualComponent, - LinkVisualComponent, - AddCompositionWizardComponent, - CreateViewDialogComponent, - CreateViewsDialogComponent, - SetDescriptionDialogComponent, - PropertyEditorComponent, - ProjectedColumnsEditorComponent, - ViewsListComponent - ], - providers: [ - { - provide: DataserviceService, - useFactory: dataserviceServiceFactory, - deps: [ Http, VdbService, AppSettingsService, NotifierService, LoggerService ], - multi: false - }, - { - provide: VdbService, - useFactory: vdbServiceFactory, - deps: [ Http, AppSettingsService, NotifierService, LoggerService ], - multi: false - }, - LoggerService, - NotifierService, - SelectionService, - CanvasService - ], - exports: [ - ], - entryComponents: [AddCompositionWizardComponent, ConfirmDialogComponent, ConnectionTableDialogComponent, - CreateViewDialogComponent, CreateViewsDialogComponent, ProgressDialogComponent, SetDescriptionDialogComponent] -}) -export class DataservicesModule { } - -/** - * A factory that produces the appropriate instance of the service based on current environment settings. - * - * @param {Http} http the HTTP service - * @param {VdbService} vdbService the VDB service - * @param {AppSettingsService} appSettings the app settings service - * @param {NotifierService} notifierService the notifier service - * @param {LoggerService} logger the logger - * @returns {DataserviceService} the requested service - */ -export function dataserviceServiceFactory( http: Http, - vdbService: VdbService, - appSettings: AppSettingsService, - notifierService: NotifierService, - logger: LoggerService ): DataserviceService { - return environment.production || !environment.uiDevMode ? new DataserviceService( http, - vdbService, - appSettings, - notifierService, - logger ) - : new MockDataserviceService( http, - vdbService, - appSettings, - notifierService, - logger ); -} - -/** - * A factory that produces the appropriate instance of the service based on current environment settings. - * - * @param {Http} http the HTTP service - * @param {AppSettingsService} appSettings the app settings service - * @param {NotifierService} notifierService the notifier service - * @param {LoggerService} logger the logger - * @returns {VdbService} the requested service - */ -export function vdbServiceFactory( http: Http, - appSettings: AppSettingsService, - notifierService: NotifierService, - logger: LoggerService ): VdbService { - return environment.production || !environment.uiDevMode ? new VdbService( http, - appSettings, - notifierService, - logger ) - : new MockVdbService( http, - appSettings, - notifierService, - logger ); -} diff --git a/ui/src/app/dataservices/odata-control/odata-column.model.ts b/ui/src/app/dataservices/odata-control/odata-column.model.ts deleted file mode 100644 index 8d4e0af4..00000000 --- a/ui/src/app/dataservices/odata-control/odata-column.model.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class OdataColumn { - - private _name: string; - - private _type: string; - - private _sort: string; - - /** - * @returns name - */ - public get name(): string { - return this._name; - } - - /** - * Sets the name - */ - public set name(name: string) { - this._name = name; - } - - /** - * @returns type - */ - public get type(): string { - return this._type; - } - - /** - * Sets the type - */ - public set type(type: string) { - this._type = type; - } - - /** - * @returns sort - */ - public get sort(): string { - return this._sort; - } - - /** - * Sets the sort type - */ - public set sort(sort: string) { - this._sort = sort; - } -} diff --git a/ui/src/app/dataservices/odata-control/odata-conditions.model.ts b/ui/src/app/dataservices/odata-control/odata-conditions.model.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/dataservices/odata-control/odata-constants.ts b/ui/src/app/dataservices/odata-control/odata-constants.ts deleted file mode 100644 index db68fba7..00000000 --- a/ui/src/app/dataservices/odata-control/odata-constants.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* tslint:disable:max-line-length */ - -/* - * TODO - * This file should be ported to a proper i18n translation module - */ - -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class OdataConstants { - - public readonly UrlNotAvailable = 'URL Not Available'; - - public readonly AscendingChoice = "Asc"; - public readonly columnPlaceholder = "column"; - public readonly Columns = "Columns"; - public readonly conditionPlaceholder = "condition"; - public readonly dataServiceDeploymentFailedMessage = "The Data Service failed to activate. Please correct the problem and retry"; - public readonly deployingDataService = "Deploying data service"; - public readonly DescendingChoice = "Desc"; - public readonly endpointNotAvailableMsg = "The endpoint is not available"; - public readonly enterQueryMsg = "Enter an SQL query to test the Data Service"; - public readonly failedDeploymentMsg = "The Data Service could not be deployed:"; - public readonly NoSortChoice = "No sort"; - public readonly OData = "OData"; - public readonly ODataEndpoint = "OData Endpoint: "; - public readonly resultLimitPlaceholder = "Select result limit..."; - public readonly resultsTabular = "Tabular"; - public readonly resultsRaw = "Raw"; - public readonly runningOdataMetadataFetch = "Fetching OData metadata ..."; - public readonly runningOdataQuery = "Running OData query..."; - public readonly runQueryAction = "Submit"; - public readonly Select = "Select"; - - public readonly selectResultLimitMsg = "Select the number of results to be initially returned"; - public readonly selectViewMsg = "Select the view to be queried"; - public readonly selectViewPlaceholder = "Select a view in the list..."; - public readonly SQL = "SQL"; - public readonly testingJdbcConnection = "Testing JDBC connection"; - public readonly urlPath = "Test URL"; - public readonly valuePlaceholder = "value"; - public readonly Where = "Where"; - public readonly OrderBy = "Order By"; - public readonly ResultFormat = "Format"; - - public readonly noResultsColumnName = "Err: No Data!"; - public readonly noResultsMsg = "No data was returned from the query"; - public readonly resultCountMsg = "The total number of results returned by the query is "; - public readonly searchErrorColumnName = "Err: Failed!"; - public readonly searchErrorConsoleMsg = "Error: Failed to get value at link: "; - public readonly searchErrorMsg = "Error: failed to get any results: "; - public readonly whereErrorMsg = "The chosen column has a type which cannot be used in a where condition"; - public readonly metadataFetchFailure = "Failed to get the odata metadata for the published artifact."; - public readonly metadataFetchFailureNoOdataRoot = "No route url could be detected. Please check your Openshift installation."; - public readonly metadataFetchFailureNoViewModel = "No view model is available within the selected dataservice."; - public readonly metadataFetchFailureUrl = "Try to navigate to the following url to check for a problem:"; - - public readonly help_endpointSubmit = "This URL is formed using the OData specification. It can be copied into a new browser window to return the results in xml format or append ?format=json to the URL for JSON. Click the Submit button to display the results in a formatted table."; - public readonly help_select = "Choose the view from which results should be sought. Select a limit to curtail the number of results returned "; - public readonly help_columns = "Select the columns to be included in the results."; - public readonly help_where = "Create where clauses for filtering the results based on the values in each tuple. Use the + button to add new where clauses (clauses are and-ed together) and remove them with the - buttons."; - public readonly help_orderBy = "Sort the results by column in ascending or descending order."; - public readonly help_format = "Choose the format of the query results."; - public readonly help_resultsTable = "Use the column headers to sort the results or filter them by entering values. Results are paginated in blocks of 25 and can be scrolled through with the controls at the foot of the table."; - public readonly help_resultsRaw = "The raw data as returned from the odata teiid service in json format."; - public readonly help_sqlSearch = "Use the Teiid dialect of SQL to construct a query that interrogates the data service for data results. Use the record limit to limit the number of results returned. Set the starting record index to fetch a subset of results starting at the given row index."; -} diff --git a/ui/src/app/dataservices/odata-control/odata-control.component.css b/ui/src/app/dataservices/odata-control/odata-control.component.css deleted file mode 100644 index a970f5a4..00000000 --- a/ui/src/app/dataservices/odata-control/odata-control.component.css +++ /dev/null @@ -1,258 +0,0 @@ -.help-label { - color: #0088ce; - padding-left: 0.5em; - padding-right: 0.5em; -} - -.custom-tooltip { - width: 20em; -} - -.custom-tooltip .tooltip-inner { - background: transparent linear-gradient(to top, #ececec 50%, #d1d1d1 100%) repeat scroll 0% 0%; - color: black; - font-style: oblique; -} - -.custom-tooltip .tooltip-arrow { - background-color: #ececec; -} - -.odata-editor { - font-weight: bold; - margin-top: 1em; -} - -#odata-endpoint-url { - font-weight: bold; - padding-right: 0.25em; - margin-bottom: 1em; -} - -#odata-endpoint-url label { - font-weight: bold; - padding-left: 0; - padding-right: 1em; - width: auto; -} - -#odata-endpoint-url input { - background: #ededed; - background: -webkit-linear-gradient(white, #ededed); - background: -o-linear-gradient(white, #ededed); - background: -moz-linear-gradient(white, #ededed); - background: linear-gradient(white, #ededed); -} - -#odata-query-button { - float: left; - width: 10%; - margin-left: 5em; -} - -#odata-control-panel { - clear: both; -} - -.odata-controls { - max-height: 27em; - border-style: solid; - border-width: 1px; - border-color: rgb(187,187,187); - overflow-y: auto; -} - -/* - * Add icon for accordion group being open - */ -.odata-controls .panel-title .accordion-toggle[aria-expanded="true"]::after { - float: right; - content: "\f106"; - color: #424242; - font-family: "FontAwesome"; -} - -/* - * Add icon for accordion group being closed - */ -.odata-controls .panel-title .accordion-toggle[aria-expanded="false"]::after { - float: right; - content: "\f107"; - color: #424242; - font-family: "FontAwesome"; -} - -.odata-control-panel-title { - font-weight: bold; - display: inline-block; - margin-right: 0.5em; -} - -.odata-control-panel-title-help { - margin-right: 1em; - margin-top: 0.15em; - font-size: 12px; -} - -.odata-controls .panel-title { - font-weight: bold; - height: 1em; -} - -.odata-exp-select-group-entity { - float: left; - width: 40%; - margin-right: 5em; -} - -.odata-exp-select-group-limit { - float: left; - width: 40%; -} - -.odata-exp-column-group { - float: left; - margin-bottom: 0; - padding-left: 0; -} - -.odata-exp-column-group-row { - margin-top: 0; - margin-bottom: 0; - margin-right: 5em; - margin-left: 0.25em; -} - -.odata-exp-select-group, -.odata-exp-column-group-row label, -.odata-exp-where-group-row, -.odata-exp-order-by-group-row, -.odata-exp-order-by-group-row label, -.odata-exp-order-by-group-row-label label { - font-weight: bold; -} - -.odata-format-row label { - margin-right: 5em; - font-weight: bold; -} - -.odata-exp-where-group-row { - padding-top: 0.25em; - padding-left: 0.25em !important; - padding-right: 0.25em !important; -} - -.odata-exp-where-group .ui-select-toggle, -.odata-exp-select-group .ui-select-toggle { - background-color: white; - background-image: -webkit-linear-gradient(top, #ffffff 0%, #ffffff 100%); - background-image: -o-linear-gradient(top, #ffffff 0%, #ffffff 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #ffffff 100%); -} - -#odata-exp-where-group-buttons button { - padding-left: 5%; - padding-right: 1%; -} - -.odata-form-text-control { - color: #000000; - background-color: #FFFFFB; - font-weight: bold; - width: 100%; - border-top-color: rgb(187, 187, 187); - border-top-style: solid; - border-top-width: 1px; - border-left-color: rgb(187, 187, 187); - border-left-style: solid; - border-left-width: 1px; - border-right-color: rgb(252, 255, 255); - border-right-style: outset; - border-right-width: 2px; - border-bottom-color: rgb(252, 255, 255); - border-bottom-style: outset; - border-bottom-width: 2px; - padding-left: 0.5em; - margin-bottom: 0.5em; -} - -.odata-exp-order-by-group-row-label { - padding-left: 0; - width: 30%; - word-wrap: break-word; - margin-bottom: 0.5em; -} - -.odata-form-where-add-btn { - background-color: transparent; - border: none; - color: black; -} - -.odata-form-where-remove-btn { - background-color: transparent; - border: none; - color: red; -} - -.odata-exp-where-error-msg { - color: red; - font-style: italic; - font-weight: bold; -} - -#odata-results-type { - float: right; - margin-bottom: 0.5em; -} - -#odata-results { - clear: both; - padding-left: 0; - padding-right: 0; - padding-bottom: 2em; - position: relative; - border-color: rgb(187,187,187); - border-style: solid; - border-width: 1px; -} - -/* - * Limit CodeMirror class changes to - * the odata-results. - */ -/*#odata-results .CodeMirror { - height: 25em; -}*/ - -#odata-search-progress-spinner { - font-style: italic; - text-align: center; - margin-top: 10em; -} - -.odata-results-msg-error { - color: red; - font-style: italic; - font-weight: bold; - padding-left: 7em; -} - -.odata-results-msg-info { - color: green; - font-style: italic; - font-weight: bold; - padding-left: 7em; -} - -#odata-metadata-fetch-failure { - color: red; - font-style: italic; - font-weight: bold; - padding-left: 7em; -} - -#odata-metadata-fetch-failure h3 { - line-height: 150%; -} diff --git a/ui/src/app/dataservices/odata-control/odata-control.component.html b/ui/src/app/dataservices/odata-control/odata-control.component.html deleted file mode 100644 index 270f06cd..00000000 --- a/ui/src/app/dataservices/odata-control/odata-control.component.html +++ /dev/null @@ -1,220 +0,0 @@ -
    - -
    -
    - {{i18n.runningOdataMetadataFetch}} -
    - -
    -
    - - - -
    - -
    - -
    -
    - -
    - - - - - - - -
    -
    {{i18n.Select}}
    -
    - -
    -
    -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - - - - - - -
    -
    {{i18n.Columns}}
    -
    - -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - - - - - -
    -
    {{i18n.Where}}
    -
    - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    - -
    - - -
    - -
    - {{where.error}} -
    -
    -
    -
    - - - - - - -
    -
    {{i18n.OrderBy}}
    -
    - -
    -
    -
    -
    -
    -
    - -
    - - - -
    -
    -
    -
    - - - - - - -
    -
    {{i18n.ResultFormat}}
    -
    - -
    -
    -
    -
    - - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -

    {{searchMsg}}

    -
    - - -
    -
    - {{i18n.runningOdataQuery}} -
    - -
    -

    -
    -
    diff --git a/ui/src/app/dataservices/odata-control/odata-control.component.ts b/ui/src/app/dataservices/odata-control/odata-control.component.ts deleted file mode 100644 index c9e8d001..00000000 --- a/ui/src/app/dataservices/odata-control/odata-control.component.ts +++ /dev/null @@ -1,463 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Input, ViewChild, ViewEncapsulation } from "@angular/core"; -import { Component, OnChanges, SimpleChanges } from "@angular/core"; -import { LoggerService } from "@core/logger.service"; -import * as _ from "lodash"; -import "codemirror/mode/javascript/javascript.js"; -import "codemirror/mode/xml/xml.js"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { OdataConstants } from "@dataservices/odata-control/odata-constants"; -import { Odata } from "@dataservices/odata-control/odata.model"; -import { OdataEntity } from "@dataservices/odata-control/odata-entity.model"; -import { OdataColumn } from "@dataservices/odata-control/odata-column.model"; -import { OdataWhere } from "@dataservices/odata-control/odata-where.model"; -import { SelectionService } from "@core/selection.service"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-odata-control", - templateUrl: "./odata-control.component.html", - styleUrls: ["./odata-control.component.css"] -}) -export class OdataControlComponent implements OnChanges { - - @Input() private dataserviceName: string; - - @ViewChild('odataResultsEditor') private resultsEditor: any; - - private dataserviceService: DataserviceService; - private dataservice: Dataservice; - private logger: LoggerService; - private selectionService: SelectionService; - public i18n: OdataConstants = new OdataConstants(); - - public searchMsg: string; - public searchMsgClasses: string[]; - public searchInProgress: boolean; - - public metadataFetchInProgress: boolean; - - public odata: Odata; - - private jsonFormat = { - mode: { - name: "javascript", - json: true, - statementIndent: 2 - } - }; - - private xmlFormat = { - mode: { - name: "xml", - htmlMode: "false", - } - }; - - public resultsConfig = { - mode: {}, - lineNumbers: true, - lineWrapping: true, - readOnly: true, - placeholder: "No results", - styleActiveLine: true, - tabSize: 2, - showCursorWhenSelecting: true, - theme: "neat" - }; - - // - // Format of the results - // - public resultsType = "JSON"; - - // - // Results to show from the odata query - // - public results: string = null; - - constructor( dataserviceService: DataserviceService, logger: LoggerService, - selectionService: SelectionService ) { - this.dataserviceService = dataserviceService; - this.logger = logger; - this.selectionService = selectionService; - } - - public get rootUrl(): string { - return this.dataservice.getOdataRootUrl() + '/' + this.dataservice.getServiceViewModel(); - } - - public get metadataUrl(): string { - return this.rootUrl + '/$metadata'; - } - - public ngOnChanges(changes: SimpleChanges): void { - this.dataservice = this.selectionService.getSelectedVirtualization(); - - this.metadataFetchInProgress = false; - - this.searchMsg = null; - this.searchMsgClasses = []; - this.searchInProgress = false; - this.odata = new Odata(); - - this.results = null; - - const url = this.metadataUrl; - - this.metadataFetchInProgress = true; - this.dataserviceService.odataGet(url) - .subscribe( - (response) => { - if (! _.isEmpty(response) && this.dataserviceService.isXML(response.value)) { - const xmlObject = this.dataserviceService.tryXMLParse(response.value); - this.odata.metadata = xmlObject; - this.odata.metadataFailure = false; - } else { - this.odata.metadata = ''; - this.odata.metadataFailure = true; - } - this.metadataFetchInProgress = false; - }, - (error) => { - this.odata.metadataFailure = true; - this.metadataFetchInProgress = false; - console.error('Failed to get odata metadata from\n' + url + "\n" + error); - } - ); - } - - /** - * The odata endpoint url constructed from the parameters - */ - public get endPointUrl(): string { - if (this.odata.metadataFailure) - return this.i18n.UrlNotAvailable; - - if (_.isEmpty(this.odata.metadata)) - return this.i18n.UrlNotAvailable; - - const baseUrl = this.rootUrl; - - if (_.isEmpty(baseUrl)) - return this.i18n.UrlNotAvailable; - - const service = this.odata.entity; - if (_.isEmpty(service) || _.isEmpty(service.name)) - return this.i18n.UrlNotAvailable; - - let odataUrl = baseUrl + '/' + service.name; - - const limit = this.odata.convertLimit(); - if (! _.isEmpty(limit)) - odataUrl = odataUrl + limit; - - const where = this.odata.convertWhere(); - if (! _.isEmpty(where)) - odataUrl = odataUrl + where; - - const columns = this.odata.convertColumns(); - if (! _.isEmpty(columns)) - odataUrl = odataUrl + columns; - - const orderBy = this.odata.convertOrderBy(); - if (! _.isEmpty(orderBy)) - odataUrl = odataUrl + orderBy; - - // - // Append the result format but only if the - // query has not specified count (which is incompatible) - // - if (! _.isEmpty(this.resultsType) && this.odata.limit !== Odata.COUNT_ONLY) { - odataUrl = odataUrl + "$format=" + this.resultsType.toLowerCase(); - } - - if (odataUrl.endsWith('&') || odataUrl.endsWith('?')) - odataUrl = odataUrl.substring(0, odataUrl.length - 1); - - return odataUrl; - } - - /** - * @returns true if the odata control widgets - * should be displayed. - */ - public get hasOdataAttributes(): boolean { - return ! _.isEmpty(this.odata.metadata); - } - - public get metadataFailure(): boolean { - return this.odata.metadataFailure; - } - - public get metadataFailureMsg(): string { - const msg = this.i18n.metadataFetchFailure + '
    '; - if (_.isEmpty(this.dataservice.getOdataRootUrl())) - return msg + this.i18n.metadataFetchFailureNoOdataRoot; - - if (_.isEmpty(this.dataservice.getServiceViewModel())) - return msg + this.i18n.metadataFetchFailureNoViewModel; - - return msg + this.i18n.metadataFetchFailureUrl + '
    ' + - '' + this.metadataUrl + ''; - } - - /** - * Can the query be enacted - * @returns {boolean} true if good to go, false otherwise - */ - public get canQuery(): boolean { - return !_.isEmpty(this.odata.metadata) && - !_.isEmpty(this.odata.entity) && - this.endPointUrl !== this.i18n.UrlNotAvailable; - - } - - /** - * @returns {OdataEntity[]} the available entities - */ - public get entities(): OdataEntity[] { - if (_.isEmpty(this.odata.entities)) - return []; - - return this.odata.entities; - } - - /** - * @returns {OdataEntity} the selected entitie - */ - public get entity(): OdataEntity { - if (_.isEmpty(this.odata.entity)) - return null; - - return this.odata.entity; - } - - /** - * Set the selected entity - */ - public set entity(entity: OdataEntity) { - this.odata.entity = entity; - } - - /** - * @returns {string[]} the available limit options - */ - public get limits(): string[] { - return Odata.LIMITS; - } - - /** - * @returns {string} the selected limit - */ - public get limit(): string { - if (_.isEmpty(this.odata.limit)) - return ''; - - return this.odata.limit; - } - - /** - * Set the selected limit - */ - public set limit(limit: string) { - this.odata.limit = limit; - } - - /** - * Return the available columns for the selected entity - */ - public get columns(): OdataColumn[] { - if (_.isEmpty(this.odata.entity) || _.isEmpty(this.odata.entity.columns)) { - return []; - } - - return this.odata.entity.columns; - } - - /** - * Return the selected columns - */ - public get selectedColumns(): OdataColumn[] { - return this.odata.columns; - } - - /** - * Used by column checkboxes to determine if a checkbox - * should be checked. - */ - public isColumnSelected(columnName: string): boolean { - return this.odata.hasColumn(columnName); - } - - /** - * Updates the column selection when its checkbox has been (un)checked - */ - public updateColumnSelection(checked: boolean, column: OdataColumn): void { - if (checked) { - this.odata.addColumn(column); - } - else { - this.odata.removeColumn(column); - } - } - - /** - * Return the available wheres - */ - public get wheres(): OdataWhere[] { - return this.odata.wheres; - } - - /** - * On changing the where column selection: - * * Remove the where condition since it may be invalid - * * Check the column is queryable and if not display an error - */ - public onWhereColumnSelected(where: OdataWhere): void { - if (! _.isEmpty(where) && ! _.isEmpty(where.condition)) - delete where.condition; - - if (! _.isEmpty(where.column)) { - const index = _.indexOf(Odata.QUERYABLE_TYPES, where.column.type); - if (index < 0) - where.error = this.i18n.whereErrorMsg; - else - where.error = null; - } - } - - /** - * Event handler for adding a where condition - */ - public onAddWhereClicked(): void { - try { - const newWhere: OdataWhere = new OdataWhere(); - this.odata.addWhere(newWhere); - } catch (error) { - // nothing to do - } - } - - /** - * Event handler for removing a where condition - */ - public onRemoveWhereClicked(where): void { - try { - if (_.isEmpty(where)) - return; - - this.odata.removeWhere(where); - - if (this.odata.wheres.length === 0) { - // - // Always keep 1 empty clause so preserve buttons - // - const newWhere: OdataWhere = new OdataWhere(); - this.odata.addWhere(newWhere); - } - - } catch (error) { - // nothing to do - } - } - - /** - * Provides the choices to select for a where clause - * depending on the type of column already selected - */ - public whereConditions(where: OdataWhere): Array { - if (_.isEmpty(where) || _.isEmpty(where.column)) - return []; - - const index = _.indexOf(Odata.QUERYABLE_TYPES, where.column.type); - if (index < 0) - return []; - else if (index === 0) // Boolean - return this.odata.booleanConditions(); - else if (index === 1) // String - return this.odata.stringConditions(); - else if (index <= 11) // number - return this.odata.intConditions(); - else if (index > 11) // DateTime - return this.odata.dateConditions(); - else - return []; - } - - public get showResults(): boolean { - return ! _.isEmpty(this.results); - } - - /** - * Submit the query for evaluation - */ - public submitQuery(): void { - this.searchMsg = null; - this.searchMsgClasses = []; - this.searchInProgress = true; - - this.dataserviceService.odataGet(this.endPointUrl) - .subscribe( - (response) => { - this.results = null; - - // Remove the search progress spinner - this.searchInProgress = false; - - if (response.error) { - this.searchMsgClasses = ['odata-results-msg-error']; - this.searchMsg = this.i18n.searchErrorMsg + response.error; - return; - } - - if (response.count) { - // - // Handles the count function by returning a - // - this.searchMsgClasses = ['odata-results-msg-info']; - this.searchMsg = this.i18n.resultCountMsg + response.count; - return; - } - - if (_.isEmpty(response.value)) { - this.searchMsgClasses = ['odata-results-msg-info']; - this.searchMsg = this.i18n.noResultsMsg; - return; - } - - const instance = this.resultsEditor.instance; - if (this.resultsType === "XML") { - instance.setOption('mode', this.xmlFormat.mode); - } else { - instance.setOption('mode', this.jsonFormat.mode); - } - - this.results = response.value; - }, - (error) => { - this.results = null; - this.searchInProgress = false; - this.searchMsgClasses = ['odata-results-msg-error']; - this.searchMsg = 'Failed to get odata results ' + error; - } - ); - } -} diff --git a/ui/src/app/dataservices/odata-control/odata-entity.model.ts b/ui/src/app/dataservices/odata-control/odata-entity.model.ts deleted file mode 100644 index 7ea96bb9..00000000 --- a/ui/src/app/dataservices/odata-control/odata-entity.model.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { OdataColumn } from "@dataservices/odata-control/odata-column.model"; - -export class OdataEntity { - - private _name: string; - - /* The available columns for the entity */ - private _columns: Array = []; - - /** - * @returns name - */ - public get name(): string { - return this._name; - } - - /** - * Sets the name - */ - public set name(name: string) { - this._name = name; - } - - /** - * @returns columns - */ - public get columns(): OdataColumn[] { - return this._columns; - } - - /** - * Sets the columns - */ - public set columns(columns: OdataColumn[]) { - this._columns = columns; - } -} diff --git a/ui/src/app/dataservices/odata-control/odata-where.model.ts b/ui/src/app/dataservices/odata-control/odata-where.model.ts deleted file mode 100644 index 6a652f73..00000000 --- a/ui/src/app/dataservices/odata-control/odata-where.model.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { OdataColumn } from "@dataservices/odata-control/odata-column.model"; - - /* - *Will contain: - * column - * condition ( one of odata.conditions ) - * value - */ -export class OdataWhere { - - private _column: OdataColumn; - private _condition = ''; - private _value = ''; - - public error: string = null; - - /** - * @returns column - */ - public get column(): OdataColumn { - return this._column; - } - - public set column(column: OdataColumn) { - this._column = column; - } - - /** - * @returns the condition - */ - public get condition(): string { - return this._condition; - } - - public set condition(condition: string) { - this._condition = condition; - } - - /** - * @returns value - */ - public get value(): string { - return this._value; - } - - public set value(value: string) { - this._value = value; - } - -} diff --git a/ui/src/app/dataservices/odata-control/odata.model.ts b/ui/src/app/dataservices/odata-control/odata.model.ts deleted file mode 100644 index 75515ac7..00000000 --- a/ui/src/app/dataservices/odata-control/odata.model.ts +++ /dev/null @@ -1,527 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as _ from "lodash"; -import { OdataEntity } from "@dataservices/odata-control/odata-entity.model"; -import { OdataColumn } from "@dataservices/odata-control/odata-column.model"; -import { OdataWhere } from "@dataservices/odata-control/odata-where.model"; - -export class Odata { - - public static readonly EQUALS = 'equals'; - public static readonly NOT_EQUALS = 'not equals'; - public static readonly GREATER_THAN = 'greater than'; - public static readonly GREATER_THAN_EQ_TO = 'greater than or equal to'; - public static readonly LESS_THAN = 'less than'; - public static readonly LESS_THAN_EQ_TO = 'less than or equal to'; - public static readonly IN = 'in'; - public static readonly EQUALS_CINS = 'equals (case insensitive)'; - public static readonly NOT_EQUALS_CINS = 'not equals (case insensitive)'; - public static readonly STARTS_WITH = 'starts with'; - public static readonly NO_STARTS_WITH = 'not starts with'; - public static readonly ENDS_WITH = 'ends with'; - public static readonly NO_ENDS_WITH = 'not ends with'; - public static readonly CONTAINS = 'contains'; - public static readonly LENGTH_EQ = 'length equals'; - public static readonly BEFORE_DATE = 'before date'; - public static readonly AFTER_DATE = 'after date'; - public static readonly BEFORE_EQ = 'before or equals'; - public static readonly AFTER_EQ = 'after or equals'; - - public static readonly NO_LIMIT = 'no limit'; - public static readonly COUNT_ONLY = 'count only'; - public static readonly TOP_1 = 'top 1'; - public static readonly TOP_10 = 'top 10'; - public static readonly TOP_50 = 'top 50'; - public static readonly TOP_100 = 'top 100'; - public static readonly TOP_1000 = 'top 1000'; - public static readonly TOP_10000 = 'top 10000'; - - public static readonly QUERYABLE_TYPES: Array = ['Boolean', 'String', 'Byte', 'Decimal', 'Double', 'Single', 'Float', 'Guid', - 'Int16', 'Int32', 'Int64', 'SByte', 'DateTime', 'Time', 'DateTimeOffset']; - - public static readonly LIMITS: Array = [ - Odata.NO_LIMIT, - Odata.COUNT_ONLY, - Odata.TOP_1, - Odata.TOP_10, - Odata.TOP_50, - Odata.TOP_100, - Odata.TOP_1000, - Odata.TOP_10000 - ]; - - private _metadata: any = null; - - private _metadataFailure = false; - - private _entities: Array = []; - - /* The entity for the select component */ - private _entity: OdataEntity = new OdataEntity(); - - /* Will contain the selected columns */ - private _columns: Array = []; - - /* Where clauses for query criteria */ - private _wheres: Array = []; - - /* The limit of the query results */ - private _limit: string = Odata.NO_LIMIT; - - constructor() { - const newWhere: OdataWhere = new OdataWhere(); - this.addWhere(newWhere); - } - - /** - * @returns collection of conditions for int types - */ - public intConditions(): string[] { - const conditions: Array = [ Odata.EQUALS, Odata.NOT_EQUALS, Odata.GREATER_THAN, - Odata.GREATER_THAN_EQ_TO, Odata.LESS_THAN, Odata.LESS_THAN_EQ_TO, - Odata.IN ]; - return conditions; - } - - /** - * @returns collection of conditions for string types - */ - public stringConditions(): string[] { - const conditions: Array = [ Odata.EQUALS, Odata.NOT_EQUALS, Odata.IN, Odata.EQUALS_CINS, Odata.NOT_EQUALS_CINS, - Odata.STARTS_WITH, Odata.NO_STARTS_WITH, Odata.ENDS_WITH, Odata.NO_ENDS_WITH, - Odata.CONTAINS, Odata.LENGTH_EQ ]; - return conditions; - } - - /** - * @returns collection of conditions for date types - */ - public dateConditions(): string[] { - const conditions: Array = [ Odata.EQUALS, Odata.BEFORE_DATE, Odata.AFTER_DATE, Odata.BEFORE_EQ, Odata.AFTER_EQ ]; - return conditions; - } - - /** - * @returns collection of conditions for boolean types - */ - public booleanConditions(): string[] { - const conditions: Array = [ Odata.EQUALS, Odata.NOT_EQUALS ]; - return conditions; - } - - /** - * @returns metadata - */ - public get metadata(): any { - return this._metadata; - } - - /** - * Extract the available columns from the entity - * located in the $metadata xml/json - */ - private extractColumns(entity: any): OdataColumn[] { - let odataColumns = []; - if (_.isEmpty(entity.Property)) - return odataColumns; - - const columns = entity.Property; - if (_.isArray(columns)) { - for (const column of columns) { - const odataColumn = new OdataColumn(); - odataColumn.name = column._Name; - odataColumn.type = column._Type.replace('Edm.', ''); - odataColumns.push(odataColumn); - } - } else if (_.isObject(columns)) { - const singleColumn = new OdataColumn(); - singleColumn.name = columns._Name; - singleColumn.type = columns._Type.replace('Edm.', ''); - odataColumns = [singleColumn]; - } - - return odataColumns; - } - - /** - * sets the metadata - */ - public set metadata(metadata: any) { - if (_.isEqual(this._metadata, metadata)) - return; - - this._metadata = metadata; - - // - // Reset the entity - // - this.entity = null; - this._entities = []; - - if (_.isEmpty(metadata) || _.isEmpty(metadata.Edmx) || - _.isEmpty(metadata.Edmx.DataServices) || _.isEmpty(metadata.Edmx.DataServices.Schema) || - _.isEmpty(metadata.Edmx.DataServices.Schema.EntityType)) { - return; - } - - const entityTypes = metadata.Edmx.DataServices.Schema.EntityType; - if (_.isArray(entityTypes)) { - for (const entityType of entityTypes) { - const entity = new OdataEntity(); - entity.name = entityType._Name; - entity.columns = this.extractColumns(entityType); - this._entities.push(entity); - } - } else if (_.isObject(entityTypes)) { - const singleEntity = new OdataEntity(); - singleEntity.name = entityTypes._Name; - singleEntity.columns = this.extractColumns(entityTypes); - this._entities = [singleEntity]; - } - - if (! _.isEmpty(this._entities)) { - this._entity = this._entities[0]; - } - } - - /** - * @returns metadata failure flag - */ - public get metadataFailure(): boolean { - return this._metadataFailure; - } - - /** - * sets the metadata failure flag - */ - public set metadataFailure(metadataFailure: boolean) { - this._metadataFailure = metadataFailure; - } - - /** - * @returns entity - */ - public get entity(): OdataEntity { - return this._entity; - } - - /** - * Sets the entity - */ - public set entity(entity: OdataEntity) { - this._entity = entity; - } - - /** - * @returns entities - */ - public get entities(): OdataEntity[] { - if (_.isEmpty(this._entities)) - return []; - - return this._entities; - } - - /** - * @returns limit - */ - public get limit(): string { - return this._limit; - } - - /** - * Sets the limit - */ - public set limit(limit: string) { - this._limit = limit; - } - - /** - * @returns the selected columns - */ - public get columns(): OdataColumn[] { - return this._columns; - } - - /** - * Is this column with name selected - */ - public hasColumn(columnName: string): boolean { - for (const column of this.columns) { - if (_.isEqual(columnName, column.name)) - return true; - } - - return false; - } - - /** - * Add a column - */ - public addColumn(column: OdataColumn): void { - if (this.hasColumn(column.name)) - return; // already selected - - this._columns.push(column); - } - - /** - * Remove a column - */ - public removeColumn(column: OdataColumn): void { - if (! this.hasColumn(column.name)) - return; // not present - - const index = this._columns.indexOf(column); - if (index > -1) { - this._columns.splice(index, 1); - } - } - - /** - * @returns available where clauses - */ - public get wheres(): OdataWhere[] { - if (_.isEmpty(this._wheres)) - return []; - - return this._wheres; - } - - /** - * @returns true if there are where clauses defined - */ - public get hasWhere(): boolean { - return this._wheres.length > 0; - } - - /** - * Add a where - */ - public addWhere(where: OdataWhere): void { - this._wheres.push(where); - } - - /** - * Remove a where - */ - public removeWhere(where: OdataWhere): void { - const index = this._wheres.indexOf(where); - if (index > -1) { - this._wheres.splice(index, 1); - } - } - - /** - * Converts the limit value into the odata limit clause - */ - public convertLimit(): string { - if (_.isEmpty(this.limit)) - return ''; - - if (Odata.LIMITS[0] === this.limit) - return '?'; // no limit - - if (Odata.LIMITS[1] === this.limit) - return '/$count?'; // count - - return this.limit.replace('top ', '?$top=') + '&'; - } - - /** - * Converts the where clauses into odata where clauses - */ - public convertWhere(): string { - if (this._wheres.length === 0) - return ''; - - const SPACE = ' '; - const OBKT = '('; - const CBKT = ')'; - const QUOTE = "'"; - const COMMA = ','; - - const prefix = '$filter='; - let clauses = ''; - - for (let i = 0; i < this._wheres.length; ++i) { - const where = this._wheres[i]; - const column: OdataColumn = where.column; - const condition: string = where.condition; - const value: string = where.value; - - if (! column || ! value) - continue; // ignore incomplete where clauses - - if (clauses.length > 0 && i > 0) - clauses = clauses + SPACE + 'and' + SPACE; - - let clause = ''; - if (condition === Odata.EQUALS) - clause = column.name + SPACE + 'eq' + SPACE + QUOTE + value + QUOTE; - else if (condition === Odata.NOT_EQUALS) - clause = column.name + SPACE + 'ne' + SPACE + QUOTE + value + QUOTE; - else if (condition === Odata.GREATER_THAN || condition === Odata.AFTER_DATE) - clause = column.name + SPACE + 'gt' + SPACE + QUOTE + value + QUOTE; - else if (condition === Odata.GREATER_THAN_EQ_TO || condition === Odata.BEFORE_EQ) - clause = column.name + SPACE + 'ge' + SPACE + QUOTE + value + QUOTE; - else if (condition === Odata.LESS_THAN || condition === Odata.BEFORE_DATE) - clause = column.name + SPACE + 'lt' + SPACE + QUOTE + value + QUOTE; - else if (condition === Odata.LESS_THAN_EQ_TO || condition === Odata.AFTER_EQ) - clause = column.name + SPACE + 'le' + SPACE + QUOTE + value + QUOTE; - else if (condition === Odata.EQUALS_CINS) { - // - // tolower(Description) eq tolower('value') - // - clause = 'tolower' + OBKT + column + CBKT + - SPACE + 'eq' + SPACE + - 'tolower' + OBKT + QUOTE + value + QUOTE + CBKT; - } - else if (condition === Odata.NOT_EQUALS_CINS) { - // - // tolower(Description) ne tolower('value') - // - clause = 'tolower' + OBKT + column + CBKT + SPACE + 'ne' + SPACE + - 'tolower' + OBKT + QUOTE + value + QUOTE + CBKT; - } - else if (condition === Odata.STARTS_WITH) { - // - // startswith(Description, 'value') - // - clause = 'startswith' + OBKT + column.name + COMMA + QUOTE + value + QUOTE + CBKT; - } - else if (condition === Odata.NO_STARTS_WITH) { - // - // not startswith(Description, 'value') - // - clause = 'not startswith' + OBKT + column.name + COMMA + QUOTE + value + QUOTE + CBKT; - } - else if (condition === Odata.ENDS_WITH) { - // - // endswith(Description, 'value') - // - clause = 'endswith' + OBKT + column.name + COMMA + QUOTE + value + QUOTE + CBKT; - } - else if (condition === Odata.NO_ENDS_WITH) { - // - // not endswith(Description, 'value') - // - clause = 'not endswith' + OBKT + column.name + COMMA + QUOTE + value + QUOTE + CBKT; - } - else if (condition === Odata.CONTAINS) { - // - // contains(Description, 'value') - // - clause = 'contains' + OBKT + column.name + COMMA + QUOTE + value + QUOTE + CBKT; - } - else if (condition === Odata.LENGTH_EQ) { - // - // length(Description) eq 5 - // - clause = 'length' + OBKT + column.name + CBKT + SPACE + 'eq' + SPACE + value; - } - else if (condition === Odata.IN) { - // - // in separated by ;, eg. 1;2 - // becomes - // (ID eq 1 or ID eq 2) - // - clause = OBKT; - const values = value.split(';'); - for (let j = 0; j < values.length; ++j) { - if (j > 0) - clause = clause + SPACE + 'or' + SPACE; - - clause = clause + column.name + SPACE + 'eq' + SPACE + values[j]; - } - clause = clause + CBKT; - } - - clauses = clauses + clause; - } - - if (clauses.length > 0) - return prefix + clauses + '&'; - - return clauses; - } - - /** - * Converts the column array into odata select clause - */ - public convertColumns(): string { - if (this._columns.length === 0) - return ''; - - // - // Column selection not applicable with count only - // - if (this.limit === Odata.COUNT_ONLY) - return ''; - - let value = '$select='; - for (let i = 0; i < this._columns.length; ++i) { - value = value + this._columns[i].name; - - if ((i + 1) < this._columns.length) - value = value + ','; - } - - return value + '&'; - } - - /** - * Converts the order by values into odata orderby clause - */ - public convertOrderBy(): string { - if (this._entity.columns.length === 0) - return ''; - - // - // orderby not applicable with count only - // - if (this.limit === Odata.COUNT_ONLY) - return ''; - - const orderbyPrefix = '$orderby='; - let value = orderbyPrefix; - for (let i = 0; i < this._entity.columns.length; ++i) { - const column: OdataColumn = this._entity.columns[i]; - if (!column.sort) - continue; - - if ('asc' === column.sort) - value = value + column.name; - else if ('desc' === column.sort) - value = value + column.name + ' desc'; - - if ((i + 1) < this._entity.columns.length) - value = value + ','; - } - - // Remove trailing comma if applicable - if (value.endsWith(',')) - value = value.substring(0, value.length - 1); - - if (value === orderbyPrefix) - return ''; - - return value + '&'; - } - -} diff --git a/ui/src/app/dataservices/selected-node/selected-node.component.css b/ui/src/app/dataservices/selected-node/selected-node.component.css deleted file mode 100644 index 5168756c..00000000 --- a/ui/src/app/dataservices/selected-node/selected-node.component.css +++ /dev/null @@ -1,20 +0,0 @@ -.selected-table-card .card-pf { - background-color: var(--card-hover-color); -} - -.selected-table-column-selection { - background-color: var(--card-body-color); - color: white; - margin: 4px 0; - text-align: center; -} - -.selected-table-columns { - height: 10vh; - overflow-y: auto; - overflow-x: auto; -} - -.selected-tables-container { - background-color: var(--page-background-color); -} diff --git a/ui/src/app/dataservices/selected-node/selected-node.component.html b/ui/src/app/dataservices/selected-node/selected-node.component.html deleted file mode 100644 index e5130126..00000000 --- a/ui/src/app/dataservices/selected-node/selected-node.component.html +++ /dev/null @@ -1,34 +0,0 @@ - - -
    -
    - - {{ node.getName() }} -
    -
    -
    - {{ node.getConnectionName() }} -
    -
    -
    -
    -
    Include/Exclude Columns
    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    diff --git a/ui/src/app/dataservices/selected-node/selected-node.component.spec.ts b/ui/src/app/dataservices/selected-node/selected-node.component.spec.ts deleted file mode 100644 index 5db1c3fe..00000000 --- a/ui/src/app/dataservices/selected-node/selected-node.component.spec.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { SelectedNodeComponent } from "./selected-node.component"; - -describe("SelectedNodeComponent", () => { - let component: SelectedNodeComponent; - let fixture: ComponentFixture; - let htmlElem: HTMLElement; - - const nodeName = "testNode"; - const connectionName = "testConnection"; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ SelectedNodeComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SelectedNodeComponent); - component = fixture.componentInstance; - htmlElem = fixture.nativeElement; - - const node = new SchemaNode(); - node.setConnectionName(connectionName); - node.setName(nodeName); - component.node = node; - - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [SelectedNodeComponent] should be created"); - expect(component).toBeTruthy(); - }); - - it("should have correct table name", () => { - console.log("========== [SelectedNodeComponent] should have correct table name"); - const heading = fixture.debugElement.nativeElement.querySelector( ".object-card-title" ); - expect( heading.textContent ).toContain( nodeName ); - }); - - it("should have correct connector name", () => { - console.log("========== [SelectedNodeComponent] should have correct connector name"); - // const heading = fixture.debugElement.nativeElement.querySelector( ".text-info" ); - // expect( heading.textContent ).toContain( connectionName ); - }); - -}); diff --git a/ui/src/app/dataservices/selected-node/selected-node.component.ts b/ui/src/app/dataservices/selected-node/selected-node.component.ts deleted file mode 100644 index 998172fa..00000000 --- a/ui/src/app/dataservices/selected-node/selected-node.component.ts +++ /dev/null @@ -1,130 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from "@angular/core"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { Column } from "@dataservices/shared/column.model"; -import { CardAction, CardConfig, TableConfig, TableEvent } from "patternfly-ng"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-selected-node", - templateUrl: "./selected-node.component.html", - styleUrls: ["./selected-node.component.css"] -}) -export class SelectedNodeComponent implements OnInit { - - @Input() public node: SchemaNode; - @Output() public selectionNodeRemoved: EventEmitter = new EventEmitter(); - - public config: CardConfig; - public columnDefinitions: any[]; - public columns: Column[]; - public showColumns = false; - public tableConfig: TableConfig; - - constructor() { - // nothing to do - } - - public ngOnInit(): void { - this.columnDefinitions = [ - { prop: "name" }, - { prop: "type" }, - { prop: "size" } - ]; - - // TODO: replace with call to get the column metadata - const c1 = new Column(); - const c2 = new Column(); - const c3 = new Column(); - const c4 = new Column(); - const c5 = new Column(); - const c6 = new Column(); - const c7 = new Column(); - const c8 = new Column(); - c1.setName("name"); - c2.setName("age"); - c3.setName("street"); - c4.setName("state"); - c5.setName("zipcode"); - c6.setName("company"); - c7.setName("married"); - c8.setName("gender"); - c1.setDatatype("string"); - c2.setDatatype("integer"); - c3.setDatatype("string"); - c4.setDatatype("string"); - c5.setDatatype("string"); - c6.setDatatype("string"); - c7.setDatatype("boolean"); - c8.setDatatype("string"); - c1.setSize(25); - c2.setSize(3); - c3.setSize(30); - c4.setSize(2); - c5.setSize(9); - c6.setSize(50); - c7.setSize(1); - c8.setSize(1); - this.columns = [ c1, c2, c3, c4, c5, c6, c7, c8 ]; - - this.tableConfig = { - showCheckbox: true - } as TableConfig; - - this.config = { - action: { - id: "showColumns", - hypertext: this.showColumnsActionTitle, - iconStyleClass: "fa fa-columns" - }, - titleBorder: true, - noPadding: true, - topBorder: true - } as CardConfig; - } - - private get columnCount(): number { - return this.columns.length; - } - - public handleActionSelect( $event: CardAction ): void { - this.showColumns = !this.showColumns; - $event.hypertext = this.showColumnsActionTitle; - } - - public handleSelectionChange( $event: TableEvent ): void { - // need to update footer action link label - this.config.action.hypertext = this.showColumnsActionTitle; - } - - public get selectedColumnCount(): number { - return this.columns.filter( ( column ) => column.selected ).length; - } - - public get showColumnsActionTitle(): string { - return this.showColumns ? "Hide Columns (" + this.selectedColumnCount + " of " + this.columnCount + " selected)" - : "Show Columns"; - } - - public onRemove(): void { - this.node.selected = false; - this.selectionNodeRemoved.emit(this.node); - } - -} diff --git a/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.css b/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.css deleted file mode 100644 index 3027fd8a..00000000 --- a/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.css +++ /dev/null @@ -1,10 +0,0 @@ -.alert-padding { - padding-top: 10px; -} - -.selected-tables-container { - background-color: #bbbbbb; - max-height: 480px; - margin-top: 0; - overflow-y: auto; -} diff --git a/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.html b/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.html deleted file mode 100644 index e66f2e9c..00000000 --- a/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.html +++ /dev/null @@ -1,11 +0,0 @@ -
    -
    - - No source nodes selected -
    -
    -
    -
    - -
    -
    diff --git a/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.spec.ts b/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.spec.ts deleted file mode 100644 index 2b8593cb..00000000 --- a/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { RouterTestingModule } from "@angular/router/testing"; -import { SelectedNodeComponent } from "@dataservices/selected-node/selected-node.component"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { SelectedNodesListComponent } from "./selected-nodes-list.component"; - -describe("SelectedNodesListComponent", () => { - let component: SelectedNodesListComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ SelectedNodesListComponent, SelectedNodeComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SelectedNodesListComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.ts b/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.ts deleted file mode 100644 index 04582059..00000000 --- a/ui/src/app/dataservices/selected-nodes-list/selected-nodes-list.component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, EventEmitter, OnInit, Output } from "@angular/core"; -import { SchemaNode } from "@connections/shared/schema-node.model"; - -@Component({ - selector: "app-selected-nodes-list", - templateUrl: "./selected-nodes-list.component.html", - styleUrls: ["./selected-nodes-list.component.css"] -}) -export class SelectedNodesListComponent implements OnInit { - - @Output() public selectionListNodeRemoved: EventEmitter = new EventEmitter(); - - private nodes: SchemaNode[] = []; - - constructor() { - // nothing to do - } - - public ngOnInit(): void { - // nothing to do - } - - public setNodes( nodes: SchemaNode[] ): void { - this.nodes = nodes; - } - - public getNodes( ): SchemaNode[] { - return this.nodes; - } - - public get hasNodes( ): boolean { - return this.getNodes().length > 0; - } - - /** - * Determine if the list already has the specified node - * @param {SchemaNode} node - * @returns {boolean} - */ - public hasNode( node: SchemaNode ): boolean { - let hasIt = false; - for (const listNode of this.nodes) { - if ( (listNode.getName() === node.getName()) && - (listNode.getConnectionName() === node.getConnectionName()) ) { - hasIt = true; - break; - } - } - return hasIt; - } - - public onNodeRemoved( node: SchemaNode ): void { - this.selectionListNodeRemoved.emit(node); - } -} diff --git a/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.css b/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.html b/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.html deleted file mode 100644 index 4bc78c28..00000000 --- a/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.html +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.spec.ts b/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.spec.ts deleted file mode 100644 index e5f12789..00000000 --- a/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { SetDescriptionDialogComponent } from './set-description-dialog.component'; -import { HttpModule } from "@angular/http"; -import { BsModalRef, ModalModule } from "ngx-bootstrap"; -import { - ActionModule -} from "patternfly-ng"; -import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; - -describe('SetDescriptionDialogComponent', () => { - let component: SetDescriptionDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule, - FormsModule, - ReactiveFormsModule, - ModalModule.forRoot(), - ActionModule - ], - declarations: [ SetDescriptionDialogComponent ], - providers: [ AppSettingsService, BsModalRef, LoggerService - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SetDescriptionDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.ts b/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.ts deleted file mode 100644 index 402b6ea5..00000000 --- a/ui/src/app/dataservices/set-description-dialog/set-description-dialog.component.ts +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnInit } from "@angular/core"; -import { Output } from "@angular/core"; -import { EventEmitter } from "@angular/core"; -import { BsModalRef } from "ngx-bootstrap"; -import { LoggerService } from "@core/logger.service"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { FormControl, FormGroup } from "@angular/forms"; - -@Component({ - selector: "app-create-view-dialog", - templateUrl: "./set-description-dialog.component.html", - styleUrls: ["./set-description-dialog.component.css"] -}) -/** - * SetDescription Dialog. Invoke this from another component as follows: - * - * this.modalRef = this.modalService.show(SetDescriptionDialogComponent, {initialState}); - * this.modalRef.content.okAction.take(1).subscribe((description) => { - * // do something with description - * }); - * - * The expected initial state is as follows: - * const initialState = { - * title: "The dialog title", - * cancelButtonText: "Text for cancel button", - * confirmButtonText: "Text for confirm button" - * }; - */ -export class SetDescriptionDialogComponent implements OnInit { - - @Output() public okAction: EventEmitter = new EventEmitter(); - - public readonly title = ViewEditorI18n.setDescriptionDialogTitle; - public readonly message = ViewEditorI18n.setDescriptionDialogMessage; - public readonly cancelButtonText = ViewEditorI18n.cancelButtonText; - public readonly okButtonText = ViewEditorI18n.okButtonText; - public description = ""; - public okButtonEnabled = true; - public bsModalRef: BsModalRef; - public viewPropertyForm: FormGroup; - - private loggerService: LoggerService; - private originalDescription = ""; - - constructor(bsModalRef: BsModalRef, logger: LoggerService) { - this.bsModalRef = bsModalRef; - this.loggerService = logger; - this.createViewPropertyForm(); - } - - public ngOnInit(): void { - this.originalDescription = this.description; - this.viewPropertyForm.controls["description"].setValue(this.description); - } - - /* - * Creates the view property form - */ - private createViewPropertyForm(): void { - this.viewPropertyForm = new FormGroup({ - description: new FormControl(this.description) - }); - } - - /** - * OK selected. Emit ViewDefinition with the view, then modal is closed - */ - public onOkSelected(): void { - const theDescr = this.viewPropertyForm.controls["description"].value; - - this.okAction.emit(theDescr); - this.bsModalRef.hide(); - } - - /** - * Cancel selected. The modal is closed. - */ - public onCancelSelected(): void { - this.bsModalRef.hide(); - } - -} diff --git a/ui/src/app/dataservices/shared/column-data.model.ts b/ui/src/app/dataservices/shared/column-data.model.ts deleted file mode 100644 index 81e4435f..00000000 --- a/ui/src/app/dataservices/shared/column-data.model.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * The ColumnData model - */ -export class ColumnData { - - private name: string; - private label: string; - private type: string; - - /** - * Constructor - * @param {Object} json the JSON representation of ColumnData - */ - constructor(json: object = {}) { - for (const field of Object.keys(json)) { - this[field] = json[field]; - } - } - - /** - * @returns {string} the column name - */ - public getName( ): string { - return this.name; - } - - /** - * @returns {string} the column label - */ - public getLabel( ): string { - return this.label; - } - - /** - * @returns {string} the column type - */ - public getType( ): string { - return this.type; - } - -} diff --git a/ui/src/app/dataservices/shared/column.model.spec.ts b/ui/src/app/dataservices/shared/column.model.spec.ts deleted file mode 100644 index abe58900..00000000 --- a/ui/src/app/dataservices/shared/column.model.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Column } from "@dataservices/shared/column.model"; - -describe("Column", () => { - let column: Column; - - beforeEach(() => { - column = null; - }); - - it("should create", () => { - console.log("========== [Column] should create"); - column = Column.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.67.nip.io/vdb-builder/v1/", - "keng__id": "account_id", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/pgConn/pgconnschemavdb/pgconnschemamodel/account/account_id", - "keng__kType": "Column", - "keng__hasChildren": false, - "Datatype": "INTEGER", - "keng___links": [ - { - "rel": "self", - "href": "http://das-beetle-studio.192.168.42.67.nip.io/vdb-builder/v1/workspace/blah/account/Columns/account_id" - }, - { - "rel": "parent", - "href": "http://das-beetle-studio.192.168.42.67.nip.io/vdb-builder/v1/workspace/blah/account" - }, - { - "rel": "children", - "href": "http://das-beetle-studio.192.168.42.67.nip.io/vdb-builder/v1/workspace/s" - } - ] - } - ); - - expect(column.getName()).toEqual("account_id"); - expect(column.getDatatype()).toEqual("INTEGER"); - }); - -}); diff --git a/ui/src/app/dataservices/shared/column.model.ts b/ui/src/app/dataservices/shared/column.model.ts deleted file mode 100644 index 738b9f65..00000000 --- a/ui/src/app/dataservices/shared/column.model.ts +++ /dev/null @@ -1,104 +0,0 @@ - -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class Column { - - private isSelected = false; - private keng__id: string; - private Datatype: string; - private size: number; - - /** - * @param {Object} json the JSON representation of a Column - * @returns {Column} the new Column (never null) - */ - public static create( json: object = {} ): Column { - const column = new Column(); - column.setValues( json ); - return column; - } - - constructor() { - // nothing to do - } - - /** - * @returns {string} the column name - */ - public getName(): string { - return this.keng__id; - } - - /** - * @param {string} name the column name - */ - public setName( name?: string ): void { - this.keng__id = name ? name : null; - } - - /** - * @returns {string} the column type - */ - public getDatatype(): string { - return this.Datatype; - } - - /** - * @param {string} name the column type - */ - public setDatatype( type: string ): void { - this.Datatype = type; - } - - /** - * @returns {number} the column size - */ - public getSize(): number { - return this.size; - } - - /** - * @param {number} size the column size - */ - public setSize( size: number ): void { - this.size = size; - } - - /** - * @returns {boolean} 'true' if column isSelected - */ - public get selected(): boolean { - return this.isSelected; - } - - /** - * @param {boolean} selected the column isSelected state - */ - public setSelected( selected: boolean ): void { - this.isSelected = selected; - } - - /** - * Set all object values using the supplied View json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/dataservices/shared/composition-operator.enum.ts b/ui/src/app/dataservices/shared/composition-operator.enum.ts deleted file mode 100644 index b5a31760..00000000 --- a/ui/src/app/dataservices/shared/composition-operator.enum.ts +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export enum CompositionOperator { - - /** - * Indicates 'equals' condition - * - * @type {string} - */ - EQ = "EQ", - - /** - * Indicates 'greater than' condition - * - * @type {string} - */ - GT = "GT", - - /** - * Indicates 'less than' condition - * - * @type {string} - */ - LT = "LT", - - /** - * Indicates 'greater than or equal' condition - * - * @type {string} - */ - GE = "GE", - - /** - * Indicates 'less than or equal' condition - * - * @type {string} - */ - LE = "LE", - - /** - * Indicates 'not equal' condition - * - * @type {string} - */ - NE = "NE" - -} - -export namespace CompositionOperator { - export function toSql( oper: CompositionOperator): string { - if (oper === CompositionOperator.EQ) { - return "="; - } else if (oper === CompositionOperator.LT) { - return "<"; - } else if (oper === CompositionOperator.GT) { - return ">"; - } else if (oper === CompositionOperator.LE) { - return "<="; - } else if (oper === CompositionOperator.GE) { - return ">="; - } else if (oper === CompositionOperator.NE) { - return "<>"; - } - return "="; - } -} diff --git a/ui/src/app/dataservices/shared/composition-type.enum.ts b/ui/src/app/dataservices/shared/composition-type.enum.ts deleted file mode 100644 index 6dac3671..00000000 --- a/ui/src/app/dataservices/shared/composition-type.enum.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export enum CompositionType { - - /** - * Indicates an inner join composition - * - * @type {string} - */ - INNER_JOIN = "INNER_JOIN", - - /** - * Indicates a left outer join composition - * - * @type {string} - */ - LEFT_OUTER_JOIN = "LEFT_OUTER_JOIN", - - /** - * Indicates a right outer join composition - * - * @type {string} - */ - RIGHT_OUTER_JOIN = "RIGHT_OUTER_JOIN", - - /** - * Indicates a full outer join composition - * - * @type {string} - */ - FULL_OUTER_JOIN = "FULL_OUTER_JOIN", - - /** - * Indicates a union composition - * - * @type {string} - */ - UNION = "UNION" - -} - -export namespace CompositionType { - export function toSql( type: CompositionType): string { - if ( type === CompositionType.INNER_JOIN ) { - return "INNER JOIN"; - } else if ( type === CompositionType.LEFT_OUTER_JOIN ) { - return "LEFT OUTER JOIN"; - } else if ( type === CompositionType.RIGHT_OUTER_JOIN ) { - return "RIGHT OUTER JOIN"; - } else if ( type === CompositionType.FULL_OUTER_JOIN ) { - return "FULL OUTER JOIN"; - } else if ( type === CompositionType.UNION ) { - return "UNION"; - } - return "INNER JOIN"; - } -} diff --git a/ui/src/app/dataservices/shared/composition.model.spec.ts b/ui/src/app/dataservices/shared/composition.model.spec.ts deleted file mode 100644 index e6631ba9..00000000 --- a/ui/src/app/dataservices/shared/composition.model.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Composition } from "@dataservices/shared/composition.model"; -import { CompositionType } from "@dataservices/shared/composition-type.enum"; -import { CompositionOperator } from "@dataservices/shared/composition-operator.enum"; - -describe("Composition", () => { - let composition: Composition; - - beforeEach(() => { - composition = null; - }); - - it("should create", () => { - console.log("========== [Composition] should create"); - composition = Composition.create( - { - "name": "myView", - "leftSourcePath": "leftPath", - "rightSourcePath": "rightPath", - "type": "INNER_JOIN", - "condition": "EQ" - } - ); - - expect(composition.getName()).toEqual("myView"); - expect(composition.getLeftSourcePath()).toEqual("leftPath"); - expect(composition.getRightSourcePath()).toEqual("rightPath"); - expect(composition.getType()).toEqual(CompositionType.INNER_JOIN); - expect(composition.getOperator()).toEqual(CompositionOperator.EQ); - }); - -}); diff --git a/ui/src/app/dataservices/shared/composition.model.ts b/ui/src/app/dataservices/shared/composition.model.ts deleted file mode 100644 index 5fae2323..00000000 --- a/ui/src/app/dataservices/shared/composition.model.ts +++ /dev/null @@ -1,268 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CompositionType } from "@dataservices/shared/composition-type.enum"; -import { CompositionOperator } from "@dataservices/shared/composition-operator.enum"; -import { PathUtils } from "@dataservices/shared/path-utils"; - -/** - * Composition model - */ -export class Composition { - - private name: string; - private initialSourcePath: string; - private leftSourcePath: string; - private rightSourcePath: string; - private leftCriteriaColumn: string; - private rightCriteriaColumn: string; - private type: CompositionType = CompositionType.INNER_JOIN; - private operator: CompositionOperator = CompositionOperator.EQ; - - /** - * @param {Object} json the JSON representation of a Composition - * @returns {Composition} the new Composition (never null) - */ - public static create( json: object = {} ): Composition { - const composition = new Composition(); - composition.setValues( json ); - return composition; - } - - constructor() { - // nothing to do - } - - /** - * @returns {string} the composition name - */ - public getName(): string { - return this.name; - } - - /** - * @param {string} name the composition name - */ - public setName( name?: string ): void { - this.name = name ? name : null; - } - - /** - * @returns {string} the composition type - */ - public getType(): CompositionType { - return this.type; - } - - /** - * @param {string} type the composition type - */ - public setType( type: CompositionType ): void { - this.type = type; - } - - /** - * @returns {CompositionOperator} the composition operator - */ - public getOperator(): CompositionOperator { - return this.operator; - } - - /** - * @param {CompositionOperator} operator the composition operator - */ - public setOperator(operator: CompositionOperator ): void { - this.operator = operator; - } - - /** - * @return {boolean} 'true' if initial source is set and on the left - */ - public get initialSourceOnLeft(): boolean { - return this.initialSourcePath !== null && this.leftSourcePath !== null && this.initialSourcePath === this.leftSourcePath; - } - - /** - * @return {boolean} 'true' if initial source is set and on the right - */ - public get initialSourceOnRight(): boolean { - return this.initialSourcePath !== null && this.rightSourcePath !== null && this.initialSourcePath === this.rightSourcePath; - } - - /** - * @returns {string} the left source path of the composition - */ - public getLeftSourcePath(): string { - return this.leftSourcePath; - } - - /** - * @param {string} sourcePath the left source path of the composition - */ - public setLeftSourcePath(sourcePath: string, isInitialSource = false ): void { - this.leftSourcePath = sourcePath; - if (isInitialSource) { - this.initialSourcePath = this.leftSourcePath; - } - } - - /** - * @returns {string} the right source source of the composition - */ - public getRightSourcePath(): string { - return this.rightSourcePath; - } - - /** - * @param {string} sourcePath the right source of the composition - */ - public setRightSourcePath(sourcePath: string, isInitialSource = false ): void { - this.rightSourcePath = sourcePath; - if (isInitialSource) { - this.initialSourcePath = this.rightSourcePath; - } - } - - /** - * @returns {string} the left criteria column - */ - public getLeftCriteriaColumn(): string { - return this.leftCriteriaColumn; - } - - /** - * @param {string} column the left criteria column - */ - public setLeftCriteriaColumn(column: string ): void { - this.leftCriteriaColumn = column; - } - - /** - * @returns {string} the right criteria column - */ - public getRightCriteriaColumn(): string { - return this.rightCriteriaColumn; - } - - /** - * @param {string} column the right criteria column - */ - public setRightCriteriaColumn(column: string ): void { - this.rightCriteriaColumn = column; - } - - /** - * Swap the left and right sources (and corresponding column selections) - */ - public swapTables( ): void { - // Switch the left and right tables - const leftSource = this.getLeftSourcePath(); - const rightSource = this.getRightSourcePath(); - this.setRightSourcePath(leftSource); - this.setLeftSourcePath(rightSource); - - // Switch the column selections - const selectedLeftColumn = this.getLeftCriteriaColumn(); - const selectedRightColumn = this.getRightCriteriaColumn(); - this.setRightCriteriaColumn(selectedLeftColumn); - this.setLeftCriteriaColumn(selectedRightColumn); - } - - /** - * Determine whether the composition is in a complete state - * @returns {boolean} true if complete - */ - public get complete(): boolean { - if ( this.name !== null && - this.type && this.type !== null && - this.operator && this.operator !== null && - this.leftSourcePath && this.leftSourcePath !== null && - this.rightSourcePath && this.rightSourcePath !== null && - this.leftCriteriaColumn && this.leftCriteriaColumn !== null && - this.rightCriteriaColumn && this.rightCriteriaColumn !== null) { - return true; - } else { - return false; - } - } - - /** - * Determine if the supplied Composition is equal to this - * @param {Object} values - */ - public isEqual( otherComp: Composition ): boolean { - let equal = false; - if (this.getName() === otherComp.getName() && - this.getLeftSourcePath() === otherComp.getLeftSourcePath() && - this.getRightSourcePath() === otherComp.getRightSourcePath() && - this.getLeftCriteriaColumn() === otherComp.getLeftCriteriaColumn() && - this.getRightCriteriaColumn() === otherComp.getRightCriteriaColumn() && - this.getType() === otherComp.getType() && - this.getOperator() === otherComp.getOperator() ) { - equal = true; - } - return equal; - } - - /** - * Set all object values using the supplied View json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - - /** - * @returns {{}} a JSON representation of the composition - */ - public toJSON(): {} { - return { - name: this.name, - leftSourcePath: this.leftSourcePath, - rightSourcePath: this.rightSourcePath, - leftCriteriaColumn: this.leftCriteriaColumn, - rightCriteriaColumn: this.rightCriteriaColumn, - type: this.type, - operator: this.operator - }; - } - - public toString(): string { - return JSON.stringify(this.toJSON()); - } - - public getLeftSourceDisplay(): string { - const leftSrcPath = this.getLeftSourcePath(); - const leftConn = PathUtils.getConnectionName(leftSrcPath); - const leftSrc = PathUtils.getSourceName(leftSrcPath); - return "[" + leftConn + "] " + leftSrc; - } - - public getRightSourceDisplay(): string { - const rightSrcPath = this.getRightSourcePath(); - const rightConn = PathUtils.getConnectionName(rightSrcPath); - const rightSrc = PathUtils.getSourceName(rightSrcPath); - return "[" + rightConn + "] " + rightSrc; - } - - public getCriteriaDisplay(): string { - const leftColumn = this.getLeftCriteriaColumn(); - const rightColumn = this.getRightCriteriaColumn(); - return leftColumn + " " + CompositionOperator.toSql(this.getOperator()) + " " + rightColumn; - } - -} diff --git a/ui/src/app/dataservices/shared/connection-summary.model.spec.ts b/ui/src/app/dataservices/shared/connection-summary.model.spec.ts deleted file mode 100644 index 1f4291ad..00000000 --- a/ui/src/app/dataservices/shared/connection-summary.model.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { ConnectionSummary } from "@dataservices/shared/connection-summary.model"; - -describe("ConnectionSummary", () => { - let connectionSummary: ConnectionSummary; - - beforeEach(() => { - connectionSummary = null; - }); - - it("should create", () => { - console.log("========== [ConnectionSummary] should create"); - connectionSummary = ConnectionSummary.create( - { - "connection": { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "keng__id": "PgConn", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/PgConn", - "keng__kType": "Connection", - "keng__hasChildren": true, - "dv__jndiName": "java:/postgresql-persistent-jq7wz", - "dv__driverName": "postgresql", - "dv__type": true, - "keng__properties": [ - { - "name": "description", - "value": "customer db on postgres" - }, - { - "name": "serviceCatalogSource", - "value": "postgresql-persistent-jq7wz" - } - ], - "keng___links": [ - { - "rel": "self", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/connections/PgConn" - }, - { - "rel": "parent", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/connections" - }, - { - "rel": "children", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/search%2Fadmin%2FPgConn" - } - ] - }, - "status": { - "connectionName": "PgConn", - "vdbState": "ACTIVE", - "schemaState": "ACTIVE", - "errors": [], - "schemaModelName": "pgconnschemamodel", - "schemaVdbName": "pgconnschemavdb", - "vdbName": "pgconnbtlconn" - } - } - ); - - expect(connectionSummary.getConnection().getId()).toEqual("PgConn"); - expect(connectionSummary.getConnection().getDescription()).toEqual("customer db on postgres"); - expect(connectionSummary.getConnection().getDriverName()).toEqual("postgresql"); - expect(connectionSummary.getConnection().getJndiName()).toEqual("java:/postgresql-persistent-jq7wz"); - expect(connectionSummary.getConnection().getServiceCatalogSourceName()).toEqual("postgresql-persistent-jq7wz"); - expect(connectionSummary.getConnection().getDataPath()).toEqual("/tko:komodo/tko:workspace/admin/PgConn"); - - expect(connectionSummary.getStatus().getConnectionName()).toEqual("PgConn"); - expect(connectionSummary.getStatus().getSchemaModelName()).toEqual("pgconnschemamodel"); - expect(connectionSummary.getStatus().getSchemaVdbName()).toEqual("pgconnschemavdb"); - expect(connectionSummary.getStatus().getServerVdbName()).toEqual("pgconnbtlconn"); - expect(connectionSummary.getStatus().getErrors()).toEqual([]); - }); - -}); diff --git a/ui/src/app/dataservices/shared/connection-summary.model.ts b/ui/src/app/dataservices/shared/connection-summary.model.ts deleted file mode 100644 index 4be7caee..00000000 --- a/ui/src/app/dataservices/shared/connection-summary.model.ts +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ConnectionStatus } from "@connections/shared/connection-status"; -import { Connection } from "@connections/shared/connection.model"; - -/** - * ConnectionSummary model. - */ -export class ConnectionSummary { - - private connection: Connection; - private status: ConnectionStatus; - - /** - * @param {Object} json the JSON representation of a ConnectionSummary - * @returns {ConnectionSummary} the new ConnectionSummary (never null) - */ - public static create( json: object = {} ): ConnectionSummary { - const connSummary = new ConnectionSummary(); - for (const field of Object.keys(json)) { - if (field === "connection") { - // length of 2 or shorter - no object. TODO: better way to do this? - if (JSON.stringify(json[field]).length > 2) { - connSummary.setConnection(Connection.create(json[field])); - } - } else if (field === "status") { - // length of 2 or shorter - no object. TODO: better way to do this? - if (JSON.stringify(json[field]).length > 2) { - connSummary.setStatus(ConnectionStatus.create(json[field])); - } - } - } - return connSummary; - } - - constructor() { - // nothing to do - } - - /** - * @returns {Connection} the connection - */ - public getConnection(): Connection { - return this.connection; - } - - /** - * @returns {boolean} 'true' if a status exists - */ - public hasStatus(): boolean { - return (this.status && this.status !== null); - } - - /** - * @returns {ConnectionStatus} the status - */ - public getStatus(): ConnectionStatus { - return this.status; - } - - /** - * @param {Connection} connection the named connection - */ - public setConnection( connection: Connection ): void { - this.connection = connection; - } - - /** - * @param {ConnectionStatus} status the named vdbStatus - */ - public setStatus( status: ConnectionStatus ): void { - this.status = status; - } - - /** - * Set all object values using the supplied ConnectionSummary json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/dataservices/shared/dataservice.model.spec.ts b/ui/src/app/dataservices/shared/dataservice.model.spec.ts deleted file mode 100644 index f8e0be36..00000000 --- a/ui/src/app/dataservices/shared/dataservice.model.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { DeploymentState } from "@dataservices/shared/deployment-state.enum"; -import { PublishState } from "@dataservices/shared/publish-state.enum"; - -describe("Dataservice", () => { - let dataservice: Dataservice; - - beforeEach(() => { - dataservice = null; - }); - - it("should create", () => { - console.log("========== [Dataservice] should create"); - dataservice = Dataservice.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "keng__id": "mongoVirtualization", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/mongoVirtualization", - "keng__kType": "Dataservice", - "keng__hasChildren": true, - "serviceVdbName": "mongovirtualizationvdb", - "serviceVdbVersion": "1", - "serviceViewModel": "views", - "serviceViewDefinitions": [ - "addressView", - "gradesView", - "restaurantsView" - ], - "connections": 0, - "drivers": 0, - "keng___links": [ - { - "rel": "self", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/dataservices/mongoVirtualization" - }, - { - "rel": "parent", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/dataservices" - }, - { - "rel": "children", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/xxx" - }, - { - "rel": "vdbs", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/yyy" - }, - { - "rel": "connections", - "href": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/workspace/zzz" - } - ] - } - ); - - expect(dataservice.getId()).toEqual("mongoVirtualization"); - expect(dataservice.getServiceVdbName()).toEqual("mongovirtualizationvdb"); - expect(dataservice.getServiceVdbVersion()).toEqual("1"); - expect(dataservice.getServiceViewModel()).toEqual("views"); - expect(dataservice.getServiceViewNames().length).toEqual(3); - expect(dataservice.getServiceDeploymentState()).toEqual(DeploymentState.LOADING); - expect(dataservice.getServicePublishState()).toEqual(PublishState.NOT_PUBLISHED); - }); - -}); diff --git a/ui/src/app/dataservices/shared/dataservice.model.ts b/ui/src/app/dataservices/shared/dataservice.model.ts deleted file mode 100644 index 2f3bc98b..00000000 --- a/ui/src/app/dataservices/shared/dataservice.model.ts +++ /dev/null @@ -1,358 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { DeploymentState } from "@dataservices/shared/deployment-state.enum"; -import { PublishState } from "@dataservices/shared/publish-state.enum"; -import { Virtualization } from "@dataservices/shared/virtualization.model"; -import { VirtRoute } from "@dataservices/shared/virt-route.model"; -import { Identifiable } from "@shared/identifiable"; -import { SortDirection } from "@shared/sort-direction.enum"; -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; - -export class Dataservice implements Identifiable< string > { - - private keng__id: string; - private tko__description: string; - private serviceVdbName: string; - private serviceVdbVersion: string; - private serviceViewDefinitions: string[]; - private serviceViewModel: string; - private deploymentState: DeploymentState = DeploymentState.LOADING; - private virtualization: Virtualization = null; - - /** - * @param {Object} json the JSON representation of a Dataservice - * @returns {Dataservice} the new Dataservice (never null) - */ - public static create( json: object = {} ): Dataservice { - const svc = new Dataservice(); - svc.setValues( json ); - return svc; - } - - /** - * @param {Dataservice[]} dataservices the dataservices being sorted - * @param {SortDirection} sortDirection the sort direction - */ - public static sort( dataservices: Dataservice[], - sortDirection: SortDirection ): void { - dataservices.sort( ( thisDataservice: Dataservice, thatDataservice: Dataservice ) => { - const result = thisDataservice.compareTo( thatDataservice ); - - if ( sortDirection === SortDirection.DESC ) { - return result * -1; - } - - return result; - } ); - } - - constructor( ) { - // nothing to do - } - - /** - * See {Identifiable}. - */ - public compareTo( that: Dataservice ): number { - let result = 0; - - if ( this.getId() ) { - if ( that.getId() ) { - // both have an ID - result = this.getId().localeCompare( that.getId() ); - } else { - // thatItem does not have an ID - result = 1; - } - } else if ( that.getId() ) { - // thisItem does not have an ID and thatItem does - result = -1; - } - - return result; - } - - /** - * @returns {string} the dataservice identifier (can be null) - */ - public getId(): string { - return this.keng__id; - } - - /** - * @returns {string} the dataservice description (can be null) - */ - public getDescription(): string { - return this.tko__description; - } - - /** - * @returns {string} the dataservice Vdb name (can be null) - */ - public getServiceVdbName(): string { - return this.serviceVdbName; - } - - /** - * @returns {string} the dataservice Vdb version (can be null) - */ - public getServiceVdbVersion(): string { - return this.serviceVdbVersion; - } - - /** - * @returns {string[]} the dataservice view names (never null or undefined) - */ - public getServiceViewNames(): string[] { - if ( this.serviceViewDefinitions ) { - return this.serviceViewDefinitions; - } - - return []; - } - - /** - * Remove the specified view name, if it exists - * @param {string} viewNameToRemove the view name to remove - */ - public removeServiceViewName( viewNameToRemove: string ): void { - const index = this.serviceViewDefinitions.findIndex( ( viewName ) => - viewName === viewNameToRemove ); - - if ( index !== -1 ) { - this.serviceViewDefinitions.splice( index, 1 ); - } - } - - /** - * @returns {string} the dataservice view model name (can be null) - */ - public getServiceViewModel(): string { - return this.serviceViewModel; - } - - /** - * @returns {string} the dataservice type name (can be null) - */ - public getType(): string { - return "Dataservice"; - } - - /** - * @returns {DeploymentState} the dataservice Deployment state - */ - public getServiceDeploymentState(): DeploymentState { - return this.deploymentState; - } - - /** - * Accessor to determine if service deployment is active - * @returns {boolean} the dataservice service deployment active state - */ - public get serviceDeploymentActive(): boolean { - return this.deploymentState === DeploymentState.ACTIVE; - } - - /** - * Accessor to determine if service deployment is inactive - * @returns {boolean} the dataservice service deployment inactive state - */ - public get serviceDeploymentInactive(): boolean { - return this.deploymentState === DeploymentState.INACTIVE; - } - - /** - * Accessor to determine if service deployment is loading - * @returns {boolean} the dataservice service deployment loading state - */ - public get serviceDeploymentLoading(): boolean { - return this.deploymentState === DeploymentState.LOADING; - } - - /** - * Accessor to determine if service deployment is failed - * @returns {boolean} the dataservice service deployment failed state - */ - public get serviceDeploymentFailed(): boolean { - return this.deploymentState === DeploymentState.FAILED; - } - - /** - * Accessor to determine if service is not deployed - * @returns {boolean} the dataservice service not deployed state - */ - public get serviceDeploymentNotDeployed(): boolean { - return this.deploymentState === DeploymentState.NOT_DEPLOYED; - } - - /** - * @returns {DeploymentState} the dataservice Deployment state - */ - public getServicePublishState(): PublishState { - return this.virtualization ? this.virtualization.getPublishState() : PublishState.NOT_PUBLISHED; - } - - /** - * Accessor to determine if service has not been published - * @returns {boolean} the dataservice service not published state - */ - public get serviceNotPublished(): boolean { - return this.getServicePublishState() === PublishState.NOT_PUBLISHED; - } - - /** - * Accessor to determine if service submission is active - * @returns {boolean} the dataservice service submitted active state - */ - public get serviceSubmitted(): boolean { - return this.getServicePublishState() === PublishState.SUBMITTED; - } - - /** - * Accessor to determine if service configuring is active - * @returns {boolean} the dataservice service configuring active state - */ - public get serviceConfiguring(): boolean { - return this.getServicePublishState() === PublishState.CONFIGURING; - } - - /** - * Accessor to determine if service building is active - * @returns {boolean} the dataservice service building active state - */ - public get serviceBuilding(): boolean { - return this.getServicePublishState() === PublishState.BUILDING; - } - - /** - * Accessor to determine if service deploying is active - * @returns {boolean} the dataservice service deploying active state - */ - public get serviceDeploying(): boolean { - return this.getServicePublishState() === PublishState.DEPLOYING; - } - - /** - * Accessor to determine if service has been published - * @returns {boolean} the dataservice service published state - */ - public get servicePublished(): boolean { - return this.getServicePublishState() === PublishState.PUBLISHED; - } - - /** - * Accessor to determine if service has failed publishing - * @returns {boolean} the dataservice service publishing failed state - */ - public get servicePublishFailed(): boolean { - return this.getServicePublishState() === PublishState.FAILED; - } - - /** - * Accessor to return the root of the odata url, ie. - * http://HOST/odata4/vdbName/ - * - * @returns {string} the odata url for this dataaservice - */ - public getOdataRootUrl(): string { - if (! this.servicePublished || ! this.virtualization) { - return null; - } - - const route: VirtRoute = this.virtualization.getOdataRoute(); - if (route == null) { - return null; - } - - let proto = 'http'; - if (route.isSecure()) - proto = proto + 's'; - - return proto + '://' + route.getHost() + '/' + DataservicesConstants.ODATA_VERSION + '/' + this.getServiceVdbName(); - } - - /** - * @param {string} id the dataservice identifier (optional) - */ - public setId( id?: string ): void { - this.keng__id = id ? id : null; - } - - /** - * @param {string} description the dataservice description (optional) - */ - public setDescription( description?: string ): void { - this.tko__description = description ? description : null; - } - - /** - * @param {string} name the dataservice service vdb name - */ - public setServiceVdbName( name: string ): void { - this.serviceVdbName = name; - } - - /** - * @param {string} version the dataservice service vdb version - */ - public setServiceVdbVersion( version: string ): void { - this.serviceVdbVersion = version; - } - - /** - * @param {string} viewModel the dataservice view model - */ - public setServiceViewModel( viewModel: string ): void { - this.serviceViewModel = viewModel; - } - - /** - * @param {DeploymentState} state the dataservice deployment state - */ - public setServiceDeploymentState( state: DeploymentState ): void { - this.deploymentState = state; - } - - /** - * @param {Virtualization} state the dataservice virtualization - */ - public setServiceVirtualization( state: Virtualization ): void { - this.virtualization = state ? state : null; - } - - // overrides toJSON - we do not want the appSettings - public toJSON(): {} { - return { - keng__id: this.keng__id, - tko__description: this.tko__description, - serviceVdbName: this.serviceVdbName, - serviceVdbVersion: this.serviceVdbVersion, - serviceViews: this.serviceViewDefinitions, - serviceViewModel: this.serviceViewModel - }; - } - - /** - * Set all object values using the supplied Dataservice json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/dataservices/shared/dataservice.service.spec.ts b/ui/src/app/dataservices/shared/dataservice.service.spec.ts deleted file mode 100644 index 7b1fd68c..00000000 --- a/ui/src/app/dataservices/shared/dataservice.service.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; -import { HttpModule } from "@angular/http"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; - -describe("DataserviceService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ HttpModule ], - providers: [ - DataserviceService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - LoggerService, - NotifierService, - { provide: VdbService, useClass: MockVdbService } - ] - }); - }); - - it("should be created", inject([DataserviceService, AppSettingsService, LoggerService], - ( service: DataserviceService ) => { - console.log("========== [DataserviceService] should be created"); - expect(service).toBeTruthy(); - })); -}); diff --git a/ui/src/app/dataservices/shared/dataservice.service.ts b/ui/src/app/dataservices/shared/dataservice.service.ts deleted file mode 100644 index bc7bfd2c..00000000 --- a/ui/src/app/dataservices/shared/dataservice.service.ts +++ /dev/null @@ -1,721 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable } from "@angular/core"; -import { Http, RequestOptions } from "@angular/http"; -import { ApiService } from "@core/api.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; -import { DeploymentState } from "@dataservices/shared/deployment-state.enum"; -import { NewDataservice } from "@dataservices/shared/new-dataservice.model"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { PublishState } from "@dataservices/shared/publish-state.enum"; -import { QueryResults } from "@dataservices/shared/query-results.model"; -import { VdbStatus } from "@dataservices/shared/vdb-status.model"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { VdbsConstants } from "@dataservices/shared/vdbs-constants"; -import { Virtualization } from "@dataservices/shared/virtualization.model"; -import { environment } from "@environments/environment"; -import { saveAs } from "file-saver/FileSaver"; -import { Observable } from "rxjs/Observable"; -import { ReplaySubject } from "rxjs/ReplaySubject"; -import { Subject } from "rxjs/Subject"; -import { Subscription } from "rxjs/Subscription"; -import * as _ from "lodash"; -import * as vkbeautify from 'vkbeautify'; -import { ViewEditorState } from "@dataservices/shared/view-editor-state.model"; - -@Injectable() -export class DataserviceService extends ApiService { - - private static readonly nameValidationUrl = environment.komodoWorkspaceUrl - + DataservicesConstants.dataservicesRestPath - + "/nameValidation/"; - - // Observable dataservice state changes - // Using replay status with cache of 1, so subscribers dont get an initial value on subscription - public dataserviceStateChange: Subject< Map > = new ReplaySubject< Map >(1); - - private http: Http; - private notifierService: NotifierService; - private appSettingsService: AppSettingsService; - private vdbService: VdbService; - private cachedDataserviceDeployStates: Map = new Map(); - private cachedDataserviceVirtualizations: Map = new Map(); - private updatesSubscription: Subscription; - - constructor(http: Http, vdbService: VdbService, appSettings: AppSettingsService, - notifierService: NotifierService, logger: LoggerService ) { - super( appSettings, logger ); - this.http = http; - this.notifierService = notifierService; - this.vdbService = vdbService; - this.appSettingsService = appSettings; - // Polls to fire Dataservice state updates every 15 sec - this.pollDataserviceStatus(15); - } - - /** - * Create and return a NewDataservice instance - * @param {string} name the dataservice name - * @param {string} description the dataservice description - * @returns {NewDataservice} the NewDataservice object - */ - public newDataserviceInstance(name: string, description: string ): NewDataservice { - const ds: NewDataservice = new NewDataservice(this.appSettingsService.getKomodoUserWorkspacePath()); - - // Set provided name and description - ds.setId(name); - ds.setDescription(description); - - return ds; - } - - /** - * Validates the specified data service name. If the name contains valid characters and the name is unique, the - * service returns 'null'. Otherwise, a 'string' containing an error message is returned. - * - * @param {string} name the dataservice name - * @returns {Observable} - */ - public isValidName( name: string ): Observable< string > { - if ( !name || name.length === 0 ) { - return Observable.of( "Data virtualization name cannot be empty" ); - } - - const url = DataserviceService.nameValidationUrl + encodeURIComponent( name ); - - return this.http.get( url, this.getAuthRequestOptions() ) - .map( ( response ) => { - if ( response.ok ) { - if ( response.text() ) { - return response.text(); - } - - return ""; - } } ) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Get the dataservices from the komodo rest interface - * @returns {Observable} - */ - public getAllDataservices(): Observable { - return this.http - .get(environment.komodoWorkspaceUrl + DataservicesConstants.dataservicesRestPath, this.getAuthRequestOptions()) - .map((response) => { - const dataservices = response.json(); - return dataservices.map((dataservice) => Dataservice.create( dataservice )); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Create a dataservice via the komodo rest interface - * @param {NewDataservice} dataservice - * @returns {Observable} - */ - public createDataservice(dataservice: NewDataservice): Observable { - return this.http - .post(environment.komodoWorkspaceUrl + DataservicesConstants.dataservicesRestPath + "/" + dataservice.getId(), - dataservice, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Update a dataservice via the komodo rest interface - * @param {NewDataservice} dataservice - * @returns {Observable} - */ - public updateDataservice(dataservice: NewDataservice): Observable { - return this.http - .put(environment.komodoWorkspaceUrl + DataservicesConstants.dataservicesRestPath + "/" + dataservice.getId(), - dataservice, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Deploy a dataservice via the komodo rest interface - * @param {string} dataserviceName - * @returns {Observable} - */ - public deployDataservice(dataserviceName: string): Observable { - const servicePath = this.getKomodoUserWorkspacePath() + "/" + dataserviceName; - return this.http - .post(environment.komodoTeiidUrl + DataservicesConstants.dataserviceRestPath, - { path: servicePath}, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Create a readonly datarole for the dataservice - * @param {string} serviceVdbName, - * @param {string} model1Name, - * @returns {Observable} - */ - public createReadonlyDataRole(serviceVdbName: string, model1Name: string): Observable { - const READ_ONLY_DATA_ROLE_NAME = VdbsConstants.DEFAULT_READONLY_DATA_ROLE; - const VIEW_MODEL = VdbsConstants.SERVICE_VIEW_MODEL_NAME; - const userWorkspacePath = this.getKomodoUserWorkspacePath(); - - // The payload for the rest call - const payload = { - "keng__id": READ_ONLY_DATA_ROLE_NAME, - "keng__kType": "VdbDataRole", - "keng__dataPath": userWorkspacePath + "/" + serviceVdbName + "/vdb:dataRoles/" + READ_ONLY_DATA_ROLE_NAME, - "vdb__dataRole": READ_ONLY_DATA_ROLE_NAME, - "vdb__description": "The default read-only access data role.", - "vdb__grantAll": false, - "vdb__anyAuthenticated": true, - "vdb__allowCreateTemporaryTables": false, - "vdb__permissions": [ - { - "keng__id": VIEW_MODEL, - "keng__kType": "VdbPermission", - "keng__dataPath": userWorkspacePath + "/" + serviceVdbName + "/vdb:dataRoles/" + READ_ONLY_DATA_ROLE_NAME - + "/vdb:permissions/" + VIEW_MODEL, - "vdb__permission": VIEW_MODEL, - "vdb__allowAlter": false, - "vdb__allowCreate": false, - "vdb__allowDelete": false, - "vdb__allowExecute": false, - "vdb__allowRead": true, - "vdb__allowUpdate": false - }, - { - "keng__id": model1Name, - "keng__kType": "VdbPermission", - "keng__dataPath": userWorkspacePath + "/" + serviceVdbName + "/vdb:dataRoles/" + READ_ONLY_DATA_ROLE_NAME - + "/vdb:permissions/" + model1Name, - "vdb__permission": model1Name, - "vdb__allowAlter": false, - "vdb__allowCreate": false, - "vdb__allowDelete": false, - "vdb__allowExecute": false, - "vdb__allowRead": true, - "vdb__allowUpdate": false - } - ] - }; - const url = environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath + "/" + serviceVdbName - + "/VdbDataRoles/" + READ_ONLY_DATA_ROLE_NAME; - const paystr = JSON.stringify(payload); - - return this.http - .post(url, paystr, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Delete a dataservice via the komodo rest interface - * @param {string} dataserviceId - * @returns {Observable} - */ - public deleteDataservice(dataserviceId: string): Observable { - return this.http - .delete(environment.komodoWorkspaceUrl + DataservicesConstants.dataservicesRestPath + "/" + dataserviceId, - this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Refresh the views for a dataservice via the komodo rest interface - * @param {string} dataserviceName - * @returns {Observable} - */ - public refreshDataserviceViews(dataserviceName: string): Observable { - const refreshViewsUrl = environment.komodoWorkspaceUrl - + DataservicesConstants.dataservicesRestPath - + "/refreshViews/" + encodeURIComponent(dataserviceName); - - return this.http - .post(refreshViewsUrl, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Download a dataservice as a jar archive - * @param {string} dataserviceName the dataservice name - * @returns {Observable} - */ - public downloadDataservice(dataserviceName: string): Observable { - // The payload for the rest call - const payload = { - "storageType": "file", - "dataPath": this.getKomodoUserWorkspacePath() + "/" + dataserviceName, - "parameters": {} - }; - - const url = environment.komodoImportExportUrl + "/" + DataservicesConstants.dataservicesExport; - - return this.http - .post(url, payload, this.getAuthRequestOptions()) - .map((response) => { - const status = response.json(); - - if (! status.downloadable) { - throw new Error(payload.dataPath + " is not downloadable"); - } - - if (! status.content) { - throw new Error(payload.dataPath + " has no content"); - } - - const name = status.Name || dataserviceName; - const fileType = status.type || "data"; - const enc = status.content; - - const contentType = fileType === "zip" ? "application/zip" : "text/plain;charset=utf-8"; - const dataBlob = this.b64toBlob(enc, contentType); - - const fileExt = ( fileType === "-vdb.xml" || fileType === "-connection.xml" ) ? fileType : "." + fileType; - - saveAs(dataBlob, name + fileExt); - - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Publish a dataservice - * @param {string} dataserviceName the dataservice name - * @returns {Observable} - */ - public publishDataservice(dataserviceName: string): Observable { - - // The payload for the rest call - const payload = { - "name": dataserviceName - }; - - const url = environment.komodoTeiidUrl + "/" + DataservicesConstants.dataservicesPublish; - - return this.http - .post(url, payload, this.getAuthRequestOptions()) - .map((response) => { - const status = response.json(); - - if (status.Information && status.Information["Build Status"] === "FAILED") { - throw new Error(status.Information["Build Message"]); - } - - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Retrieve the publishing logs for the given dataservice - * @param {Dataservice} dataservice the dataservice - * @returns {Observable} - */ - public publishLogsGet(dataservice: Dataservice): Observable { - const url = environment.komodoTeiidUrl + "/" + - DataservicesConstants.dataservicesPublishLogs + "/" + - dataservice.getServiceVdbName(); - - return this.http - .get(url, this.getAuthRequestOptions()) - .map((response) => { - const data = response.json(); - return data; - }).catch((error) => this.handleError(error)); - } - - /** - * Query a Dataservice via the komodo rest interface - * @param {string} query the SQL query - * @param {string} dataserviceName the dataservice name - * @param {number} limit the limit for the number of result rows - * @param {number} offset the offset for the result rows - * @returns {Observable} - */ - public queryDataservice(query: string, dataserviceName: string, limit: number, offset: number): Observable { - // The payload for the rest call - const payload = { - "query": query, - "target": dataserviceName, - "limit": limit, - "offset": offset - }; - - const url = environment.komodoTeiidUrl + "/query"; - - return this.http - .post(url, payload, this.getAuthRequestOptions()) - .map((response) => { - const queryResults = response.json(); - return new QueryResults(queryResults); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Query a Dataservice's published virtualization using odata protocol - * @param {string} url the odata url string - * @returns {Observable} - */ - public odataGet(url: string): Observable { - return this.http - .get(url, this.getAuthRequestOptions()) - .map((response) => { - const data = response.text(); - const jobj = this.tryJsonParse(data); - if (_.isObject(jobj)) { - const json = JSON.stringify(jobj, null, 4); - return { - value: json - }; - } - - if (this.isXML(data)) { - const xml = vkbeautify.xml(data); - return { - value: xml - }; - } - - if (_.isEqual(data, "0")) { - // - // corner-case where $count is used - // and there are no results - // - return { - count: 0 - }; - } - - const n = this.tryNumberParse(data); - if (n) { - return { - count: n - }; - } - - if (typeof response === 'string' || response instanceof String) { - return { - value: response - }; - } - - return { - error: 'Error: Request to ' + url + " produces an unexpected response: " + data - }; - }).catch((error) => this.handleError(error)); - } - - /** - * Updates the current Dataservice states - triggers update to be broadcast to interested components - */ - public updateDataserviceStates(): void { - const self = this; - this.getAllDataservices() - .subscribe( - (dataservices) => { - self.updateServiceStateMaps(dataservices); - }, - (error) => { - // On error, broadcast the cached states - this.notifierService.sendDataserviceDeployStateMap(this.cachedDataserviceDeployStates); - this.notifierService.sendDataserviceVirtualizationMap(this.cachedDataserviceVirtualizations); - } - ); - } - - /** - * Polls the server and sends Dataservice state updates at the specified interval - * @param {number} pollIntervalSec the interval (sec) between polling attempts - */ - public pollDataserviceStatus(pollIntervalSec: number): void { - const pollIntervalMillis = pollIntervalSec * 1000; - - const self = this; - // start the timer - const timer = Observable.timer(500, pollIntervalMillis); - this.updatesSubscription = timer.subscribe((t: any) => { - self.updateDataserviceStates(); - }); - } - - /** - * @param {string} editorStatePattern the name pattern to use for returning the array of viewEditorStates. - * If no pattern is supplied, all states are returned - * @returns {Observable} the view editor states or empty array if none found - */ - public getViewEditorStates( editorStatePattern?: string ): Observable< ViewEditorState[] > { - // pattern is added to the request options - let statePattern = {}; - if (editorStatePattern && editorStatePattern.length > 0) { - statePattern = { - params: { - "pattern": editorStatePattern - } - }; - } - - return this.http.get(environment.viewEditorState, this.getAuthRequestOptions().merge(new RequestOptions(statePattern)) ) - .map( ( response ) => { - const editorStates = response.json(); - return editorStates.map((state) => ViewEditorState.create( state )); - } ) - .catch( ( error ) => { - // no editor state found - if ( error.status === 404 ) { - return Observable.of( {} ); - } - - return this.handleError( error ); - } ); - } - - /** - * @param {string} editorId the ID of the editor state being requested - * @returns {Observable} the view editor state or empty object if not found - */ - public getViewEditorState( editorId: string ): Observable< ViewEditorState > { - return this.http.get(environment.viewEditorState + "/" + editorId, this.getAuthRequestOptions() ) - .map( ( response ) => { - const editorState = response.json(); - return ViewEditorState.create(editorState); - } ) - .catch( ( error ) => { - // no editor state found - if ( error.status === 404 ) { - return Observable.of( {} ); - } - - return this.handleError( error ); - } ); - } - - /** - * @param {ViewEditorState[]} editorStates the view editor state array - * @returns {Observable} `true` if the editor state was successfully saved - */ - public saveViewEditorStates( editorStates: ViewEditorState[] ): Observable< boolean > { - - return this.http.put( environment.viewEditorStates, JSON.stringify(editorStates), this.getAuthRequestOptions() ) - .map( ( response ) => { - return response.ok; - } ) - .catch( ( error ) => - this.handleError( error ) - ); - } - - /** - * @param {string} editorId the ID of the editor state being deleted - * @returns {Observable} `true` if the editor state was successfully deleted - */ - public deleteViewEditorState( editorId: string ): Observable< boolean > { - return this.http.delete(environment.viewEditorState + "/" + editorId, this.getAuthRequestOptions() ) - .map( ( response ) => { - return response.ok; - } ) - .catch( ( error ) => - this.handleError( error ) - ); - } - - /** - * @param {ViewEditorState[]} editorStates the view editor state array - * @param {string} dataserviceName the name of the dataservice - * @returns {Observable} `true` if the editor state was successfully saved - */ - public saveViewEditorStatesRefreshViews( editorStates: ViewEditorState[], dataserviceName: string ): Observable< boolean > { - return this.saveViewEditorStates(editorStates) - .flatMap((res) => this.refreshDataserviceViews(dataserviceName)); - } - - /** - * @param {string} editorId the ID of the editor state being deleted - * @param {string} dataserviceName the name of the dataservice - * @returns {Observable} `true` if the editor state was successfully saved - */ - public deleteViewEditorStateRefreshViews( editorId: string, dataserviceName: string ): Observable< boolean > { - return this.deleteViewEditorState(editorId) - .flatMap((res) => this.refreshDataserviceViews(dataserviceName)); - } - - /** - * Converts a base64 data string into a blob for use with the FileSaver library - * Acknowledgement to - * http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript - */ - private b64toBlob(b64Data: string, contentType: string): Blob { - contentType = contentType || ""; - const sliceSize = 512; - - // - // Decodes the base64 string back into binary data byte characters - // - const byteCharacters = atob(b64Data); - const byteArrays = []; - - // - // Each character's code point (charCode) will be the value of the byte. - // Can create an array of byte values by applying this using the .charCodeAt - // method for each character in the string. - // - // The performance can be improved a little by processing the byteCharacters - // in smaller slices, rather than all at once. Rough testing indicates 512 bytes - // seems to be a good slice size. - // - for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { - const slice = byteCharacters.slice(offset, offset + sliceSize); - - const byteNumbers = new Array(slice.length); - for (let i = 0; i < slice.length; i++) { - byteNumbers[i] = slice.charCodeAt(i); - } - - // - // Convert the array of byte values into a real typed byte array - // by passing it to the Uint8Array constructor. - // - const byteArray = new Uint8Array(byteNumbers); - byteArrays.push(byteArray); - } - - // - // Convert to a Blob by wrapping it in an array passing it to the Blob constructor. - // - const blob = new Blob(byteArrays, { - type: contentType - }); - - return blob; - } - - /* - * Get updates for the provided array of Dataservices and broadcast the map of states - * @param {Dataservice[]} services the array of Dataservices - */ - private updateServiceStateMaps(services: Dataservice[]): void { - const self = this; - this.vdbService.getTeiidVdbStatuses() - .subscribe( - (vdbStatuses) => { - self.cachedDataserviceDeployStates = self.createDeploymentStateMap(services, vdbStatuses); - this.notifierService.sendDataserviceDeployStateMap(self.cachedDataserviceDeployStates); - }, - (error) => { - // On error, broadcast the cached states - this.notifierService.sendDataserviceDeployStateMap(self.cachedDataserviceDeployStates); - } - ); - this.vdbService.getVirtualizations() - .subscribe( - (vdbStatuses) => { - self.cachedDataserviceVirtualizations = self.createPublishStateMap(services, vdbStatuses); - this.notifierService.sendDataserviceVirtualizationMap(self.cachedDataserviceVirtualizations); - }, - (error) => { - // On error, broadcast the cached states - this.notifierService.sendDataserviceVirtualizationMap(self.cachedDataserviceVirtualizations); - } - ); - } - - /* - * Creates a Map of dataservice name to DeploymentState, given the list of dataservices and vdbStatuses - * @param {Dataservice[]} dataservices the Dataservice array - * @param {VdbStatus[]} vdbStatuses the VdbStatus array - * @returns {Map} the map of dataservice name to DeploymentState - */ - private createDeploymentStateMap(dataservices: Dataservice[], vdbStatuses: VdbStatus[]): Map { - const dsStateMap: Map = new Map(); - - // For each dataservice, find the corresponding VDB status. Add the map entry - for ( const dService of dataservices ) { - const serviceId = dService.getId(); - const serviceVdbName = dService.getServiceVdbName(); - let statusFound = false; - for ( const vdbStatus of vdbStatuses ) { - if ( vdbStatus.getName() === serviceVdbName ) { - statusFound = true; - if ( vdbStatus.isActive() ) { - dsStateMap.set(serviceId, DeploymentState.ACTIVE); - } else if ( vdbStatus.isFailed() ) { - dsStateMap.set(serviceId, DeploymentState.FAILED); - } else if ( vdbStatus.isLoading() ) { - dsStateMap.set(serviceId, DeploymentState.LOADING); - } else { - dsStateMap.set(serviceId, DeploymentState.INACTIVE); - } - } - } - if ( !statusFound ) { - dsStateMap.set(serviceId, DeploymentState.NOT_DEPLOYED); - } - } - - return dsStateMap; - } - - /* - * Creates a Map of dataservice name to PublishState, given the list of dataservices and virtualizations - * @param {Dataservice[]} dataservices the Dataservice array - * @param {virtualization[]} virtualizations the Virtualization array - * @returns {Map} the map of dataservice name to PublishState - */ - private createPublishStateMap(dataservices: Dataservice[], virtualizations: Virtualization[]): Map { - const dsStateMap: Map = new Map(); - - // For each dataservice, find the corresponding Virtualization. Add the map entry - for ( const dService of dataservices ) { - const serviceId = dService.getId(); - const serviceVdbName = dService.getServiceVdbName(); - let statusFound = false; - for ( const virtualization of virtualizations ) { - if ( virtualization.getVdbName() === serviceVdbName ) { - statusFound = true; - dsStateMap.set(serviceId, virtualization); - } - } - - if ( !statusFound ) { - const virtual = new Virtualization(serviceVdbName, PublishState.NOT_PUBLISHED); - dsStateMap.set(serviceId, virtual); - } - } - - return dsStateMap; - } -} diff --git a/ui/src/app/dataservices/shared/dataservices-constants.ts b/ui/src/app/dataservices/shared/dataservices-constants.ts deleted file mode 100644 index d9216686..00000000 --- a/ui/src/app/dataservices/shared/dataservices-constants.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, / - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NavigationItemConfig } from "patternfly-ng"; - -export class DataservicesConstants { - - public static readonly dataservicesExport = "export"; - public static readonly dataservicesPublish = "publish"; - public static readonly dataservicesPublishLogs = "publishLogs"; - - public static readonly dataservicesRootRoute = "virtualizations"; - public static readonly dataservicesRootPath = "/" + DataservicesConstants.dataservicesRootRoute; - - public static readonly dataserviceRestPath = "/dataservice"; - public static readonly dataservicesRestPath = "/dataservices"; - - public static readonly viewRoute = DataservicesConstants.dataservicesRootRoute + "/view"; - public static readonly viewPath = DataservicesConstants.dataservicesRootPath + "/view"; - - public static readonly testDataserviceRoute = DataservicesConstants.dataservicesRootRoute + "/test-virtualization"; - public static readonly testDataservicePath = DataservicesConstants.dataservicesRootPath + "/test-virtualization"; - - public static readonly ODATA_VERSION = 'odata4'; - - public static dataserviceNameLabel = "Name"; - public static descriptionLabel = "Description"; - - public static readonly dataservicesNavItem: NavigationItemConfig = { - title: "Virtualizations", - iconStyleClass: "fa fa-fw fa-table", - url: DataservicesConstants.dataservicesRootPath - }; - -} diff --git a/ui/src/app/dataservices/shared/deployment-state.enum.ts b/ui/src/app/dataservices/shared/deployment-state.enum.ts deleted file mode 100644 index d71725b5..00000000 --- a/ui/src/app/dataservices/shared/deployment-state.enum.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * An enumeration of Deployment state - */ -export enum DeploymentState { - - /** - * loading - */ - LOADING, - - /** - * active - */ - ACTIVE, - - /** - * inactive - */ - INACTIVE, - - /** - * failed - */ - FAILED, - - /** - * not deployed - */ - NOT_DEPLOYED, - - /** - * Indicates that the view compositions have changed. - */ - COMPOSITIONS_CHANGED = "COMPOSITIONS_CHANGED", -} diff --git a/ui/src/app/dataservices/shared/mock-dataservice.service.ts b/ui/src/app/dataservices/shared/mock-dataservice.service.ts deleted file mode 100644 index 0cc4f337..00000000 --- a/ui/src/app/dataservices/shared/mock-dataservice.service.ts +++ /dev/null @@ -1,338 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable, ReflectiveInjector } from "@angular/core"; -import { Http, Response } from "@angular/http"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { NewDataservice } from "@dataservices/shared/new-dataservice.model"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { QueryResults } from "@dataservices/shared/query-results.model"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { TestDataService } from "@shared/test-data.service"; -import "rxjs/add/observable/of"; -import "rxjs/add/observable/throw"; -import "rxjs/add/operator/catch"; -import "rxjs/add/operator/map"; -import { Observable } from "rxjs/Observable"; -import { ErrorObservable } from "rxjs/observable/ErrorObservable"; -import { ViewEditorState } from "@dataservices/shared/view-editor-state.model"; - -@Injectable() -export class MockDataserviceService extends DataserviceService { - - private readonly services: Dataservice[]; - private readonly queryResults: QueryResults; - private editorViewStateMap = new Map(); - - constructor(http: Http, vdbService: VdbService, appSettings: AppSettingsService, - notifierService: NotifierService, logger: LoggerService ) { - super(http, vdbService, appSettings, notifierService, logger); - - // Inject service for test data - const injector = ReflectiveInjector.resolveAndCreate([TestDataService]); - const testDataService = injector.get(TestDataService); - - // Get test data - this.services = testDataService.getDataservices(); - this.queryResults = testDataService.getQueryResults(); - - this.editorViewStateMap = testDataService.getViewEditorStateMap(); - } - - /** - * Get the dataservices from the komodo rest interface - * @returns {Observable} - */ - public getAllDataservices(): Observable { - return Observable.of(this.services); - } - - /** - * Create a dataservice via the komodo rest interface - * @param {NewDataservice} dataservice - * @returns {Observable} - */ - public createDataservice(dataservice: NewDataservice): Observable { - const ds = new Dataservice(); - ds.setId( dataservice.getId() ); - ds.setDescription( dataservice.getDescription() ); - - this.services.push( ds ); - return Observable.of(true); - } - - /** - * Update a dataservice via the komodo rest interface - * @param {NewDataservice} dataservice - * @returns {Observable} - */ - public updateDataservice(dataservice: NewDataservice): Observable { - return Observable.of(true); - } - - /** - * Delete a dataservice via the komodo rest interface - * @param {string} dataserviceId - * @returns {Observable} - */ - public deleteDataservice(dataserviceId: string): Observable { - return Observable.of(true); - } - - public downloadDataservice( dataserviceName: string ): Observable< boolean > { - alert( "Download of " + dataserviceName + " happens here" ); - return Observable.of( true ); - } - - /** - * Query a Dataservice via the komodo rest interface - * @param {string} query the SQL query - * @param {string} dataserviceName the dataservice name - * @param {number} limit the limit for the number of result rows - * @param {number} offset the offset for the result rows - * @returns {Observable} - */ - public queryDataservice(query: string, dataserviceName: string, limit: number, offset: number): Observable { - return Observable.of(this.queryResults); - } - - protected handleError(error: Response): ErrorObservable { - return Observable.throw(error); - } - - public createReadonlyDataRole( dataserviceName: string, - model1Name: string ): Observable< boolean > { - return Observable.of( true ); - } - - public isValidName( name: string ): Observable { - if ( !name || name.length === 0 ) { - return Observable.of( "Data virtualization name cannot be empty" ); - } - - // make sure no dataservice exists with that name - for ( const ds of this.services ) { - if ( ds.getId() === name ) { - return Observable.of( "Data virtualization with that name already exists" ); - } - } - - // just implement a case where no special characters allowed - for ( let i = 0; i < name.length; i++ ) { - const c = name.charAt( i ); - - // special characters have the same upper and lower case values - if ( c.toUpperCase() === c.toLowerCase() ) { - return Observable.of( "No special characters allowed" ); - } - } - - // valid - return Observable.of( "" ); - } - - /** - * @param {ViewEditorState[]} editorStates the view editor state array - * @returns {Observable} `true` if the editor state was successfully saved - */ - public saveViewEditorStates( editorStates: ViewEditorState[] ): Observable< boolean > { - return Observable.of(true); - } - - /** - * @param {string} editorId the ID of the editor state being requested - * @returns {Observable} the view editor state or empty object if not found - */ - public getViewEditorState( editorId: string ): Observable< ViewEditorState > { - return Observable.of(this.editorViewStateMap.get(editorId)); - } - - /** - * @param {string} editorStatePattern the editorState name pattern - * @returns {Observable} the view editor state array - */ - public getViewEditorStates( editorStatePattern?: string ): Observable< ViewEditorState[] > { - const editorStates = []; - - this.editorViewStateMap.forEach( ( value, key ) => { - if (editorStatePattern && editorStatePattern.length > 0) { - - // Just match the first few chars with this test method - const patternTrimmed = editorStatePattern.substring(0, 5); - const keyTrimmed = key.substring(0, 5); - if (keyTrimmed.startsWith(patternTrimmed)) { - editorStates.push(value); - } - } else { - editorStates.push(value); - } - } ); - - return Observable.of(editorStates); - } - - /** - * @param {string} editorId the ID of the editor state being deleted - * @returns {Observable} `true` if the editor state was successfully deleted - */ - public deleteViewEditorState( editorId: string ): Observable< boolean > { - return Observable.of(true); - } - - /** - * @param {ViewEditorState[]} editorStates the view editor state array - * @param {string} dataserviceName the name of the dataservice - * @returns {Observable} `true` if the editor state was successfully saved - */ - public saveViewEditorStatesRefreshViews( editorStates: ViewEditorState[], dataserviceName: string ): Observable< boolean > { - return Observable.of(true); - } - - /** - * @param {string} editorId the ID of the editor state being deleted - * @param {string} dataserviceName the name of the dataservice - * @returns {Observable} `true` if the editor state was successfully saved - */ - public deleteViewEditorStateRefreshViews( editorId: string, dataserviceName: string ): Observable< boolean > { - return Observable.of(true); - } - - /** - * Query a Dataservice's published virtualization using odata protocol - * @param {string} url the odata url string - * @returns {Observable} - */ - public odataGet(url: string): Observable { - const result = this.getMetadata(); - - return Observable.of(result); - } - private getMetadata(): string { - const metadata = "" + - "" + - "" + - " " + - "" + - "" + - " " + - "" + - "" + - " " + - " " + - " " + - " " + - " " + - " " + - " true" + - " " + - " " + - " false" + - " " + - " " + - " " + - " " + - " true" + - " " + - " " + - " false" + - " " + - " " + - " " + - " " + - " true" + - " " + - " " + - " false" + - " " + - " " + - " " + - " " + - " true" + - " " + - " " + - " false" + - " " + - " " + - " " + - " " + - " true" + - " " + - " " + - " false" + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " truefalse" + - " " + - " " + - " true" + - " false" + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " true" + - " false" + - " " + - " " + - " true" + - " false" + - " " + - " " + - " " + - " true" + - " " + - " false" + - " " + - " " + - " " + - " false" + - " " + - " " + - " false" + - " " + - " " + - " " + - " " + - " false" + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - " " + - "" + - "" + - ""; - - return metadata; - } -} diff --git a/ui/src/app/dataservices/shared/mock-vdb.service.ts b/ui/src/app/dataservices/shared/mock-vdb.service.ts deleted file mode 100644 index a3ca6f58..00000000 --- a/ui/src/app/dataservices/shared/mock-vdb.service.ts +++ /dev/null @@ -1,234 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable, ReflectiveInjector } from "@angular/core"; -import { Http } from "@angular/http"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbModelSource } from "@dataservices/shared/vdb-model-source.model"; -import { VdbModel } from "@dataservices/shared/vdb-model.model"; -import { VdbStatus } from "@dataservices/shared/vdb-status.model"; -import { Vdb } from "@dataservices/shared/vdb.model"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { Virtualization } from "@dataservices/shared/virtualization.model"; -import { TestDataService } from "@shared/test-data.service"; -import "rxjs/add/observable/of"; -import "rxjs/add/observable/throw"; -import "rxjs/add/operator/catch"; -import "rxjs/add/operator/map"; -import { Observable } from "rxjs/Observable"; - -@Injectable() -export class MockVdbService extends VdbService { - - private testDataService: TestDataService; - - constructor(http: Http, appSettings: AppSettingsService, notifierService: NotifierService, logger: LoggerService ) { - super(http, appSettings, notifierService, logger); - - // Inject service for test data - const injector = ReflectiveInjector.resolveAndCreate([TestDataService]); - const testDataService = injector.get(TestDataService); - - this.testDataService = testDataService; - } - - /** - * Get the vdbs from the komodo rest interface - * @returns {Observable} - */ - public getVdbs(): Observable { - return Observable.of(this.testDataService.getVdbs()); - } - - /** - * Get the vdbs from the komodo rest interface - * @returns {Observable} - */ - public getTeiidVdbStatuses(): Observable { - return Observable.of(this.testDataService.getVdbStatuses()); - } - - /** - * Create a vdb via the komodo rest interface - * @param {Vdb} vdb - * @returns {Observable} - */ - public createVdb(vdb: Vdb): Observable { - return Observable.of(true); - } - - /** - * Create a vdb via the komodo rest interface - * @param {string} vdbName - * @param {VdbModel} vdbModel - * @returns {Observable} - */ - public createVdbModel(vdbName: string, vdbModel: VdbModel): Observable { - return Observable.of(true); - } - - /** - * Create a vdbModelSource via the komodo rest interface - * @param {string} vdbName the vdb name - * @param {string} modelName the model name - * @param {VdbModelSource} vdbModelSource the modelsource name - * @returns {Observable} - */ - public createVdbModelSource(vdbName: string, modelName: string, vdbModelSource: VdbModelSource): Observable { - return Observable.of(true); - } - - /** - * Determine if the workspace has a vdb with the supplied name - * @param {string} vdbName the name of the VDB - * @returns {Observable} - */ - public hasWorkspaceVdb(vdbName: string): Observable { - return Observable.of(true); - } - - /** - * Delete a vdb via the komodo rest interface - * @param {string} vdbId - * @returns {Observable} - */ - public deleteVdb(vdbId: string): Observable { - return Observable.of(true); - } - - /** - * Delete a vdb if found via the komodo rest interface - * @param {string} vdbId - * @returns {Observable} - */ - public deleteVdbIfFound(vdbId: string): Observable { - return Observable.of(true); - } - - /** - * Deploys the workspace VDB with the provided name - * @param {string} vdbName - * @returns {Observable} - */ - public deployVdb(vdbName: string): Observable { - return Observable.of(true); - } - - /** - * Undeploy a vdb from the teiid server - * @param {string} vdbId - * @returns {Observable} - */ - public undeployVdb(vdbId: string): Observable { - return Observable.of(true); - } - - /** - * Polls the server for the specified VDB. Polling will terminate if - * (1) The VDB is active - * (2) The VDB is in a failed state - * (3) The polling duration has lapsed - * @param {string} vdbName the name of the VDB - * @param {number} pollDurationSec the duration (sec) to poll the server - * @param {number} pollIntervalSec the interval (sec) between polling attempts - */ - public pollForActiveVdb(vdbName: string, pollDurationSec: number, pollIntervalSec: number): void { - const pollIntervalMillis = pollIntervalSec * 1000; - const timer = Observable.timer(1000, pollIntervalMillis); - this.deploymentSubscription = timer.subscribe(( t: any ) => { - const vdbStatus = new VdbStatus(); - vdbStatus.setName( vdbName ); - vdbStatus.setActive( true ); - vdbStatus.setLoading( false ); - vdbStatus.setFailed( false ); - - this.notifierService.sendVdbDeploymentStatus( vdbStatus ); - this.deploymentSubscription.unsubscribe(); - } ); - - } - - public getVirtualizations(): Observable< Virtualization[] > { - return Observable.of( this.testDataService.getVirtualizations() ); - } - - public deleteView(vdbName: string, modelName: string, viewName: string): Observable { - return Observable.of(true); - } - - /** - * Query the vdb via the komodo rest interface - * @param {string} query the SQL query - * @param {string} vdbName the vdb name - * @param {number} limit the limit for the number of result rows - * @param {number} offset the offset for the result rows - * @returns {Observable} - */ - public queryVdb(query: string, vdbName: string, limit: number, offset: number): Observable { - return Observable.of(this.testDataService.getQueryResults()); - } - - /** - * Create the workspace VDB Model View if specified view is not found. - * If specified VDB Model View is found, the create attempt is skipped. - * @param {string} vdbName the name of the vdb - * @param {string} modelName the name of the model - * @param {string} viewName the name of the view - * @returns {Observable} - */ - public createVdbModelViewIfNotFound(vdbName: string, modelName: string, viewName: string): Observable { - return Observable.of(true); - } - - /** - * Validates the specified view name within the specified vdb model. If the name contains valid characters - * and the name is unique, the service returns 'null'. Otherwise, a 'string' containing an error message is returned. - * - * @param {string} vdbName the vdb name - * @param {string} modelName the model name - * @param {string} viewName the view name - * @returns {Observable} - */ - public isValidViewName( vdbName: string, modelName: string, viewName: string ): Observable< string > { - // Check that valid names were supplied - // if ( !vdbName || vdbName.length === 0 ) { - // return Observable.of( "VDB name cannot be empty" ); - // } - if ( !modelName || modelName.length === 0 ) { - return Observable.of( "Model name cannot be empty" ); - } - if ( !viewName || viewName.length === 0 ) { - return Observable.of( "View name cannot be empty" ); - } - - // just implement a case where no special characters allowed - for ( let i = 0; i < viewName.length; i++ ) { - const c = viewName.charAt( i ); - - // special characters have the same upper and lower case values - if ( c.toUpperCase() === c.toLowerCase() ) { - return Observable.of( "No special characters allowed" ); - } - } - - // valid - return Observable.of( "" ); - } - -} diff --git a/ui/src/app/dataservices/shared/name-value.model.ts b/ui/src/app/dataservices/shared/name-value.model.ts deleted file mode 100644 index 342078a6..00000000 --- a/ui/src/app/dataservices/shared/name-value.model.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * A model for holding simple name-value pairs. - */ -export class NameValue { - - private readonly name: string; - private readonly value: string; - - constructor(name: string, value: string) { - this.name = name; - this.value = value; - } - - public getName(): string { - return this.name; - } - - public getValue(): string { - return this.value; - } - -} diff --git a/ui/src/app/dataservices/shared/new-dataservice.model.ts b/ui/src/app/dataservices/shared/new-dataservice.model.ts deleted file mode 100644 index 9566a048..00000000 --- a/ui/src/app/dataservices/shared/new-dataservice.model.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class NewDataservice { - - private keng__id: string; - private keng__dataPath: string; - private readonly keng__kType: string; - private tko__description: string; - private readonly workspacePath: string; - - /** - * Constructor - */ - constructor(workspacePath: string) { - this.keng__kType = "Dataservice"; - this.workspacePath = workspacePath; - } - - /** - * @returns {string} the dataservice name (can be null) - */ - public getId(): string { - return this.keng__id; - } - - /** - * @returns {string} the dataservice description (can be null) - */ - public getDescription(): string { - return this.tko__description; - } - - /** - * @param {string} name the dataservice name - */ - public setId( name: string ): void { - this.keng__id = name; - this.keng__dataPath = this.workspacePath + "/" + name; - } - - /** - * @param {string} description the dataservice description (optional) - */ - public setDescription( description?: string ): void { - this.tko__description = description ? description : null; - } - - // overrides toJSON - we do not want the workspace path - public toJSON(): {} { - return { - keng__id: this.keng__id, - keng__dataPath: this.keng__dataPath, - keng__kType: this.keng__kType, - tko__description: this.tko__description - }; - } -} diff --git a/ui/src/app/dataservices/shared/node-selector.ts b/ui/src/app/dataservices/shared/node-selector.ts deleted file mode 100644 index 8936bd3a..00000000 --- a/ui/src/app/dataservices/shared/node-selector.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { SchemaNode } from "@connections/shared/schema-node.model"; - -/** - * The node selector interface - */ -export interface NodeSelector { - - /** - * Determine if any nodes are currently selected - * @returns {boolean} true if one or more nodes are selected - */ - hasSelectedNodes( ): boolean; - - /** - * Get the array of currently selected SchemaNodes - * @returns {SchemaNode[]} the array of selected SchemaNodes (never null, but may be empty) - */ - getSelectedNodes(): SchemaNode[]; - - /** - * Deselect the node if a node with the same name is currently selected. - * @param {SchemaNode} node the table to deselect - */ - deselectNode(node: SchemaNode): void; - -} diff --git a/ui/src/app/dataservices/shared/notifier.service.spec.ts b/ui/src/app/dataservices/shared/notifier.service.spec.ts deleted file mode 100644 index 507630a2..00000000 --- a/ui/src/app/dataservices/shared/notifier.service.spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; - -import { NotifierService } from "./notifier.service"; - -describe("NotifierService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [NotifierService] - }); - }); - - it("should be created", inject([NotifierService], (service: NotifierService) => { - expect(service).toBeTruthy(); - })); -}); diff --git a/ui/src/app/dataservices/shared/notifier.service.ts b/ui/src/app/dataservices/shared/notifier.service.ts deleted file mode 100644 index 542076bb..00000000 --- a/ui/src/app/dataservices/shared/notifier.service.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Injectable } from "@angular/core"; -import { ConnectionStatus } from "@connections/shared/connection-status"; -import { DeploymentState } from "@dataservices/shared/deployment-state.enum"; -import { VdbStatus } from "@dataservices/shared/vdb-status.model"; -import { Virtualization } from "@dataservices/shared/virtualization.model"; -import { Observable } from "rxjs/Observable"; -import { ReplaySubject } from "rxjs/ReplaySubject"; -import { Subject } from "rxjs/Subject"; - -/** - * NotifierService is used to send notifications to any interested components, and for interested components to register - * for notifications - */ -@Injectable() -export class NotifierService { - - private deploymentStatusSubject: Subject = new ReplaySubject(1); - private dataserviceDeployStateSubject: Subject< Map > = new ReplaySubject< Map >(1); - private dataserviceVirtualizationSubject: Subject< Map > = new ReplaySubject< Map >(1); - private connectionStatusSubject: Subject< Map > = new ReplaySubject< Map >(1); - - constructor() { - // Nothing to do - } - - /** - * Sends VdbStatus - * @param {VdbStatus} status the VDB deployment Status - */ - public sendVdbDeploymentStatus(status: VdbStatus): void { - this.deploymentStatusSubject.next(status); - } - - /** - * Get the VdbStatus Observable - * @returns {Observable} - */ - public getVdbDeploymentStatus(): Observable { - return this.deploymentStatusSubject.asObservable(); - } - - /** - * Clears VdbStatus - */ - public clearVdbDeploymentStatus(): void { - this.deploymentStatusSubject.next(null); - } - - /** - * Sends map of dataservice DeploymentState - * @param {Map} stateMap - */ - public sendDataserviceDeployStateMap(stateMap: Map): void { - this.dataserviceDeployStateSubject.next(stateMap); - } - - /** - * Get the map of dataservice DeploymentState - * @returns {Observable>} - */ - public getDataserviceDeployStateMap(): Observable> { - return this.dataserviceDeployStateSubject.asObservable(); - } - - /** - * Clears the dataservice DeploymentState - */ - public clearDataserviceDeployStateMap(): void { - this.dataserviceDeployStateSubject.next(null); - } - - /** - * Sends map of dataservice virtualizations - * @param {Map} stateMap - */ - public sendDataserviceVirtualizationMap(stateMap: Map): void { - this.dataserviceVirtualizationSubject.next(stateMap); - } - - /** - * Get the map of dataservice Virtualization - * @returns {Observable>} - */ - public getDataserviceVirtualizationMap(): Observable> { - return this.dataserviceVirtualizationSubject.asObservable(); - } - - /** - * Clears the dataservice Virtualization - */ - public clearDataserviceVirtualizationMap(): void { - this.dataserviceVirtualizationSubject.next(null); - } - - /** - * Sends map of Connection Status - * @param {Map} statusMap - */ - public sendConnectionStatusMap(statusMap: Map): void { - this.connectionStatusSubject.next(statusMap); - } - - /** - * Get the map of Connection Status - * @returns {Observable>} - */ - public getConnectionStatusMap(): Observable> { - return this.connectionStatusSubject.asObservable(); - } - - /** - * Clears the Connection Status - */ - public clearConnectionStatusMap(): void { - this.connectionStatusSubject.next(null); - } -} diff --git a/ui/src/app/dataservices/shared/path-utils.ts b/ui/src/app/dataservices/shared/path-utils.ts deleted file mode 100644 index cfdf92f8..00000000 --- a/ui/src/app/dataservices/shared/path-utils.ts +++ /dev/null @@ -1,89 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class PathUtils { - - /** - * Return the path, without the leading connection info - * @param {string} sourcePath - * @returns {string} the connection name - */ - public static getPathWithoutConnection(sourcePath: string): string { - if (!sourcePath || sourcePath === null || sourcePath.length === 0) { - return undefined; - } - const indx = sourcePath.indexOf("/"); - return sourcePath.substring(indx + 1); - } - - /** - * Get the connection name from the supplied source path - * @param {string} sourcePath - * @returns {string} the connection name - */ - public static getConnectionName(sourcePath: string): string { - if (!sourcePath || sourcePath === null || sourcePath.length === 0) { - return undefined; - } - const fqnArray = sourcePath.split("/", 10); - - const connectionSegment = fqnArray[0]; - const parts = connectionSegment.split("=", 2); - const connName = parts[1]; - - return connName; - } - - /** - * Get the source name from the supplied source path - * @param {string} sourcePath - * @returns {string} the source name - */ - public static getSourceName(sourcePath: string): string { - if (!sourcePath || sourcePath === null || sourcePath.length === 0) { - return undefined; - } - const fqnArray = sourcePath.split("/", 10); - - const arrayLength = fqnArray.length; - const nodeSeqment = fqnArray[arrayLength - 1]; - const parts = nodeSeqment.split("=", 2); - const nodeName = parts[1]; - - return nodeName; - } - - /** - * Get the source type from the supplied source path - * @param {string} sourcePath - * @returns {string} the source type - */ - public static getSourceType(sourcePath: string): string { - if (!sourcePath || sourcePath === null || sourcePath.length === 0) { - return undefined; - } - const fqnArray = sourcePath.split("/", 10); - - const arrayLength = fqnArray.length; - const nodeSeqment = fqnArray[arrayLength - 1]; - const parts = nodeSeqment.split("=", 2); - const nodeType = parts[0]; - - return nodeType; - } - -} diff --git a/ui/src/app/dataservices/shared/projected-column.model.spec.ts b/ui/src/app/dataservices/shared/projected-column.model.spec.ts deleted file mode 100644 index 51471a60..00000000 --- a/ui/src/app/dataservices/shared/projected-column.model.spec.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ProjectedColumn } from "@dataservices/shared/projected-column.model"; - -describe("ProjectedColumn", () => { - let projCol1: ProjectedColumn; - let projCol2: ProjectedColumn; - - beforeEach(() => { - projCol1 = null; - projCol2 = null; - }); - - it("should create", () => { - console.log("========== [ProjectedColumn] should create"); - projCol1 = ProjectedColumn.create( - { - "name": "colName1", - "type": "string", - "selected": true - } - ); - projCol2 = ProjectedColumn.create( - { - "name": "colName2", - "type": "integer", - "selected": false - } - ); - - expect(projCol1.getName()).toEqual("colName1"); - expect(projCol1.getType()).toEqual("string"); - expect(projCol1.selected).toEqual(true); - - expect(projCol2.getName()).toEqual("colName2"); - expect(projCol2.getType()).toEqual("integer"); - expect(projCol2.selected).toEqual(false); - }); - -}); diff --git a/ui/src/app/dataservices/shared/projected-column.model.ts b/ui/src/app/dataservices/shared/projected-column.model.ts deleted file mode 100644 index 50e81e8b..00000000 --- a/ui/src/app/dataservices/shared/projected-column.model.ts +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * ProjectedColumn model - to hold the column info for projected view columns - */ -export class ProjectedColumn { - - private name: string; - private type: string; - public selected = false; - - /** - * @param {Object} json the JSON representation of ProjectedColumn - * @returns {ProjectedColumn} the new ProjectedColumn (never null) - */ - public static create( json: object = {} ): ProjectedColumn { - const projCol = new ProjectedColumn(); - for (const field of Object.keys(json)) { - if (field === "name") { - projCol.setName(json[field]); - } else if (field === "type") { - projCol.setType(json[field]); - } else if (field === "selected") { - projCol.selected = json[field]; - } - } - return projCol; - } - - constructor() { - // nothing to do - } - - /** - * @returns {string} the column name - */ - public getName(): string { - return this.name; - } - - /** - * @param {string} name the column name - */ - public setName( name?: string ): void { - this.name = name ? name : null; - } - - /** - * @returns {string} the column type - */ - public getType(): string { - return this.type; - } - - /** - * @param {string} type the column type - */ - public setType( type?: string ): void { - this.type = type ? type : ""; - } - - /** - * Determine if the supplied ProjectedColumn is equal to this - * @param {ProjectedColumn} otherCol the other column - */ - public isEqual( otherCol: ProjectedColumn ): boolean { - let equal = false; - if (this.getName() === otherCol.getName() && - this.getType() === otherCol.getType() && - this.selected === otherCol.selected ) { - equal = true; - } - return equal; - } - -} diff --git a/ui/src/app/dataservices/shared/publish-state.enum.ts b/ui/src/app/dataservices/shared/publish-state.enum.ts deleted file mode 100644 index 1f369490..00000000 --- a/ui/src/app/dataservices/shared/publish-state.enum.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * An enumeration of Publishing state - */ -export enum PublishState { - - /** - * not published - */ - NOT_PUBLISHED, - - /** - * submitted - */ - SUBMITTED, - - /** - * configuring - */ - CONFIGURING, - - /** - * building - */ - BUILDING, - - /** - * deploying - */ - DEPLOYING, - - /** - * published - */ - PUBLISHED, - - /** - * failed - */ - FAILED -} diff --git a/ui/src/app/dataservices/shared/query-results.model.spec.ts b/ui/src/app/dataservices/shared/query-results.model.spec.ts deleted file mode 100644 index d4c7e2a6..00000000 --- a/ui/src/app/dataservices/shared/query-results.model.spec.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { QueryResults } from "@dataservices/shared/query-results.model"; - -describe("QueryResults", () => { - let queryResults: QueryResults; - - const employeeJson = { - "columns": [ - { - "name": "ssn", - "label": "ssn", - "type": "string" - }, - { - "name": "firstname", - "label": "firstname", - "type": "string" - }, - { - "name": "lastname", - "label": "lastname", - "type": "string" - }, - { - "name": "st_address", - "label": "st_address", - "type": "string" - }, - { - "name": "apt_number", - "label": "apt_number", - "type": "string" - }, - { - "name": "city", - "label": "city", - "type": "string" - }, - { - "name": "state", - "label": "state", - "type": "string" - }, - { - "name": "zipcode", - "label": "zipcode", - "type": "string" - }, - { - "name": "phone", - "label": "phone", - "type": "string" - } - ], - "rows": [ - { - "row": [ - "CST01002 ", - "Joseph", - "Smith", - "1234 Main Street", - "Apartment 56", - "New York", - "New York", - "10174", - "(646)555-1776" - ] - }, - { - "row": [ - "CST01003 ", - "Nicholas", - "Ferguson", - "202 Palomino Drive", - "", - "Pittsburgh", - "Pennsylvania", - "15071", - "(412)555-4327" - ] - }, - { - "row": [ - "CST01004 ", - "Jane", - "Aire", - "15 State Street", - "", - "Philadelphia", - "Pennsylvania", - "19154", - "(814)555-6789" - ] - }, - { - "row": [ - "CST01005 ", - "Charles", - "Jones", - "1819 Maple Street", - "Apartment 17F", - "Stratford", - "Connecticut", - "06614", - "(203)555-3947" - ] - }, - { - "row": [ - "CST01006 ", - "Virginia", - "Jefferson", - "1710 South 51st Street", - "Apartment 3245", - "New York", - "New York", - "10175", - "(718)555-2693" - ] - }, - { - "row": [ - "CST01007 ", - "Ralph", - "Bacon", - "57 Barn Swallow Avenue", - "", - "Charlotte", - "North Carolina", - "28205", - "(704)555-4576" - ] - }, - { - "row": [ - "CST01008 ", - "Bonnie", - "Dragon", - "88 Cinderella Lane", - "", - "Jacksonville", - "Florida", - "32225", - "(904)555-6514" - ] - }, - { - "row": [ - "CST01009 ", - "Herbert", - "Smith", - "12225 Waterfall Way", - "Building 100, Suite 9", - "Portland", - "Oregon", - "97220", - "(971)555-7803" - ] - }, - { - "row": [ - "CST01015 ", - "Jack", - "Corby", - "1 Lone Star Way", - "", - "Dallas", - "Texas", - "75231", - "(469)555-8023" - ] - }, - { - "row": [ - "CST01019 ", - "Robin", - "Evers", - "1814 Falcon Avenue", - "", - "Atlanta", - "Georgia", - "30355", - "(470)555-4390" - ] - } - ] - }; - - beforeEach(() => { - queryResults = null; - }); - - it("should create", () => { - console.log("========== [QueryResults] should create"); - queryResults = new QueryResults(employeeJson); - - expect(queryResults.getColumns().length).toEqual(9); - expect(queryResults.getRows().length).toEqual(10); - }); - -}); diff --git a/ui/src/app/dataservices/shared/query-results.model.ts b/ui/src/app/dataservices/shared/query-results.model.ts deleted file mode 100644 index 8356a9e9..00000000 --- a/ui/src/app/dataservices/shared/query-results.model.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ColumnData } from "@dataservices/shared/column-data.model"; -import { RowData } from "@dataservices/shared/row-data.model"; - -/** - * QueryResults model - */ -export class QueryResults { - - private columns: ColumnData[] = []; - private rows: RowData[] = []; - - /** - * Constructor - * @param {object} json the representation of the QueryResults - */ - constructor(json: object = {}) { - for (const field of Object.keys(json)) { - if (field === "columns") { - const jsonColumns = json[field]; - const cols: ColumnData[] = []; - for (const arr of jsonColumns) { - const col: ColumnData = new ColumnData(arr); - cols.push(col); - } - this.setColumns(cols); - } else if (field === "rows") { - const jsonRows = json[field]; - const rows: RowData[] = []; - for (const arr of jsonRows) { - const row: RowData = new RowData(arr); - rows.push(row); - } - this.setRows(rows); - } - } - } - - /** - * @returns {ColumnData[]} the column data - */ - public getColumns(): ColumnData[] { - return this.columns; - } - - /** - * @param {ColumnData[]} columns the column data (optional) - */ - public setColumns( columns?: ColumnData[] ): void { - this.columns = columns ? columns : null; - } - - /** - * @returns {RowData[]} the row data - */ - public getRows(): RowData[] { - return this.rows; - } - - /** - * @param {RowData[]} rows the row data (optional) - */ - public setRows( rows?: RowData[] ): void { - this.rows = rows ? rows : null; - } - -} diff --git a/ui/src/app/dataservices/shared/row-data.model.ts b/ui/src/app/dataservices/shared/row-data.model.ts deleted file mode 100644 index 0f7dd97a..00000000 --- a/ui/src/app/dataservices/shared/row-data.model.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * The RowData model - */ -export class RowData { - - private row: string[] = []; - - /** - * Constructor - * @param {object} json the representation of the RowData - */ - constructor(json: object = {}) { - for (const field of Object.keys(json)) { - this[field] = json[field]; - } - } - - /** - * @returns {string[]} the row data array - */ - public getData( ): string[] { - return this.row; - } - -} diff --git a/ui/src/app/dataservices/shared/sql-view.model.ts b/ui/src/app/dataservices/shared/sql-view.model.ts deleted file mode 100644 index bfcd0239..00000000 --- a/ui/src/app/dataservices/shared/sql-view.model.ts +++ /dev/null @@ -1,41 +0,0 @@ - -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class SqlView { - - private viewName: string; - - constructor(name: string) { - this.viewName = name; - } - - /** - * @returns {string} the view name - */ - public get name(): string { - return this.viewName; - } - - /** - * @param {string} name the view name - */ - public set name( name: string ) { - this.viewName = name; - } - -} diff --git a/ui/src/app/dataservices/shared/vdb-model-source.model.ts b/ui/src/app/dataservices/shared/vdb-model-source.model.ts deleted file mode 100644 index 35b11fc7..00000000 --- a/ui/src/app/dataservices/shared/vdb-model-source.model.ts +++ /dev/null @@ -1,129 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * VdbModelSource model - */ -export class VdbModelSource { - - private keng__id: string; - private keng__dataPath: string; - private keng__kType = "VdbModelSource"; - private vdb__sourceJndiName: string; - private vdb__sourceTranslator: string; - private vdb__originConnection: string; - - /** - * @param {Object} json the JSON representation of a VdbModelSource - * @returns {VdbModelSource} the new VdbModelSource (never null) - */ - public static create( json: object = {} ): VdbModelSource { - const vdbModelSource = new VdbModelSource(); - vdbModelSource.setValues( json ); - return vdbModelSource; - } - - constructor() { - // nothing to do - } - - /** - * @returns {string} the vdbModelSource identifier (can be null) - */ - public getId(): string { - return this.keng__id; - } - - /** - * @returns {string} the vdbModelSource dataPath (can be null) - */ - public getDataPath(): string { - return this.keng__dataPath; - } - - /** - * @returns {string} the vdbModelSource type name (can be null) - */ - public getType(): string { - return this.keng__kType; - } - - /** - * @returns {string} the jndi name (can be null) - */ - public getJndiName(): string { - return this.vdb__sourceJndiName; - } - - /** - * @returns {string} the translator name (can be null) - */ - public getTranslatorName(): string { - return this.vdb__sourceTranslator; - } - - /** - * @returns {string} the associated connection path (can be null) - */ - public getOriginConnection(): string { - return this.vdb__originConnection; - } - - /** - * @param {string} id the vdbModelSource identifier (optional) - */ - public setId( id?: string ): void { - this.keng__id = id ? id : null; - } - - /** - * @param {string} dataPath the vdbModelSource dataPath (optional) - */ - public setDataPath( dataPath?: string ): void { - this.keng__dataPath = dataPath ? dataPath : null; - } - - /** - * @param {string} jndiName the jndi name (optional) - */ - public setJndiName( jndiName?: string ): void { - this.vdb__sourceJndiName = jndiName ? jndiName : null; - } - - /** - * @param {string} translator the translator name (optional) - */ - public setTranslatorName( translator?: string ): void { - this.vdb__sourceTranslator = translator ? translator : null; - } - - /** - * @param {string} connectionPath the path to the associated connection (optional) - */ - public setOriginConnection( connectionPath?: string ): void { - this.vdb__originConnection = connectionPath ? connectionPath : null; - } - - /** - * Set all object values using the supplied VdbModelSource json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/dataservices/shared/vdb-model.model.ts b/ui/src/app/dataservices/shared/vdb-model.model.ts deleted file mode 100644 index 215972cf..00000000 --- a/ui/src/app/dataservices/shared/vdb-model.model.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NameValue } from "@dataservices/shared/name-value.model"; - -/** - * VdbModel model - */ -export class VdbModel { - - private keng__id: string; - private keng__dataPath: string; - private keng__kType = "VdbModel"; - private mmcore__modelType: string; - // noinspection JSMismatchedCollectionQueryUpdate - private keng__properties: NameValue[] = []; - - /** - * @param {Object} json the JSON representation of a VdbModel - * @returns {VdbModel} the new VdbModel (never null) - */ - public static create( json: object = {} ): VdbModel { - const vdbModel = new VdbModel(); - vdbModel.setValues( json ); - return vdbModel; - } - - constructor() { - // nothing to do - } - - /** - * @returns {string} the vdbModel identifier (can be null) - */ - public getId(): string { - return this.keng__id; - } - - /** - * @returns {string} the vdbModel dataPath (can be null) - */ - public getDataPath(): string { - return this.keng__dataPath; - } - - /** - * @returns {string} the vdbModel type name (can be null) - */ - public getType(): string { - return this.keng__kType; - } - - /** - * @returns {string} the vdbModel model type - */ - public getModelType(): string { - return this.mmcore__modelType; - } - - /** - * @param {string} id the vdbModel identifier (optional) - */ - public setId( id?: string ): void { - this.keng__id = id ? id : null; - } - - /** - * @param {string} dataPath the vdbModel dataPath (optional) - */ - public setDataPath( dataPath?: string ): void { - this.keng__dataPath = dataPath ? dataPath : null; - } - - /** - * @param {string} modelType the vdbModel type - */ - public setModelType( modelType: string ): void { - this.mmcore__modelType = modelType; - } - - /** - * @param {NameValue[]} props the model properties (optional) - */ - public setProperties( props?: NameValue[] ): void { - this.keng__properties = props ? props : null; - } - - /** - * Set all object values using the supplied VdbModel json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/dataservices/shared/vdb-status.model.spec.ts b/ui/src/app/dataservices/shared/vdb-status.model.spec.ts deleted file mode 100644 index 838c5e29..00000000 --- a/ui/src/app/dataservices/shared/vdb-status.model.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { VdbStatus } from "@dataservices/shared/vdb-status.model"; - -describe("VdbStatus", () => { - let vdbStatus: VdbStatus; - - beforeEach(() => { - vdbStatus = null; - }); - - it("should create", () => { - console.log("========== [VdbStatus] should create"); - vdbStatus = VdbStatus.create( - { - "name": "acctsVdb", - "deployedName": "acctsVdb-vdb.xml", - "version": "1", - "active": true, - "loading": false, - "failed": false, - "errors": [] - } - ); - - expect(vdbStatus.getName()).toEqual("acctsVdb"); - expect(vdbStatus.getDeployedName()).toEqual("acctsVdb-vdb.xml"); - expect(vdbStatus.getVersion()).toEqual("1"); - expect(vdbStatus.getErrors()).toEqual([]); - expect(vdbStatus.isActive()).toEqual(true); - expect(vdbStatus.isLoading()).toEqual(false); - expect(vdbStatus.isFailed()).toEqual(false); - }); - -}); diff --git a/ui/src/app/dataservices/shared/vdb-status.model.ts b/ui/src/app/dataservices/shared/vdb-status.model.ts deleted file mode 100644 index 2b310105..00000000 --- a/ui/src/app/dataservices/shared/vdb-status.model.ts +++ /dev/null @@ -1,151 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * VdbStatus model - */ -export class VdbStatus { - - private name: string; - private deployedName: string; - private version = "1"; - private active = false; - private loading = false; - private failed = false; - private errors: string[] = []; - - /** - * @param {Object} json the JSON representation of a VdbStatus - * @returns {VdbStatus} the new VdbStatus (never null) - */ - public static create( json: object = {} ): VdbStatus { - const vdbStatus = new VdbStatus(); - vdbStatus.setValues( json ); - return vdbStatus; - } - - constructor() { - // nothing to do - } - - /** - * @returns {string} the vdbStatus name - */ - public getName(): string { - return this.name; - } - - /** - * @returns {string} the vdbStatus deployedName - */ - public getDeployedName(): string { - return this.deployedName; - } - - /** - * @returns {string} the vdbStatus version (can be null) - */ - public getVersion(): string { - return this.version; - } - - /** - * @returns {boolean} the vdbStatus active state - */ - public isActive(): boolean { - return this.active; - } - - /** - * @returns {boolean} the vdbStatus loading state - */ - public isLoading(): boolean { - return this.loading; - } - - /** - * @returns {boolean} the vdbStatus failed state - */ - public isFailed(): boolean { - return this.failed; - } - - /** - * @returns {string[]} the errors (never null) - */ - public getErrors(): string[] { - return this.errors; - } - - /** - * @param {string} name the vdbStatus name - */ - public setName( name: string ): void { - this.name = name; - } - - /** - * @param {string} deployedName the vdbStatus deployedName - */ - public setDeployedName( deployedName: string ): void { - this.deployedName = deployedName; - } - - /** - * @param {string} version the vdbStatus version (optional) - */ - public setVersion( version?: string ): void { - this.version = version ? version : "1"; - } - - /** - * @param {boolean} active the active state - */ - public setActive( active: boolean ): void { - this.active = active; - } - - /** - * @param {boolean} loading the loading state - */ - public setLoading( loading: boolean ): void { - this.loading = loading; - } - - /** - * @param {boolean} failed the failed state - */ - public setFailed( failed: boolean ): void { - this.failed = failed; - } - - /** - * @param {[string]} errors the status errors - */ - public setErrors( errors: string[] ): void { - this.errors = errors; - } - - /** - * Set all object values using the supplied VdbStatus json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/dataservices/shared/vdb.model.ts b/ui/src/app/dataservices/shared/vdb.model.ts deleted file mode 100644 index 6df84a81..00000000 --- a/ui/src/app/dataservices/shared/vdb.model.ts +++ /dev/null @@ -1,201 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Identifiable } from "@shared/identifiable"; -import { SortDirection } from "@shared/sort-direction.enum"; - -/** - * Vdb model - */ -export class Vdb implements Identifiable< string > { - - private keng__id: string; - private vdb__description: string; - private keng__dataPath: string; - private keng__kType = "Vdb"; - private vdb__name: string; - private vdb__originalFile: string; - private vdb__preview: boolean; - private vdb__version: string; - - /** - * @param {Object} json the JSON representation of a Vdb - * @returns {Vdb} the new Vdb (never null) - */ - public static create( json: object = {} ): Vdb { - const vdb = new Vdb(); - vdb.setValues( json ); - return vdb; - } - - /** - * @param {Vdb[]} vdbs the vdbs being sorted - * @param {SortDirection} sortDirection the sort direction - */ - public static sort( vdbs: Vdb[], - sortDirection: SortDirection ): void { - vdbs.sort( ( thisVdb: Vdb, thatVdb: Vdb ) => { - const result = thisVdb.compareTo( thatVdb ); - - if ( sortDirection === SortDirection.DESC ) { - return result * -1; - } - - return result; - } ); - } - - constructor() { - // nothing to do - } - - /** - * See {Identifiable}. - */ - public compareTo( that: Vdb ): number { - let result = 0; - - if ( this.getId() ) { - if ( that.getId() ) { - // both have an ID - result = this.getId().localeCompare( that.getId() ); - } else { - // thatItem does not have an ID - result = 1; - } - } else if ( that.getId() ) { - // thisItem does not have an ID and thatItem does - result = -1; - } - - return result; - } - - /** - * @returns {string} the vdb identifier (can be null) - */ - public getId(): string { - return this.keng__id; - } - - /** - * @returns {string} the vdb name (can be null) - */ - public getName(): string { - return this.vdb__name; - } - - /** - * @returns {string} the vdb description (can be null) - */ - public getDescription(): string { - return this.vdb__description; - } - - /** - * @returns {string} the vdb dataPath (can be null) - */ - public getDataPath(): string { - return this.keng__dataPath; - } - - /** - * @returns {string} the vdb originalFile (can be null) - */ - public getOriginalFile(): string { - return this.vdb__originalFile; - } - - /** - * @returns {string} the vdb type name (can be null) - */ - public getType(): string { - return this.keng__kType; - } - - /** - * @returns {boolean} the vdb preview status - */ - public isPreview(): boolean { - return this.vdb__preview; - } - - /** - * @returns {string} the vdb type name (can be null) - */ - public getVersion(): string { - return this.vdb__version; - } - - /** - * @param {string} id the vdb identifier (optional) - */ - public setId( id?: string ): void { - this.keng__id = id ? id : null; - } - - /** - * @param {string} name the vdb name (optional) - */ - public setName( name?: string ): void { - this.vdb__name = name ? name : null; - } - - /** - * @param {string} description the vdb description (optional) - */ - public setDescription( description?: string ): void { - this.vdb__description = description ? description : null; - } - - /** - * @param {string} dataPath the vdb dataPath (optional) - */ - public setDataPath( dataPath?: string ): void { - this.keng__dataPath = dataPath ? dataPath : null; - } - - /** - * @param {string} originalFile the vdb originalFile (optional) - */ - public setOriginalFile( originalFile?: string ): void { - this.vdb__originalFile = originalFile ? originalFile : null; - } - - /** - * @param {boolean} preview the vdb preview status - */ - public setPreview( preview: boolean ): void { - this.vdb__preview = preview; - } - - /** - * @param {string} version the vdb version - */ - public setVersion( version?: string ): void { - this.vdb__version = version; - } - - /** - * Set all object values using the supplied Vdb json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/dataservices/shared/vdb.service.spec.ts b/ui/src/app/dataservices/shared/vdb.service.spec.ts deleted file mode 100644 index 55e90f94..00000000 --- a/ui/src/app/dataservices/shared/vdb.service.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; -import { HttpModule } from "@angular/http"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; - -describe("VdbService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ HttpModule ], - providers: [ - VdbService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - NotifierService, - LoggerService - ] - }); - }); - - it("should be created", inject([VdbService, AppSettingsService, LoggerService], - ( service: VdbService ) => { - console.log("========== [VdbService] should be created"); - expect(service).toBeTruthy(); - })); -}); diff --git a/ui/src/app/dataservices/shared/vdb.service.ts b/ui/src/app/dataservices/shared/vdb.service.ts deleted file mode 100644 index c8fc0aec..00000000 --- a/ui/src/app/dataservices/shared/vdb.service.ts +++ /dev/null @@ -1,455 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable } from "@angular/core"; -import { Http } from "@angular/http"; -import { ApiService } from "@core/api.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbModelSource } from "@dataservices/shared/vdb-model-source.model"; -import { VdbModel } from "@dataservices/shared/vdb-model.model"; -import { VdbStatus } from "@dataservices/shared/vdb-status.model"; -import { Vdb } from "@dataservices/shared/vdb.model"; -import { VdbsConstants } from "@dataservices/shared/vdbs-constants"; -import { Virtualization } from "@dataservices/shared/virtualization.model"; -import { environment } from "@environments/environment"; -import { Observable } from "rxjs/Rx"; -import { Subscription } from "rxjs/Subscription"; -import { QueryResults } from "@dataservices/shared/query-results.model"; - -@Injectable() -/** - * VdbService - */ -export class VdbService extends ApiService { - - protected deploymentSubscription: Subscription; - protected notifierService: NotifierService; - private http: Http; - - constructor(http: Http, appSettings: AppSettingsService, - notifierService: NotifierService, logger: LoggerService ) { - super( appSettings, logger ); - this.http = http; - this.notifierService = notifierService; - } - - /** - * Get the vdbs from the komodo rest interface - * @returns {Observable} - */ - public getVdbs(): Observable { - return this.http - .get(environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath, this.getAuthRequestOptions()) - .map((response) => { - const vdbs = response.json(); - return vdbs.map((vdb) => Vdb.create( vdb )); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Determine if the workspace has a vdb with the supplied name - * @param {string} vdbName the name of the VDB - * @returns {Observable} - */ - public hasWorkspaceVdb(vdbName: string): Observable { - return this.http - .get(environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath + "/" + vdbName, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch((error) => { - // VDB not found returns a 404 - if (error.status === 404) { - return Observable.of(false); - } - this.handleError( error ); - } ); - } - - /** - * Determine if the workspace has the specified vdb model view - * @param {string} vdbName the name of the VDB - * @param {string} modelName the name of the Model - * @param {string} viewName the name of the View - * @returns {Observable} - */ - public hasWorkspaceVdbModelView(vdbName: string, modelName: string, viewName: string): Observable { - const url = environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath + "/" + vdbName - + VdbsConstants.vdbModelsRootPath + "/" + modelName + "/Views/" + viewName; - - return this.http - .get(url, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch((error) => { - // VDB not found returns a 404 - if (error.status === 404) { - return Observable.of(false); - } - this.handleError( error ); - } ); - } - - /** - * Get the status of any deployed vdbs - * @returns {Observable} - */ - public getTeiidVdbStatuses(): Observable { - return this.http - .get(environment.komodoTeiidUrl + VdbsConstants.statusPath + VdbsConstants.vdbsRootPath, this.getAuthRequestOptions()) - .map((response) => { - const vdbStatuses = response.json(); - return vdbStatuses.vdbs.map((vdbStatus) => VdbStatus.create( vdbStatus )); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Get the status of all published vdbs (virtualizations) - * @returns {Observable} - */ - public getVirtualizations(): Observable { - return this.http - .get(environment.komodoTeiidUrl + "/" + VdbsConstants.vdbPublish, this.getAuthRequestOptions()) - .map((response) => { - const virtuals = response.json(); - return virtuals.map((virtualStatus) => Virtualization.create( virtualStatus )); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Validates the specified view name within the specified vdb model. If the name contains valid characters - * and the name is unique, the service returns 'null'. Otherwise, a 'string' containing an error message is returned. - * - * @param {string} vdbName the vdb name - * @param {string} modelName the model name - * @param {string} viewName the view name - * @returns {Observable} - */ - public isValidViewName( vdbName: string, modelName: string, viewName: string ): Observable< string > { - // Check that valid names were supplied - if ( !vdbName || vdbName.length === 0 ) { - return Observable.of( "VDB name cannot be empty" ); - } - if ( !modelName || modelName.length === 0 ) { - return Observable.of( "Model name cannot be empty" ); - } - if ( !viewName || viewName.length === 0 ) { - return Observable.of( "View name cannot be empty" ); - } - - const url = environment.komodoWorkspaceUrl + "/vdbs/" + vdbName + "/Models/" + modelName + - "/Views/nameValidation/" + encodeURIComponent( viewName ); - - return this.http.get( url, this.getAuthRequestOptions() ) - .map( ( response ) => { - if ( response.ok ) { - if ( response.text() ) { - return response.text(); - } - - return ""; - } } ) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Query the vdb via the komodo rest interface - * @param {string} query the SQL query - * @param {string} vdbName the vdb name - * @param {number} limit the limit for the number of result rows - * @param {number} offset the offset for the result rows - * @returns {Observable} - */ - public queryVdb(query: string, vdbName: string, limit: number, offset: number): Observable { - // The payload for the rest call - const payload = { - "query": query, - "target": vdbName, - "limit": limit, - "offset": offset - }; - - const url = environment.komodoTeiidUrl + "/query"; - - return this.http - .post(url, payload, this.getAuthRequestOptions()) - .map((response) => { - const queryResults = response.json(); - return new QueryResults(queryResults); - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Create a vdb via the komodo rest interface - * @param {Vdb} vdb - * @returns {Observable} - */ - public createVdb(vdb: Vdb): Observable { - return this.http - .post(environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath + "/" + vdb.getId(), - vdb, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Create a vdb via the komodo rest interface - * @param {string} vdbName - * @param {VdbModel} vdbModel - * @returns {Observable} - */ - public createVdbModel(vdbName: string, vdbModel: VdbModel): Observable { - const str = JSON.stringify(vdbModel); - return this.http - .post(environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath + "/" + vdbName - + VdbsConstants.vdbModelsRootPath + "/" + vdbModel.getId(), - str, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Create a vdbModelSource via the komodo rest interface - * @param {string} vdbName the vdb name - * @param {string} modelName the model name - * @param {VdbModelSource} vdbModelSource the modelsource name - * @returns {Observable} - */ - public createVdbModelSource(vdbName: string, modelName: string, vdbModelSource: VdbModelSource): Observable { - return this.http - .post(environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath + "/" + vdbName - + VdbsConstants.vdbModelsRootPath + "/" + modelName - + VdbsConstants.vdbModelSourcesRootPath + "/" + vdbModelSource.getId(), - vdbModelSource, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Create a vdb model view via the komodo rest interface - * @param {string} vdbName - * @param {string} modelName - * @param {string} viewName - * @returns {Observable} - */ - public createVdbModelView(vdbName: string, modelName: string, viewName: string): Observable { - // The payload for the rest call - const userWorkspacePath = this.getKomodoUserWorkspacePath(); - const payload = { - "keng__id": viewName, - "keng__kType": "View", - "keng__dataPath": userWorkspacePath + "/" + vdbName + "/" + modelName + "/" + viewName, - }; - - const url = environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath + "/" + vdbName - + VdbsConstants.vdbModelsRootPath + "/" + modelName + "/Views/" + viewName; - const paystr = JSON.stringify(payload); - - return this.http - .post(url, paystr, this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Delete a vdb via the komodo rest interface - * @param {string} vdbId - * @returns {Observable} - */ - public deleteVdb(vdbId: string): Observable { - return this.http - .delete(environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath + "/" + vdbId, - this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Deploys the workspace VDB with the provided name - * @param {string} vdbName - * @returns {Observable} - */ - public deployVdb(vdbName: string): Observable { - const vdbPath = this.getKomodoUserWorkspacePath() + "/" + vdbName; - return this.http - .post(environment.komodoTeiidUrl + VdbsConstants.vdbRootPath, - { path: vdbPath}, this.getAuthRequestOptions()) - .map((response) => { - const status = response.json(); - if (status.Information.deploymentSuccess !== "true") { - this.handleError(response); - } - - return status.Information.deploymentSuccess === "true"; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Undeploy a vdb from the teiid server - * @param {string} vdbId - * @returns {Observable} - */ - public undeployVdb(vdbId: string): Observable { - return this.http - .delete(environment.komodoTeiidUrl + VdbsConstants.vdbsRootPath + "/" + vdbId, - this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Polls the server for the specified VDB. Polling will terminate if - * (1) The VDB is active - * (2) The VDB is in a failed state - * (3) The polling duration has lapsed - * @param {string} vdbName the name of the VDB - * @param {number} pollDurationSec the duration (sec) to poll the server - * @param {number} pollIntervalSec the interval (sec) between polling attempts - */ - public pollForActiveVdb(vdbName: string, pollDurationSec: number, pollIntervalSec: number): void { - const pollIntervalMillis = pollIntervalSec * 1000; - const pollIterations = pollDurationSec / pollIntervalSec; - - let pollCount = 0; - const self = this; - // start a timer after one second - const timer = Observable.timer(1000, pollIntervalMillis); - this.deploymentSubscription = timer.subscribe((t: any) => { - this.getTeiidVdbStatuses() - .subscribe( - (resp) => { - for ( const vdbStatus of resp ) { - if ( vdbStatus.getName() !== vdbName ) { - continue; - } - if ( vdbStatus.isActive() ) { - this.notifierService.sendVdbDeploymentStatus(vdbStatus); - self.deploymentSubscription.unsubscribe(); - } else if ( vdbStatus.isFailed() ) { - this.notifierService.sendVdbDeploymentStatus(vdbStatus); - self.deploymentSubscription.unsubscribe(); - } - } - pollCount++; - if (pollCount > pollIterations) { - // Timed out status - const status: VdbStatus = new VdbStatus(); - status.setName(vdbName); - status.setActive(false); - status.setLoading(false); - status.setFailed(true); - const errors: string[] = []; - errors.push("Deployment polling timed out"); - status.setErrors(errors); - // broadcast the status - this.notifierService.sendVdbDeploymentStatus(status); - self.deploymentSubscription.unsubscribe(); - } - }, - (error) => { - // Error status - const status: VdbStatus = new VdbStatus(); - status.setName(vdbName); - status.setActive(false); - status.setLoading(false); - status.setFailed(true); - const errors: string[] = []; - errors.push("Deployment failed"); - status.setErrors(errors); - // Broadcast the status - this.notifierService.sendVdbDeploymentStatus(status); - self.deploymentSubscription.unsubscribe(); - } - ); - }); - } - - /** - * Deletes the workspace VDB if found. Checks the workspace first, before attempting the delete. - * If the VDB is not found the delete attempt is skipped. - * @param {string} vdbName the name of the vdb - * @returns {Observable} - */ - public deleteVdbIfFound(vdbName: string): Observable { - return this.hasWorkspaceVdb(vdbName) - .switchMap( (resp) => { - if (resp === true) { - return this.deleteVdb(vdbName); - } else { - return Observable.of(true); - } - }); - } - - /** - * Delete a view within a vdb model via the komodo rest interface - * @param {string} vdbName the vdb name - * @param {string} modelName the model name - * @param {string} viewName the view name - * @returns {Observable} 'true' if successful - */ - public deleteView(vdbName: string, modelName: string, viewName: string): Observable { - return this.http - .delete(environment.komodoWorkspaceUrl + VdbsConstants.vdbsRootPath + "/" + vdbName - + "/Models/" + modelName + "/Views/" + viewName, - this.getAuthRequestOptions()) - .map((response) => { - return response.ok; - }) - .catch( ( error ) => this.handleError( error ) ); - } - - /** - * Deletes the workspace VDB model view if found. Checks the workspace first, before attempting the delete. - * If the View is not found the delete attempt is skipped. - * @param {string} vdbName the name of the vdb - * @param {string} modelName the name of the model - * @param {string} viewName the name of the view - * @returns {Observable} - */ - public deleteViewIfFound(vdbName: string, modelName: string, viewName: string): Observable { - return this.hasWorkspaceVdbModelView(vdbName, modelName, viewName) - .switchMap( (resp) => { - if (resp === true) { - return this.deleteView(vdbName, modelName, viewName); - } else { - return Observable.of(true); - } - }); - } - -} diff --git a/ui/src/app/dataservices/shared/vdbs-constants.ts b/ui/src/app/dataservices/shared/vdbs-constants.ts deleted file mode 100644 index d18f5329..00000000 --- a/ui/src/app/dataservices/shared/vdbs-constants.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, / - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class VdbsConstants { - - public static readonly SERVICE_VIEW_MODEL_NAME = "views"; // ** must match KomodoDataserviceService.SERVICE_VDB_VIEW_MODEL ** - public static readonly SCHEMA_VDB_SUFFIX = "schemavdb"; - public static readonly SCHEMA_MODEL_SUFFIX = "schemamodel"; - public static readonly DATASERVICE_VDB_SUFFIX = "vdb"; - public static readonly DEFAULT_READONLY_DATA_ROLE = "DefaultReadOnlyDataRole"; - public static readonly PREVIEW_VDB_NAME = "PreviewVdb"; - - public static readonly statusPath = "/status"; - - public static readonly vdbRootRoute = "vdb"; - public static readonly vdbRootPath = "/" + VdbsConstants.vdbRootRoute; - - public static readonly vdbsRootRoute = "vdbs"; - public static readonly vdbsRootPath = "/" + VdbsConstants.vdbsRootRoute; - - public static readonly vdbModelsRootRoute = "Models"; - public static readonly vdbModelsRootPath = "/" + VdbsConstants.vdbModelsRootRoute; - - public static readonly vdbModelSourcesRootRoute = "VdbModelSources"; - public static readonly vdbModelSourcesRootPath = "/" + VdbsConstants.vdbModelSourcesRootRoute; - - public static readonly vdbPublish = "publish"; -} diff --git a/ui/src/app/dataservices/shared/view-definition.model.spec.ts b/ui/src/app/dataservices/shared/view-definition.model.spec.ts deleted file mode 100644 index ae859ca4..00000000 --- a/ui/src/app/dataservices/shared/view-definition.model.spec.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { ViewDefinition } from "@dataservices/shared/view-definition.model"; -import { CompositionOperator } from "@dataservices/shared/composition-operator.enum"; -import { CompositionType } from "@dataservices/shared/composition-type.enum"; - -describe("ViewDefinition", () => { - let viewDefn1: ViewDefinition; - let viewDefn2: ViewDefinition; - - beforeEach(() => { - viewDefn1 = null; - viewDefn2 = null; - }); - - it("should create", () => { - console.log("========== [ViewDefinition] should create"); - viewDefn1 = ViewDefinition.create( - { - "viewName": "viewDefnName", - "keng__description": "viewDescription", - "isComplete": true, - "sourcePaths": - [ - "connection=pgConn/schema=public/table=account", - "connection=pgConn/schema=public/table=holdings" - ], - "compositions": - [ - { - "name": "compositionName", - "leftSourcePath": "connection=pgConn/schema=public/table=account", - "rightSourcePath": "connection=pgConn/schema=public/table=holdings", - "leftCriteriaColumn": "leftCriteriaCol", - "rightCriteriaColumn": "rightCriteriaCol", - "type": "INNER_JOIN", - "operator": "EQ" - } - ], - "projectedColumns": [ - { - "name": "ALL", - "type": "ALL", - "selected": true - } - ] - } - ); - - viewDefn2 = ViewDefinition.create( - { - "viewName": "viewDefnName", - "keng__description": "viewDescription", - "isComplete": true, - "sourcePaths": - [ - "connection=pgConn/schema=public/table=account", - "connection=pgConn/schema=public/table=holdings" - ], - "compositions": - [ - { - "name": "compositionName", - "leftSourcePath": "connection=pgConn/schema=public/table=account", - "rightSourcePath": "connection=pgConn/schema=public/table=holdings", - "leftCriteriaColumn": "leftCriteriaCol", - "rightCriteriaColumn": "rightCriteriaCol", - "type": "INNER_JOIN", - "operator": "EQ" - } - ], - "projectedColumns": [ - { - "name": "col1", - "type": "string", - "selected": true - }, - { - "name": "col2", - "type": "integer", - "selected": false - }, - { - "name": "col3", - "type": "string", - "selected": true - } - ] - } - ); - - expect(viewDefn1.getName()).toEqual("viewDefnName"); - expect(viewDefn1.getDescription()).toEqual("viewDescription"); - expect(viewDefn1.complete).toEqual(true); - expect(viewDefn1.getSourcePaths().length).toEqual(2); - expect(viewDefn1.getSourcePaths()[0]).toEqual("connection=pgConn/schema=public/table=account"); - expect(viewDefn1.getSourcePaths()[1]).toEqual("connection=pgConn/schema=public/table=holdings"); - expect(viewDefn1.getCompositions().length).toEqual(1); - expect(viewDefn1.getCompositions()[0].getName()).toEqual("compositionName"); - expect(viewDefn1.getCompositions()[0].getLeftSourcePath()).toEqual("connection=pgConn/schema=public/table=account"); - expect(viewDefn1.getCompositions()[0].getRightSourcePath()).toEqual("connection=pgConn/schema=public/table=holdings"); - expect(viewDefn1.getCompositions()[0].getLeftCriteriaColumn()).toEqual("leftCriteriaCol"); - expect(viewDefn1.getCompositions()[0].getRightCriteriaColumn()).toEqual("rightCriteriaCol"); - expect(viewDefn1.getCompositions()[0].getType()).toEqual(CompositionType.INNER_JOIN); - expect(viewDefn1.getCompositions()[0].getOperator()).toEqual(CompositionOperator.EQ); - expect(viewDefn1.getProjectedColumns().length).toEqual(1); - expect(viewDefn1.getProjectedColumns()[0].getName()).toEqual("ALL"); - expect(viewDefn1.getProjectedColumns()[0].getType()).toEqual("ALL"); - expect(viewDefn1.getProjectedColumns()[0].selected).toEqual(true); - expect(viewDefn1.getPreviewSql()).toEqual("SELECT * FROM pgconnschemamodel.account AS A INNER JOIN pgconnschemamodel.holdings AS B ON A.leftCriteriaCol = B.rightCriteriaCol;"); - - expect(viewDefn2.getName()).toEqual("viewDefnName"); - expect(viewDefn2.getDescription()).toEqual("viewDescription"); - expect(viewDefn2.complete).toEqual(true); - expect(viewDefn2.getSourcePaths().length).toEqual(2); - expect(viewDefn2.getSourcePaths()[0]).toEqual("connection=pgConn/schema=public/table=account"); - expect(viewDefn2.getSourcePaths()[1]).toEqual("connection=pgConn/schema=public/table=holdings"); - expect(viewDefn2.getCompositions().length).toEqual(1); - expect(viewDefn2.getCompositions()[0].getName()).toEqual("compositionName"); - expect(viewDefn2.getCompositions()[0].getLeftSourcePath()).toEqual("connection=pgConn/schema=public/table=account"); - expect(viewDefn2.getCompositions()[0].getRightSourcePath()).toEqual("connection=pgConn/schema=public/table=holdings"); - expect(viewDefn2.getCompositions()[0].getLeftCriteriaColumn()).toEqual("leftCriteriaCol"); - expect(viewDefn2.getCompositions()[0].getRightCriteriaColumn()).toEqual("rightCriteriaCol"); - expect(viewDefn2.getCompositions()[0].getType()).toEqual(CompositionType.INNER_JOIN); - expect(viewDefn2.getCompositions()[0].getOperator()).toEqual(CompositionOperator.EQ); - expect(viewDefn2.getProjectedColumns().length).toEqual(3); - expect(viewDefn2.getProjectedColumns()[0].getName()).toEqual("col1"); - expect(viewDefn2.getProjectedColumns()[0].getType()).toEqual("string"); - expect(viewDefn2.getProjectedColumns()[0].selected).toEqual(true); - expect(viewDefn2.getProjectedColumns()[1].getName()).toEqual("col2"); - expect(viewDefn2.getProjectedColumns()[1].getType()).toEqual("integer"); - expect(viewDefn2.getProjectedColumns()[1].selected).toEqual(false); - expect(viewDefn2.getProjectedColumns()[2].getName()).toEqual("col3"); - expect(viewDefn2.getProjectedColumns()[2].getType()).toEqual("string"); - expect(viewDefn2.getProjectedColumns()[2].selected).toEqual(true); - expect(viewDefn2.getPreviewSql()).toEqual("SELECT col1, col3 FROM pgconnschemamodel.account AS A INNER JOIN pgconnschemamodel.holdings AS B ON A.leftCriteriaCol = B.rightCriteriaCol;"); - - }); - -}); diff --git a/ui/src/app/dataservices/shared/view-definition.model.ts b/ui/src/app/dataservices/shared/view-definition.model.ts deleted file mode 100644 index 2c26a5df..00000000 --- a/ui/src/app/dataservices/shared/view-definition.model.ts +++ /dev/null @@ -1,601 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Composition } from "@dataservices/shared/composition.model"; -import { PathUtils } from "@dataservices/shared/path-utils"; -import { VdbsConstants } from "@dataservices/shared/vdbs-constants"; -import { CompositionOperator } from "@dataservices/shared/composition-operator.enum"; -import { CompositionType } from "@dataservices/shared/composition-type.enum"; -import { ProjectedColumn } from "@dataservices/shared/projected-column.model"; - -/** - * ViewDefinition model - */ -export class ViewDefinition { - private viewName: string; - private keng__description = ""; - private isEditable = false; - private sourcePaths: string[] = []; - private compositions: Composition[] = []; - private isSelected = false; - private projectedColumns: ProjectedColumn[] = []; - private defaultProjectedColumns: ProjectedColumn[] = []; - - /** - * @param {Object} json the JSON representation of a ViewDefinition - * @returns {ViewDefinition} the new ViewDefinition (never null) - */ - public static create( json: object = {} ): ViewDefinition { - const viewDefn = new ViewDefinition(); - for (const field of Object.keys(json)) { - if (field === "viewName") { - viewDefn.setName(json[field]); - } else if (field === "keng__description") { - viewDefn.setDescription(json[field]); - } else if (field === "sourcePaths") { - const arrayElems = json[field]; - for (const arrayElem of arrayElems) { - if (arrayElem.length > 0) { - viewDefn.addSourcePath(arrayElem); - } - } - } else if (field === "compositions") { - const arrayElems = json[field]; - for (const arrayElem of arrayElems) { - const compStr = JSON.stringify(arrayElem); - if (compStr.length > 2) { - const comp = Composition.create(arrayElem); - viewDefn.addComposition(comp); - } - } - } else if (field === "projectedColumns") { - const arrayElems = json[field]; - const cols: ProjectedColumn[] = []; - for (const arrayElem of arrayElems) { - const compStr = JSON.stringify(arrayElem); - if (compStr.length > 2) { - const col = ProjectedColumn.create(arrayElem); - cols.push(col); - } - } - viewDefn.setProjectedColumns(cols); - } - } - return viewDefn; - } - - /** - * Constructor - */ - constructor() { - // Define the default projected columns ('SELECT *') - const selectStar: ProjectedColumn = new ProjectedColumn(); - selectStar.setName("ALL"); - selectStar.setType("ALL"); - selectStar.selected = true; - this.defaultProjectedColumns.push(selectStar); - - // Init the ViewDefinition with default projected columns - this.initProjectedColumns(); - } - - /** - * @returns {string} the view definition name - */ - public getName(): string { - return this.viewName; - } - - /** - * @param {string} name the view definition name - */ - public setName( name?: string ): void { - this.viewName = name ? name : null; - } - - /** - * @returns {string} the view description - */ - public getDescription(): string { - return this.keng__description; - } - - /** - * @param {string} description the view description - */ - public setDescription( description?: string ): void { - this.keng__description = description ? description : ""; - } - - /** - * @returns {string[]} the view source paths - */ - public getSourcePaths(): string[] { - return this.sourcePaths; - } - - /** - * @param {string[]} sourcePaths the view source paths - */ - public setSourcePaths( sourcePaths: string[] = [] ): void { - this.sourcePaths = sourcePaths; - // change in source paths will re-init the projected columns - this.initProjectedColumns(); - } - - /** - * @returns {Composition[]} the view compositions - */ - public getCompositions(): Composition[] { - return this.compositions; - } - - /** - * @param {Composition[]} compositions the view compositions - */ - public setCompositions( compositions: Composition[] = [] ): void { - this.compositions = compositions; - // change in compositions will re-init the projected columns - this.initProjectedColumns(); - } - - /** - * @returns {ProjectedColumn[]} the view projected columns - */ - public getProjectedColumns(): ProjectedColumn[] { - return this.projectedColumns; - } - - /** - * @param {ProjectedColumns} projColumns the projected columns - */ - public setProjectedColumns( projColumns: ProjectedColumn[] ): void { - this.projectedColumns = projColumns; - } - - /** - * Get the projected columns that are currently selected - * @returns {ProjectedColumn[]} the view selected projected columns - */ - public getSelectedProjectedColumns(): ProjectedColumn[] { - const selectedProjCols: ProjectedColumn[] = []; - for (const projCol of this.getProjectedColumns()) { - if (projCol.selected) { - selectedProjCols.push(projCol); - } - } - return selectedProjCols; - } - - /** - * Add Composition to the View - * - * @param {Composition} compositionToAdd the composition to add - */ - public addComposition( compositionToAdd: Composition ): void { - const index = this.compositions.findIndex( ( comp ) => comp.getName() === compositionToAdd.getName() ); - - if ( index === -1 ) { - this.compositions.push( compositionToAdd ); - // adding composition will re-init the projected columns - this.initProjectedColumns(); - } - } - - /** - * @param {string} compositionToRemove the composition name to remove - */ - public removeComposition( compositionToRemove: string ): void { - const index = this.compositions.findIndex( ( comp ) => comp.getName() === compositionToRemove ); - - if ( index !== -1 ) { - this.compositions.splice( index, 1 ); - // removing composition will re-init the projected columns - this.initProjectedColumns(); - } - } - - /** - * Add source path to the list of source paths - * - * @param {string} sourcePathToAdd the source path to add - */ - public addSourcePath( sourcePathToAdd: string ): void { - const index = this.sourcePaths.findIndex( ( sPath ) => - sPath === sourcePathToAdd - ); - - if ( index === -1 ) { - this.sourcePaths.push( sourcePathToAdd ); - // adding source will re-init the projected columns - this.initProjectedColumns(); - } - } - - /** - * Add source paths to the list of source paths. - * - * @param {string[]} sourcePathsToAdd the source paths being added - */ - public addSourcePaths( sourcePathsToAdd: string[] = [] ): void { - const self = this; - - sourcePathsToAdd.forEach( ( sourcePath ) => { - self.addSourcePath( sourcePath ); - } ); - } - - /** - * @param {string} sourcePathToRemove the source path to remove - */ - public removeSourcePath( sourcePathToRemove: string ): void { - const index = this.sourcePaths.findIndex( ( sourcePath ) => - sourcePath === sourcePathToRemove ); - - if ( index !== -1 ) { - this.sourcePaths.splice( index, 1 ); - // remove source will re-init the projected columns - this.initProjectedColumns(); - } - } - - /** - * @param {string[]} sourcePathsToRemove the source paths to remove - */ - public removeSourcePaths( sourcePathsToRemove: string[] ): void { - const self = this; - - sourcePathsToRemove.forEach( ( sourcePath ) => { - self.removeSourcePath( sourcePath ); - } ); - } - - /** - * Determine if this view definition currenly has the specified source path - * @param {string} sourcePathToTest the source path - */ - public hasSourcePath( sourcePathToTest: string ): boolean { - const index = this.sourcePaths.findIndex( ( sourcePath ) => - sourcePath === sourcePathToTest ); - - if ( index !== -1 ) { - return true; - } - return false; - } - - /** - * Determine whether the view definition is in a complete state - * @returns {boolean} true if complete - */ - public get complete(): boolean { - // Checks to determine whether the viewDefinition is complete. - - // View name must be set - if (!this.viewName || this.viewName.length === 0) { - return false; - } - - // Must be at least one source Path - if (!this.sourcePaths || this.sourcePaths.length === 0) { - return false; - } - - // If single source path, then any compositions will be ignored - and it's complete - if (this.sourcePaths.length === 1) { - return true; - } else { - // Has more than one source path. Make sure - // 1 - has a composition - // 2 - composition is complete, - // 3 - sides of the composition are contained in the sourcePaths - const comps: Composition[] = this.getCompositions(); - if (!comps || comps.length !== 1) { - return false; - } else if (!comps[0].complete) { - return false; - } - // Make sure the left and right composition source paths are present in the view definition sourcePaths - const leftSrcPath = comps[0].getLeftSourcePath(); - const rightSrcPath = comps[0].getRightSourcePath(); - let hasLeft = false; - let hasRight = false; - for (const srcPath of this.sourcePaths) { - if (srcPath === leftSrcPath) { - hasLeft = true; - } else if (srcPath === rightSrcPath) { - hasRight = true; - } - } - if (!hasLeft || !hasRight) { - return false; - } - } - - return true; - } - - /** - * Determine whether the view definition is editable - * @returns {boolean} true if editable - */ - public get editable(): boolean { - return this.isEditable; - } - - /** - * Set the ViewDefinition editable status - * @param {boolean} editable true if editable - */ - public setEditable(editable: boolean): void { - this.isEditable = editable; - } - - /** - * Get the preview SQL for the view, given the current selections - * @returns {string} the view SQL - */ - public getPreviewSql( sourcePath?: string ): string { - - // TODO: This method currently handles single source views, and single join views - // Will need to expand capabilites in the future - as more complex joins are supported. - - // If source path is supplied, return the source SQL - if ( sourcePath != null ) { - const tableName = this.getPreviewTableName(sourcePath); - return "SELECT * FROM " + tableName + ";"; - } - - // The preview SQL for the view is only generated if the view is complete - if ( this.complete ) { - // Join View - if ( this.getCompositions().length === 1 ) { - const composition = this.getCompositions()[0]; - const leftTable = this.getPreviewTableName(composition.getLeftSourcePath()); - const rightTable = this.getPreviewTableName(composition.getRightSourcePath()); - const leftCriteriaColName = composition.getLeftCriteriaColumn(); - const rightCriteriaColName = composition.getRightCriteriaColumn(); - const criteriaOperator = CompositionOperator.toSql(composition.getOperator()); - const joinType = CompositionType.toSql(composition.getType()); - const projColsSql = this.getProjectedColumnsSql(); - return "SELECT " + projColsSql + " FROM " + leftTable + " AS A " + joinType + " " + - rightTable + " AS B ON " + - "A." + leftCriteriaColName + " " + criteriaOperator + " " + - "B." + rightCriteriaColName + ";"; - // Single Source View - } else { - const tableName = this.getPreviewTableName(this.getSourcePaths()[0]); - const projColsSql = this.getProjectedColumnsSql(); - return "SELECT " + projColsSql + " FROM " + tableName + ";"; - } - } - - return ""; - } - - /** - * Determine if the current projected columns is '*' - * @return {boolean} 'true' if select all - */ - public isProjectAllColumns(): boolean { - return this.getProjectedColumns().length === 1 && this.getProjectedColumns()[0].getName() === "ALL" && this.getProjectedColumns()[0].getType() === "ALL"; - } - - /** - * Initializes the projected columns for this view. This resets the view projected columns to "*" ("ALL") - */ - private initProjectedColumns(): void { - this.setProjectedColumns(this.defaultProjectedColumns); - } - - /** - * Get the SQL string for the current projected columns - * @return {string} the projected columns SQL - */ - private getProjectedColumnsSql(): string { - // TODO: This function will need more work as the ViewDefinition is refined (addition of aliases, etc) - let sql = ""; - - // Determine duplicate names from all projected columns. They will need to be aliased so they are not ambiguous - const duplicateNames = this.getDuplicateColumnNames(this.getProjectedColumns()); - - // Build the sql from the selected columns - const selectedCols = this.getSelectedProjectedColumns(); - for ( let i = 0; i < selectedCols.length; i++ ) { - // If column is a duplicate, qualify it as left table - const cName = this.getSqlColumnName(selectedCols[i]); - if ( duplicateNames.indexOf(cName) !== -1 ) { - sql = sql.concat("A." + cName); - } else { - sql = sql.concat(cName); - } - if ( i < selectedCols.length - 1 ) { - sql = sql.concat(", "); - } - } - return sql; - } - - /** - * Get the array of duplicate column names. If no duplicates, an empty array is returned - * @param columns the array of columns to test - * @return the array of duplicate names in the supplied columns - */ - private getDuplicateColumnNames(columns: ProjectedColumn[]): string[] { - const allColNames: string[] = []; - const duplicateNames: string[] = []; - for ( const col of columns ) { - const colName = this.getSqlColumnName(col); - if (allColNames.indexOf(colName) !== -1) { - duplicateNames.push(colName); - } else { - allColNames.push(colName); - } - } - return duplicateNames; - } - - /** - * Get the name of the supplied column - * @param col the column - * @return {string} the column sql name - */ - private getSqlColumnName(col: ProjectedColumn): string { - if (col && col !== null) { - if (col.getName() === "ALL" && col.getType() === "ALL") { - return "*"; - } else { - return col.getName(); - } - } - return ""; - } - - /** - * Generates the table name for the preview query, given the source path - * @param {string} sourcePath the path for the view source - */ - private getPreviewTableName( sourcePath: string ): string { - let sourceNodeName = "unknownSource"; - let connectionName = "unknownConnection"; - if ( sourcePath && sourcePath !== null ) { - sourceNodeName = PathUtils.getSourceName(sourcePath); - if ( PathUtils.getConnectionName(sourcePath) !== null ) { - connectionName = PathUtils.getConnectionName(sourcePath); - } - } - return connectionName.toLowerCase() + VdbsConstants.SCHEMA_MODEL_SUFFIX + "." + sourceNodeName; - } - - /** - * @returns {boolean} 'true' if ViewDefinition isSelected - */ - public get selected(): boolean { - return this.isSelected; - } - - /** - * @param {boolean} selected the ViewDefinition isSelected state - */ - public setSelected( selected: boolean ): void { - this.isSelected = selected; - } - - /** - * Determine if the supplied ViewDefinition is equal to this - * @param {Object} values - */ - public isEqual( otherView: ViewDefinition ): boolean { - let equal = false; - if (this.getName() === otherView.getName() && - this.getDescription() === otherView.getDescription() && - this.pathsEqual(this.getSourcePaths(), otherView.getSourcePaths()) && - this.compositionsEqual(this.getCompositions(), otherView.getCompositions()) && - this.projectedColumnsEqual(this.getProjectedColumns(), otherView.getProjectedColumns()) ) { - equal = true; - } - return equal; - } - - private pathsEqual(left: string[], right: string[]): boolean { - if (left === right) return true; - if (left == null || right == null) return false; - if (left.length !== right.length) return false; - - left.sort(); - right.sort(); - for (let i = 0; i < right.length; ++i) { - if (left[i] !== right[i]) return false; - } - return true; - } - - private compositionsEqual(left: Composition[], right: Composition[]): boolean { - if (left === right) return true; - if (left == null || right == null) return false; - if (left.length !== right.length) return false; - - left.sort(); - right.sort(); - for (let i = 0; i < right.length; ++i) { - if (!left[i].isEqual(right[i])) return false; - } - return true; - } - - private projectedColumnsEqual(left: ProjectedColumn[], right: ProjectedColumn[]): boolean { - if (left === right) return true; - if (left == null || right == null) return false; - if (left.length !== right.length) return false; - - left.sort(); - right.sort(); - for (let i = 0; i < right.length; ++i) { - if (!left[i].isEqual(right[i])) return false; - } - return true; - } - - /** - * Set all object values using the supplied ViewDefinition json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - - /** - * @returns {{}} a JSON representation of the view definition - */ - public toJSON(): {} { - return { - viewName: this.viewName, - keng__description: this.keng__description, - isComplete: this.complete, - sourcePaths: this.sourcePaths, - compositions: this.compositions, - projectedColumns: this.projectedColumns - }; - } - - /** - * @returns {string} a string representation of the event - */ - public toString(): string { - let text = `viewName: ${this.viewName}, keng__description: ${this.keng__description}, isComplete: ${this.complete}`; - - let firstTime = true; - if ( this.sourcePaths.length !== 0 ) { - text += ", sourcePaths: "; - - for ( const sourcePath of this.sourcePaths ) { - if ( firstTime ) { - firstTime = false; - } else { - text += ", "; - } - - text += sourcePath; - } - } else { - text += ", []"; - } - - return text; - } - -} diff --git a/ui/src/app/dataservices/shared/view-editor-state.model.spec.ts b/ui/src/app/dataservices/shared/view-editor-state.model.spec.ts deleted file mode 100644 index b71fde72..00000000 --- a/ui/src/app/dataservices/shared/view-editor-state.model.spec.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { ViewEditorState } from "@dataservices/shared/view-editor-state.model"; -import { CompositionType } from "@dataservices/shared/composition-type.enum"; -import { CompositionOperator } from "@dataservices/shared/composition-operator.enum"; - -describe("ViewEditorState", () => { - let viewEditorState: ViewEditorState; - - beforeEach(() => { - viewEditorState = null; - }); - - it("should create", () => { - console.log("========== [ViewEditorState] should create"); - viewEditorState = ViewEditorState.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "id": "virt1vdb.view", - "undoables": [ - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "oldName": "v" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "view" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "view", - "oldName": "vie" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "removedSourcePaths": "connection=pgConn/schema=public/table=account" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "addedSourcePaths": "connection=pgConn/schema=public/table=account" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "removedSourcePaths": "connection=pgConn/schema=public/table=product" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "addedSourcePaths": "connection=pgConn/schema=public/table=product" - } - } - }, - { - "undo": { - "id": "RemoveCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "removedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - }, - "redo": { - "id": "AddCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "addedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - } - } - ], - "viewDefinition": - { - "viewName": "viewDefnName", - "keng__description": "viewDescription", - "isComplete": true, - "sourcePaths": - [ - "sourcePath1", - "sourcePath2" - ], - "compositions": - [ - { - "name": "compositionName", - "leftSourcePath": "sourcePath1", - "rightSourcePath": "sourcePath2", - "leftCriteriaColumn": "leftCriteriaCol", - "rightCriteriaColumn": "rightCriteriaCol", - "type": "INNER_JOIN", - "operator": "EQ" - } - ] - } - } - ); - - expect(viewEditorState.getId()).toEqual("virt1vdb.view"); - - // Check undoable 1 - expect(viewEditorState.getUndoables().length).toEqual(5); - const undoable1 = viewEditorState.getUndoables()[0]; - const undoCmd1 = undoable1.undoCommand; - const redoCmd1 = undoable1.redoCommand; - expect(undoCmd1.id).toEqual("UpdateViewNameCommand"); - expect(undoCmd1.getArg("oldName")).toEqual("v"); - expect(redoCmd1.id).toEqual("UpdateViewNameCommand"); - expect(redoCmd1.getArg("newName")).toEqual("v"); - - // Check undoable 5 - const undoable5 = viewEditorState.getUndoables()[4]; - const undoCmd5 = undoable5.undoCommand; - const redoCmd5 = undoable5.redoCommand; - expect(undoCmd5.id).toEqual("RemoveCompositionCommand"); - expect(undoCmd5.getArg("ObjectId")).toEqual("AddCompositionCommand1532727472875"); - expect(redoCmd5.id).toEqual("AddCompositionCommand"); - expect(redoCmd5.getArg("ObjectId")).toEqual("AddCompositionCommand1532727472875"); - - // Check the View Definition - const viewDefn = viewEditorState.getViewDefinition(); - expect(viewDefn).toBeDefined(); - - expect(viewDefn.getName()).toEqual("viewDefnName"); - expect(viewDefn.getDescription()).toEqual("viewDescription"); - expect(viewDefn.complete).toEqual(true); - expect(viewDefn.getSourcePaths().length).toEqual(2); - expect(viewDefn.getSourcePaths()[0]).toEqual("sourcePath1"); - expect(viewDefn.getSourcePaths()[1]).toEqual("sourcePath2"); - expect(viewDefn.getCompositions().length).toEqual(1); - expect(viewDefn.getCompositions()[0].getName()).toEqual("compositionName"); - expect(viewDefn.getCompositions()[0].getLeftSourcePath()).toEqual("sourcePath1"); - expect(viewDefn.getCompositions()[0].getRightSourcePath()).toEqual("sourcePath2"); - expect(viewDefn.getCompositions()[0].getLeftCriteriaColumn()).toEqual("leftCriteriaCol"); - expect(viewDefn.getCompositions()[0].getRightCriteriaColumn()).toEqual("rightCriteriaCol"); - expect(viewDefn.getCompositions()[0].getType()).toEqual(CompositionType.INNER_JOIN); - expect(viewDefn.getCompositions()[0].getOperator()).toEqual(CompositionOperator.EQ); - }); - -}); diff --git a/ui/src/app/dataservices/shared/view-editor-state.model.ts b/ui/src/app/dataservices/shared/view-editor-state.model.ts deleted file mode 100644 index 9123aa0f..00000000 --- a/ui/src/app/dataservices/shared/view-editor-state.model.ts +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ViewDefinition } from "@dataservices/shared/view-definition.model"; -import { CommandFactory } from "@dataservices/virtualization/view-editor/command/command-factory"; -import { Undoable } from "@dataservices/virtualization/view-editor/command/undo-redo/undoable"; - -/** - * ViewEditorState model - */ -export class ViewEditorState { - private id: string; - private undoables: Undoable[] = []; - private viewDefinition: ViewDefinition; - - /** - * @param {Object} json the JSON representation of a ViewEditorState - * @returns {ViewEditorState} the new ViewEditorState (never null) - */ - public static create( json: object = {} ): ViewEditorState { - const editorState = new ViewEditorState(); - for (const field of Object.keys(json)) { - if (field === "id") { - editorState.setId(json[field]); - } else if (field === "undoables") { - const undos = json[field]; - const undoableArray: Undoable[] = []; - for ( const jsonUndo of undos ) { - const undoable = CommandFactory.decodeUndoable( jsonUndo ) as Undoable; - undoableArray.push(undoable); - } - editorState.setUndoables(undoableArray); - } else if (field === "viewDefinition") { - const viewDefn = ViewDefinition.create(json[field]); - editorState.setViewDefinition(viewDefn); - } - } - return editorState; - } - - constructor() { - // nothing to do - } - - /** - * @returns {string} the editor state id - */ - public getId(): string { - return this.id; - } - - /** - * @param {string} id the editor state id - */ - public setId( id?: string ): void { - this.id = id ? id : null; - } - - /** - * @returns {ViewDefinition} the editor state view definition - */ - public getViewDefinition(): ViewDefinition { - return this.viewDefinition; - } - - /** - * @param {ViewDefinition} viewDefn the editor state view definition - */ - public setViewDefinition( viewDefn?: ViewDefinition ): void { - this.viewDefinition = viewDefn ? viewDefn : null; - } - - /** - * @returns {Undoable[]} the editor state undoables array - */ - public getUndoables(): Undoable[] { - return this.undoables; - } - - /** - * @param {Undoable[]} undoables the editor state undoables array - */ - public setUndoables( undoables: Undoable[] ): void { - this.undoables = undoables; - } - - /** - * @returns {{}} a JSON representation of the ViewEditorState - */ - public toJSON(): {} { - const undoablesJson = []; - this.undoables.forEach( ( undoable ) => undoablesJson.push( undoable.toJSON() ) ); - - return { - id: this.id, - undoables: undoablesJson, - viewDefinition: this.viewDefinition.toJSON() - }; - } - - /** - * @returns {string} a string representation of the event - */ - public toString(): string { - const text = `id: ${this.id}`; - return text; - } - -} diff --git a/ui/src/app/dataservices/shared/virt-route.model.ts b/ui/src/app/dataservices/shared/virt-route.model.ts deleted file mode 100644 index 9daf0aaf..00000000 --- a/ui/src/app/dataservices/shared/virt-route.model.ts +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * VirtRoute model - * This is a model of the routes generated within Openshift - * allowing access to the protocols urls, such as odata and jdbc. - */ -export class VirtRoute { - - public static readonly ODATA_PROTOCOL = 'odata'; - - private readonly name: string; - private protocol: string; - private host: string; - private port: string; - private path: string; - private target: string; - private secure: boolean; - - /** - * @param {Object} json the JSON representation of a VirtRoute - * @returns {VirtRoute} the new VirtRoute (never null) - */ - public static create( json: object = {} ): VirtRoute { - const route = new VirtRoute(); - route.setValues( json ); - return route; - } - - constructor(); - constructor(name?: string) { - this.name = name ? name : null; - } - - /** - * @returns {string} the route name (can be null) - */ - public getName(): string { - return this.name; - } - - /** - * @returns {string} the route protocol (can be null) - */ - public getProtocol(): string { - return this.protocol; - } - - /** - * @returns {string} the route host (can be null) - */ - public getHost(): string { - return this.host; - } - - /** - * @returns {string} the route port (can be null) - */ - public getPort(): string { - return this.port; - } - - /** - * @returns {string} the route path (can be null) - */ - public getPath(): string { - return this.path; - } - - /** - * @returns {string} the route target (can be null) - */ - public getTarget(): string { - return this.target; - } - - /** - * @returns {boolean} whether the route is secure - */ - public isSecure(): boolean { - return this.secure; - } - - /** - * Set all object values using the supplied VirtRoute json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - - /** - * Is this an odata route - */ - public isOdata(): boolean { - return this.getProtocol() === VirtRoute.ODATA_PROTOCOL; - } -} diff --git a/ui/src/app/dataservices/shared/virtualization.model.spec.ts b/ui/src/app/dataservices/shared/virtualization.model.spec.ts deleted file mode 100644 index 65570c92..00000000 --- a/ui/src/app/dataservices/shared/virtualization.model.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { PublishState } from "@dataservices/shared/publish-state.enum"; -import { Virtualization } from "@dataservices/shared/virtualization.model"; - -describe("Virtualization", () => { - let virtualization: Virtualization; - - beforeEach(() => { - virtualization = null; - }); - - it("should create", () => { - console.log("========== [Virtualization] should create"); - virtualization = Virtualization.create( - { - "vdb_name": "acctsVdb", - "build_name": "acctsVdb-build-1", - "deployment_name": "acctsVdb-deployment-1", - "build_status": "RUNNING", /* NOTFOUND, BUILDING, DEPLOYING, RUNNING, FAILED, CANCELLED */ - "build_status_message": "Accounts VDB build was successful", - "namespace": "beetle-studio", - "last_updated": "2018-03-29T17:02:51.181Z", - "publishState": PublishState.PUBLISHED - } - ); - - expect(virtualization.getVdbName()).toEqual("acctsVdb"); - expect(virtualization.getBuildName()).toEqual("acctsVdb-build-1"); - expect(virtualization.getDeploymentName()).toEqual("acctsVdb-deployment-1"); - expect(virtualization.getBuildStatus()).toEqual("RUNNING"); - expect(virtualization.getBuildStatusMsg()).toEqual("Accounts VDB build was successful"); - expect(virtualization.getNamespace()).toEqual("beetle-studio"); - expect(virtualization.getLastUpdated()).toEqual("2018-03-29T17:02:51.181Z"); - expect(virtualization.getPublishState()).toEqual(PublishState.PUBLISHED); - }); - -}); diff --git a/ui/src/app/dataservices/shared/virtualization.model.ts b/ui/src/app/dataservices/shared/virtualization.model.ts deleted file mode 100644 index 19036c56..00000000 --- a/ui/src/app/dataservices/shared/virtualization.model.ts +++ /dev/null @@ -1,160 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { PublishState } from "@dataservices/shared/publish-state.enum"; -import { VirtRoute } from "@dataservices/shared/virt-route.model"; - -/** - * Virtualization model - */ -export class Virtualization { - - private readonly vdb_name: string; - private build_name: string; - private deployment_name: string; - private build_status: string; /* NOTFOUND, SUBMITTED, CONFIGURING, BUILDING, DEPLOYING, RUNNING, FAILED, CANCELLED */ - private build_status_message: string; - private namespace: string; - private last_updated: string; - private publishState: PublishState; - private virtRoutes: Array; - - /** - * @param {Object} json the JSON representation of a Virtualization - * @returns {Virtualization} the new Virtualization (never null) - */ - public static create( json: object = {} ): Virtualization { - const virtual = new Virtualization(); - virtual.setValues( json ); - return virtual; - } - - constructor(); - constructor(vdbName: string, publishState: PublishState) - constructor(vdbName?: string, publishState?: PublishState) { - this.vdb_name = vdbName ? vdbName : null; - this.publishState = publishState ? publishState : PublishState.NOT_PUBLISHED; - } - - /** - * @returns {string} the virtualization name (can be null) - */ - public getVdbName(): string { - return this.vdb_name; - } - - /** - * @returns {string} the virtualization build_name (can be null) - */ - public getBuildName(): string { - return this.build_name; - } - - /** - * @returns {string} the virtualization deployment name (can be null) - */ - public getDeploymentName(): string { - return this.deployment_name; - } - - /** - * @returns {string} the virtualization build status (can be null) - */ - public getBuildStatus(): string { - return this.build_status; - } - - /** - * @returns {string} the virtualization build status message (can be null) - */ - public getBuildStatusMsg(): string { - return this.build_status_message; - } - - /** - * @returns {string} the virtualization namespace (can be null) - */ - public getNamespace(): string { - return this.namespace; - } - - /** - * @returns {string} the virtualization last updated date and time (can be null) - */ - public getLastUpdated(): string { - return this.last_updated; - } - - /** - * @returns {PublishState} the published state of this virtualization (derived from build state) - */ - public getPublishState(): PublishState { - return this.publishState; - } - - public getOdataRoute(): VirtRoute { - if (! this.virtRoutes) { - return null; - } - - for ( const virtRoute of this.virtRoutes ) { - if (virtRoute.isOdata()) - return virtRoute; - } - - return null; - } - - /** - * Set all object values using the supplied Virtualization json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - - if (values['routes']) { - const routes = values['routes']; - for (const route of routes) { - const virtRoute = VirtRoute.create(route); - if (!this.virtRoutes) { - this.virtRoutes = []; - } - - this.virtRoutes.push(virtRoute); - } - } - - if (this.build_status) { - if (this.build_status === "SUBMITTED") { - this.publishState = PublishState.SUBMITTED; - } else if (this.build_status === "CONFIGURING") { - this.publishState = PublishState.CONFIGURING; - } else if (this.build_status === "BUILDING") { - this.publishState = PublishState.BUILDING; - } else if (this.build_status === "DEPLOYING") { - this.publishState = PublishState.DEPLOYING; - } else if (this.build_status === "RUNNING") { - this.publishState = PublishState.PUBLISHED; - } else if (this.build_status === "FAILED") { - this.publishState = PublishState.FAILED; - } else { - this.publishState = PublishState.NOT_PUBLISHED; - } - } - } - -} diff --git a/ui/src/app/dataservices/sql-control/sql-control.component.css b/ui/src/app/dataservices/sql-control/sql-control.component.css deleted file mode 100644 index b2b4e2f2..00000000 --- a/ui/src/app/dataservices/sql-control/sql-control.component.css +++ /dev/null @@ -1,82 +0,0 @@ -.preview-control { - height: 90vh; - overflow: auto; -} - -.quick-look-control { - height: 50vh; - overflow: auto; -} - -.view-table-full-div { - padding-left: 0; - padding-right: 0; - min-height: 240px; - max-height: 240px; - border: 1px inset grey; - overflow-y: auto; -} - -.view-table-quicklook-div { - padding-left: 0; - padding-right: 0; - min-height: 120px; - max-height: 120px; - border: 1px inset grey; - overflow-y: auto; -} - -.sql-control-control-title { - margin: 5px 0 0; - color: grey; - font-weight: bold; -} -.sql-control-controls-query { - float: left; - margin: 0.5em; -} - -.sql-control-editor { - border: 1px inset grey; - margin-left: 15px; - padding-left: 0; -} - -/* - * Limit CodeMirror class changes to - * the sql-control-editor. - */ -.sql-control-editor .CodeMirror { - height: 200px; -} - -.sql-results-panel { - padding-left: 0; - padding-right: 0; - clear: both; - border: 1px inset grey; -} - -.sql-control-controls-limit input[type=number] { - width: 5em; -} - -.sql-control-controls-offset input[type=number] { - width: 5em; -} - -.row-number-column { - text-align: center; -} - -.quicklook-sql-title { - font-size: 1.25em; - font-weight: bold; -} - -.quicklook-sql { - margin-left: 15px; - font-size: 1.15em; - font-weight: bold; - font-style: italic; -} diff --git a/ui/src/app/dataservices/sql-control/sql-control.component.html b/ui/src/app/dataservices/sql-control/sql-control.component.html deleted file mode 100644 index 98ae9fbc..00000000 --- a/ui/src/app/dataservices/sql-control/sql-control.component.html +++ /dev/null @@ -1,58 +0,0 @@ -
    -
    -
    - - -
    -
    - -
    - -
    -
    -
    - SQL:{{ queryText }} -
    -
    - -
    -
    Query Results
    - -
    -
    - - No results to show. Click 'Submit' in query editor to obtain results. -
    -
    -
    -
    - - - Submitting the Query... -
    -
    -
    -
    - - Error running Query for '{{ viewName }}' -
    -
    -
    - - -
    -
    - -
    diff --git a/ui/src/app/dataservices/sql-control/sql-control.component.spec.ts b/ui/src/app/dataservices/sql-control/sql-control.component.spec.ts deleted file mode 100644 index 32ccd4d2..00000000 --- a/ui/src/app/dataservices/sql-control/sql-control.component.spec.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { FormsModule } from "@angular/forms"; -import { HttpModule } from "@angular/http"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { SelectionService } from "@core/selection.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { CodemirrorModule } from "ng2-codemirror"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule -} from "patternfly-ng"; -import { SqlControlComponent } from "./sql-control.component"; -import { SqlView } from "@dataservices/shared/sql-view.model"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; - -describe("SqlControlComponent", () => { - let component: SqlControlComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, - HttpModule, - CodemirrorModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ SqlControlComponent ], - providers: [ - AppSettingsService, - LoggerService, - NotifierService, - SelectionService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - { provide: VdbService, useClass: MockVdbService } - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - // select a dataservice before constructing component - const service = TestBed.get( DataserviceService ); - let dataservices: Dataservice[]; - service.getAllDataservices().subscribe( ( values ) => { dataservices = values; } ); - - const selService = TestBed.get( SelectionService ); - // noinspection JSUnusedAssignment - selService.setSelectedVirtualization( dataservices[ 0 ] ); - - fixture = TestBed.createComponent(SqlControlComponent); - component = fixture.componentInstance; - - // Set the inputs for the component - component.viewSql = "SELECT * FROM views.View1"; - const sqlView = new SqlView("views.View1"); - const sqlViews: SqlView[] = []; - sqlViews.push(sqlView); - component.serviceViews = sqlViews; - component.selectedViews = sqlViews; - - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [SqlControlComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/sql-control/sql-control.component.ts b/ui/src/app/dataservices/sql-control/sql-control.component.ts deleted file mode 100644 index 3115404e..00000000 --- a/ui/src/app/dataservices/sql-control/sql-control.component.ts +++ /dev/null @@ -1,293 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Input, ViewEncapsulation } from "@angular/core"; -import { Component, OnInit } from "@angular/core"; -import { LoggerService } from "@core/logger.service"; -import { ColumnData } from "@dataservices/shared/column-data.model"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { QueryResults } from "@dataservices/shared/query-results.model"; -import { RowData } from "@dataservices/shared/row-data.model"; -import { LoadingState } from "@shared/loading-state.enum"; -import "codemirror/addon/display/placeholder.js"; -import "codemirror/addon/selection/active-line.js"; -import "codemirror/mode/sql/sql.js"; -import { NgxDataTableConfig, TableConfig } from "patternfly-ng"; -import { SqlView } from "@dataservices/shared/sql-view.model"; -import { SelectionService } from "@core/selection.service"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-sql-control", - templateUrl: "./sql-control.component.html", - styleUrls: ["./sql-control.component.css"] -}) -export class SqlControlComponent implements OnInit { - - @Input() public quicklook = false; - @Input() public selectedViews: SqlView[] = []; - @Input() public serviceViews: SqlView[] = []; - @Input() public viewSql = ""; - - public ngxConfig: NgxDataTableConfig; - public tableConfig: TableConfig; - - public ngxViewConfig: NgxDataTableConfig; - public viewTableConfig: TableConfig; - - public columns: any[] = []; - public viewColumns: any[] = []; - public rows: any[] = []; - - public config = { - lineNumbers: true, - mode: "text/x-sql", - placeholder: "Enter the SQL, then click Submit", - styleActiveLine: true, - tabSize: 4, - theme: "mdn-like" }; - - private dataserviceService: DataserviceService; - private logger: LoggerService; - private selectionService: SelectionService; - private showResults = false; - private queryResultsLoading: LoadingState; - private queryResults: QueryResults; - private queryMap: Map = new Map(); - private previousViewName: string; - - constructor( dataserviceService: DataserviceService, logger: LoggerService, - selectionService: SelectionService ) { - this.dataserviceService = dataserviceService; - this.logger = logger; - this.selectionService = selectionService; - } - - public ngOnInit(): void { - this.queryMap.clear(); - this.setQueryText(); - this.queryMap.set(this.viewName, this.queryText); - this.previousViewName = this.viewName; - this.submitCurrentQuery(); - - this.viewColumns = [ - { - draggable: false, - name: "Views", - prop: "name", - resizeable: true, - sortable: true, - width: "100" - } - ]; - - this.ngxConfig = { - reorderable: true, - scrollbarH: true, - scrollbarV: false, - selectionType: "single", - sortable: true - } as NgxDataTableConfig; - - this.tableConfig = { - // nothing to do - } as TableConfig; - - this.ngxViewConfig = { - reorderable: false, - selected: this.selectedViews, - selectionType: "'single'", - sorts: [ { prop: "name", dir: "asc" } ], - } as NgxDataTableConfig; - - this.viewTableConfig = { - // nothing to do - } as TableConfig; - } - - /* - * Handle View selection from the view table - */ - public selectionChange( $event ): void { - // Save query for current selection first - this.queryMap.set(this.previousViewName, this.queryText); - - // View table is single select so use first element - const selected: SqlView[] = $event.selected; - const view: SqlView = selected[ 0 ]; - - this.selectedViews = []; - this.selectedViews.push(view); - - this.setQueryText(); - this.previousViewName = this.viewName; - this.submitCurrentQuery(); - } - - /* - * Submit the currently entered SQL - */ - public submitCurrentQuery( ): void { - this.submitQuery(this.queryText, this.selectionService.getSelectedVirtualization().getId(), 15, 0); - } - - /* - * Determines if the results table should be shown - */ - public get showResultsTable( ): boolean { - return this.showResults; - } - - /** - * Get the SQL text - */ - public get queryText( ): string { - return this.viewSql; - } - - /** - * Set the SQL text - */ - public set queryText( sql: string ) { - this.viewSql = sql; - } - - /** - * Determine if query is running - */ - public get queryRunning( ): boolean { - return ( this.queryResultsLoading != null && (this.queryResultsLoading === LoadingState.LOADING) ); - } - - /** - * Determine if query has run successfully - */ - public get queryRanValid( ): boolean { - return ( this.queryResultsLoading != null && (this.queryResultsLoading === LoadingState.LOADED_VALID) ); - } - - /** - * Determine if query has run but was not successful - */ - public get queryRanInvalid( ): boolean { - return ( this.queryResultsLoading != null && (this.queryResultsLoading === LoadingState.LOADED_INVALID) ); - } - - public get viewName(): string { - return !this.selectedViews ? "" : this.selectedViews[0].name; - } - - /* - * Sets the query text based on the selected dataservice - */ - public setQueryText( ): void { - const mapEntry = this.queryMap.get(this.viewName); - if (mapEntry) { - this.viewSql = mapEntry; - } else { - this.viewSql = "SELECT * FROM " + this.viewName + ";"; - } - } - - /* - * Submits the query - */ - private submitQuery(sqlQuery: string, dataserviceName: string, limit: number, offset: number): void { - this.queryResultsLoading = LoadingState.LOADING; - this.queryResults = null; - const self = this; - this.dataserviceService - .queryDataservice(sqlQuery, dataserviceName, limit, offset) - .subscribe( - (queryResult) => { - self.refreshData(queryResult); - self.queryResultsLoading = LoadingState.LOADED_VALID; - }, - (error) => { - self.logger.error("[SqlControlComponent] Error getting query results: %o", error); - self.queryResultsLoading = LoadingState.LOADED_INVALID; - } - ); - } - - /* - * Refresh the Query results - * @param {QueryResults} results the results for a query - */ - private refreshData(results: QueryResults): void { - this.queryResults = results; - if (!results) { - return; - } - - this.columns.length = 0; - this.rows.length = 0; - - const columnData: ColumnData[] = results.getColumns(); - const rowData: RowData[] = results.getRows(); - - // - // Define the row data - // - let firstTime = true; - const rowNumHeader = "ROW #"; - - for ( let rowIndex = 0; rowIndex < rowData.length; rowIndex++ ) { - const row = rowData[ rowIndex ]; - const data = row.getData(); - - const dataRow = {}; - dataRow[ rowNumHeader ] = rowIndex + 1; - - for (let colIndex = 0; colIndex < data.length; colIndex++) { - const label = columnData[ colIndex ].getLabel(); - dataRow[ label ] = data[ colIndex ]; - } - - this.rows.push( dataRow ); - firstTime = false; - } - - // setup row number column - const column = { canAutoResize: true, - draggable: false, - maxWidth: 60, - minWidth: 60, - name: rowNumHeader, - prop: rowNumHeader, - resizable: true, - sortable: true, - width: 60, - cellClass: "row-number-column"}; - this.columns.push( column ); - - // - // Setup data columns - // - for ( const colData of columnData ) { - const label = colData.getLabel(); - const col = { canAutoResize: true, - draggable: false, - name: label.toUpperCase(), - prop: label, - resizable: true, - sortable: true }; - this.columns.push( col ); - } - } - -} diff --git a/ui/src/app/dataservices/test-dataservice/test-dataservice.component.css b/ui/src/app/dataservices/test-dataservice/test-dataservice.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/dataservices/test-dataservice/test-dataservice.component.html b/ui/src/app/dataservices/test-dataservice/test-dataservice.component.html deleted file mode 100644 index b943e2a3..00000000 --- a/ui/src/app/dataservices/test-dataservice/test-dataservice.component.html +++ /dev/null @@ -1,31 +0,0 @@ -
    -
    - -
  • -
  • -
    -
    -
    -
    -

    Test Data Virtualization '{{ this.dataservice.getId() }}'

    -
    - -
    -
    - - - Deploying the Data Virtualization... -
    -
    -
    -
    - - There was an error deploying the Data Virtualization! -
    -
    -
    - -
    -
    -
    diff --git a/ui/src/app/dataservices/test-dataservice/test-dataservice.component.spec.ts b/ui/src/app/dataservices/test-dataservice/test-dataservice.component.spec.ts deleted file mode 100644 index 02f4b467..00000000 --- a/ui/src/app/dataservices/test-dataservice/test-dataservice.component.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { FormsModule } from "@angular/forms"; -import { RouterTestingModule } from "@angular/router/testing"; -import { AppSettingsService } from "@core/app-settings.service"; -import { CoreModule } from "@core/core.module"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { SqlControlComponent } from "@dataservices/sql-control/sql-control.component"; -import { TestDataserviceComponent } from "@dataservices/test-dataservice/test-dataservice.component"; -import { CodemirrorModule } from "ng2-codemirror"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { SelectionService } from "@core/selection.service"; - -describe("TestDataserviceComponent", () => { - let component: TestDataserviceComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - CoreModule, - FormsModule, - RouterTestingModule, - CodemirrorModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ SqlControlComponent, TestDataserviceComponent ], - providers: [ - NotifierService, SelectionService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - { provide: VdbService, useClass: MockVdbService } - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - // select a dataservice before constructing component - const service = TestBed.get( DataserviceService ); - let dataservices: Dataservice[]; - service.getAllDataservices().subscribe( ( values ) => { dataservices = values; } ); - - const selService = TestBed.get( SelectionService ); - // noinspection JSUnusedAssignment - selService.setSelectedVirtualization( dataservices[ 1 ] ); - - fixture = TestBed.createComponent(TestDataserviceComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [TestDataserviceComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/test-dataservice/test-dataservice.component.ts b/ui/src/app/dataservices/test-dataservice/test-dataservice.component.ts deleted file mode 100644 index 49850121..00000000 --- a/ui/src/app/dataservices/test-dataservice/test-dataservice.component.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Component } from "@angular/core"; -import { Router } from "@angular/router"; -import { ActivatedRoute } from "@angular/router"; -import { LoggerService } from "@core/logger.service"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; -import { AbstractPageComponent } from "@shared/abstract-page.component"; -import { LoadingState } from "@shared/loading-state.enum"; -import { SqlView } from "@dataservices/shared/sql-view.model"; -import { SelectionService } from "@core/selection.service"; - -@Component({ - selector: "app-test-dataservice", - templateUrl: "./test-dataservice.component.html", - styleUrls: ["./test-dataservice.component.css"] -}) -export class TestDataserviceComponent extends AbstractPageComponent { - - public readonly dataservicesLink = DataservicesConstants.dataservicesRootPath; - - public pageError: any = ""; - - private dataservice: Dataservice; - private selectionService: SelectionService; - private pageLoadingState: LoadingState = LoadingState.LOADED_VALID; - private selectedSvcViewNames: SqlView[] = []; - private allSvcViewNames: SqlView[] = []; - private quickLookQueryText: string; - - constructor( router: Router, route: ActivatedRoute, selectionService: SelectionService, logger: LoggerService ) { - super(route, logger); - this.selectionService = selectionService; - } - - public loadAsyncPageData(): void { - this.dataservice = this.selectionService.getSelectedVirtualization(); - this.allSvcViewNames = this.selectionService.getSelectedVirtualizationViewNames(); - this.selectedSvcViewNames = []; - this.selectedSvcViewNames.push(this.allSvcViewNames[0]); - const viewName = this.selectedSvcViewNames[0]; - this.quickLookQueryText = "SELECT * FROM " + viewName + ";"; - } - - /** - * Determine if page is loading - */ - public get pageLoading( ): boolean { - return this.pageLoadingState === LoadingState.LOADING; - } - - /** - * Determine if page has loaded successfully - */ - public get pageLoadedValid( ): boolean { - return this.pageLoadingState === LoadingState.LOADED_VALID; - } - - /** - * Accessor for all available service view definitions - */ - public get allServiceViewNames( ): SqlView[] { - return this.allSvcViewNames; - } - - /** - * Accessor for selected service view definition - */ - public get selectedViewNames( ): SqlView[] { - return this.selectedSvcViewNames; - } - - /** - * @returns {string} the quick look service name - */ - public get quickLookSql(): string { - return this.quickLookQueryText; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.css b/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.css deleted file mode 100644 index aee1f901..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.css +++ /dev/null @@ -1,13 +0,0 @@ -.comp-wizard-condition { - margin-top: 30px; -} - -.comp-wizard-swap { - margin-top: 30px; - margin-left: 20px; - color: darkgreen; -} - -.comp-wizard-column-margins { - margin-top: 30px; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.html b/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.html deleted file mode 100644 index db3ff05f..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - -
    -
    -
    - -
    -
    -

    - - Step Initialization Error -

    -
    -
    -

    - Could not load the tables. Please Try relaunching the wizard or check the console log. -

    -
    -
    -
    -
    {{step1InstructionMessage}}
    - -
    -

    {{currentSelectionMsg}}

    - {{ selectionText }} -
    -
    -
    - - - - -
    {{step2InstructionMessage}}
    -
    -
    -
    -
    {{ leftCompositionTableTitle }}
    -
    -
    -   -
    -
    -
    {{ rightCompositionTableTitle }}
    -
    -
    -
    - - -
    -
    -
    - - -
    -
    -
    -
    -
    - - -
    -
    -
    Operator
    - -
    Condition
    - - -
    -
    - - -
    -
    -
    -
    -
    - - -
    -
    -
    - -
    -
    diff --git a/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.spec.ts deleted file mode 100644 index 4eb3d40f..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { AddCompositionWizardComponent } from './add-composition-wizard.component'; -import { - CardModule, - TableModule, - WizardModule -} from "patternfly-ng"; -import { ConnectionTreeSelectorComponent } from "@dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component"; -import { TreeModule } from "angular-tree-component"; -import { FormsModule } from "@angular/forms"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { HttpModule } from "@angular/http"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; - -describe('AddCompositionWizardComponent', () => { - let component: AddCompositionWizardComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule, - CardModule, - FormsModule, - TableModule, - TreeModule, - WizardModule - ], - declarations: [ ConnectionTreeSelectorComponent, AddCompositionWizardComponent ], - providers: [ AppSettingsService, LoggerService, NotifierService, - { provide: ConnectionService, useClass: MockConnectionService }, - { provide: VdbService, useClass: MockVdbService } - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AddCompositionWizardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - // it('should be created', () => { - // expect(component).toBeTruthy(); - // }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.ts b/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.ts deleted file mode 100644 index 554f19e4..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component.ts +++ /dev/null @@ -1,656 +0,0 @@ -import { Component, EventEmitter, Input, OnInit, Output, ViewChild, ViewEncapsulation } from '@angular/core'; -import { - NgxDataTableConfig, NotificationType, - TableConfig, - WizardComponent, - WizardConfig, - WizardEvent, - WizardStepConfig -} from "patternfly-ng"; -import { LoggerService } from "@core/logger.service"; -import { Composition } from "@dataservices/shared/composition.model"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { LoadingState } from "@shared/loading-state.enum"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { ConnectionTreeSelectorComponent } from "@dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { Column } from "@dataservices/shared/column.model"; -import { CompositionType } from "@dataservices/shared/composition-type.enum"; -import { CompositionOperator } from "@dataservices/shared/composition-operator.enum"; -import { PathUtils } from "@dataservices/shared/path-utils"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; - -enum CompositeSide { - LEFT = 0, - RIGHT = 1 -} - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: 'app-add-composition-wizard', - templateUrl: './add-composition-wizard.component.html', - styleUrls: ['./add-composition-wizard.component.css'] -}) -export class AddCompositionWizardComponent implements OnInit { - - @Input() public initialSourcePath: string; - @Input() public editorService: ViewEditorService; - @Output() public finishAction = new EventEmitter(); - @Output() public cancelAction = new EventEmitter(); - @ViewChild("wizard") public wizard: WizardComponent; - @ViewChild("connTree") public connectionTree: ConnectionTreeSelectorComponent; - - // Wizard Config - public wizardConfig: WizardConfig; - - // Wizard Step Configs - public step1Config: WizardStepConfig; - public step2Config: WizardStepConfig; - - public ngxLhTableConfig: NgxDataTableConfig; - public lhTableConfig: TableConfig; - public lhTableColumns: any[] = []; - public lhTableRows: Column[] = []; - - public ngxRhTableConfig: NgxDataTableConfig; - public rhTableConfig: TableConfig; - public rhTableColumns: any[] = []; - public rhTableRows: Column[] = []; - - public compositionTablesLoadingState = LoadingState.LOADING; - public compositionLHColumnsLoadingState = LoadingState.LOADING; - public compositionRHColumnsLoadingState = LoadingState.LOADING; - public selectionText = ViewEditorI18n.noSelection; - public readonly currentSelectionMsg = ViewEditorI18n.currentSelection; - public selectedCompositionType: CompositionType = CompositionType.INNER_JOIN; - public selectedCompositionCondition: CompositionOperator = CompositionOperator.EQ; - public readonly columnLoadFailedHeader = "Loading Failed: "; - public readonly columnLoadFailedMsg = "Columns failed to load!"; - public readonly columnLoadFailedType = NotificationType.DANGER; - - private selectedTreeNodePath: string; - - private readonly step1Id = "step1"; - private readonly step2Id = "step2"; - private readonly logger: LoggerService; - private readonly connectionService: ConnectionService; - private composition: Composition; - private columnsMap = new Map(); // Maintain loaded columns map to reduce rest calls - - constructor( connectionService: ConnectionService, logger: LoggerService ) { - this.connectionService = connectionService; - this.logger = logger; - } - - /* - * Initialization - */ - public ngOnInit(): void { - // Step 1 - Basic Properties - this.step1Config = { - id: this.step1Id, - priority: 0, - title: ViewEditorI18n.addCompositionWizardStep1Text, - allowClickNav: false, - nextEnabled: false - } as WizardStepConfig; - - // Step 3 - Review and Create - this.step2Config = { - id: this.step2Id, - priority: 0, - title: ViewEditorI18n.addCompositionWizardStep2Text, - allowClickNav: false - } as WizardStepConfig; - - // Wizard Configuration - this.wizardConfig = { - embedInPage: false, - title: ViewEditorI18n.addCompositionWizardTitle, - loadingTitle: ViewEditorI18n.addCompositionWizardLoadingPrimaryText, - loadingSecondaryInfo: ViewEditorI18n.addCompositionWizardLoadingSecondaryText, - contentHeight: "500px", - done: false - } as WizardConfig; - - // Init the working Composition model - this.composition = new Composition(); - this.composition.setName(this.generateCompositionName()); - - // Init the lhs of the composition with the editorService selection - if (this.initialSourcePath && this.initialSourcePath !== null && this.initialSourcePath.length > 0) { - const idParts = this.initialSourcePath.split(Command.identDivider); - this.composition.setLeftSourcePath(idParts[1], true); - } else { - const selections = this.editorService.getSelection(); - if (selections && selections.length === 2) { - // ------------------ - // this block of code should only be run if 'plus' icon is selected on a source connection node - // the second arg of the selection array should be the source path of the canvas node selected - // ------------------ - this.composition.setLeftSourcePath(selections[1], true); - } else if (selections && selections.length === 1) { - const selection = selections[0]; - const idParts = selection.split(Command.identDivider); - this.composition.setLeftSourcePath(idParts[1], true); - } - } - - const self = this; - // Load the connection tables - this.compositionTablesLoadingState = LoadingState.LOADING; - this.connectionService - .getConnections(true, true) - .subscribe( - (connectionSummaries) => { - const conns = []; - const treeNodes = []; - for ( const connectionSummary of connectionSummaries ) { - const connStatus = connectionSummary.getStatus(); - const conn = connectionSummary.getConnection(); - conn.setStatus(connStatus); - conns.push(conn); - // Add active connection to tree root nodes - if (conn.isActive) { - const node = new SchemaNode(); - node.setName(conn.getId()); - node.setType(ConnectionsConstants.schemaNodeType_connection); - node.setHasChildren(true); - treeNodes.push(node); - } - } - self.connectionTree.setTreeRoots(treeNodes); - self.compositionTablesLoadingState = LoadingState.LOADED_VALID; - }, - (error) => { - self.logger.error("[ConnectionTableDialogComponent] Error getting connections: %o", error); - self.compositionTablesLoadingState = LoadingState.LOADED_INVALID; - } - ); - - // ---------------------------------- - // Left Table configurations - // ---------------------------------- - this.lhTableColumns = [ - { - draggable: false, - name: "Name", - prop: "keng__id", - resizeable: true, - sortable: true, - width: "100" - } - ]; - - this.ngxLhTableConfig = { - reorderable: false, - selectionType: "'single'" - } as NgxDataTableConfig; - - this.lhTableConfig = { - } as TableConfig; - - // ---------------------------------- - // Right Table configurations - // ---------------------------------- - this.rhTableColumns = [ - { - draggable: false, - name: "Name", - prop: "keng__id", - resizeable: true, - sortable: true, - width: "100" - } - ]; - - this.ngxRhTableConfig = { - reorderable: false, - selectionType: "'single'" - } as NgxDataTableConfig; - - this.rhTableConfig = { - } as TableConfig; - - // Init columnsMap - this.columnsMap.clear(); - - this.loadColumns(CompositeSide.LEFT, true); - } - - /** - * Load the columns for the specified CompositeSide - * @param {CompositeSide} side the side (left or right) - * @param {boolean} initSelected if 'true' will attempt init the column selections - */ - private loadColumns(side: CompositeSide, initSelected = false): void { - const fullPath = this.getSourcePath(side); - - // Columns were already loaded - get them from Map - if (this.columnsMap.has(fullPath)) { - const cols = this.columnsMap.get(fullPath); - this.setColumns(side, cols); - this.updatePage2ValidStatus(); - return; - } - - // Columns not loaded - make rest service call - const connName = PathUtils.getConnectionName(fullPath); - const tableOption = PathUtils.getPathWithoutConnection(fullPath); - this.setColumnLoadingState(side, LoadingState.LOADING); - const self = this; - this.connectionService - .getConnectionSchemaColumns(connName, tableOption) - .subscribe( - (columns) => { - self.setColumns(side, columns); - self.setColumnLoadingState(side, LoadingState.LOADED_VALID); - self.columnsMap.set(fullPath, columns); - if (initSelected) { - self.initCompositionSelectedColumns(); - } - self.updatePage2ValidStatus(); - }, - (error) => { - self.setColumns(side, []); - self.setColumnLoadingState(side, LoadingState.LOADED_INVALID); - self.updatePage2ValidStatus(); - self.logger.debug("[AddCompositionWizard] Error getting columns: %o", error); - } - ); - } - - /** - * Get the path for the specified source - * @param {CompositeSide} side the side (left or right) - * @return {string} the source path - */ - private getSourcePath( side: CompositeSide ): string { - if ( side === CompositeSide.LEFT ) { - return this.composition.getLeftSourcePath(); - } - return this.composition.getRightSourcePath(); - } - - /** - * Set the specified columns loading state for the side - * @param {CompositeSide} side the side (left or right) - * @param {LoadingState} state the loading state - */ - private setColumnLoadingState( side: CompositeSide, state: LoadingState): void { - if ( side === CompositeSide.LEFT ) { - this.compositionLHColumnsLoadingState = state; - } else { - this.compositionRHColumnsLoadingState = state; - } - } - - /** - * Set the specified columns for the side - * @param {CompositeSide} side the side (left or right) - * @param {Column[]} cols the array of Columns - */ - private setColumns( side: CompositeSide, cols: Column[] ): void { - if ( !cols ) cols = []; - if ( side === CompositeSide.LEFT ) { - this.lhTableRows = cols; - } else { - this.rhTableRows = cols; - } - } - - /** - * Get a title for the Left Composition table - * @returns {string} the left title - */ - public get leftCompositionTableTitle(): string { - return this.generateTableTitle(CompositeSide.LEFT); - } - - /** - * Get a title for the Right Composition table - * @returns {string} the right title - */ - public get rightCompositionTableTitle(): string { - return this.generateTableTitle(CompositeSide.RIGHT); - } - - /** - * Generate a table title for the specified side of the composite - * @param {CompositeSide} side the side (left or right) - * @return {string} the title - */ - private generateTableTitle(side: CompositeSide): string { - let title = ""; - let sourcePath = ""; - if (side === CompositeSide.LEFT) { - sourcePath = this.composition.getLeftSourcePath(); - if (this.composition.initialSourceOnLeft) { - title += "** "; - } - } else { - sourcePath = this.composition.getRightSourcePath(); - if (this.composition.initialSourceOnRight) { - title += "** "; - } - } - if (sourcePath && sourcePath !== null) { - const connName = PathUtils.getConnectionName(sourcePath); - const sourceName = PathUtils.getSourceName(sourcePath); - title += "[" + connName + "] " + sourceName; - } else { - title = "undefined"; - } - return title; - } - - /* - * Step 1 instruction message - */ - public get step1InstructionMessage(): string { - let message = ViewEditorI18n.addCompositionWizardSelectSourceMessage; - // If one composition node is available, use it in the message - if (this.composition && this.composition !== null) { - let sourcePath: string = null; - if (this.composition.initialSourceOnLeft) { - sourcePath = this.composition.getLeftSourcePath(); - } else if (this.composition.initialSourceOnRight) { - sourcePath = this.composition.getRightSourcePath(); - } - if (sourcePath !== null) { - const connName = PathUtils.getConnectionName(sourcePath); - const srcName = PathUtils.getSourceName(sourcePath); - message = "Select a source for the composition. The opposite node is: '[" + connName + "] " + srcName + "'"; - } - } - return message; - } - - /* - * Step 2 instruction message - */ - public get step2InstructionMessage(): string { - return ViewEditorI18n.addCompositionWizardCriteriaStepMessage; - } - - public stepChanged($event: WizardEvent): void { - if ($event.step.config.id === this.step1Id) { - this.wizardConfig.nextTitle = ViewEditorI18n.wizardNextButtonText; - } else if ($event.step.config.id === this.step2Id) { - this.wizardConfig.nextTitle = ViewEditorI18n.finishButtonText; - } - } - - public nextClicked($event: WizardEvent): void { - // Click next on page 1 - sets the additional composition node - if ($event.step.config.id === this.step1Id) { - // Reset the composition name based on LH and RH nodes - this.composition.setName(this.generateCompositionName()); - // Load columns for the "opposite" side of the composition (initial node columns are already loaded) - if (this.composition.initialSourceOnRight) { - this.loadColumns(CompositeSide.LEFT); - } else { - this.loadColumns(CompositeSide.RIGHT); - } - } - // Click finish on page 2 - fires finish event with the composition - else if ($event.step.config.id === this.step2Id) { - // Set the selected composition type and operator - this.composition.setType(this.selectedCompositionType); - this.composition.setOperator(this.selectedCompositionCondition); - this.finishAction.emit(this.composition); - } - } - - public cancelClicked( ): void { - this.cancelAction.emit(); - } - - /** - * Determine if schema node tree is loading - * @returns {boolean} - */ - public get treeLoading( ): boolean { - return ( this.compositionTablesLoadingState === LoadingState.LOADING ); - } - - /** - * Determine if schema node tree loading completed, and was successful - * @returns {boolean} - */ - public get treeLoadedSuccess( ): boolean { - return ( this.compositionTablesLoadingState === LoadingState.LOADED_VALID ); - } - - /** - * Determine if schema node tree loading completed, but failed - * @returns {boolean} - */ - public get treeLoadedFailed( ): boolean { - return ( this.compositionTablesLoadingState === LoadingState.LOADED_INVALID ); - } - - /** - * Determine if left columns are loading - * @returns {boolean} - */ - public get lhColumnsLoading( ): boolean { - return ( this.compositionLHColumnsLoadingState === LoadingState.LOADING ); - } - - /** - * Determine if left columns loading completed, and was successful - * @returns {boolean} - */ - public get lhColumnsLoadedSuccess( ): boolean { - return ( this.compositionLHColumnsLoadingState === LoadingState.LOADED_VALID ); - } - - /** - * Determine if left columns loading completed, but failed - * @returns {boolean} - */ - public get lhColumnsLoadedFailed( ): boolean { - return ( this.compositionLHColumnsLoadingState === LoadingState.LOADED_INVALID ); - } - - /** - * Determine if right columns are loading - * @returns {boolean} - */ - public get rhColumnsLoading( ): boolean { - return ( this.compositionRHColumnsLoadingState === LoadingState.LOADING ); - } - - /** - * Determine if right columns loading completed, and was successful - * @returns {boolean} - */ - public get rhColumnsLoadedSuccess( ): boolean { - return ( this.compositionRHColumnsLoadingState === LoadingState.LOADED_VALID ); - } - - /** - * Determine if right columns loading completed, but failed - * @returns {boolean} - */ - public get rhColumnsLoadedFailed( ): boolean { - return ( this.compositionRHColumnsLoadingState === LoadingState.LOADED_INVALID ); - } - - /** - * Updates the page 1 status - */ - private updatePage1ValidStatus( ): void { - this.setSelectionText(); - this.step1Config.nextEnabled = ( this.selectedTreeNodePath && this.selectedTreeNodePath !== null ); - } - - /** - * Updates the page 2 status - */ - private updatePage2ValidStatus( ): void { - this.step2Config.nextEnabled = this.composition.complete; - } - - /** - * Get the array of available composition types - * @returns array of composition types - */ - public compositionTypes(): CompositionType[] { - const compTypes: Array = - [ CompositionType.INNER_JOIN, CompositionType.LEFT_OUTER_JOIN, CompositionType.RIGHT_OUTER_JOIN, - CompositionType.FULL_OUTER_JOIN, CompositionType.UNION ]; - return compTypes; - } - - /** - * Get the array of available operators - * @returns array of composition operators - */ - public compositionConditions(): CompositionOperator[] { - const compConditions: Array = - [ CompositionOperator.EQ, CompositionOperator.NE, CompositionOperator.LT, - CompositionOperator.LE, CompositionOperator.GT, CompositionOperator.GE ]; - return compConditions; - } - - /** - * Sets the node selection text, based upon the selection - */ - private setSelectionText(): void { - if (this.selectedTreeNodePath && this.selectedTreeNodePath !== null) { - const connName = PathUtils.getConnectionName(this.selectedTreeNodePath); - const sourceName = PathUtils.getSourceName(this.selectedTreeNodePath); - this.selectionText = "[" + connName + "] " + sourceName; - } else { - this.selectionText = ViewEditorI18n.noSelection; - } - } - - /** - * Handles tree node selection - * @param {SchemaNode} $event - */ - public onTreeNodeSelected( $event: SchemaNode ): void { - const selectedNode = $event; - if (selectedNode && selectedNode !== null && selectedNode.isQueryable()) { - this.selectedTreeNodePath = "connection=" + selectedNode.getConnectionName() + "/" + selectedNode.getPath(); - // Set the side of the composition opposite of the initially selected node - if (this.composition.initialSourceOnRight) { - this.composition.setLeftSourcePath(this.selectedTreeNodePath); - } else { - this.composition.setRightSourcePath(this.selectedTreeNodePath); - } - } else { - this.selectedTreeNodePath = null; - } - this.updatePage1ValidStatus(); - } - - /** - * Handles tree node de-selection - * @param {SchemaNode} $event - */ - public onTreeNodeDeselected( $event: SchemaNode ): void { - this.selectedTreeNodePath = null; - this.updatePage1ValidStatus(); - } - - /** - * Handles click of the 'swap' button - */ - public onSwapClicked( ): void { - this.composition.swapTables(); - - // Reset the composition name based on LH and RH nodes - this.composition.setName(this.generateCompositionName()); - - // swap the table rows - this.deselectAll(this.lhTableRows); - this.deselectAll(this.rhTableRows); - - const temp = this.lhTableRows; - this.lhTableRows = this.rhTableRows; - this.rhTableRows = temp; - - this.selectTableRow(this.lhTableRows, this.composition.getLeftCriteriaColumn()); - this.selectTableRow(this.rhTableRows, this.composition.getRightCriteriaColumn()); - } - - /* - * Handle LH column selection - */ - public lhColumnSelectionChange( $event ): void { - // mark any selected column as deselected - this.deselectAll(this.lhTableRows); - - // Single row selection - use first row - const selected: Column[] = $event.selected; - const column = selected[0]; - column.setSelected(true); - this.composition.setLeftCriteriaColumn(column.getName()); - this.updatePage2ValidStatus(); - } - - /* - * Handle RH column selection - */ - public rhColumnSelectionChange( $event ): void { - // mark any selected column as deselected - this.deselectAll(this.rhTableRows); - - // Single row selection - use first row - const selected: Column[] = $event.selected; - const column = selected[0]; - column.setSelected(true); - this.composition.setRightCriteriaColumn(column.getName()); - this.updatePage2ValidStatus(); - } - - private deselectAll( cols: Column[] ): void { - for (const col of cols) { - col.setSelected(false); - } - } - - private selectTableRow( cols: Column[], colName: string ): void { - if (cols && colName) { - for (const col of cols) { - if (col.getName() === colName) { - col.setSelected(true); - } - } - } - } - - /* - * Initialize the composition selected columns, if any columns selected - */ - private initCompositionSelectedColumns(): void { - for (const lhCol of this.lhTableRows) { - if (lhCol.selected) { - this.composition.setLeftCriteriaColumn(lhCol.getName()); - } - } - for (const rhCol of this.rhTableRows) { - if (rhCol.selected) { - this.composition.setRightCriteriaColumn(rhCol.getName()); - } - } - } - - /** - * Generate the composition name using the left and right node names - * @return {string} the composition name - */ - private generateCompositionName(): string { - const leftPath = this.composition.getLeftSourcePath(); - const rightPath = this.composition.getRightSourcePath(); - const leftSource = PathUtils.getSourceName(leftPath); - const rightSource = PathUtils.getSourceName(rightPath); - return leftSource + "-" + rightSource; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/add-composition-command.ts b/ui/src/app/dataservices/virtualization/view-editor/command/add-composition-command.ts deleted file mode 100644 index 1ace8a52..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/add-composition-command.ts +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { Composition } from "@dataservices/shared/composition.model"; -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; - -export class AddCompositionCommand extends Command { - - /** - * The command identifier. - * - * @type {string} - */ - public static readonly id = CommandType.ADD_COMPOSITION_COMMAND; - - /** - * The name of the command argument whose value is the stringified composition - * - * @type {string} - */ - public static readonly addedComposition = "addedComposition"; - - /** - * Constructor - * 'addedComposition' must be Composition object -OR- stringified composition - * - * @param {string | Composition} addedComposition the Composition object, or the stringified composition being - * added (cannot be `null` or empty) - * @param {string} id the command id. If not supplied, an id is generated. - */ - public constructor( addedComposition: string | Composition, id?: string ) { - super( AddCompositionCommand.id, ViewEditorI18n.addCompositionCommandName ); - - let arg: string; - - if ( typeof addedComposition === "string" ) { - arg = addedComposition as string; - } else { - arg = JSON.stringify(addedComposition); - } - - this._args.set( AddCompositionCommand.addedComposition, arg ); - - if (!id) { - // - // Generate new id for this source - // - id = AddCompositionCommand.id + this.idGen; - } - - this._args.set( Command.identArg, id); - } - - /** - * @returns {string} the composition name - */ - public getComposition(): Composition { - const compStr = this.getArg( AddCompositionCommand.addedComposition ) as string; - const comp = Composition.create(JSON.parse(compStr)); - return comp; - } - - /** - * @returns {string} json payload for this command - */ - public getPayload( ): string { - return this.getArg( AddCompositionCommand.addedComposition ) as string; - } - - /** - * @returns {string} a unique short identifier of this command - */ - public getId( ): string { - return this.getArg( Command.identArg ) as string; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/add-sources-command.ts b/ui/src/app/dataservices/virtualization/view-editor/command/add-sources-command.ts deleted file mode 100644 index de69f13b..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/add-sources-command.ts +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; - -export class AddSourcesCommand extends Command { - - /** - * The command identifier. - * - * @type {string} - */ - public static readonly id = CommandType.ADD_SOURCES_COMMAND; - - /** - * The name of the command argument whose value is the paths of the sources being added. - * - * @type {string} - */ - public static readonly addedSourcePaths = "addedSourcePaths"; - - private static readonly delim = ", "; - - /** - * Constructor - * 'addedSources' must be an array of SchemaNodes -OR- - * string of the source paths (comma delimited) - path form: "connection=aConn/schema=aSchema/table=aTable" - * - * @param {string | SchemaNode} addedSources the string representation of the sources or the schema nodes of the sources - * being added (cannot be `null` or empty) - * @param {string} id the command id. If not supplied, an id is generated. - */ - public constructor( addedSources: string | SchemaNode[], id?: string ) { - super( AddSourcesCommand.id, ViewEditorI18n.addSourcesCommandName ); - - let arg: string; - - if ( typeof addedSources === "string" ) { - arg = addedSources as string; - } else { - arg = ""; - const sources = addedSources as SchemaNode[]; - let firstTime = true; - - sources.forEach( ( source ) => { - if ( firstTime ) { - firstTime = false; - } else { - arg += AddSourcesCommand.delim; - } - - // Prepend the connection to the schema node path - arg += "connection=" + source.getConnectionName() + "/" + source.getPath(); - } ); - } - - this._args.set( AddSourcesCommand.addedSourcePaths, arg ); - - if (!id) { - // - // Generate new id for this source - // - id = AddSourcesCommand.id + this.idGen; - } - - this._args.set( Command.identArg, id); - } - - /** - * @returns {string[]} an array of the paths of the sources being added - */ - public getSourcePaths(): string[] { - const argValue = this.getArg( AddSourcesCommand.addedSourcePaths ) as string; - return argValue.split( AddSourcesCommand.delim ); - } - - /** - * @returns {string} the json payload for this command - */ - public getPayload(sourcePath?: string): string { - if (sourcePath) - return sourcePath; - return this.getArg( Command.identArg ) as string; - } - - /** - * @returns {string} a unique short identifier of this command - */ - public getId( ): string { - return this.getArg( Command.identArg ) as string; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/command-factory.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/command/command-factory.spec.ts deleted file mode 100644 index b24239fb..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/command-factory.spec.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { CommandFactory } from "@dataservices/virtualization/view-editor/command/command-factory"; -import { AddSourcesCommand } from "@dataservices/virtualization/view-editor/command/add-sources-command"; -import { RemoveSourcesCommand } from "@dataservices/virtualization/view-editor/command/remove-sources-command"; -import { NoOpCommand } from "@dataservices/virtualization/view-editor/command/no-op-command"; -import { UpdateViewNameCommand } from "@dataservices/virtualization/view-editor/command/update-view-name-command"; -import { UpdateViewDescriptionCommand } from "@dataservices/virtualization/view-editor/command/update-view-description-command"; - -describe( "Command Factory Tests", () => { - - it("AddSourcesCommand Test", () => { - const conn1 = "conn1"; - const conn2 = "conn2"; - const path1 = "table=node1"; - const path2 = "table=node2"; - const node1 = SchemaNode.create( { connectionName: conn1, path: path1 } ); - const node2 = SchemaNode.create( { connectionName: conn2, path: path2 } ); - const tempCmd = CommandFactory.createAddSourcesCommand( [ node1, node2 ], "ident" ); - expect( tempCmd instanceof AddSourcesCommand ).toBe( true ); - - const cmd = tempCmd as AddSourcesCommand; - expect( cmd.id ).toBe( AddSourcesCommand.id ); - expect( cmd.args ).not.toBeNull(); - expect( cmd.args.size ).toBe( 2 ); - - const expectedSrcPaths = "connection=" + conn1 + "/" + path1 + ", connection=" + conn2 + "/" + path2; - const expectedFull = expectedSrcPaths + ", ObjectId=ident"; - const actual = cmd.getArg( AddSourcesCommand.addedSourcePaths ); - expect( cmd.getArg( AddSourcesCommand.addedSourcePaths ) ).toEqual( expectedSrcPaths ); - expect( cmd.toString() ).toBe( "AddSourcesCommand, addedSourcePaths=" + expectedFull ); - expect( cmd.isUndoable() ).toBe( true ); - - const json = cmd.toJSON(); - const tempRoundtrip = CommandFactory.decode( json ); - expect( tempRoundtrip instanceof AddSourcesCommand ).toBe( true ); - - const roundtrip = tempRoundtrip as AddSourcesCommand; - expect( roundtrip.id ).toBe( cmd.id ); - expect( roundtrip.args.size ).toBe( cmd.args.size ); - expect( roundtrip.getArg( AddSourcesCommand.addedSourcePaths ) ).toBe( cmd.getArg( AddSourcesCommand.addedSourcePaths ) ); - }); - - it("AddSourcesCommand Undo Test", () => { - const node1 = SchemaNode.create( { connectionName: "conn1", path: "table=node1" } ); - const node2 = SchemaNode.create( { connectionName: "conn2", path: "table=node2" } ); - const tempCmd = CommandFactory.createAddSourcesCommand( [ node1, node2 ], "ident" ); - expect( tempCmd instanceof AddSourcesCommand ).toBe( true ); - - const cmd = tempCmd as AddSourcesCommand; - const tempUndoCmd = CommandFactory.createUndoCommand( cmd ); - expect( tempUndoCmd instanceof RemoveSourcesCommand ).toBe( true ); - - const undoCmd = tempUndoCmd as RemoveSourcesCommand; - expect( undoCmd ).not.toBeNull(); - expect( undoCmd.id ).toBe( RemoveSourcesCommand.id ); - expect( undoCmd.args.size ).toBe( 2 ); - expect( undoCmd.getArg( RemoveSourcesCommand.removedSourcePaths ) ).toEqual( cmd.getArg( AddSourcesCommand.addedSourcePaths ) ); - }); - - it("NoOpCommand Test", () => { - const cmd = CommandFactory.createNoOpCommand(); - expect( cmd.id ).toBe( NoOpCommand.id ); - expect( cmd.args ).not.toBeNull(); - expect( cmd.args.size ).toBe( 0 ); - expect( cmd.toString() ).toEqual( "NoOpCommand, []" ); - expect( cmd.isUndoable() ).toBe( false ); - }); - - it("NoOpCommand Undo Test", () => { - const cmd = CommandFactory.createNoOpCommand(); - const error = CommandFactory.createUndoCommand( cmd ); - expect( error instanceof Error).toBe( true ); - }); - - it("RemoveSourcesCommand Test", () => { - const conn1 = "conn1"; - const conn2 = "conn2"; - const path1 = "table=node1"; - const path2 = "table=node2"; - const node1 = SchemaNode.create( { connectionName: "conn1", path: path1 } ); - const node2 = SchemaNode.create( { connectionName: "conn2", path: path2 } ); - const temp = CommandFactory.createRemoveSourcesCommand( [ node1, node2 ], "ident" ); - expect( temp instanceof RemoveSourcesCommand ).toBe( true ); - - const cmd = temp as RemoveSourcesCommand; - expect( cmd.id ).toBe( RemoveSourcesCommand.id ); - expect( cmd.args ).not.toBeNull(); - expect( cmd.args.size ).toBe( 2 ); - - const expectedSrcPaths = "connection=" + conn1 + "/" + path1 + ", connection=" + conn2 + "/" + path2; - const expectedFull = expectedSrcPaths + ", ObjectId=ident"; - expect( cmd.getArg( RemoveSourcesCommand.removedSourcePaths ) ).toEqual( expectedSrcPaths ); - expect( cmd.toString() ).toEqual( "RemoveSourcesCommand, removedSourcePaths=" + expectedFull ); - expect( cmd.isUndoable() ).toBe( true ); - - const json = cmd.toJSON(); - const tempRoundtrip = CommandFactory.decode( json ); - expect( tempRoundtrip instanceof RemoveSourcesCommand ).toBe( true ); - - const roundtrip = tempRoundtrip as RemoveSourcesCommand; - expect( roundtrip.id ).toBe( cmd.id ); - expect( roundtrip.args.size ).toBe( cmd.args.size ); - expect( roundtrip.getArg( RemoveSourcesCommand.removedSourcePaths ) ).toBe( cmd.getArg( RemoveSourcesCommand.removedSourcePaths ) ); - }); - - it("RemoveSourcesCommand Undo Test", () => { - const node1 = SchemaNode.create( { connectionName: "conn1", path: "table=node1" } ); - const node2 = SchemaNode.create( { connectionName: "conn2", path: "table=node2" } ); - const tempCmd = CommandFactory.createRemoveSourcesCommand( [ node1, node2 ], "ident" ); - expect( tempCmd instanceof RemoveSourcesCommand ).toBe( true ); - - const cmd = tempCmd as RemoveSourcesCommand; - const tempUndoCmd = CommandFactory.createUndoCommand( cmd ); - expect( tempUndoCmd instanceof AddSourcesCommand ).toBe( true ); - - const undoCmd = tempUndoCmd as AddSourcesCommand; - expect( undoCmd ).not.toBeNull(); - expect( undoCmd.id ).toBe( AddSourcesCommand.id ); - expect( undoCmd.args.size ).toBe( 2 ); - expect( undoCmd.getArg( AddSourcesCommand.addedSourcePaths ) ).toEqual( cmd.getArg( RemoveSourcesCommand.removedSourcePaths ) ); - }); - - it("UpdateViewDescriptionCommand Test", () => { - const temp = CommandFactory.createUpdateViewDescriptionCommand( "theNewDescription", - "theOldDescription" ); - expect( temp instanceof UpdateViewDescriptionCommand ).toBe( true ); - - const cmd = temp as UpdateViewDescriptionCommand; - expect( cmd.id ).toBe( UpdateViewDescriptionCommand.id ); - expect( cmd.args ).not.toBeNull(); - expect( cmd.args.size ).toBe( 2 ); - expect( cmd.getArg( UpdateViewDescriptionCommand.newDescription ) ).toEqual( "theNewDescription" ); - expect( cmd.getArg( UpdateViewDescriptionCommand.oldDescription ) ).toEqual( "theOldDescription" ); - expect( cmd.toString() ).toEqual( "UpdateViewDescriptionCommand, newDescription=theNewDescription, oldDescription=theOldDescription" ); - expect( cmd.isUndoable() ).toBe( true ); - - const json = cmd.toJSON(); - const tempRoundtrip = CommandFactory.decode( json ); - expect( tempRoundtrip instanceof UpdateViewDescriptionCommand ).toBe( true ); - - const roundtrip = tempRoundtrip as UpdateViewDescriptionCommand; - expect( roundtrip.id ).toBe( cmd.id ); - expect( roundtrip.args.size ).toBe( cmd.args.size ); - expect( roundtrip.getArg( UpdateViewDescriptionCommand.newDescription ) ) - .toBe( cmd.getArg( UpdateViewDescriptionCommand.newDescription ) ); - expect( roundtrip.getArg( UpdateViewDescriptionCommand.oldDescription ) ) - .toBe( cmd.getArg( UpdateViewDescriptionCommand.oldDescription ) ); - }); - - it("UpdateViewDescriptionCommand Undo Test", () => { - const tempCmd = CommandFactory.createUpdateViewDescriptionCommand( "theNewDescription", - "theOldDescription" ); - expect( tempCmd instanceof UpdateViewDescriptionCommand ).toBe( true ); - - const cmd = tempCmd as UpdateViewDescriptionCommand; - const tempUndoCmd = CommandFactory.createUndoCommand( cmd ); - expect( tempUndoCmd instanceof UpdateViewDescriptionCommand ).toBe( true ); - - const undoCmd = tempUndoCmd as UpdateViewDescriptionCommand; - expect( undoCmd ).not.toBeNull(); - expect( undoCmd.id ).toBe( UpdateViewDescriptionCommand.id ); - expect( undoCmd.args.size ).toBe( 2 ); - expect( undoCmd.getArg( UpdateViewDescriptionCommand.newDescription ) ) - .toBe( cmd.getArg( UpdateViewDescriptionCommand.oldDescription ) ); - expect( undoCmd.getArg( UpdateViewDescriptionCommand.oldDescription ) ) - .toBe( cmd.getArg( UpdateViewDescriptionCommand.newDescription ) ); - }); - - it("UpdateViewNameCommand Test", () => { - const newName = "theNewName"; - const oldName = "theOldName"; - const temp = CommandFactory.createUpdateViewNameCommand( newName, oldName ); - expect( temp instanceof UpdateViewNameCommand ).toBe( true ); - - const cmd = temp as UpdateViewNameCommand; - expect( cmd.id ).toBe( UpdateViewNameCommand.id ); - expect( cmd.args ).not.toBeNull(); - expect( cmd.args.size ).toBe( 2 ); - expect( cmd.getArg( UpdateViewNameCommand.newName ) ).toEqual( newName ); - expect( cmd.getArg( UpdateViewNameCommand.oldName ) ).toEqual( oldName ); - expect( cmd.toString() ).toEqual( "UpdateViewNameCommand, newName=theNewName, oldName=theOldName" ); - expect( cmd.isUndoable() ).toBe( true ); - - const json = cmd.toJSON(); - const tempRoundtrip = CommandFactory.decode( json ); - expect( tempRoundtrip instanceof UpdateViewNameCommand ).toBe( true ); - - const roundtrip = tempRoundtrip as UpdateViewNameCommand; - expect( roundtrip.getArg( UpdateViewNameCommand.newName ) ).toBe( cmd.getArg( UpdateViewNameCommand.newName ) ); - expect( roundtrip.getArg( UpdateViewNameCommand.oldName ) ).toBe( cmd.getArg( UpdateViewNameCommand.oldName ) ); - }); - - it("UpdateViewNameCommand Undo Test", () => { - const tempCmd = CommandFactory.createUpdateViewNameCommand( "theNewName", - "theOldName" ); - expect( tempCmd instanceof UpdateViewNameCommand ).toBe( true ); - - const cmd = tempCmd as UpdateViewNameCommand; - const tempUndoCmd = CommandFactory.createUndoCommand( cmd ); - expect( tempUndoCmd instanceof UpdateViewNameCommand ).toBe( true ); - - const undoCmd = tempUndoCmd as UpdateViewNameCommand; - expect( undoCmd ).not.toBeNull(); - expect( undoCmd.id ).toBe( UpdateViewNameCommand.id ); - expect( undoCmd.args.size ).toBe( 2 ); - expect( undoCmd.getArg( UpdateViewNameCommand.newName ) ).toBe( cmd.getArg( UpdateViewNameCommand.oldName ) ); - expect( undoCmd.getArg( UpdateViewNameCommand.oldName ) ).toBe( cmd.getArg( UpdateViewNameCommand.newName ) ); - }); - -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/command-factory.ts b/ui/src/app/dataservices/virtualization/view-editor/command/command-factory.ts deleted file mode 100644 index 7f07dc07..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/command-factory.ts +++ /dev/null @@ -1,324 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { AddCompositionCommand } from "@dataservices/virtualization/view-editor/command/add-composition-command"; -import { AddSourcesCommand } from "@dataservices/virtualization/view-editor/command/add-sources-command"; -import { UpdateViewDescriptionCommand } from "@dataservices/virtualization/view-editor/command/update-view-description-command"; -import { UpdateViewNameCommand } from "@dataservices/virtualization/view-editor/command/update-view-name-command"; -import { RemoveSourcesCommand } from "@dataservices/virtualization/view-editor/command/remove-sources-command"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { NoOpCommand } from "@dataservices/virtualization/view-editor/command/no-op-command"; -import { Undoable } from "@dataservices/virtualization/view-editor/command/undo-redo/undoable"; -import { Composition } from "@dataservices/shared/composition.model"; -import { RemoveCompositionCommand } from "@dataservices/virtualization/view-editor/command/remove-composition-command"; -import { UpdateProjectedColumnsCommand } from "@dataservices/virtualization/view-editor/command/update-projected-columns-command"; - -export class CommandFactory { - - /** - * @param {string | SchemaNode[]} addedSources the JSON representation of or the schema nodes of the sources being added - * @returns {Command} the add sources command or a no op command if sources are empty - */ - public static createAddSourcesCommand( addedSources: string | SchemaNode[], id?: string ): Command { - if ( !addedSources || addedSources.length === 0 ) { - return NoOpCommand.NO_OP; - } - - return new AddSourcesCommand( addedSources, id ); - } - - /** - * @param {string | Composition} addedSources the JSON representation of or the composition being added - * @returns {Command} the add composition command or a no op command if composition is null - */ - public static createAddCompositionCommand( addedComposition: string | Composition, id?: string ): Command { - if ( !addedComposition || addedComposition === null ) { - return NoOpCommand.NO_OP; - } - - return new AddCompositionCommand( addedComposition, id ); - } - - /** - * @returns {Command} a no op command (never `null`) - */ - public static createNoOpCommand(): Command { - return NoOpCommand.NO_OP; - } - - /** - * @param {string | SchemaNode[]} removedSources the JSON representation of or the schema nodes of the sources being removed - * @returns {Command} the remove sources command or a no op command if sources are `undefined` or `null` - */ - public static createRemoveSourcesCommand( removedSources: string | SchemaNode[], id: string ): Command { - if ( !removedSources || removedSources.length === 0 ) { - return NoOpCommand.NO_OP; - } - - return new RemoveSourcesCommand( removedSources, id ); - } - - /** - * @param {string | SchemaNode[]} removedSources the JSON representation of or the schema nodes of the sources being removed - * @returns {Command} the remove sources command or a no op command if sources are `undefined` or `null` - */ - public static createRemoveCompositionCommand( removedComposition: string | Composition, id: string ): Command { - if ( !removedComposition || removedComposition === null ) { - return NoOpCommand.NO_OP; - } - - return new RemoveCompositionCommand( removedComposition, id ); - } - - /** - * - * @param {Command} cmd the command whose undoable is being requested - * @returns {Undoable | Error} the undoable or an error if an undoable cannot be created - */ - public static createUndoable( cmd: Command ): Undoable | Error { - if ( cmd.isUndoable() ) { - const undoOrError = CommandFactory.createUndoCommand( cmd ); - - if ( undoOrError instanceof Command ) { - return new Undoable( undoOrError as Command, cmd ); - } - - return undoOrError; - } - - return new Error( "The '" + cmd.id + "' command does not have an undo command" ); - } - - /** - * @param {Command} cmd the command whose undo command is being requested - * @returns {Command | Error} the undo command or an error if an undo command cannot be created - */ - public static createUndoCommand( cmd: Command ): Command | Error { - switch ( cmd.id ) { - case AddSourcesCommand.id: { - const value = cmd.getArg( AddSourcesCommand.addedSourcePaths ); - const id = cmd.getArg(Command.identArg); - return CommandFactory.createRemoveSourcesCommand( value, id ); - } - case RemoveSourcesCommand.id: { - const value = cmd.getArg( RemoveSourcesCommand.removedSourcePaths ); - return CommandFactory.createAddSourcesCommand( value ); - } - case AddCompositionCommand.id: { - const value = cmd.getArg( AddCompositionCommand.addedComposition ); - const id = cmd.getArg(Command.identArg); - return CommandFactory.createRemoveCompositionCommand( value, id ); - } - case RemoveCompositionCommand.id: { - const value = cmd.getArg( RemoveCompositionCommand.removedComposition ); - return CommandFactory.createAddCompositionCommand( value ); - } - case UpdateViewDescriptionCommand.id: { - return CommandFactory.createUpdateViewDescriptionCommand( cmd.getArg( UpdateViewDescriptionCommand.oldDescription ), - cmd.getArg( UpdateViewDescriptionCommand.newDescription ) ); - } - case UpdateViewNameCommand.id: { - return CommandFactory.createUpdateViewNameCommand( cmd.getArg( UpdateViewNameCommand.oldName ), - cmd.getArg( UpdateViewNameCommand.newName ) ); - } - case UpdateProjectedColumnsCommand.id: { - return CommandFactory.createUpdateProjectedColumnsCommand( cmd.getArg( UpdateProjectedColumnsCommand.oldProjectedColumns ), - cmd.getArg( UpdateProjectedColumnsCommand.newProjectedColumns ) ); - } - default: { - return new Error( "The '" + cmd.id + "' command does not have an undo command" ); - } - } - } - - /** - * @param {string} newDescription the new view description (can be `null` or empty if old description has a value) - * @param {string} oldDescription the view description being replaced (can be `null` or empty if new description has a value) - * @returns {Command | Error} the update view description command or an error if both the new an old description is missing - */ - public static createUpdateViewDescriptionCommand( newDescription: string, - oldDescription: string ): Command | Error { - if ( newDescription || oldDescription ) { - if ( newDescription === oldDescription ) { - return CommandFactory.createNoOpCommand(); - } - - return new UpdateViewDescriptionCommand( newDescription, oldDescription ); - } - - return new Error( "Must have either a new description or an old description when creating an UpdateViewDescriptionCommand" ); - } - - /** - * @param {string} newName the new view name (can be `null` or empty if the old name has a value) - * @param {string} oldName the view name being replaced (can be `null` or empty if the new name has a value) - * @returns {Command | Error} the update view name command or an error if both the new and old name is missing - */ - public static createUpdateViewNameCommand( newName: string, - oldName: string ): Command | Error { - if ( newName || oldName ) { - if ( newName === oldName ) { - return CommandFactory.createNoOpCommand(); - } - - return new UpdateViewNameCommand( newName, oldName ); - } - - return new Error( "Must have either a new name or an old name when creating an UpdateViewNameCommand" ); - } - - /** - * @param {string | ProjectedColumns} newProjColumns the stringified representation of or the new projected columns - * @param {string | ProjectedColumns} oldProjColumns the stringified representation of or the old projected columns - * @returns {Command} the update projected columns command or a no op command if args are not supplied - */ - public static createUpdateProjectedColumnsCommand( newProjColumns: string, - oldProjColumns: string ): Command { - if ( !newProjColumns || newProjColumns === null || !oldProjColumns || oldProjColumns === null ) { - return NoOpCommand.NO_OP; - } - - return new UpdateProjectedColumnsCommand( newProjColumns, oldProjColumns ); - } - - /** - * Constructs a command object from JSON. - * - * @param {object} json the JSON being converted to a command - * @returns {Command | Error} the decoded command or an error if one could not be constructed - */ - public static decode( json: object = {} ): Command | Error { - const cmdId = json[ Command.idPropJson ]; - const args = json[ Command.argsPropJson ]; - - switch ( cmdId ) { - case AddSourcesCommand.id: { - const addSourcePaths = args[ AddSourcesCommand.addedSourcePaths ]; - const addIdent = args[ Command.identArg ]; - - if ( addSourcePaths ) - return CommandFactory.createAddSourcesCommand( addSourcePaths, addIdent ); - - return new Error( "Unable to decode AddSourcesCommand: " + json ); - } - case RemoveSourcesCommand.id: { - const removedSourcePaths = args[ RemoveSourcesCommand.removedSourcePaths ]; - const removedIdent = args[ Command.identArg ]; - - if (removedSourcePaths && removedIdent) { - return CommandFactory.createRemoveSourcesCommand(removedSourcePaths, removedIdent); - } - - return new Error( "Unable to decode RemoveSourcesCommand: " + json ); - } - case AddCompositionCommand.id: { - const addComposition = args[ AddCompositionCommand.addedComposition ]; - const addIdent = args[ Command.identArg ]; - - if ( addComposition ) - return CommandFactory.createAddCompositionCommand( addComposition, addIdent ); - - return new Error( "Unable to decode AddCompositionCommand: " + json ); - } - case RemoveCompositionCommand.id: { - const removedComposition = args[ RemoveCompositionCommand.removedComposition ]; - const removedIdent = args[ Command.identArg ]; - - if (removedComposition && removedIdent) { - return CommandFactory.createRemoveCompositionCommand(removedComposition, removedIdent); - } - - return new Error( "Unable to decode RemoveCompositionCommand: " + json ); - } - case UpdateViewDescriptionCommand.id: { - const newViewDescription = args[ UpdateViewDescriptionCommand.newDescription ]; - const replacedViewDescription = args[ UpdateViewDescriptionCommand.oldDescription ]; - - if ( newViewDescription || replacedViewDescription ) { - return CommandFactory.createUpdateViewDescriptionCommand( newViewDescription, replacedViewDescription ); - } - - return new Error( "Unable to decode UpdateViewDescriptionCommand: " + json ); - } - case UpdateViewNameCommand.id: { - const newViewName = args[ UpdateViewNameCommand.newName ]; - const replacedViewName = args[UpdateViewNameCommand.oldName]; - - if ( newViewName || replacedViewName ) { - return CommandFactory.createUpdateViewNameCommand( newViewName, replacedViewName ); - } - - return new Error( "Unable to decode UpdateViewNameCommand: " + json ); - } - case UpdateProjectedColumnsCommand.id: { - const newProjectedCols = args[ UpdateProjectedColumnsCommand.newProjectedColumns ]; - const replacedProjectedCols = args[ UpdateProjectedColumnsCommand.oldProjectedColumns ]; - - if ( newProjectedCols || replacedProjectedCols ) { - return CommandFactory.createUpdateProjectedColumnsCommand( newProjectedCols, replacedProjectedCols ); - } - - return new Error( "Unable to decode UpdateProjectedColumnsCommand: " + json ); - } - default: { - return new Error( "Unhandled command: " + cmdId ); - } - } - } - - /** - * @param {Object} json the JSON representation of a Undoable - * @returns {Undoable | Error} the new Undoable or an error if the undoable could not be created - */ - public static decodeUndoable( json: object = {} ): Undoable | Error { - let undo: Command = null; - let redo: Command = null; - for (const field of Object.keys(json)) { - if (field === "undo") { - // length of 2 or shorter - no object. TODO: better way to do this? - if (JSON.stringify(json[field]).length > 2) { - const temp = CommandFactory.decode( json[ field ] ); - - if ( temp instanceof Command ) { - undo = temp; - } else { - return new Error( "Unable to decode undo command: " + temp ); - } - } - } else if (field === "redo") { - // length of 2 or shorter - no object. TODO: better way to do this? - if (JSON.stringify(json[field]).length > 2) { - const temp = CommandFactory.decode( json[ field ] ); - - if ( temp instanceof Command ) { - redo = temp; - } else { - return new Error( "Unable to decode redo command: " + temp ); - } - } - } - } - - if (!undo || !redo) { - return new Error( "Unable to create undoable" ); - } - - return new Undoable(undo, redo); - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/command-type.enum.ts b/ui/src/app/dataservices/virtualization/view-editor/command/command-type.enum.ts deleted file mode 100644 index 8a1ebbdc..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/command-type.enum.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Enumerates the available commands - */ -export enum CommandType { - - /** - * Command id for Add Composition - */ - ADD_COMPOSITION_COMMAND = "AddCompositionCommand", - - /** - * Command id for Add Sources - */ - ADD_SOURCES_COMMAND = "AddSourcesCommand", - - /** - * Command id for No op - */ - NO_OP_COMMAND = "NoOpCommand", - - /** - * Command id for Remove Composition - */ - REMOVE_COMPOSITION_COMMAND = "RemoveCompositionCommand", - - /** - * Command id for Remove Sources - */ - REMOVE_SOURCES_COMMAND = "RemoveSourcesCommand", - - /** - * Command id for Add Composition - */ - UPDATE_VIEW_DESCRIPTION_COMMAND = "UpdateViewDescriptionCommand", - - /** - * Command id for Add Composition - */ - UPDATE_VIEW_NAME_COMMAND = "UpdateViewNameCommand", - - /** - * Command id for Update Projected Columns - */ - UPDATE_PROJECTED_COLUMNS_COMMAND = "UpdateProjectedColumnsCommand" - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/command.ts b/ui/src/app/dataservices/virtualization/view-editor/command/command.ts deleted file mode 100644 index dac0c431..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/command.ts +++ /dev/null @@ -1,161 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export abstract class Command { - - /** - * The name of the JSON key used to store the arguments. - * @type {string} - */ - public static readonly argsPropJson = "args"; - - /** - * The name of the JSON key used to store the command identifier. - * - * @type {string} - */ - public static readonly idPropJson = "id"; - - /** - * The identifier used for the id argument - */ - public static readonly identArg = "ObjectId"; - - /** - * Divider symbol between the command ident and source paths - */ - public static readonly identDivider = "_-_"; - - protected readonly _args = new Map< string, any >(); - protected readonly _id: string; - protected readonly _name: string; - - protected constructor( id: string, - name: string ) { - this._id = id; - this._name = name; - } - - /** - * @returns {Map} a copy of the arguments to the command (never `null` but can be empty) - */ - public get args(): Map< string, any > { - const copy = new Map< string, any >(); - - this._args.forEach( ( value, key ) => { - copy.set( key, value ); - } ); - - return copy; - } - - private argsToJson(): {} { - const result = {}; - - this.args.forEach( ( value, key ) => { - if ( !this.isTransient( key ) ) { - result[ key ] = value; - } - } ); - - return result; - } - - /** - * @param {string} argName the name of the arg whose value is being requested - * @returns {any} the arg value or `undefined` if not found - */ - public getArg( argName: string ): any { - return this._args.get( argName ); - } - - /** - * @returns {string} the unique identifier of the command (never `null` or empty) - */ - public get id(): string { - return this._id; - } - - // noinspection JSMethodCanBeStatic - /** - * @param {string} argName the name of the argument being checked - * @returns {boolean} `true` if the argument should not be serialized - */ - protected isTransient( argName: string ): boolean { - return false; - } - - /** - * Subclasses need to override if they do not have an associated undo command. - * - * @returns {boolean} `true` if the command is undoable - */ - public isUndoable(): boolean { - return true; - } - - /** - * @returns {string} a short name of the command (never `null` or empty) - */ - public get name(): string { - return this._name; - } - - /** - * @returns {string} a unique 9 digit number preceeded with an underscore '_' - */ - public get idGen(): string { - return '_' + Math.random().toString(36).substr(2, 9); - } - - /** - * @returns {{}} a JSON representation of the command - */ - public toJSON(): {} { - return { - id: this.id, - args: this.argsToJson() - }; - } - - /** - * @returns {string} a string representation of the command - */ - public toString(): string { - let text = `${this.id}`; - let firstTime = true; - - if ( this.args.size !== 0 ) { - text += ", "; - - this.args.forEach( ( value, key ) => { - if ( firstTime ) { - firstTime = false; - } else { - text += ", "; - } - - text += key + "=" + String( value ); - } ); - } else { - text += ", []"; - } - - return text; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/no-op-command.ts b/ui/src/app/dataservices/virtualization/view-editor/command/no-op-command.ts deleted file mode 100644 index b542dccf..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/no-op-command.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; - -export class NoOpCommand extends Command { - - /** - * The command identifier. - * - * @type {string} - */ - public static readonly id = CommandType.NO_OP_COMMAND; - - /** - * The shared instance of the no op command. - * - * @type {NoOpCommand} - */ - public static readonly NO_OP = new NoOpCommand(); - - private constructor() { - super( NoOpCommand.id, ViewEditorI18n.noOpCommandName ); - } - - /** - * Overridden to ensure an empty map is always returned. - * - * @returns {Map} an empty map - */ - public get args(): Map< string, any > { - return new Map< string, any >(); - } - - /** - * Overridden to ensure `undefined` is always returned. - * - * @param {string} argName the name of the arg being requested - * @returns {string} undefined always - */ - public getArg( argName: string ): any { - return undefined; - } - - /** - * @returns {boolean} `false` - */ - public isUndoable(): boolean { - return false; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/remove-composition-command.ts b/ui/src/app/dataservices/virtualization/view-editor/command/remove-composition-command.ts deleted file mode 100644 index 334b0ee3..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/remove-composition-command.ts +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { Composition } from "@dataservices/shared/composition.model"; -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; - -export class RemoveCompositionCommand extends Command { - - /** - * The command identifier. - * - * @type {string} - */ - public static readonly id = CommandType.REMOVE_COMPOSITION_COMMAND; - - /** - * The name of the command argument whose value is the compositions being removed. - * - * @type {string} - */ - public static readonly removedComposition = "removedComposition"; - - /** - * Constructor - * 'removedCompositionName' must be an array of Compositions -OR- stringified composition - * - * @param {string | Composition} removedComposition the Composition object, or the stringified composition being - * removed (cannot be `null` or empty) - * @param {string} id the command id. If not supplied, an id is generated. - */ - public constructor( removedComposition: string | Composition, id: string ) { - super( RemoveCompositionCommand.id, ViewEditorI18n.removeCompositionCommandName ); - - let arg: string; - - if ( typeof removedComposition === "string" ) { - arg = removedComposition as string; - } else { - arg = JSON.stringify(removedComposition); - } - - this._args.set( RemoveCompositionCommand.removedComposition, arg ); - this._args.set( Command.identArg, id); - } - - /** - * @returns {string} the composition - */ - public getComposition(): Composition { - const compStr = this.getArg( RemoveCompositionCommand.removedComposition ) as string; - return Composition.create(JSON.parse(compStr)); - } - - /** - * @param {Composition} composition the Composition to use in generating the id - * @returns {string} the json payload for this command - */ - public getPayload(composition?: Composition): string { - return JSON.stringify(composition); - } - - /** - * @returns {string} a unique short identifier of this command - */ - public getId( ): string { - return this.getArg( Command.identArg ) as string; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/remove-sources-command.ts b/ui/src/app/dataservices/virtualization/view-editor/command/remove-sources-command.ts deleted file mode 100644 index c99d8b73..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/remove-sources-command.ts +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; - -export class RemoveSourcesCommand extends Command { - - /** - * The command identifier. - * - * @type {string} - */ - public static readonly id = CommandType.REMOVE_SOURCES_COMMAND; - - /** - * The name of the command argument whose value is the paths of the sources being removed. - * - * @type {string} - */ - public static readonly removedSourcePaths = "removedSourcePaths"; - - private static readonly delim = ", "; - - /** - * Constructor - * 'removedSources' must be an array of SchemaNodes -OR- - * string of the source paths (comma delimited) - path form: "connection=aConn/schema=aSchema/table=aTable" - * - * @param {string | SchemaNode} removedSources the string representation of the sources or the schema nodes of the sources - * being removed (cannot be `null` or empty) - * @param {string} id the command id (cannot be 'null' or empty) - */ - public constructor( removedSources: string | SchemaNode[], id: string ) { - super( RemoveSourcesCommand.id, ViewEditorI18n.removeSourcesCommandName ); - - let arg: string; - - if ( typeof removedSources === "string" ) { - arg = removedSources as string; - } else { - arg = ""; - const sources = removedSources as SchemaNode[]; - let firstTime = true; - - sources.forEach( ( source ) => { - if ( firstTime ) { - firstTime = false; - } else { - arg += ", "; - } - - // Prepend the connection to the schema node path - arg += "connection=" + source.getConnectionName() + "/" + source.getPath(); - } ); - } - - this._args.set( RemoveSourcesCommand.removedSourcePaths, arg ); - this._args.set( Command.identArg, id); - } - - /** - * @returns {string[]} an array of the paths of the sources being added - */ - public getSourcePaths(): string[] { - const argValue = this.getArg( RemoveSourcesCommand.removedSourcePaths ) as string; - return argValue.split( RemoveSourcesCommand.delim ); - } - - /** - * @returns {string} the json payload for this command - */ - public getPayload(sourcePath?: string): string { - if (sourcePath) - return sourcePath; - return this.getArg( Command.identArg ) as string; - } - - /** - * @returns {string} a unique identifier of this command - */ - public getId( ): string { - return this.getArg( Command.identArg ) as string; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undo-manager.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undo-manager.spec.ts deleted file mode 100644 index a0d8b452..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undo-manager.spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { UndoManager } from "@dataservices/virtualization/view-editor/command/undo-redo/undo-manager"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { CommandFactory } from "@dataservices/virtualization/view-editor/command/command-factory"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { Undoable } from "@dataservices/virtualization/view-editor/command/undo-redo/undoable"; - -describe( "UndoManager Tests", () => { - - it( "shouldHaveGoodInitialState", () => { - const undoMgr = new UndoManager(); - expect( undoMgr.canRedo() ).toBe( false ); - expect( undoMgr.canUndo() ).toBe( false ); - expect( () => { undoMgr.peekRedoCommand(); } ).toThrow(); - expect( () => { undoMgr.popRedoCommand(); } ).toThrow(); - expect( () => { undoMgr.peekUndoCommand(); } ).toThrow(); - expect( () => { undoMgr.popUndoCommand(); } ).toThrow(); - expect( undoMgr.redoLabel() ).toBe( ViewEditorI18n.redoActionTooltip ); - expect( undoMgr.toArray().length ).toBe( 0 ); - expect( undoMgr.undoLabel() ).toBe( ViewEditorI18n.undoActionTooltip ); - } ); - - it( "shouldAddUndoable", () => { - const undoMgr = new UndoManager(); - const cmd = CommandFactory.createUpdateViewNameCommand( "newName", "oldName"); - const undoable = CommandFactory.createUndoable( cmd as Command ) ; - undoMgr.add( undoable as Undoable ); - - expect( undoMgr.canRedo() ).toBe( false ); - expect( undoMgr.canUndo() ).toBe( true ); - expect( () => { undoMgr.peekRedoCommand(); } ).toThrow(); - expect( () => { undoMgr.popRedoCommand(); } ).toThrow(); - expect( undoMgr.peekUndoCommand() instanceof Command ).toBe( true ); - expect( undoMgr.toArray().length ).toBe( 1 ); - - // now pop - expect( undoMgr.popUndoCommand() instanceof Command ).toBe( true ); - expect( undoMgr.canRedo() ).toBe( true ); - expect( undoMgr.canUndo() ).toBe( false ); - expect( () => { undoMgr.peekUndoCommand(); } ).toThrow(); - expect( () => { undoMgr.popUndoCommand(); } ).toThrow(); - expect( undoMgr.peekRedoCommand() instanceof Command ).toBe( true ); - expect( undoMgr.toArray().length ).toBe( 1 ); - expect( undoMgr.toJSON()[ "undoables"].length ).toBe( 1 ); - } ); - - it( "shouldClear", () => { - const undoMgr = new UndoManager(); - const cmd = CommandFactory.createUpdateViewNameCommand( "newName", "oldName"); - const undoable = CommandFactory.createUndoable( cmd as Command ) ; - undoMgr.add( undoable as Undoable ); - - expect( undoMgr.canRedo() ).toBe( false ); - expect( undoMgr.canUndo() ).toBe( true ); - expect( () => { undoMgr.peekRedoCommand(); } ).toThrow(); - expect( () => { undoMgr.popRedoCommand(); } ).toThrow(); - expect( undoMgr.peekUndoCommand() instanceof Command ).toBe( true ); - expect( undoMgr.toArray().length ).toBe( 1 ); - - // now pop - expect( undoMgr.popUndoCommand() instanceof Command ).toBe( true ); - expect( undoMgr.canRedo() ).toBe( true ); - expect( undoMgr.canUndo() ).toBe( false ); - expect( () => { undoMgr.peekUndoCommand(); } ).toThrow(); - expect( () => { undoMgr.popUndoCommand(); } ).toThrow(); - expect( undoMgr.peekRedoCommand() instanceof Command ).toBe( true ); - expect( undoMgr.toArray().length ).toBe( 1 ); - expect( undoMgr.toJSON()[ "undoables"].length ).toBe( 1 ); - } ); - - it( "shouldConvertToArrayCorrectly" , () => { - const undoMgr = new UndoManager(); - - // add update name command - let cmd = CommandFactory.createUpdateViewNameCommand( "newName", "oldName"); - let undoable = CommandFactory.createUndoable( cmd as Command ) ; - undoMgr.add( undoable as Undoable ); - - // add update description command - cmd = CommandFactory.createUpdateViewNameCommand( "newName", "oldName"); - undoable = CommandFactory.createUndoable( cmd as Command ) ; - undoMgr.add( undoable as Undoable ); - - // should include both undoables - expect( undoMgr.toArray()).not.toBe( null ); - expect( undoMgr.toArray().length).toBe( 2 ); - - // move the pointer to the left - undoMgr.popUndoCommand(); - expect( undoMgr.toArray().length).toBe( 1 ); - expect( undoMgr.toArray().length).toBe( 1 ); - } ); - - it( "shouldConvertToJsonCorrectly" , () => { - const undoMgr = new UndoManager(); - - // add update name command - let cmd = CommandFactory.createUpdateViewNameCommand( "newName", "oldName"); - let undoable = CommandFactory.createUndoable( cmd as Command ) ; - undoMgr.add( undoable as Undoable ); - - // add update description command - cmd = CommandFactory.createUpdateViewDescriptionCommand( "newDescription", "oldDescription"); - undoable = CommandFactory.createUndoable( cmd as Command ) ; - undoMgr.add( undoable as Undoable ); - - // should include both undoables - expect( undoMgr.toJSON() ).not.toBe( null ); - expect( undoMgr.toJSON()[ UndoManager.undoables ] ).not.toBe( null ); - expect( undoMgr.toJSON()[ UndoManager.undoables ] instanceof Array ).toBe( true ); - - const undoables = undoMgr.toJSON()[ UndoManager.undoables ] as Array< any >; - expect( undoables.length ).toBe( 2 ); - - // move the pointer to the left - undoMgr.popUndoCommand(); - expect( undoMgr.toArray().length).toBe( 1 ); - expect( undoMgr.toArray().length).toBe( 1 ); - } ); - -} ); diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undo-manager.ts b/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undo-manager.ts deleted file mode 100644 index 2b10ca1d..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undo-manager.ts +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { UndoNode } from "@dataservices/virtualization/view-editor/command/undo-redo/undo-node"; -import { Undoable } from "@dataservices/virtualization/view-editor/command/undo-redo/undoable"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; - -export class UndoManager { - - /** - * The name of the JSON property whose value is the array of {@link Undoable}s. - * - * @type {string} - */ - public static readonly undoables = "undoables"; - - private currentIndex: UndoNode = null; - private readonly rootNode: UndoNode; - - public constructor() { - this.rootNode = new UndoNode(); - this.currentIndex = this.rootNode; - } - - /** - * @param {Undoable} undoable the undoable being added (cannot be `null`) - */ - public add( undoable: Undoable ): void { - const node = new UndoNode( undoable ); - this.currentIndex.right = node; - node.left = this.currentIndex; - this.currentIndex = node; - } - - /** - * Removes all undoables. - */ - public clear(): void { - this.currentIndex = this.rootNode; - } - - /** - * @returns {boolean} `true` if there is a redo command can be executed - */ - public canRedo(): boolean { - return this.currentIndex.right !== null; - } - - /** - * @returns {boolean} `true` if there is an undo command can be executed - */ - public canUndo(): boolean { - return this.currentIndex !== this.rootNode; - } - - private moveLeft(): void { - if ( this.currentIndex.left == null ) { - throw new RangeError( "Cannot move left since internal index is null." ); - } - - this.currentIndex = this.currentIndex.left; - } - - private moveRight(): void { - if ( this.currentIndex.right == null ) { - throw new RangeError( "Cannot move right since internal index is null." ); - } - - this.currentIndex = this.currentIndex.right; - } - - /** - * Calling this method does not affect the undo manager command stack. If the redo method will be executed call - * the `popRedoCommand` method instead. - * - * @returns {Command} the current redo command to execute (never `null`) - * @throws {RangeError} if there is not an available redo command - */ - public peekRedoCommand(): Command { - if ( !this.canRedo() ) { - throw new RangeError( "Cannot redo since index is out of range." ); - } - - return this.currentIndex.right.undoable.redoCommand; - } - - /** - * Calling this method does not affect the undo manager command stack. If the undo method will be executed call - * the `popUndoCommand` method instead. - * - * @returns {Command} the available undo command - * @throws {RangeError} if there is not an undo command - */ - public peekUndoCommand(): Command { - if ( !this.canUndo() ) { - throw new RangeError( "Cannot undo since index is out of range." ); - } - - return this.currentIndex.undoable.undoCommand; - } - - /** - * Removes the current redo command from the redo command stack. - * - * @returns {Command} the current redo command to execute (never `null`) - * @throws {RangeError} if there is not an available redo command - */ - public popRedoCommand(): Command { - if ( !this.canRedo() ) { - throw new RangeError( "Cannot redo since index is out of range." ); - } - - this.moveRight(); - return this.currentIndex.undoable.redoCommand; - } - - /** - * Removes the current undo command from the undo command stack. - * - * @returns {Command} the current undo command to execute (never `null`) - * @throws {RangeError} if there is not an undo command - */ - public popUndoCommand(): Command { - if ( !this.canUndo() ) { - throw new RangeError( "Cannot undo since index is out of range." ); - } - - const cmd = this.currentIndex.undoable.undoCommand; - this.moveLeft(); - return cmd; - } - - /** - * @returns {string} a short description, suitable for use in tooltips, of the next available redo command - */ - public redoLabel(): string { - let label = ViewEditorI18n.redoActionTooltip; - - if ( this.canRedo() ) { - label += " " + this.peekRedoCommand().name; - } - - return label; - } - - /** - * @param {boolean} includeAll if `false` will include from the first up to the current node - * @returns {Undoable[]} a collection of undoables in order from the first to the last (can be empty) - */ - public toArray( includeAll: boolean = false ): Undoable[] { - const result: Undoable[] = []; - - let node = this.rootNode.right; - - while ( node != null ) { - result.push( node.undoable ); - - if ( !includeAll && this.currentIndex === node ) { - break; - } - - node = node.right; - } - - return result; - } - - public toJSON(): {} { - const json = []; - this.toArray().forEach( ( undoable ) => json.push( undoable.toJSON() ) ); - - return { - [ UndoManager.undoables ]: json - }; - } - - /** - * @returns {string} a string representation of this undo manager - */ - public toString(): string { - let result = ""; - let firstTime = true; - - this.toArray().forEach( ( undoable ) => { - if ( firstTime ) { - firstTime = false; - } else { - result += "\n"; - } - - result += undoable.toString(); - } ); - - return result; - } - - /** - * @returns {string} a short description, suitable for use in tooltips, of the next available undo command - */ - public undoLabel(): string { - let label = ViewEditorI18n.undoActionTooltip; - - if ( this.canUndo() ) { - label += " " + this.currentIndex.undoable.redoCommand.name; - } - - return label; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undo-node.ts b/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undo-node.ts deleted file mode 100644 index ed25d7c8..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undo-node.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Undoable } from "@dataservices/virtualization/view-editor/command/undo-redo/undoable"; - -export class UndoNode { - - private _left: UndoNode = null; - private _right: UndoNode = null; - private readonly _undoable: Undoable; - - public constructor( undoable?: Undoable ) { - if ( undoable ) { - this._undoable = undoable; - } - } - - /** - * @returns {UndoNode} the node to the left or `null` - */ - public get left(): UndoNode { - return this._left; - } - - /** - * @param {UndoNode} node the new left node - */ - public set left( node: UndoNode ) { - this._left = node; - } - - /** - * @returns {UndoNode} the node to the right or `null` - */ - public get right(): UndoNode { - return this._right; - } - - /** - * @param {UndoNode} node the new right node - */ - public set right( node: UndoNode ) { - this._right = node; - } - - /** - * @returns {Undoable} the undoable associated with this node (never `null`) - */ - public get undoable(): Undoable { - return this._undoable; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undoable.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undoable.spec.ts deleted file mode 100644 index 80455b67..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undoable.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Undoable } from "@dataservices/virtualization/view-editor/command/undo-redo/undoable"; -import { UpdateViewNameCommand } from "@dataservices/virtualization/view-editor/command/update-view-name-command"; -import { CommandFactory } from "@dataservices/virtualization/view-editor/command/command-factory"; - -describe("Undoable", () => { - let result: Undoable | Error; - - beforeEach(() => { - result = null; - }); - - it("should create", () => { - console.log( "========== [Undoable] should create" ); - result = CommandFactory.decodeUndoable( - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { "oldName": "v", "newName": "" } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { "oldName": "b", "newName": "v" } - } - } - ); - - if ( result instanceof Undoable ) { - const undoable = result as Undoable; - expect( undoable.undoCommand.id ).toEqual( UpdateViewNameCommand.id ); - expect( undoable.redoCommand.id ).toEqual( UpdateViewNameCommand.id ); - } else { - fail("Unable to create Undoable"); - } - }); - -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undoable.ts b/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undoable.ts deleted file mode 100644 index 173df0e6..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/undo-redo/undoable.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Command } from "@dataservices/virtualization/view-editor/command/command"; - -export class Undoable { - - private readonly _redoCmd: Command; - private readonly _undoCmd: Command; - - /** - * Constructs an undoable. !! ** The undo and redo commands should not be `null` *** !! - * @param {Command} undoCmd the undo command (should not be `null`) - * @param {Command} redoCmd the redo command (should not be `null`) - */ - public constructor( undoCmd: Command, - redoCmd: Command ) { - this._undoCmd = undoCmd; - this._redoCmd = redoCmd; - } - - /** - * @returns {Command} the redo command (never `null`) - */ - public get redoCommand(): Command { - return this._redoCmd; - } - - /** - * @returns {{}} a JSON representation of this undoable - */ - public toJSON(): {} { - return { - undo: this.undoCommand.toJSON(), - redo: this.redoCommand.toJSON() - }; - } - - /** - * @returns {string} a string representation of this undoable - */ - public toString(): string { - return "undo: " + this.undoCommand.toString() + ", redo: " + this.redoCommand.toString(); - } - - /** - * @returns {Command} the undo command (never `null`) - */ - public get undoCommand(): Command { - return this._undoCmd; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/update-projected-columns-command.ts b/ui/src/app/dataservices/virtualization/view-editor/command/update-projected-columns-command.ts deleted file mode 100644 index e9eb427c..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/update-projected-columns-command.ts +++ /dev/null @@ -1,134 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; -import { ProjectedColumn } from "@dataservices/shared/projected-column.model"; - -export class UpdateProjectedColumnsCommand extends Command { - - /** - * The command identifier. - * - * @type {string} - */ - public static readonly id = CommandType.UPDATE_PROJECTED_COLUMNS_COMMAND; - - /** - * The name of the command argument whose value is the new projected columns of the view. - * - * @type {string} - */ - public static readonly newProjectedColumns = "newProjectedColumns"; - - /** - * The name of the command argument whose value is the replaced projected columns of the view. - * - * @type {string} - */ - public static readonly oldProjectedColumns = "oldProjectedColumns"; - - /** - * Constructor - * the specified ProjectedColumns must be a ProjectedColumns object -OR- stringified projected columns - * @param {string | ProjectedColumn[]} newProjectedColumns the new projected columns or stringified projected columns - * (cannot be `null` or empty) - * @param {string | ProjectedColumn[]} oldProjectedColumns the projected columns being replaced or stringified columns - * (cannot be `null` or empty) - * @param {string} id the command id. If not supplied, an id is generated. - */ - public constructor( newProjectedColumns: string | ProjectedColumn[], - oldProjectedColumns: string | ProjectedColumn[], id?: string) { - super( UpdateProjectedColumnsCommand.id, ViewEditorI18n.updateProjectedColumnsCommandName ); - - let newColsArg: string; - if ( typeof newProjectedColumns === 'string' ) { - newColsArg = newProjectedColumns as string; - } else { - newColsArg = JSON.stringify(newProjectedColumns); - } - this._args.set( UpdateProjectedColumnsCommand.newProjectedColumns, newColsArg ); - - let oldColsArg: string; - if ( typeof oldProjectedColumns === 'string' ) { - oldColsArg = oldProjectedColumns as string; - } else { - oldColsArg = JSON.stringify(oldProjectedColumns); - } - this._args.set( UpdateProjectedColumnsCommand.oldProjectedColumns, oldColsArg ); - - if (!id) { - // - // Generate new id - // - id = UpdateProjectedColumnsCommand.id + this.idGen; - } - - this._args.set( Command.identArg, id); - } - - /** - * @returns {ProjectedColumns} the new projected columns - */ - public getNewProjectedColumns(): ProjectedColumn[] { - const newColsStr = this.getArg( UpdateProjectedColumnsCommand.newProjectedColumns ) as string; - const newCols = JSON.parse(newColsStr); - const cols: ProjectedColumn[] = []; - for (const elem of newCols) { - const col: ProjectedColumn = ProjectedColumn.create(elem); - cols.push(col); - } - return cols; - } - - /** - * @returns {string} json payload for new projected columns - */ - public getNewProjecteColumnsPayload( ): string { - return this.getArg( UpdateProjectedColumnsCommand.newProjectedColumns ) as string; - } - - /** - * @returns {ProjectedColumn[]} the old projected columns - */ - public getOldProjectedColumns(): ProjectedColumn[] { - const oldColsStr = this.getArg( UpdateProjectedColumnsCommand.oldProjectedColumns ) as string; - const oldCols = JSON.parse(oldColsStr); - const cols: ProjectedColumn[] = []; - for (const elem of oldCols) { - const col: ProjectedColumn = ProjectedColumn.create(elem); - cols.push(col); - } - return cols; - } - - /** - * @returns {string} json payload for old projected columns - */ - public getOldProjecteColumnsPayload( ): string { - return this.getArg( UpdateProjectedColumnsCommand.oldProjectedColumns ) as string; - } - - /** - * @returns {string} a unique short identifier of this command - */ - public getId( ): string { - return this.getArg( Command.identArg ) as string; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/update-view-description-command.ts b/ui/src/app/dataservices/virtualization/view-editor/command/update-view-description-command.ts deleted file mode 100644 index 2ba0b073..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/update-view-description-command.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; - -export class UpdateViewDescriptionCommand extends Command { - - /** - * The command identifier. - * - * @type {string} - */ - public static readonly id = CommandType.UPDATE_VIEW_DESCRIPTION_COMMAND; - - /** - * The name of the command argument whose value is the new description of the view. - * - * @type {string} - */ - public static readonly newDescription = "newDescription"; - - /** - * The name of the command argument whose value is the replaced description of the view. - * - * @type {string} - */ - public static readonly oldDescription = "oldDescription"; - - /** - * @param {string} newViewDescription the new view description (can be `null` or empty) - * @param {string} oldViewDescription the view description being replaced (can be `null` or empty) - */ - public constructor( newViewDescription: string, - oldViewDescription: string ) { - super( UpdateViewDescriptionCommand.id, ViewEditorI18n.updateViewDescriptionCommandName ); - - if ( newViewDescription ) { - this._args.set( UpdateViewDescriptionCommand.newDescription, newViewDescription ); - } - - if ( oldViewDescription ) { - this._args.set( UpdateViewDescriptionCommand.oldDescription, oldViewDescription ); - } - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/command/update-view-name-command.ts b/ui/src/app/dataservices/virtualization/view-editor/command/update-view-name-command.ts deleted file mode 100644 index 81bfc3a7..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/command/update-view-name-command.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; - -export class UpdateViewNameCommand extends Command { - - /** - * The command identifier. - * - * @type {string} - */ - public static readonly id = CommandType.UPDATE_VIEW_NAME_COMMAND; - - /** - * The name of the command argument whose value is the new name of the view. - * - * @type {string} - */ - public static readonly newName = "newName"; - - /** - * The name of the command argument whose value is the replaced name of the view. - * - * @type {string} - */ - public static readonly oldName = "oldName"; - - /** - * @param {string} newViewName the new view name (can be `null` or empty) - * @param {string} oldViewName the view name being replaced (can be `null` or empty) - */ - public constructor( newViewName: string, - oldViewName: string ) { - super( UpdateViewNameCommand.id, ViewEditorI18n.updateViewNameCommandName ); - - if ( newViewName ) { - this._args.set( UpdateViewNameCommand.newName, newViewName ); - } - - if ( oldViewName ) { - this._args.set( UpdateViewNameCommand.oldName, oldViewName ); - } - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.css b/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.html b/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.html deleted file mode 100644 index e62fd861..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.spec.ts deleted file mode 100644 index c7a7a5e0..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { ConnectionTableDialogComponent } from "./connection-table-dialog.component"; -import { ConnectionTreeSelectorComponent } from "@dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component"; -import { TreeModule } from "angular-tree-component"; -import { HttpModule } from "@angular/http"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { BsModalRef, ModalModule } from "ngx-bootstrap"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; - -describe("ConnectionTableDialogComponent", () => { - let component: ConnectionTableDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule, - TreeModule, - ModalModule.forRoot(), - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule - ], - declarations: [ ConnectionTableDialogComponent, ConnectionTreeSelectorComponent ], - providers: [ AppSettingsService, BsModalRef, LoggerService, NotifierService, - { provide: ConnectionService, useClass: MockConnectionService }, - { provide: VdbService, useClass: MockVdbService } - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ConnectionTableDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.ts b/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.ts deleted file mode 100644 index 5017a33b..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component.ts +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnInit, ViewChild } from "@angular/core"; -import { Output } from "@angular/core"; -import { EventEmitter } from "@angular/core"; -import { BsModalRef } from "ngx-bootstrap"; -import { ConnectionTreeSelectorComponent } from "@dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { ConnectionsConstants } from "@connections/shared/connections-constants"; -import { LoadingState } from "@shared/loading-state.enum"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { LoggerService } from "@core/logger.service"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; - -@Component({ - selector: "app-connection-table-dialog", - templateUrl: "./connection-table-dialog.component.html", - styleUrls: ["./connection-table-dialog.component.css"] -}) -/** - * ConnectionTable Dialog. Invoke this from another component as follows: - * - * this.modalRef = this.modalService.show(ConnectionTableDialogComponent, {initialState}); - * this.modalRef.content.okAction.take(1).subscribe((selectedNodes) => { - * // do something with array of selected nodes - selectedNodes - SchemaNode[] - * }); - * - * The expected initial state is as follows: - * const initialState = { - * title: "The dialog title", - * cancelButtonText: "Text for cancel button", - * confirmButtonText: "Text for confirm button" - * }; - */ -export class ConnectionTableDialogComponent implements OnInit { - - @ViewChild(ConnectionTreeSelectorComponent) public connectionTree: ConnectionTreeSelectorComponent; - - @Output() public okAction = new EventEmitter(); - - public readonly title = ViewEditorI18n.connectionTableSelectionDialogTitle; - public readonly message = ViewEditorI18n.connectionTableSelectionDialogMessage; - public readonly cancelButtonText = ViewEditorI18n.cancelButtonText; - public readonly okButtonText = ViewEditorI18n.okButtonText; - public okButtonEnabled = false; - public bsModalRef: BsModalRef; - public selectionText = ViewEditorI18n.noSelection; - public readonly currentSelectionMsg = ViewEditorI18n.currentSelection; - - private connectionService: ConnectionService; - private selectedTreeNodes: SchemaNode[] = []; - private loggerService: LoggerService; - private connectionLoadingState: LoadingState = LoadingState.LOADING; - - constructor(bsModalRef: BsModalRef, connectionService: ConnectionService, logger: LoggerService) { - this.bsModalRef = bsModalRef; - this.connectionService = connectionService; - this.loggerService = logger; - } - - public ngOnInit(): void { - // Load the connections - this.connectionLoadingState = LoadingState.LOADING; - const self = this; - this.connectionService - .getConnections(true, true) - .subscribe( - (connectionSummaries) => { - const conns = []; - const treeNodes = []; - for ( const connectionSummary of connectionSummaries ) { - const connStatus = connectionSummary.getStatus(); - const conn = connectionSummary.getConnection(); - conn.setStatus(connStatus); - conns.push(conn); - // Add active connection to tree root nodes - if (conn.isActive) { - const node = new SchemaNode(); - node.setName(conn.getId()); - node.setType(ConnectionsConstants.schemaNodeType_connection); - node.setHasChildren(true); - treeNodes.push(node); - } - } - self.connectionTree.setTreeRoots(treeNodes); - self.connectionLoadingState = LoadingState.LOADED_VALID; - }, - (error) => { - self.loggerService.error("[ConnectionTableDialogComponent] Error getting connections: %o", error); - self.connectionLoadingState = LoadingState.LOADED_INVALID; - } - ); - } - - /** - * Handles tree node selection - * @param {SchemaNode} $event - */ - public onTreeNodeSelected( $event: SchemaNode ): void { - const selectedNode = $event; - if (selectedNode && selectedNode !== null && selectedNode.isQueryable()) { - this.selectedTreeNodes = []; - this.selectedTreeNodes.push(selectedNode); - } else { - this.selectedTreeNodes = []; - } - this.setSelectionTextAndOkButtonEnablement(); - } - - /** - * Handles tree node de-selection - * @param {SchemaNode} $event - */ - public onTreeNodeDeselected( $event: SchemaNode ): void { - const selectedNode = $event; - this.selectedTreeNodes = []; - this.setSelectionTextAndOkButtonEnablement(); - } - - /** - * OK selected. The array of selected SchemaNodes is emiited, then modal is closed - */ - public onOkSelected(): void { - this.okAction.emit(this.selectedTreeNodes); - this.bsModalRef.hide(); - } - - /** - * Cancel selected. The modal is closed. - */ - public onCancelSelected(): void { - this.bsModalRef.hide(); - } - - /** - * Sets the node selection text and OK button enablement, based upon the selections - */ - private setSelectionTextAndOkButtonEnablement(): void { - if (this.selectedTreeNodes.length > 0) { - this.selectionText = "[" + this.selectedTreeNodes[0].getConnectionName() + "] " + - this.selectedTreeNodes[0].getName(); - this.okButtonEnabled = true; - } else { - this.selectionText = "Nothing selected"; - this.okButtonEnabled = false; - } - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.css b/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.css deleted file mode 100644 index 75624871..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.css +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Tree selection area - */ -.tree-selection-area { - border: 1px solid #bbbbbb; - overflow-y: auto; - height: 250px; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.html b/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.html deleted file mode 100644 index fe598d22..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.html +++ /dev/null @@ -1,9 +0,0 @@ -
    - - -
    diff --git a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.spec.ts deleted file mode 100644 index 05b8041a..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { ConnectionTreeSelectorComponent } from "./connection-tree-selector.component"; -import { LoggerService } from "@core/logger.service"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { TreeModule } from "angular-tree-component"; -import { HttpModule } from "@angular/http"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; - -describe("ConnectionTreeSelectorComponent", () => { - let component: ConnectionTreeSelectorComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ HttpModule, TreeModule ], - declarations: [ ConnectionTreeSelectorComponent ], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService }, - LoggerService, - NotifierService, - { provide: ConnectionService, useClass: MockConnectionService }, - { provide: VdbService, useClass: MockVdbService }, - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ConnectionTreeSelectorComponent); - component = fixture.componentInstance; - - // const node = { - // "connectionName": "pgConn", - // "name": "restaurants", - // "type": "collection", - // "queryable": true, - // "children": [ - // { - // "connectionName": "pgConn", - // "name": "grades", - // "type": "embedded", - // "queryable": true, - // "children": [] - // }, - // { - // "connectionName": "pgConn", - // "name": "location", - // "type": "embedded", - // "queryable": true, - // "children": [] - // } - // ] - // }; - // - // component.nodes = [ SchemaNode.create( node ) ]; - // component.options = {}; - fixture.detectChanges(); - }); - - // it("should be created", () => { - // expect(component).toBeTruthy(); - // }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.ts b/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.ts deleted file mode 100644 index 8b6442ca..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component.ts +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, EventEmitter, OnInit, Output } from "@angular/core"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { LoggerService } from "@core/logger.service"; -import { TreeNode } from "angular-tree-component/dist/defs/api"; - -@Component({ - selector: "app-connection-tree-selector", - templateUrl: "./connection-tree-selector.component.html", - styleUrls: ["./connection-tree-selector.component.css"] -}) -/** - * ConnectionTreeSelector. This is the tree selector component for selecting connection nodes. - * - */ -export class ConnectionTreeSelectorComponent implements OnInit { - - @Output() public nodeSelected: EventEmitter = new EventEmitter(); - @Output() public nodeDeselected: EventEmitter = new EventEmitter(); - - public nodes = []; - public options; - - private connectionService: ConnectionService; - private logger: LoggerService; - - constructor( connectionService: ConnectionService, logger: LoggerService ) { - this.connectionService = connectionService; - this.logger = logger; - } - - /* - * Component initialization - */ - public ngOnInit(): void { - // Tree Options (specify async loading of root children) - this.options = { - // Handles Async Call to get Connection children - getChildren: this.lazyLoadChildren.bind(this) - }; - } - - public onEvent(event): void { - if (event.eventName === "activate") { - this.nodeSelected.emit(event.node.data); - } else if (event.eventName === "deactivate") { - this.nodeDeselected.emit(event.node.data); - } - } - - public setTreeRoots( roots: SchemaNode[]): void { - this.nodes = roots; - } - - private lazyLoadChildren(node: TreeNode): any { - return this.connectionService.getConnectionSchema(node.data.name).toPromise(); - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.css b/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.html b/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.html deleted file mode 100644 index 263ccd76..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.html +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.spec.ts deleted file mode 100644 index 04cfebdb..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.spec.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { CreateViewDialogComponent } from './create-view-dialog.component'; -import { HttpModule } from "@angular/http"; -import { BsModalRef, ModalModule } from "ngx-bootstrap"; -import { - ActionModule, - NotificationModule -} from "patternfly-ng"; -import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { LoggerService } from "@core/logger.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { SelectionService } from "@core/selection.service"; - -describe('CreateViewDialogComponent', () => { - let component: CreateViewDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule, - FormsModule, - ReactiveFormsModule, - ModalModule.forRoot(), - ActionModule, - NotificationModule - ], - declarations: [ CreateViewDialogComponent ], - providers: [ AppSettingsService, BsModalRef, LoggerService, NotifierService, SelectionService, - { provide: VdbService, useClass: MockVdbService } - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(CreateViewDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.ts b/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.ts deleted file mode 100644 index b62a4457..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component.ts +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnInit } from "@angular/core"; -import { Output } from "@angular/core"; -import { EventEmitter } from "@angular/core"; -import { BsModalRef } from "ngx-bootstrap"; -import { LoggerService } from "@core/logger.service"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { AbstractControl, FormControl, FormGroup } from "@angular/forms"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { ViewDefinition } from "@dataservices/shared/view-definition.model"; -import { SelectionService } from "@core/selection.service"; - -@Component({ - selector: "app-create-view-dialog", - templateUrl: "./create-view-dialog.component.html", - styleUrls: ["./create-view-dialog.component.css"] -}) -/** - * CreateView Dialog. Invoke this from another component as follows: - * - * this.modalRef = this.modalService.show(CreateViewDialogComponent, {initialState}); - * this.modalRef.content.okAction.take(1).subscribe((selectedNodes) => { - * // do something with array of selected nodes - selectedNodes - SchemaNode[] - * }); - * - * The expected initial state is as follows: - * const initialState = { - * title: "The dialog title", - * cancelButtonText: "Text for cancel button", - * confirmButtonText: "Text for confirm button" - * }; - */ -export class CreateViewDialogComponent implements OnInit { - - @Output() public okAction: EventEmitter = new EventEmitter(); - - public readonly title = ViewEditorI18n.createViewDialogTitle; - public readonly message = ViewEditorI18n.createViewDialogMessage; - public readonly cancelButtonText = ViewEditorI18n.cancelButtonText; - public readonly okButtonText = ViewEditorI18n.okButtonText; - public okButtonEnabled = false; - public bsModalRef: BsModalRef; - public nameValidationError = ""; - public viewPropertyForm: FormGroup; - - private loggerService: LoggerService; - private selectionService: SelectionService; - private vdbService: VdbService; - private serviceVdbName = ""; - - constructor(bsModalRef: BsModalRef, logger: LoggerService, - selectionService: SelectionService, vdbService: VdbService) { - this.bsModalRef = bsModalRef; - this.loggerService = logger; - this.selectionService = selectionService; - const dService = this.selectionService.getSelectedVirtualization(); - if ( dService && dService !== null ) { - this.serviceVdbName = dService.getServiceVdbName(); - } - this.vdbService = vdbService; - this.createViewPropertyForm(); - } - - public ngOnInit(): void { - this.viewPropertyForm.controls["name"].setValue(""); - this.viewPropertyForm.controls["description"].setValue(""); - } - - /* - * Creates the view property form - */ - private createViewPropertyForm(): void { - this.viewPropertyForm = new FormGroup({ - name: new FormControl( "", this.handleNameChanged.bind( this ) ), - description: new FormControl("") - }); - // Responds to basic property changes - updates the page status - this.viewPropertyForm.valueChanges.subscribe((val) => { - // this.updatePage2aValidStatus( ); - }); - } - - /** - * Handler for view name changes. - * @param {AbstractControl} input - */ - public handleNameChanged( input: AbstractControl ): void { - const self = this; - - this.vdbService.isValidViewName( this.serviceVdbName, "views", input.value ).subscribe( - ( errorMsg ) => { - if ( errorMsg ) { - // only update if error has changed - if ( errorMsg !== self.nameValidationError ) { - self.nameValidationError = errorMsg; - } - } else { // name is valid - self.nameValidationError = ""; - } - self.setOkButtonEnablement(); - }, - ( error ) => { - self.loggerService.error( "[handleNameChanged] Error: %o", error ); - self.nameValidationError = "Error validating view name"; - self.setOkButtonEnablement(); - } ); - } - - /** - * OK selected. Emit ViewDefinition with the view, then modal is closed - */ - public onOkSelected(): void { - const theName = this.viewPropertyForm.controls["name"].value; - const theDescr = this.viewPropertyForm.controls["description"].value; - - const viewDefn = new ViewDefinition(); - viewDefn.setName(theName); - viewDefn.setDescription(theDescr); - this.okAction.emit(viewDefn); - this.bsModalRef.hide(); - } - - /** - * Cancel selected. The modal is closed. - */ - public onCancelSelected(): void { - this.bsModalRef.hide(); - } - - /* - * Return the name valid state - */ - public get nameValid(): boolean { - return this.nameValidationError == null || this.nameValidationError.length === 0; - } - - /** - * Sets the OK button enablement, based upon the selections - */ - private setOkButtonEnablement(): void { - if (this.nameValid) { - this.okButtonEnabled = true; - } else { - this.okButtonEnabled = false; - } - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.css b/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.css deleted file mode 100644 index 54a855e0..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.css +++ /dev/null @@ -1,33 +0,0 @@ -/* - * The editor views tabset. - */ -#editor-views-tabs .tab-content { - border: 1px solid lightgray; - height: 140px; - overflow-x: auto; - overflow-y: auto; -} - -/* - * Customs settings for the tab. - */ -#editor-views-tabs .nav-link { - border: 1px solid #bbbbbb; - border-radius: 8px 8px 0 0; - margin: 0; - padding: 4px 10px; -} - -/* - * Custom settings for the tab heading. - */ -.editor-views-tab-heading { - font-size: smaller; -} - -/* - * Adds a space to the right of the icon and before the tab heading. - */ -.editor-views-tab-icon:after { - margin-right: 2px; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.html b/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.html deleted file mode 100644 index e9cca771..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - {{previewTabName}} - - - - - - - {{messagesTabName}} - - - - diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.spec.ts deleted file mode 100644 index ef5e7bdb..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { HttpModule } from "@angular/http"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { EditorViewsComponent } from '@dataservices/virtualization/view-editor/editor-views/editor-views.component'; -import { MessageLogComponent } from "@dataservices/virtualization/view-editor/editor-views/message-log/message-log.component"; -import { ViewPreviewComponent } from "@dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component"; -import { TabsModule } from "ngx-bootstrap"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { SelectionService } from "@core/selection.service"; - -describe('EditorViewsComponent', () => { - let component: EditorViewsComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule, - HttpModule, - TabsModule.forRoot() - ], - declarations: [ - EditorViewsComponent, - MessageLogComponent, - ViewPreviewComponent - ], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ViewEditorService - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(EditorViewsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.ts b/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.ts deleted file mode 100644 index d75a6769..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/editor-views.component.ts +++ /dev/null @@ -1,106 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; -import { LoggerService } from "@core/logger.service"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { ViewEditorPart } from "@dataservices/virtualization/view-editor/view-editor-part.enum"; -import { ViewEditorEvent } from "@dataservices/virtualization/view-editor/event/view-editor-event"; -import { Subscription } from "rxjs/Subscription"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: 'app-editor-views', - templateUrl: './editor-views.component.html', - styleUrls: ['./editor-views.component.css'] -}) -export class EditorViewsComponent implements OnInit, OnDestroy { - - // text used by html - public readonly messagesTabName = ViewEditorI18n.messagesTabName; - public readonly previewTabName = ViewEditorI18n.previewTabName; - - private readonly previewIndex = 0; - private readonly messagesIndex = 1; - - private readonly editorService: ViewEditorService; - private readonly logger: LoggerService; - private subscription: Subscription; - - /** - * The tabs component configuration. - */ - public tabs = [ - { - "active": true // preview - }, - { - "active": false // message log - }, - ]; - - constructor( editorService: ViewEditorService, - logger: LoggerService ) { - this.editorService = editorService; - this.logger = logger; - } - - /** - * @param {ViewEditorEvent} event the event being processed - */ - public handleEditorEvent( event: ViewEditorEvent ): void { - this.logger.debug( "EditorViewsComponent received event: " + event.toString() ); - - if ( event.typeIsShowEditorPart() ) { - if ( event.args.length !== 0 ) { - if ( event.args[ 0 ] === ViewEditorPart.PREVIEW ) { - this.tabs[ this.messagesIndex ].active = false; - this.tabs[ this.previewIndex ].active = true; - } else if ( event.args[ 0 ] === ViewEditorPart.MESSAGE_LOG ) { - this.tabs[ this.previewIndex ].active = false; - this.tabs[ this.messagesIndex ].active = true; - } - } - } - } - - /** - * Cleanup code when destroying the view editor header. - */ - public ngOnDestroy(): void { - this.subscription.unsubscribe(); - } - - /** - * Initialization code run after construction. - */ - public ngOnInit(): void { - this.subscription = this.editorService.editorEvent.subscribe( ( event ) => this.handleEditorEvent( event ) ); - } - - /** - * Callback for when a tab is clicked. - * - * @param tab the tab being select or deselected - * @param selected `true` is selected - */ - public tabSelected( tab, selected ): void { - tab.active = selected; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.css b/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.css deleted file mode 100644 index 86c72b61..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.css +++ /dev/null @@ -1,25 +0,0 @@ -/* - * The container for the message log table. - */ -#view-editor-message-log { - align-items: center; - display: flex; - height: 100%; -} - -/* - * Style the empty state component so that it is centered and extends the entire width. - */ -#view-editor-message-log .blank-slate-pf { - background-color: inherit; - border: none; - padding: 0; -} - -/* - * Style the message log table so that it extends the entire width. - */ -#message-log-table { - margin: 0 20px; - width: 100%; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.html b/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.html deleted file mode 100644 index edebb55d..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.html +++ /dev/null @@ -1,11 +0,0 @@ -
    - - - - -
    diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.spec.ts deleted file mode 100644 index 12d2da53..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { HttpModule } from "@angular/http"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { LoggerService } from "@core/logger.service"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { MessageLogComponent } from '@dataservices/virtualization/view-editor/editor-views/message-log/message-log.component'; -import { SelectionService } from "@core/selection.service"; - -describe('MessageLogComponent', () => { - let component: MessageLogComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule, - HttpModule - ], - declarations: [ MessageLogComponent ], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ViewEditorService - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(MessageLogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.ts b/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.ts deleted file mode 100644 index 7805e289..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-log.component.ts +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnInit, ViewEncapsulation } from '@angular/core'; -import { LoggerService } from "@core/logger.service"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { EmptyStateConfig, NgxDataTableConfig, TableConfig } from "patternfly-ng"; -import { Message } from "@dataservices/virtualization/view-editor/editor-views/message-log/message"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: 'app-message-log', - templateUrl: './message-log.component.html', - styleUrls: ['./message-log.component.css'] -}) -export class MessageLogComponent implements OnInit { - - public columns: any[]; - private emptyStateConfig: EmptyStateConfig; - public ngxConfig: NgxDataTableConfig; - public tableConfig: TableConfig; - - private readonly editorService: ViewEditorService; - private readonly logger: LoggerService; - - constructor( logger: LoggerService, - editorService: ViewEditorService ) { - this.logger = logger; - this.editorService = editorService; - } - - /** - * Initialization code run after construction. - */ - public ngOnInit(): void { - this.columns = [ - { - name: ViewEditorI18n.idColumnName, - prop: Message.ID_PROP_NAME - }, - { - name: ViewEditorI18n.typeColumnName, - prop: Message.TYPE_PROP_NAME - }, - { - name: ViewEditorI18n.descriptionColumnName, - prop: Message.DESCRIPTION_PROP_NAME - }, - { - name: ViewEditorI18n.contextColumnName, - prop: Message.CONTEXT_PROP_NAME - }, - ]; - - this.ngxConfig = { - headerHeight: 30, - rowHeight: 20, - scrollbarH: true, - scrollbarV: true - } as NgxDataTableConfig; - - this.emptyStateConfig = { - title: ViewEditorI18n.noMessagesFound - } as EmptyStateConfig; - - this.tableConfig = { - emptyStateConfig: this.emptyStateConfig - } as TableConfig; - } - - /** - * @returns {Message[]} the log messages - */ - public get rows(): Message[] { - return this.editorService.getMessages(); - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-type.enum.ts b/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-type.enum.ts deleted file mode 100644 index 8e41d92a..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message-type.enum.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export enum MessageType { - - /** - * Indicates the message is an error message. - */ - ERROR = "ERROR", - - /** - * Indicates the message is an informational message. - */ - INFO = "INFO", - - /** - * Indicates the message is a warning message. - */ - WARNING = "WARNING", - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message.ts b/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message.ts deleted file mode 100644 index a106a6eb..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/message.ts +++ /dev/null @@ -1,136 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { MessageType } from "@dataservices/virtualization/view-editor/editor-views/message-log/message-type.enum"; -import { Problem } from "@dataservices/virtualization/view-editor/editor-views/message-log/problem"; - -export class Message { - - // Property names - public static readonly CONTEXT_PROP_NAME = "_context"; - public static readonly DESCRIPTION_PROP_NAME = "_description"; - public static readonly ID_PROP_NAME = "_id"; - public static readonly TYPE_PROP_NAME = "_type"; - - private readonly _context: string; - private readonly _description: string; - private readonly _id: string; - private readonly _type: MessageType; - - /** - * Factory method to create a message using a problem. - * - * @param {Problem} problem the unique message identifier - * @param {string} context the object context or path that generated the message (optional) - */ - public static create( problem: Problem, - context?: string ): Message { - return Message.doCreate( problem.id, problem.type, problem.description, context ); - } - - /** - * Factory method to create a message. - * - * @param {string} id the unique message identifier - * @param {MessageType} type the message type - * @param {string} description the message description - * @param {string} context the object context or path that generated the message (optional) - */ - private static doCreate( id: string, - type: MessageType, - description: string, - context?: string ): Message { - return new Message( id, type, description, context ); - } - - private constructor( id: string, - type: MessageType, - description: string, - context?: string ) { - this._id = id; - this._type = type; - this._context = context; - - if ( description ) { - this._description = description.trim(); - } else { - this._description = ""; - } - } - - /** - * @returns {string} the object context or path (can be `null`) - */ - public get context(): string { - return this._context; - } - - /** - * @returns {string} the message description - */ - public get description(): string { - return this._description; - } - - /** - * @returns {string} the unique message identifier - */ - public get id(): string { - return this._id; - } - - /** - * @returns {boolean} `true` if an error message - */ - public isError(): boolean { - return this._type === MessageType.ERROR; - } - - /** - * @returns {boolean} `true` if an informational message - */ - public isInfo(): boolean { - return this._type === MessageType.INFO; - } - - /** - * @returns {boolean} `true` if a warning message - */ - public isWarning(): boolean { - return this._type === MessageType.WARNING; - } - - /** - * @returns {string} a string representation of the event - */ - public toString(): string { - let result = `message id: ${this.id}, type: ${this.type}, description: ${this.description}`; - - if ( this.context ) { - result += ", context: " + this.context; - } - - return result; - } - - /** - * @returns {string} the message type - */ - public get type(): MessageType { - return this._type; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/problem.ts b/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/problem.ts deleted file mode 100644 index 7e76bb0a..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/message-log/problem.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { MessageType } from "@dataservices/virtualization/view-editor/editor-views/message-log/message-type.enum"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; - -export class Problem { - - public static readonly ERR0100 = new Problem( "ERR0100", MessageType.ERROR, ViewEditorI18n.error0100 ); - public static readonly ERR0110 = new Problem( "ERR0110", MessageType.ERROR, ViewEditorI18n.error0110 ); - public static readonly ERR0120 = new Problem( "ERR0120", MessageType.ERROR, ViewEditorI18n.error0120 ); - public static readonly ERR0130 = new Problem( "ERR0130", MessageType.ERROR, ViewEditorI18n.error0130 ); - - public static readonly WARN0100 = new Problem( "WARN0100", MessageType.WARNING, ViewEditorI18n.warn0100 ); - - private readonly _id: string; - private readonly _description: string; - private readonly _type: MessageType; - - public constructor( id: string, - type: MessageType, - description: string ) { - this._id = id; - this._type = type; - this._description = description; - } - - /** - * @returns {string} the description - */ - public get description(): string { - return this._description; - } - - /** - * @returns {string} the identifier - */ - public get id(): string { - return this._id; - } - - /** - * @returns {string} the type - */ - public get type(): MessageType { - return this._type; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.css b/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.css deleted file mode 100644 index 763b7c4f..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.css +++ /dev/null @@ -1,40 +0,0 @@ -/* - * The container for the results table. - */ -#view-preview-container { - align-items: center; - display: flex; - height: 100%; -} - -/* - * Style the empty state component so that it is centered and extends the entire width. - */ -#view-preview-container .blank-slate-pf { - background-color: inherit; - border: none; - padding: 0; -} - -/* - * Style the results table so that it extends the entire width. - */ -#view-preview-table { - margin: 0 20px; - width: 100%; -} - -/* - * Style the in progress spinner - */ -#view-preview-in-progress { - margin-top: 25px; -} - -/* - * Style the SQL text same as table - */ -#view-preview-sql { - margin: 0 20px; - width: 100%; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.html b/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.html deleted file mode 100644 index 9071687b..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
    - Preview SQL: {{previewSql}} -
    - -
    - - - - -
    - -
    - -
    - diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.spec.ts deleted file mode 100644 index 46279900..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { HttpModule } from "@angular/http"; -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { RouterTestingModule } from "@angular/router/testing"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { ViewPreviewComponent } from "@dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { SelectionService } from "@core/selection.service"; - -describe("ViewPreviewComponent", () => { - let component: ViewPreviewComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule, - HttpModule, - RouterTestingModule - ], - declarations: [ ViewPreviewComponent ], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ViewEditorService - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ViewPreviewComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.ts b/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.ts deleted file mode 100644 index 4188d621..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component.ts +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnDestroy, OnInit, ViewEncapsulation } from "@angular/core"; -import { LoggerService } from "@core/logger.service"; -import { ViewEditorEvent } from "@dataservices/virtualization/view-editor/event/view-editor-event"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { QueryResults } from "@dataservices/shared/query-results.model"; -import { ColumnData } from "@dataservices/shared/column-data.model"; -import { RowData } from "@dataservices/shared/row-data.model"; -import { EmptyStateConfig, NgxDataTableConfig, TableConfig } from "patternfly-ng"; -import { Subscription } from "rxjs/Subscription"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { ViewEditorProgressChangeId } from "@dataservices/virtualization/view-editor/event/view-editor-save-progress-change-id.enum"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { AddSourcesCommand } from "@dataservices/virtualization/view-editor/command/add-sources-command"; -import { RemoveSourcesCommand } from "@dataservices/virtualization/view-editor/command/remove-sources-command"; -import { AddCompositionCommand } from "@dataservices/virtualization/view-editor/command/add-composition-command"; -import { RemoveCompositionCommand } from "@dataservices/virtualization/view-editor/command/remove-composition-command"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-view-preview", - templateUrl: "./view-preview.component.html", - styleUrls: ["./view-preview.component.css"] -}) -export class ViewPreviewComponent implements OnInit, OnDestroy { - - public columns: any[] = []; - private emptyStateConfig: EmptyStateConfig; - public ngxConfig: NgxDataTableConfig; - public tableConfig: TableConfig; - public rows: any[] = []; - public saveInProgress = false; - - private readonly editorService: ViewEditorService; - private readonly logger: LoggerService; - private subscription: Subscription; - private _previewSql = null; - - /** - * @param {ViewEditorService} editorService the editor service - * @param {LoggerService} logger the logger - */ - constructor( editorService: ViewEditorService, - logger: LoggerService ) { - this.logger = logger; - this.editorService = editorService; - } - - public get previewSql(): string { - return this._previewSql; - } - - private clearResults(): void { - if ( this.rows && this.columns ) { - if ( this.rows.length !== 0 || this.columns.length !== 0 ) { - this.rows = []; - this.columns = []; - } - } - } - - /** - * @param {ViewEditorEvent} event the event being processed - */ - public handleEditorEvent( event: ViewEditorEvent ): void { - this.logger.debug( "ViewPreviewComponent received event: " + event.toString() ); - - if ( event.typeIsPreviewResultsChanged() ) { - const results = this.editorService.getPreviewResults(); - this._previewSql = this.editorService.getPreviewSql(); - - if ( results && results !== null ) { - this.reload( results ); - } else { - this.clearResults(); - } - } else if (event.typeIsViewStateChanged()) { - // Clear results if sources were changed - if ( event.args.length === 1 && event.args[ 0 ] instanceof Command ) { - const cmd = event.args[ 0 ] as Command; - - if ( cmd instanceof AddSourcesCommand || cmd instanceof RemoveSourcesCommand || - cmd instanceof AddCompositionCommand || cmd instanceof RemoveCompositionCommand ) { - this.clearResults(); - this._previewSql = null; - } - } - } else if ( event.typeIsEditorViewSaveProgressChanged() ) { - if ( event.args.length !== 0 ) { - // Detect changes in view editor save progress - if ( event.args[ 0 ] === ViewEditorProgressChangeId.IN_PROGRESS ) { - this.saveInProgress = true; - } else if ( event.args[ 0 ] === ViewEditorProgressChangeId.COMPLETED_SUCCESS ) { - this.saveInProgress = false; - } else if ( event.args[ 0 ] === ViewEditorProgressChangeId.COMPLETED_FAILED ) { - this.saveInProgress = false; - } - } - } - } - - /** - * Cleanup code when destroying the preview part. - */ - public ngOnDestroy(): void { - this.subscription.unsubscribe(); - } - - /** - * Initialization code run after construction. - */ - public ngOnInit(): void { - this.subscription = this.editorService.editorEvent.subscribe( ( event ) => this.handleEditorEvent( event ) ); - - this.ngxConfig = { - headerHeight: 40, - rowHeight: 20, - scrollbarH: true, - scrollbarV: true - } as NgxDataTableConfig; - - this.emptyStateConfig = { - title: ViewEditorI18n.previewDataUnavailable - } as EmptyStateConfig; - - this.tableConfig = { - emptyStateConfig: this.emptyStateConfig - } as TableConfig; - - const results = this.editorService.getPreviewResults(); - this.reload( results ); - } - - private reload( results: QueryResults ): void { - if ( !results ) { - this.logger.debug( "ViewPreviewComponent.reload called with no results" ); - this.clearResults(); - return; - } - - this.columns.length = 0; - this.rows.length = 0; - - const columnData: ColumnData[] = results.getColumns(); - const rowData: RowData[] = results.getRows(); - this.logger.debug( "ViewPreviewComponent.reload called with " + rowData.length + " result rows" ); - - // Define the row data - let firstTime = true; - const rowNumHeader = ViewEditorI18n.rowNumberColumnName; - - for ( let rowIndex = 0; rowIndex < rowData.length; rowIndex++ ) { - const row = rowData[ rowIndex ]; - const data = row.getData(); - - const dataRow = {}; - dataRow[ rowNumHeader ] = rowIndex + 1; - - for ( let colIndex = 0; colIndex < data.length; colIndex++ ) { - const label = columnData[ colIndex ].getLabel(); - dataRow[ label ] = data[ colIndex ]; - } - - this.rows.push( dataRow ); - firstTime = false; - } - - // setup row number column - const column = { - canAutoResize: true, - draggable: false, - maxWidth: 60, - minWidth: 60, - name: rowNumHeader, - prop: rowNumHeader, - resizable: true, - sortable: true, - width: 60, - cellClass: "row-number-column" }; - this.columns.push( column ); - - // Setup data columns - for ( const colData of columnData ) { - const label = colData.getLabel(); - const col = { - canAutoResize: true, - draggable: false, - name: label.toUpperCase(), - prop: label, - resizable: true, - sortable: true }; - this.columns.push( col ); - } - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/event/view-editor-event-type.enum.ts b/ui/src/app/dataservices/virtualization/view-editor/event/view-editor-event-type.enum.ts deleted file mode 100644 index f53436c6..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/event/view-editor-event-type.enum.ts +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { QueryResults } from "@dataservices/shared/query-results.model"; -import { ViewEditorPart } from "@dataservices/virtualization/view-editor/view-editor-part.enum"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { Message } from "@dataservices/virtualization/view-editor/editor-views/message-log/message"; -import { ViewEditorProgressChangeId } from "@dataservices/virtualization/view-editor/event/view-editor-save-progress-change-id.enum"; - -export enum ViewEditorEventType { - - /** - * An event indicating the selection of objects in the canvas has changed. - * - * @type {string} - */ - CANVAS_SELECTION_CHANGED = "CANVAS_SELECTION_CHANGED", - - /** - * An event indicating a source should be created - */ - CREATE_SOURCE = "CREATE_SOURCE", - - /** - * An event indicating a composition should be created - */ - CREATE_COMPOSITION = "CREATE_COMPOSITION", - - /** - * An event indicating a node should be deleted - */ - DELETE_NODE = "DELETE_NODE", - - /** - * An event indicating the view being edited has been set. This will only be fired one time one the view editor is - * opened. The one event argument is the {@link View} being set. - * - * @type {string} - */ - EDITED_VIEW_SET = "EDITED_VIEW_SET", - - /** - * An event indicating the editor configuration has changed. The one event argument is the name of the editor CSS - * class that was set. - * - * @type {string} - */ - EDITOR_CONFIG_CHANGED = "EDITOR_CONFIG_CHANGED", - - /** - * An event indicating the view save progress has changed. The one event argument is the - * {@link ViewEditorProgressChangeId} value. - * - * @type {string} - */ - EDITOR_VIEW_SAVE_PROGRESS_CHANGED = "EDITOR_VIEW_SAVE_PROGRESS_CHANGED", - - /** - * An event indicating a log message has been added. The one event argument is the {@link Message} that was added. - * - * @type {string} - */ - LOG_MESSAGE_ADDED = "LOG_MESSAGE_ADDED", - - /** - * An event indicating a log message has been deleted. The one event argument is the {@link Message} that was deleted. - * - * @type {string} - */ - LOG_MESSAGE_DELETED = "LOG_MESSAGE_DELETED", - - /** - * An event indicating all log messages have been deleted. An event of this type may have a string context as an - * event argument. - * - * @type {string} - */ - LOG_MESSAGES_CLEARED = "LOG_MESSAGES_CLEARED", - - /** - * An event indicating the preview results have changed. The one event argument is the {@link QueryResults}. - * - * @type {string} - */ - PREVIEW_RESULTS_CHANGED = "PREVIEW_RESULTS_CHANGED", - - /** - * An event indicating the editor's readonly property has changed. The one event argument is the new readonly state. - * - * @type {string} - */ - READONLY_CHANGED = "READONLY_CHANGED", - - /** - * An event indicating the restoring of the editor state is in progress or has finished. The first argument is the - * {@link ViewEditorProgressChangeId} value. A second argument, the error message, only occurs when restoring - * the editor state failed. - * - * @type {string} - */ - RESTORE_EDITOR_STATE = "RESTORE_EDITOR_STATE", - - /** - * An event indicating an editor part should become visible. The one event argument is the editor part that should - * be shown. See {@link ViewEditorPart}. - */ - SHOW_EDITOR_PART = "SHOW_EDITOR_PART", - - /** - * An event indicating the view has changed. The one event argument is the {@link Command} that was used to change - * the view state. - * - * @type {string} - */ - VIEW_STATE_CHANGED = "VIEW_STATE_CHANGED", - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/event/view-editor-event.ts b/ui/src/app/dataservices/virtualization/view-editor/event/view-editor-event.ts deleted file mode 100644 index f541aab4..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/event/view-editor-event.ts +++ /dev/null @@ -1,249 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ViewEditorPart } from "@dataservices/virtualization/view-editor/view-editor-part.enum"; -import { ViewEditorEventType } from "@dataservices/virtualization/view-editor/event/view-editor-event-type.enum"; - -export class ViewEditorEvent { - - private readonly _args: any[] = []; - private readonly _source: ViewEditorPart; - private readonly _type: ViewEditorEventType; - - /** - * Factory method to create an event. - * - * @param {ViewEditorPart} source the source of the event - * @param {ViewEditorEventType} type the type of event - * @param {object[]} args the optional args - * @returns {ViewEditorEvent} the created event - */ - public static create( source: ViewEditorPart, - type: ViewEditorEventType, - args?: any[] ): ViewEditorEvent { - return new ViewEditorEvent( source, type, args ); - } - - private constructor( source: ViewEditorPart, - type: ViewEditorEventType, - args?: any[] ) { - this._source = source; - this._type = type; - - if ( args ) { - this._args = args; - } - } - - /** - * @returns {any[]} the optional args to the event (never `null` but can be empty) - */ - public get args(): any[] { - return this._args; - } - - /** - * @returns {ViewEditorPart} the event source - */ - public get source(): ViewEditorPart { - return this._source; - } - - /** - * @returns {boolean} `true` if the canvas editor part was the source of the event - */ - public sourceIsCanvas(): boolean { - return this.source === ViewEditorPart.CANVAS; - } - - /** - * @returns {boolean} `true` if the editor was the source of the event - */ - public sourceIsEditor(): boolean { - return this.source === ViewEditorPart.EDITOR; - } - - /** - * @returns {boolean} `true` if the header editor part was the source of the event - */ - public sourceIsHeader(): boolean { - return this.source === ViewEditorPart.HEADER; - } - - /** - * @returns {boolean} `true` if the message log part was the source of the event - */ - public sourceIsMessageLog(): boolean { - return this.source === ViewEditorPart.MESSAGE_LOG; - } - - /** - * @returns {boolean} `true` if the preview editor part was the source of the event - */ - public sourceIsPreview(): boolean { - return this.source === ViewEditorPart.PREVIEW; - } - - /** - * @returns {boolean} `true` if the properties editor part was the source of the event - */ - public sourceIsProperties(): boolean { - return this.source === ViewEditorPart.PROPERTIES; - } - - /** - * @returns {boolean} `true` if the projected columns editor part was the source of the event - */ - public sourceIsProjectedSymbols(): boolean { - return this.source === ViewEditorPart.PROJECTED_COLUMNS; - } - - /** - * @returns {string} a string representation of the event - */ - public toString(): string { - let text = `event type: ${this.type}, source: ${this.source}, args: `; - let firstTime = true; - - if ( this.args && this.args.length !== 0 ) { - for ( const arg of this.args ) { - if ( firstTime ) { - firstTime = false; - } else { - text += ", "; - } - - text += arg; - } - } - - return text; - } - - /** - * @returns {ViewEditorEventType} the event type - */ - public get type(): ViewEditorEventType { - return this._type; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.CANVAS_SELECTION_CHANGED} - */ - public typeIsCanvasSelectionChanged(): boolean { - return this.type === ViewEditorEventType.CANVAS_SELECTION_CHANGED; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.EDITED_VIEW_SET} - */ - public typeIsEditedViewSet(): boolean { - return this.type === ViewEditorEventType.EDITED_VIEW_SET; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.EDITOR_CONFIG_CHANGED} - */ - public typeIsEditorConfigChanged(): boolean { - return this.type === ViewEditorEventType.EDITOR_CONFIG_CHANGED; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.EDITOR_VIEW_SAVE_PROGRESS_CHANGED} - */ - public typeIsEditorViewSaveProgressChanged(): boolean { - return this.type === ViewEditorEventType.EDITOR_VIEW_SAVE_PROGRESS_CHANGED; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.LOG_MESSAGE_ADDED} - */ - public typeIsLogMessageAdded(): boolean { - return this.type === ViewEditorEventType.LOG_MESSAGE_ADDED; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.LOG_MESSAGE_DELETED} - */ - public typeIsLogMessageDeleted(): boolean { - return this.type === ViewEditorEventType.LOG_MESSAGE_DELETED; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.LOG_MESSAGES_CLEARED} - */ - public typeIsLogMessagesCleared(): boolean { - return this.type === ViewEditorEventType.LOG_MESSAGES_CLEARED; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.PREVIEW_RESULTS_CHANGED} - */ - public typeIsPreviewResultsChanged(): boolean { - return this.type === ViewEditorEventType.PREVIEW_RESULTS_CHANGED; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.READONLY_CHANGED} - */ - public typeIsReadonlyChanged(): boolean { - return this.type === ViewEditorEventType.READONLY_CHANGED; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.RESTORE_EDITOR_STATE}. - */ - public typeIsRestoreEditorState(): boolean { - return this.type === ViewEditorEventType.READONLY_CHANGED; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.SHOW_EDITOR_PART} - */ - public typeIsShowEditorPart(): boolean { - return this.type === ViewEditorEventType.SHOW_EDITOR_PART; - } - - /** - * @returns {boolean} `true` if the type is {@link ViewEditorEventType.VIEW_STATE_CHANGED} - */ - public typeIsViewStateChanged(): boolean { - return this.type === ViewEditorEventType.VIEW_STATE_CHANGED; - } - - /** - * @returns {boolean} `true` if the type is `ViewEditorEventType.CREATE_SOURCE` - */ - public typeIsCreateSource(): boolean { - return this.type === ViewEditorEventType.CREATE_SOURCE; - } - - /** - * @returns {boolean} `true` if the type is `ViewEditorEventType.CREATE_COMPOSITION` - */ - public typeIsCreateComposition(): boolean { - return this.type === ViewEditorEventType.CREATE_COMPOSITION; - } - - /** - * @returns {boolean} `true` if the type is `ViewEditorEventType.DELETE_NODE` - */ - public typeIsDeleteNode(): boolean { - return this.type === ViewEditorEventType.DELETE_NODE; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/event/view-editor-save-progress-change-id.enum.ts b/ui/src/app/dataservices/virtualization/view-editor/event/view-editor-save-progress-change-id.enum.ts deleted file mode 100644 index 5bc083c8..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/event/view-editor-save-progress-change-id.enum.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export enum ViewEditorProgressChangeId { - - /** - * Indicates the view save is in progress. - */ - IN_PROGRESS = "IN_PROGRESS", - - /** - * Indicates the view save has completed successfully. - */ - COMPLETED_SUCCESS = "COMPLETED_SUCCESS", - - /** - * Indicates the view save has completed, but failed. - */ - COMPLETED_FAILED = "COMPLETED_FAILED" - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/canvas-constants.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/canvas-constants.ts deleted file mode 100644 index d3bd58a3..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/canvas-constants.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* tslint:disable:max-line-length */ - -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class CanvasConstants { - - // - // CSS constants - // - public static readonly CSS_NODE_VISUAL_GROUP_CLASS = '.node-visual-group'; - public static readonly CSS_NODE_VISUAL_TOOLS_CLASS = '.node-visual-tools'; - public static readonly CSS_NODE_VISUAL_TOOLS_PLUS_CLASS = '.node-visual-tools-plus'; - public static readonly CSS_NODE_VISUAL_TOOLS_MINUS_CLASS = '.node-visual-tools-minus'; - public static readonly CSS_GRAPH_ID = '#canvasGraph'; - public static readonly CSS_NV_TOOLS_PLUS_ID_SUFFIX = '-plus'; - public static readonly CSS_NV_TOOLS_MINUS_ID_SUFFIX = '-minus'; - - // - // Node Types - // - public static readonly SOURCE_TYPE = 'SOURCE'; - public static readonly COMPOSITION_TYPE = 'COMPOSITION'; - - // - // Model constants - // - public static readonly NODE_PREFIX = 'Node'; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/canvas.service.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/canvas.service.ts deleted file mode 100644 index ef0addca..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/canvas.service.ts +++ /dev/null @@ -1,311 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Injectable, EventEmitter, ChangeDetectorRef, Output } from '@angular/core'; -import { CanvasConstants } from '@dataservices/virtualization/view-editor/view-canvas/canvas-constants'; -import { CanvasNode, CanvasLink, CanvasGraph } from '@dataservices/virtualization/view-editor/view-canvas/models'; -import { ViewCanvasEvent } from "@dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event"; -import { ViewCanvasEventType } from "@dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event-type.enum"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import * as d3 from 'd3'; -import * as _ from "lodash"; - -@Injectable() -export class CanvasService { - - /** - * An event fired when the state of the canvas has changed. - * - * @type {EventEmitter} - */ - @Output() public canvasEvent: EventEmitter< ViewCanvasEvent > = new EventEmitter(); - - private canvasGraph: CanvasGraph; - private viewReference: ChangeDetectorRef; - - /** - * This service will provide methods to enable user interaction with elements - * while maintaining the d3 simulations physics - */ - constructor() { - // Nothing to do - } - - /** - * The interactable graph. - * This method does not interact with the document, purely physical calculations with d3 - */ - public newCanvasGraph(options: { width: number, height: number }, changeDetectorRef: ChangeDetectorRef): CanvasGraph { - this.viewReference = changeDetectorRef; - - this.canvasGraph = new CanvasGraph(this, options); - this.canvasGraph.nodesSelected.subscribe((nodes) => { - - const selection = []; - if (nodes) { - nodes.forEach((node) => { - selection.push(node.decodedId + Command.identDivider + node.decodePayload); - }); - } - - const event = ViewCanvasEvent.create(ViewCanvasEventType.CANVAS_SELECTION_CHANGED, selection); - this.canvasEvent.emit(event); - }); - - /** - * Binding change detection check on each tick - * This along with an onPush change detection strategy should enforce checking only when relevant! - * This improves scripting computation duration, consistently. - * Also, it makes sense to avoid unnecessary checks when we are dealing only with simulations data binding. - */ - this.canvasGraph.ticker.subscribe((d) => { - this.viewReference.markForCheck(); - }); - - return this.canvasGraph; - } - - private stopPropagation(): void { - // Stop propagration of click event to parent svg - d3.event.stopPropagation(); - - // Stop shift-left-click shortcut being fired (firefox opens a new tab/window) - d3.event.preventDefault(); - } - - /** - * Callback for the command icon when the command has been depressed or not - */ - private commandIconChangeCallback(nodeId: string, commandType: string, depressed: boolean): void { - console.log(" commandIconChangeCallback: " + nodeId + " " + commandType + " " + depressed); - const selection = d3.select('#' + nodeId + '-' + commandType); - selection.attr('xlink:href', this.commandIcon(commandType, depressed)); - this.stopPropagation(); - } - - private addNodeCallback(source: CanvasNode): void { - let eventType = null; - const args = []; - if (source.type === CanvasConstants.SOURCE_TYPE) { - eventType = ViewCanvasEventType.CREATE_COMPOSITION; - args.push(source.decodedId); - args.push(source.decodePayload); - } else if (source.type === CanvasConstants.COMPOSITION_TYPE) - eventType = ViewCanvasEventType.CREATE_SOURCE; - - const selectionEvent = ViewCanvasEvent.create(ViewCanvasEventType.CANVAS_SELECTION_CHANGED, args); - this.canvasEvent.emit(selectionEvent); - - const event = ViewCanvasEvent.create(eventType, args); - this.canvasEvent.emit(event); - // - // // - // // Ensure all nodes have been unfixed - // // to allow the graph to properly relayout - // // - // this.canvasGraph.unfixNodes(); - // - // // - // // Fix the source node - // // - // source.setFixed(true); - // - // let type = null; - // if (source.type === CanvasConstants.SOURCE_TYPE) - // type = CanvasConstants.COMPOSITION_TYPE; - // else - // type = CanvasConstants.SOURCE_TYPE; - // - // const tgtId = this.createNode(type, '<>'); - // const srcId = source.id; - // - // // - // // Create the link and update the graph - // // - // this.createLink(srcId, tgtId, true); - this.stopPropagation(); - } - - private removeNodeCallback(node: CanvasNode): void { - const args = []; - // - // Send the decoded id and payload so that it can be parsed - // and the source path extracted from it if required - // - args.push(node.decodedId); - args.push(node.decodePayload); - - const selectionEvent = ViewCanvasEvent.create(ViewCanvasEventType.CANVAS_SELECTION_CHANGED, args); - this.canvasEvent.emit(selectionEvent); - - const event = ViewCanvasEvent.create(ViewCanvasEventType.DELETE_NODE, args); - this.canvasEvent.emit(event); - this.stopPropagation(); - } - - public nodes(): CanvasNode[] { - if (!this.canvasGraph) - return new Array(); - - return this.canvasGraph.nodes; - } - - public links(): CanvasLink[] { - if (!this.canvasGraph) - return new Array(); - - return this.canvasGraph.links; - } - - public clear(): void { - if (this.canvasGraph == null) - return; - this.canvasGraph.clear(); - } - - /** - * Makes sure both the canvas graph and the - * view are up to date and all events have - * been wired up. - */ - public update(refreshGraph: boolean, options?: any): void { - if (this.canvasGraph && refreshGraph) { - if (options !== undefined) - this.canvasGraph.setOptions(options); - - this.canvasGraph.refresh(); - } - - if (this.viewReference) - this.viewReference.detectChanges(); - - const svg = d3.select(CanvasConstants.CSS_GRAPH_ID); - const svgGroup = svg.select('g'); - - // - // Create zoom / pan behaviour - // - const zoom = d3.zoom() - .scaleExtent([0.1, 3]) - .on('zoom', () => { - svgGroup.attr("transform", d3.event.transform); - }); - - // - // Add mouse click listener and zoom listener to graph - // - svg - .on('click', () => this.canvasGraph.selectionCallback(null)) - .call(zoom); - - // - // Add mouse selection listener on each node - // - const nodeSelection = d3.selectAll(CanvasConstants.CSS_NODE_VISUAL_GROUP_CLASS); - nodeSelection - .data(this.canvasGraph.nodes) - .on('click', (cn) => this.canvasGraph.selectionCallback(cn)); - - // - // Add mouse listener on each plus button - // - const plusSelection = d3.selectAll(CanvasConstants.CSS_NODE_VISUAL_TOOLS_PLUS_CLASS); - plusSelection - .data(this.canvasGraph.nodes) - .on('mousedown', (cn) => this.commandIconChangeCallback(cn.id, 'plus', true)) - .on('mouseup', (cn) => this.commandIconChangeCallback(cn.id, 'plus', false)) - .on('click', (src) => this.addNodeCallback(src)); - - // - // Add mouse listener on each minus button - // - const minusSelection = d3.selectAll(CanvasConstants.CSS_NODE_VISUAL_TOOLS_MINUS_CLASS); - minusSelection - .data(this.canvasGraph.nodes) - .on('mousedown', (cn) => this.commandIconChangeCallback(cn.id, 'minus', true)) - .on('mouseup', (cn) => this.commandIconChangeCallback(cn.id, 'minus', false)) - .on('click', (cn) => this.removeNodeCallback(cn)); - } - - /** - * Find the bounding box of the element associated with - * the given canvas node. The box represents the outer - * perimeter of the drawn element, including x, y, width and height - */ - public boundingBox(elementId: string): any { - if (_.isEmpty(elementId)) - return null; - - const selection = d3.select('#' + elementId); - if (selection) - return (selection.node() as SVGGraphicsElement).getBBox(); - - return null; - } - - /** - * @returns the icon for the command type provided. If depressed then - * returns the depressed version of the icon - */ - public commandIcon(cmdType: string, depressed: boolean): string { - if (depressed) - return "/assets/iconfinder/Aha-soft/" + cmdType + "-depressed.png"; - - return "/assets/iconfinder/Aha-soft/" + cmdType + ".png"; - } - - /** - * Create a new node and add it to the graph - */ - public createNode(id: string, payload: string, type: string, label: string, refresh?: boolean): string { - if (! this.canvasGraph) - throw new Error("A canvas graph is required before creating a node"); - - const canvasNode = this.canvasGraph.addNode(id, payload, type, label, refresh); - return canvasNode.id; - } - - /** - * Delete the node with the given id - */ - public deleteNode(nodeId: string, refresh?: boolean): void { - if (! this.canvasGraph) - throw new Error("A canvas graph is required before removing a node"); - - if (nodeId.includes(Command.identDivider)) { - // - // identifier has been delivered as plaintext - // while the node identifiers are encoded - // - - nodeId = CanvasNode.encodeId(nodeId); - const idParts = nodeId.split(Command.identDivider); - nodeId = idParts[0]; - } - - this.canvasGraph.removeNode(nodeId, refresh); - } - - /** - * Create a new link and add it to the graph - */ - public createLink(source: string, target: string, refresh?: boolean): void { - if (! this.canvasGraph) - throw new Error("A canvas graph is required before creating a node"); - - this.canvasGraph.addLink(source, target, refresh); - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event-type.enum.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event-type.enum.ts deleted file mode 100644 index f6805c07..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event-type.enum.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export enum ViewCanvasEventType { - - /** - * An event indicating the selection of objects in the canvas has changed. - */ - CANVAS_SELECTION_CHANGED = "CANVAS_SELECTION_CHANGED", - - /** - * An event indicating a source node should be created - */ - CREATE_SOURCE = "CREATE_SOURCE", - - /** - * An event indicating a composition node should be created - */ - CREATE_COMPOSITION = "CREATE_COMPOSITION", - - /** - * An event indicating a node should be deleted - */ - DELETE_NODE = "DELETE_NODE", - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event.ts deleted file mode 100644 index d8e4d5f3..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event.ts +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ViewCanvasEventType } from "@dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event-type.enum"; - -export class ViewCanvasEvent { - - private readonly _args: any[] = []; - private readonly _type: ViewCanvasEventType; - - /** - * Factory method to create an event. - * - * @param {ViewCanvasEventType} type the type of event - * @param {object[]} args the optional args - * @returns {ViewCanvasEvent} the created event - */ - public static create( type: ViewCanvasEventType, - args?: any[] ): ViewCanvasEvent { - return new ViewCanvasEvent( type, args ); - } - - private constructor( type: ViewCanvasEventType, - args?: any[] ) { - this._type = type; - - if ( args ) { - this._args = args; - } - } - - /** - * @returns {any[]} the optional args to the event (never `null` but can be empty) - */ - public get args(): any[] { - return this._args; - } - - /** - * @returns {string} a string representation of the event - */ - public toString(): string { - let text = `event type: ${this.type}, args: `; - let firstTime = true; - - if ( this.args && this.args.length !== 0 ) { - for ( const arg of this.args ) { - if ( firstTime ) { - firstTime = false; - } else { - text += ", "; - } - - text += arg; - } - } - - return text; - } - - /** - * @returns {ViewCanvasEventType} the event type - */ - public get type(): ViewCanvasEventType { - return this._type; - } - - /** - * @returns {boolean} `true` if the type is `ViewCanvasEventType.CANVAS_SELECTION_CHANGED` - */ - public typeIsCanvasSelectionChanged(): boolean { - return this.type === ViewCanvasEventType.CANVAS_SELECTION_CHANGED; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-graph.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-graph.ts deleted file mode 100644 index 9e45f04c..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-graph.ts +++ /dev/null @@ -1,353 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { EventEmitter } from '@angular/core'; -import { CanvasService } from '@dataservices/virtualization/view-editor/view-canvas/canvas.service'; -import { CanvasNode } from '@dataservices/virtualization/view-editor/view-canvas/models/canvas-node'; -import { CanvasLink } from '@dataservices/virtualization/view-editor/view-canvas/models/canvas-link'; -import * as d3 from 'd3'; -import * as cola from 'webcola'; -import * as _ from "lodash"; - -const FORCES = { - LINKS: 0.2, - COLLISION: 1 -}; - -export class CanvasGraph { - - private canvasService: CanvasService; - private options: any; - private _nodes: CanvasNode[] = []; - private _links: CanvasLink[] = []; - - public ticker: EventEmitter = new EventEmitter(); - public nodesSelected: EventEmitter = new EventEmitter(); - - private layout: cola.Layout; - - constructor(canvasService: CanvasService, options: { width: number, height: number }) { - this.canvasService = canvasService; - this.options = options; - - this.init(options); - } - - private select(node: CanvasNode): void { - if (! node.selected) - node.selected = true; - - const selected: CanvasNode[] = []; - this.nodes.forEach((node) => { - if (node.selected) - selected.push(node); - }); - - // - // Let other parties know what has been selected - // - this.nodesSelected.emit(selected); - } - - private clearSelection(): void { - this.nodes.forEach((node) => { - node.selected = false; - }); - - this.nodesSelected.emit(new Array()); - } - - /** - * Initialize the graph and its layout - */ - public init(options): void { - console.log("canvas-graph: init"); - - if (!options || !options.width || !options.height) { - throw new Error('missing options when initializing layout'); - } - - if (_.isEmpty(this.nodes)) - return; - - /** Creating the layout */ - if (!this.layout) { - const ticker = this.ticker; - - this.layout = cola.d3adaptor(d3) - .size([options.width, options.height]) - .flowLayout("x", 150) - .symmetricDiffLinkLengths(30) - .avoidOverlaps(true) - .handleDisconnected(false) - .nodes(this.nodes) - .links(this.links); - - // Connecting the d3 ticker to an angular event emitter - this.layout.on('tick', function(): void { - ticker.emit(this); - }); - } - } - - /** - * Reset the options of the graph. - * This will stop the layout and will require an update - * to be called after it. - */ - public setOptions(options: any): void { - this.options = options; - if (this.layout) { - this.layout.stop(); - this.layout = null; - } - } - - /** - * Callback for conducting a (de)selection of nodes - */ - public selectionCallback(node: CanvasNode): void { - const append = d3.event.shiftKey; - - if (! node) { - // Cancel all selections unless append is true (shift key held) - if (append) { - // Shift key pressed so nothing to do since current selection - // remains the same as previously. - return; - } - - // Remove all selections from the DOM - this.clearSelection(); - } - else { - /* - * Update the diagram with the new selection - */ - if (!append) { - // Remove all selections from the DOM - this.clearSelection(); - } - - this.select(node); - } - - // - // the view does not detect the change if made from - // here so need to prompt it. - // - this.canvasService.update(false); - - // Stop propagration of click event to parent svg - d3.event.stopPropagation(); - - // Stop shift-left-click shortcut being fired (firefox opens a new tab/window) - d3.event.preventDefault(); - } - - /** - * @returns the collection of nodes - */ - public get nodes(): CanvasNode[] { - return this._nodes; - } - - /** - * Add a new node to the graph - */ - public addNode(id: string, payload: string, type: string, label: string, update?: boolean): CanvasNode { - const isEmpty = _.isEmpty(this.nodes); - const canvasNode = new CanvasNode(id, payload, type, label, isEmpty); - - // - // Set as fixed by default until its linked - // - canvasNode.setFixed(true); - - // - // Always start at here so the nodes flow left -> right - // - canvasNode.x = 250; - canvasNode.y = 100 * (this.nodes.length + 1); - - this._nodes.push(canvasNode); - - if (update !== undefined && update) - this.canvasService.update(true); - - return canvasNode; - } - - private findLinksConnectedToNode(node: CanvasNode): CanvasLink[] { - // - // Need to find all links connected to this node - // - const linksToRemove = this.links.filter((link) => { - if (link.source === node || link.target === node) - return link; - }); - - return linksToRemove; - } - - /** - * Remove the node and all its dependents - */ - public removeNode(nodeToRemoveOrNodeId: CanvasNode | string, update?: boolean): void { - let nodeToRemove = null; - if (typeof nodeToRemoveOrNodeId === "string") { - // - // Find the node itself - // - nodeToRemove = this.nodes.find((node) => { - return node.id === nodeToRemoveOrNodeId; - }); - } else { - nodeToRemove = nodeToRemoveOrNodeId; - } - - if (! nodeToRemove) - return; - - // - // Remove the node from the array - // - const nodeIndex = this.nodes.findIndex((node) => { - return node === nodeToRemove; - }); - if (nodeIndex >= 0) { - this.nodes.splice(nodeIndex, 1); - } - - // - // Find any links attached to the node - // - const linksToRemove = this.findLinksConnectedToNode(nodeToRemove); - linksToRemove.forEach((link) => { - const index = this.links.indexOf(link); - if (index >= 0) { - // - // Remove the link - // - this.links.splice(index, 1); - } - - // - // Remove any nodes targeted by this link - // (ignoring the current nodeToRemove) - // - if (nodeToRemove !== link.target) - this.removeNode(link.target); - }); - - // - // If node has no links then fix its position - // since the layout will consign it to the middle - // of the graph. - // - this.nodes.forEach((node) => { - const nodeLinks = this.findLinksConnectedToNode(node); - if (_.isEmpty(nodeLinks)) - node.setFixed(true); - }); - - if (update !== undefined && update) - this.canvasService.update(true); - } - - public get links(): CanvasLink[] { - return this._links; - } - - /** - * Add a new link to the graph - */ - public addLink(source: string, target: string, update?: boolean): void { - let src: CanvasNode = null; - let tgt: CanvasNode = null; - this.nodes.forEach((node) => { - if (node.id === source) { - src = node; - } - if (node.id === target) { - tgt = node; - } - }); - - if (src === null) - throw new Error("Cannot create link as source node '" + source + "' cannot be found"); - - if (tgt === null) - throw new Error("Cannot create link as target node '" + target + "' cannot be found"); - - const link = new CanvasLink(src, tgt); - this._links.push(link); - - // - // Remove the fix on the nodes unless it is the root - // - src.setFixed(false); - tgt.setFixed(false); - - if (update !== undefined && update) - this.canvasService.update(true); - } - - public clear(): void { - this._nodes = []; - this._links = []; - this.layout = null; - } - - /** - * Refreshes / restarts / updates the layout - */ - public refresh(): void { - if (! this.layout) { - this.init(this.options); - } - - if (!this.layout) - return; // nothing to do - - // - // Restarting the layout internal timer - // - this.layout.start(); - } - - /** - * Set all nodes to be fixed to - * protect their current positions - */ - public fixNodes(): void { - this.nodes.forEach((node) => { - if (!node.root) - node.setFixed(true); - }); - } - - /** - * Set all nodes to be unfixed to allow the - * layout to properly flow. - */ - public unfixNodes(): void { - this.nodes.forEach((node) => { - if (!node.root) - node.setFixed(false); - }); - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-link.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-link.ts deleted file mode 100644 index e0b7f568..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-link.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import * as d3 from 'd3'; -import * as cola from 'webcola'; -import { CanvasNode } from '@dataservices/virtualization/view-editor/view-canvas/models/canvas-node'; - -export class CanvasLink implements cola.Link { - // optional - defining optional implementation properties - required for relevant typing assistance - index?: number; - - // source and target nodes for the CanvasLink - private src: CanvasNode; - private tgt: CanvasNode; - - constructor(source: CanvasNode, target: CanvasNode) { - this.src = source; - this.tgt = target; - } - - public get source(): CanvasNode { - return this.src; - } - - public set source(src: CanvasNode) { - this.src = src; - } - - public get target(): CanvasNode { - return this.tgt; - } - - public set target(tgt: CanvasNode) { - this.tgt = tgt; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-node.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-node.spec.ts deleted file mode 100644 index b9f9e225..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-node.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { CanvasNode } from "@dataservices/virtualization/view-editor/view-canvas/models/canvas-node"; - -describe("CanvasNode", () => { - let canvasNode: CanvasNode; - - beforeEach(() => { - canvasNode = null; - }); - - it("should create", () => { - console.log("========== [CanvasNode] should create"); - canvasNode = new CanvasNode("AddSourcesCommand1532362832377", - "connection=conn3/schema=public/table=stuff", - "SOURCE", "connection=conn3/schema=public/table=stuff", true); - - // Check the encoded id - expect(canvasNode.id).toEqual("AddSourcesCommand1532362832377"); - expect(canvasNode.payload).toEqual("connection6X6conn35X5schema6X6public5X5table6X6stuff"); - }); - - it("should decodeId", () => { - console.log("========== [CanvasNode] should decode id"); - canvasNode = new CanvasNode("AddSourcesCommand1532362832377", - "connection=conn3/schema=public/table=stuff", - "SOURCE", "connection=conn3/schema=public/table=stuff", true); - - // Check the encoded id - expect(canvasNode.id).toEqual("AddSourcesCommand1532362832377"); - expect(canvasNode.payload).toEqual("connection6X6conn35X5schema6X6public5X5table6X6stuff"); - - // Check that the encoded id is decoded properly - const decoded = canvasNode.decodedId; - expect(CanvasNode.decodeId(canvasNode.payload)).toEqual("connection=conn3/schema=public/table=stuff"); - }); - -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-node.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-node.ts deleted file mode 100644 index bb404afd..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/canvas-node.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import * as d3 from 'd3'; -import * as cola from 'webcola'; - -export class CanvasNode implements cola.Node { - - // optional - defining optional implementation properties - required for relevant typing assistance - index?: number; - x: number; - y: number; - fixed?: number; - vx?: number; - vy?: number; - fx?: number | null; - fy?: number | null; - - private readonly _id: string; - private readonly _type: string; - private readonly _payload: string; - private _label: string; - private _selected = false; - private _root = false; - - public static encodeId(id: string): string { - return id.replace(/\//g, '5X5').replace(/=/g, '6X6'); - } - - public static decodeId(id: string): string { - return id.replace(/5X5/g, '/').replace(/6X6/g, '='); - } - - constructor(id: string, payload: string, type: string, label: string, root?: boolean) { - this._id = CanvasNode.encodeId(id); - this._payload = CanvasNode.encodeId(payload); - this._type = type; - this._label = label; - if (root !== undefined) - this._root = root; - } - - public get id(): string { - return this._id; - } - - public get decodedId(): string { - return CanvasNode.decodeId(this.id); - } - - public get payload(): string { - return this._payload; - } - - public get decodePayload(): string { - return CanvasNode.decodeId(this.payload); - } - - public get type(): string { - return this._type; - } - - public get label(): string { - return this._label; - } - - public set label(label: string) { - this._label = label; - } - - public get selected(): boolean { - return this._selected; - } - - public set selected(selected: boolean) { - this._selected = selected; - } - - public get root(): boolean { - return this._root; - } - - public isFixed(): boolean { - return this.fixed === 0; - } - - public setFixed(fixed: boolean): void { - this.fixed = fixed ? 1 : 0; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/index.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/index.ts deleted file mode 100644 index 38b070b9..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/models/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export * from './canvas-node'; -export * from './canvas-link'; -export * from './canvas-graph'; diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.css b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.css deleted file mode 100644 index b521ac0d..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.css +++ /dev/null @@ -1,52 +0,0 @@ -/* - * The container of the canvas and properties editors. - */ -#view-editor-canvas-editor { - display: grid; - grid-template-areas: - "views-list-panel canvas-editor properties-editor"; - grid-template-columns: 20fr 50fr 30fr; - height: 100%; -} - -/* - * View editor canvas section in the middle-left of editor. - */ -#view-editor-canvas-container { - background-color: white; - grid-area: canvas-editor; -} - -/* - * Views List Panel - */ -#views-list-container { - grid-area: views-list-panel; -} - -/* - * Configures the alert when view has no sources. - */ -#view-editor-canvas-container .alert-padding { - padding: 80px 20px; - width: 300px; -} - -/* - * View editor middle-right section containing property editors based on selection in the canvas. - */ -#view-editor-properties-container { - grid-area: properties-editor; -} - -.view-save-toast { - margin-left: 0.5em; - margin-top: 0.5em; -} - -.canvas-node-selected { - stroke: red !important; - stroke-width: 2px !important; - stroke-dasharray: 5,5; - fill: transparent !important; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.html b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.html deleted file mode 100644 index 555f09bf..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.html +++ /dev/null @@ -1,41 +0,0 @@ -
    - -
    - -
    - - - - -
    -
    - - - -
    - - - -
    - - - - -
    - -
    - -
    diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.spec.ts deleted file mode 100644 index ebb1dee8..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.spec.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { HttpModule } from "@angular/http"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { ViewCanvasComponent } from '@dataservices/virtualization/view-editor/view-canvas/view-canvas.component'; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule } from "patternfly-ng"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { ViewPropertyEditorsComponent } from "@dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component"; -import { TabsModule} from "ngx-bootstrap"; -import { GraphVisualComponent, LinkVisualComponent, NodeVisualComponent } from "@dataservices/virtualization/view-editor/view-canvas/visuals"; -import { CanvasService } from "@dataservices/virtualization/view-editor/view-canvas/canvas.service"; -import { SelectionService } from "@core/selection.service"; -import { PropertyEditorComponent } from "@dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component"; -import { ProjectedColumnsEditorComponent } from "@dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component"; -import { ViewsListComponent } from "@dataservices/virtualization/view-editor/views-list/views-list.component"; -import { BsModalService } from "ngx-bootstrap"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; - -describe('ViewCanvasComponent', () => { - let component: ViewCanvasComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - WizardModule, - HttpModule, - TabsModule.forRoot() - ], - declarations: [ - GraphVisualComponent, - LinkVisualComponent, - NodeVisualComponent, - ProjectedColumnsEditorComponent, - PropertyEditorComponent, - ViewCanvasComponent, - ViewPropertyEditorsComponent, - ViewsListComponent - ], - providers: [ - BsModalService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - CanvasService, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ViewEditorService - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ViewCanvasComponent); - component = fixture.componentInstance; - - const selService = TestBed.get( SelectionService ); - const ds: Dataservice = new Dataservice(); - ds.setId("testDs"); - ds.setServiceVdbName("testDsVdb"); - // noinspection JSUnusedAssignment - selService.setSelectedVirtualization( ds ); - - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.ts deleted file mode 100644 index 9946f225..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/view-canvas.component.ts +++ /dev/null @@ -1,407 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnDestroy, OnInit, AfterViewInit, ViewEncapsulation } from "@angular/core"; -import { AddSourcesCommand } from "@dataservices/virtualization/view-editor/command/add-sources-command"; -import { RemoveSourcesCommand } from "@dataservices/virtualization/view-editor/command/remove-sources-command"; -import { LoggerService } from "@core/logger.service"; -import { ViewEditorEvent } from "@dataservices/virtualization/view-editor/event/view-editor-event"; -import { ViewEditorEventType } from "@dataservices/virtualization/view-editor/event/view-editor-event-type.enum"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { ViewEditorPart } from "@dataservices/virtualization/view-editor/view-editor-part.enum"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { ViewEditorProgressChangeId } from "@dataservices/virtualization/view-editor/event/view-editor-save-progress-change-id.enum"; -import { PathUtils } from "@dataservices/shared/path-utils"; -import { NotificationType } from "patternfly-ng"; -import { Subscription } from "rxjs/Subscription"; -import { CanvasNode, CanvasLink } from '@dataservices/virtualization/view-editor/view-canvas/models'; -import { CanvasConstants } from '@dataservices/virtualization/view-editor/view-canvas/canvas-constants'; -import { CanvasService } from '@dataservices/virtualization/view-editor/view-canvas/canvas.service'; -import { ViewCanvasEvent } from "@dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event"; -import { ViewCanvasEventType } from "@dataservices/virtualization/view-editor/view-canvas/event/view-canvas-event-type.enum"; -import * as _ from "lodash"; -import { AddCompositionCommand } from "@dataservices/virtualization/view-editor/command/add-composition-command"; -import { RemoveCompositionCommand } from "@dataservices/virtualization/view-editor/command/remove-composition-command"; -import { CommandFactory } from "@dataservices/virtualization/view-editor/command/command-factory"; -import { ViewDefinition } from "@dataservices/shared/view-definition.model"; -import { Composition } from "@dataservices/shared/composition.model"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-view-canvas", - templateUrl: "./view-canvas.component.html", - styleUrls: ["./view-canvas.component.css"] -}) -export class ViewCanvasComponent implements OnInit, OnDestroy { - - // used by html - public readonly noSourcesAlert = ViewEditorI18n.noSourcesAlert; - public readonly viewSaveInProgressHeader: string = "Save In Progress: "; - public readonly viewSaveSuccessHeader: string = "Save Succeeded: "; - public readonly viewSaveFailedHeader: string = "Save Failed: "; - - private readonly logger: LoggerService; - private readonly editorService: ViewEditorService; - private readonly canvasService: CanvasService; - - private saveViewNotificationHeader: string; - private saveViewNotificationMessage: string; - private saveViewNotificationType = NotificationType.SUCCESS; - private saveViewNotificationVisible = false; - - private editorSubscription: Subscription; - private canvasSubscription: Subscription; - private viewNameSaveInProgress: string; - - constructor( editorService: ViewEditorService, - logger: LoggerService, - canvasService: CanvasService) { - this.editorService = editorService; - this.logger = logger; - this.canvasService = canvasService; - } - - private viewStateChanged(source: ViewEditorPart, args: any[]): void { - if (args.length === 0) - return; - - if (args[0] instanceof AddSourcesCommand) { - const cmd = args[0] as AddSourcesCommand; - this.createSourceNode(cmd); - } else if (args[0] instanceof RemoveSourcesCommand) { - const cmd = args[0] as RemoveSourcesCommand; - this.removeSourceNodes(cmd); - } else if (args[0] instanceof AddCompositionCommand) { - const cmd = args[0] as AddCompositionCommand; - this.createComposition(cmd); - } else if (args[0] instanceof RemoveCompositionCommand) { - const cmd = args[0] as RemoveCompositionCommand; - this.removeComposition(cmd); - } - } - - /** - * @param {ViewEditorEvent} event the event being processed - */ - public handleEditorEvent( event: ViewEditorEvent ): void { - this.logger.debug( "ViewCanvasComponent received event: " + event.toString() ); - - // Initialize the canvas when set - using the ViewDefinition - if ( event.typeIsEditedViewSet()) { - const viewDefn = this.editorService.getEditorView(); - this.initCanvas(viewDefn); - } else if ( event.typeIsEditorViewSaveProgressChanged() ) { - if ( event.args.length !== 0 ) { - // Detect changes in view editor save progress - if ( event.args[ 0 ] === ViewEditorProgressChangeId.IN_PROGRESS ) { - this.viewNameSaveInProgress = this.editorService.getEditorView().getName(); - this.saveViewNotificationHeader = this.viewSaveInProgressHeader; - this.saveViewNotificationMessage = this.getViewNotificationMessage(ViewEditorProgressChangeId.IN_PROGRESS, - this.viewNameSaveInProgress); - this.saveViewNotificationType = NotificationType.INFO; - this.saveViewNotificationVisible = true; - } else if ( event.args[ 0 ] === ViewEditorProgressChangeId.COMPLETED_SUCCESS ) { - this.saveViewNotificationHeader = this.viewSaveSuccessHeader; - this.saveViewNotificationMessage = this.getViewNotificationMessage(ViewEditorProgressChangeId.COMPLETED_SUCCESS, - this.viewNameSaveInProgress); - - this.saveViewNotificationType = NotificationType.SUCCESS; - // After 8 seconds, the notification is dismissed - setTimeout(() => this.saveViewNotificationVisible = false, 8000); - } else if ( event.args[ 0 ] === ViewEditorProgressChangeId.COMPLETED_FAILED ) { - this.saveViewNotificationHeader = this.viewSaveFailedHeader; - this.saveViewNotificationMessage = this.getViewNotificationMessage(ViewEditorProgressChangeId.COMPLETED_FAILED, - this.viewNameSaveInProgress); - this.saveViewNotificationType = NotificationType.DANGER; - // After 8 seconds, the notification is dismissed - setTimeout(() => this.saveViewNotificationVisible = false, 8000); - } - } - } - else if (event.typeIsViewStateChanged()) { - this.viewStateChanged(event.source, event.args); - } - else { - this.logger.debug( "ViewCanvasComponent not handling received editor event: " + event.toString()); - } - } - - /** - * Generates a view notification message based on the progress type and viewName - * @param {ViewEditorProgressChangeId} viewProgressId the progress type - * @param {string} viewName the view name - */ - private getViewNotificationMessage(viewProgressId: ViewEditorProgressChangeId, viewName: string): string { - let msg = ""; - const viewStr = ( viewName && viewName !== null ) ? "'" + viewName + "'" : ""; - if ( viewProgressId === ViewEditorProgressChangeId.IN_PROGRESS ) { - msg = "View save in progress for " + viewStr; - } else if ( viewProgressId === ViewEditorProgressChangeId.COMPLETED_SUCCESS ) { - msg = "View save SUCCESS for " + viewStr; - } else if ( viewProgressId === ViewEditorProgressChangeId.COMPLETED_FAILED ) { - msg = "View save FAILED for " + viewStr; - } - return msg; - } - - private handleCanvasEvent(event: ViewCanvasEvent): void { - switch (event.type) { - case ViewCanvasEventType.CREATE_SOURCE: - const srcEvent = ViewEditorEvent.create(ViewEditorPart.CANVAS, ViewEditorEventType.CREATE_SOURCE, event.args); - this.editorService.editorEvent.emit(srcEvent); - break; - case ViewCanvasEventType.CREATE_COMPOSITION: - const compEvent = ViewEditorEvent.create(ViewEditorPart.CANVAS, ViewEditorEventType.CREATE_COMPOSITION, event.args); - this.editorService.editorEvent.emit(compEvent); - break; - case ViewCanvasEventType.DELETE_NODE: - const deleteEvt = ViewEditorEvent.create(ViewEditorPart.CANVAS, ViewEditorEventType.DELETE_NODE, event.args); - this.editorService.editorEvent.emit(deleteEvt); - break; - case ViewCanvasEventType.CANVAS_SELECTION_CHANGED: - const selectEvent = ViewEditorEvent.create(ViewEditorPart.CANVAS, ViewEditorEventType.CANVAS_SELECTION_CHANGED, event.args); - this.editorService.editorEvent.emit(selectEvent); - break; - default: - this.logger.debug("ViewCanvasComponent not handling received canvas event: " + event.toString()); - } - } - /** - * Cleanup code when destroying the canvas and properties parts. - */ - public ngOnDestroy(): void { - this.editorSubscription.unsubscribe(); - this.canvasSubscription.unsubscribe(); - } - - /** - * Initialization code run after construction. - */ - public ngOnInit(): void { - this.editorSubscription = this.editorService.editorEvent.subscribe( ( event ) => this.handleEditorEvent( event ) ); - - this.canvasSubscription = this.canvasService.canvasEvent.subscribe((event) => this.handleCanvasEvent(event)); - } - - /** - * @returns {boolean} `true` if view being edited is readonly - */ - public get readOnly(): boolean { - return this.editorService.isReadOnly(); - } - - /** - * @returns {boolean} true if save view notification is to be shown - */ - public get showSaveViewNotification(): boolean { - return this.saveViewNotificationVisible; - } - - /** - * Initialize the canvas with the provided ViewDefinition - * @param {ViewDefinition} viewDefn the ViewDefinition - */ - private initCanvas( viewDefn: ViewDefinition ): void { - // Make sure canvas is cleared - this.canvasService.clear(); - - if (viewDefn && viewDefn !== null) { - // ------------------------ - // Create the compositions - // -------------------------- - const compositions = viewDefn.getCompositions(); - if (compositions && compositions.length > 0) { - for (const composition of compositions) { - const cmd = CommandFactory.createAddCompositionCommand(composition) as AddCompositionCommand; - this.createComposition(cmd); - } - } - - // ------------------------ - // Create the source nodes - // ------------------------ - const sourcePaths = viewDefn.getSourcePaths(); - // ------------------------ - // create a command for each source path to correspond to - // unique canvas nodes for each source - // ------------------------ - for (const path of sourcePaths) { - const cmd = CommandFactory.createAddSourcesCommand(path) as AddSourcesCommand; - this.createSourceNode(cmd); - } - } - - this.canvasService.update(true); - } - - /** - * Create canvas nodes using the provided AddSourcesCommand - * @param {AddSourcesCommand} command the AddSourcesCommand - */ - private createSourceNode(command: AddSourcesCommand): void { - const sourcePaths: string[] = command.getSourcePaths(); - for (let i = 0; i < sourcePaths.length; ++i) { - const srcPath = sourcePaths[i]; - const existingNode = this.getCanvasNodeForSourcePath(srcPath); - if ( existingNode && existingNode !== null) { - return; - } - const update = (i === (sourcePaths.length - 1)); - const id = command.getId( ); - const label = "[" + PathUtils.getConnectionName(srcPath) + - "]: " + PathUtils.getSourceName(srcPath); - this.canvasService.createNode(id, command.getPayload(srcPath), CanvasConstants.SOURCE_TYPE, label, update); - - this.createLink(null, srcPath); - } - } - - /** - * Remove canvas nodes using the provided RemoveSourcesCommand - * @param {RemoveSourcesCommand} command the RemoveSourcesCommand - */ - private removeSourceNodes(command: RemoveSourcesCommand): void { - const srcPaths = command.getSourcePaths(); - for (let i = 0; i < srcPaths.length; ++i) { - const srcPath = srcPaths[i]; - const update = (i === (srcPaths.length - 1)); - const srcNode = this.getCanvasNodeForSourcePath(srcPath); - this.canvasService.deleteNode(srcNode.id, update); - } - } - - /** - * Create canvas nodes using the provided AddCompositionCommand - * @param {AddCompositionCommand} command the AddCompositionCommand - */ - private createComposition(command: AddCompositionCommand): void { - const composition = command.getComposition(); - const compNodeId = this.canvasService.createNode(command.getId(), command.getPayload(), CanvasConstants.COMPOSITION_TYPE, composition.getName(), true); - // Create links to source nodes if not found - this.createLink(compNodeId, composition.getLeftSourcePath()); - this.createLink(compNodeId, composition.getRightSourcePath()); - } - - /** - * Remove canvas nodes using the provided RemoveCompositionCommand - * @param {RemoveCompositionCommand} command the RemoveCompositionCommand - */ - private removeComposition(command: RemoveCompositionCommand): void { - const composition = command.getComposition(); - // an undo add command may be executed here where the command ID will include - // a timestamp that does not match any canvas node - // Need to find the "name" property in the composition and match it with the - // name property of the payload - const compNode = this.getCompositionNodeForCompositionName(composition.getName()); - this.canvasService.deleteNode(compNode.id, true); - } - - /** - * Generate a links between the compositionNode and CanvasNode for the supplied path, if not found - * @param {string} compositionNodeId - * @param {string} sourcePath - */ - private createLink(compositionNodeId: string, sourcePath: string): void { - const sourceNode = this.getCanvasNodeForSourcePath(sourcePath); - if (sourceNode && sourceNode !== null) { - const sourceNodeId = sourceNode.id; - - // See if link exists - let linkExists = false; - const canvasLinks: CanvasLink[] = this.canvasService.links(); - for (const link of canvasLinks) { - const end1Id = link.source.id; - const end2Id = link.target.id; - if (end1Id === compositionNodeId && end2Id === sourceNodeId) { - linkExists = true; - break; - } else if (end1Id === sourceNodeId && end2Id === compositionNodeId) { - linkExists = true; - break; - } - } - - if ( !linkExists ) { - if ( compositionNodeId === null ) { - const compNode = this.getCompositionNodeForSourcePath(sourcePath); - if ( compNode && compNode !== null ) { - compositionNodeId = compNode.id; - } - } - if ( compositionNodeId !== null ) { - this.canvasService.createLink(sourceNodeId, compositionNodeId, true); - } - } - } - } - - private getCanvasNodeForSourcePath( sourcePath: string ): CanvasNode { - let nodeForPath: CanvasNode = null; - const canvasNodes: CanvasNode[] = this.canvasService.nodes(); - for (const canvasNode of canvasNodes) { - const nodeId = canvasNode.id; - if (nodeId.startsWith(AddSourcesCommand.id)) { - const payload = canvasNode.decodePayload; - if (payload === sourcePath) { - nodeForPath = canvasNode; - break; - } - } - } - return nodeForPath; - } - - /* if source path == null, then a source node has been added via undo sources command - * need to find the compositions on the canvas and check if it has an source path that matches - * then return that node - */ - private getCompositionNodeForSourcePath( sourcePath: string): CanvasNode { - const canvasNodes: CanvasNode[] = this.canvasService.nodes(); - for (const canvasNode of canvasNodes) { - const nodeId = canvasNode.id; - if (nodeId.startsWith(AddCompositionCommand.id)) { - const payload = canvasNode.decodePayload; - const comp = Composition.create(JSON.parse(payload)); - const leftPath = comp.getLeftSourcePath(); - const rightPath = comp.getRightSourcePath(); - if (leftPath === sourcePath) { - return canvasNode; - } else if ( rightPath === sourcePath) { - return canvasNode; - } - } - } - } - - private getCompositionNodeForCompositionName( compName: string): CanvasNode { - const canvasNodes: CanvasNode[] = this.canvasService.nodes(); - for (const canvasNode of canvasNodes) { - const nodeId = canvasNode.id; - if (nodeId.startsWith(AddCompositionCommand.id)) { - const payload = canvasNode.decodePayload; - const comp = Composition.create(JSON.parse(payload)); - const compNodeName = comp.getName(); - - if (compNodeName === compName) { - return canvasNode; - } - } - } - return null; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/graph/graph-visual.component.css b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/graph/graph-visual.component.css deleted file mode 100644 index 9997113c..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/graph/graph-visual.component.css +++ /dev/null @@ -1,4 +0,0 @@ -.cover-up { - fill:white; - stroke-width:none; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/graph/graph-visual.component.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/graph/graph-visual.component.ts deleted file mode 100644 index f8ea0525..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/graph/graph-visual.component.ts +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Component, Input, ChangeDetectorRef, HostListener, ChangeDetectionStrategy, OnInit } from '@angular/core'; -import { CanvasService } from '@dataservices/virtualization/view-editor/view-canvas/canvas.service'; -import { CanvasGraph, CanvasNode, CanvasLink } from '@dataservices/virtualization/view-editor/view-canvas/models'; -import * as d3 from 'd3'; -import * as _ from "lodash"; - -/* - * Explanation of arrowhead - * - * Provides an svg marker that is drawn at the end of each link - * - * refX: moves the arrowhead back along the line so it can be seen, ie. N---->---N - * refY: moves the arrowhead up/below the line. In this case it stays on the line - * orient: changes orientation to match the line - * markerWidth: total area of the marker to be displayed. Arrow is 10 and covering rectangle is 50 so chosen 60 - * markerHeight: have to be careful but basically the height of the arrow - * viewBox: the viewport of the marker - lots of trial n error to get this sorted! - * - * path: the path of to draw the arrowhead - * rect: the rectangle that covers up the remaining end of the line to provide a space, ie. N ----> N - * - */ -@Component({ - selector: 'canvas-graph', - changeDetection: ChangeDetectionStrategy.OnPush, - template: ` - - - - - - - - - - - - - - - - `, - styleUrls: ['./graph-visual.component.css'] -}) -export class GraphVisualComponent implements OnInit { - - public canvasGraph: CanvasGraph; - public _options: { width: number, height: number } = { width: 800, height: 600 }; - - private canvasService: CanvasService; - private readonly ref: ChangeDetectorRef; - - @HostListener('window:resize', ['$event']) - public onResize(event): void { - this.canvasService.update(true, this.options); - } - - constructor(canvasService: CanvasService, ref: ChangeDetectorRef) { - this.canvasService = canvasService; - this.ref = ref; - this.canvasGraph = this.canvasService.newCanvasGraph(this.options, this.ref); - } - - public get nodes(): CanvasNode[] { - return this.canvasService.nodes(); - } - - public get links(): CanvasLink[] { - return this.canvasService.links(); - } - - public ngOnInit(): void { - console.log("graph-visual: ngOnInit"); - } - - // TODO: Need to discuss how all the layout sizes affect each other. - public get options(): any { - return this._options = { - width: window.innerWidth * .5, - height: window.innerHeight * .45 - }; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/index.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/index.ts deleted file mode 100644 index 5f89621a..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './graph/graph-visual.component'; -export * from './node/node-visual.component'; -export * from './link/link-visual.component'; diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/link/link-visual.component.css b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/link/link-visual.component.css deleted file mode 100644 index ad6825d7..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/link/link-visual.component.css +++ /dev/null @@ -1,4 +0,0 @@ -.link { - stroke-width: 1; - stroke: black; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/link/link-visual.component.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/link/link-visual.component.ts deleted file mode 100644 index bd3a1fc4..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/link/link-visual.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Component, Input } from '@angular/core'; -import { CanvasLink } from '@dataservices/virtualization/view-editor/view-canvas/models'; - -@Component({ - selector: '[link-visual]', - template: ` - - `, - styleUrls: ['./link-visual.component.css'] -}) - -export class LinkVisualComponent { - @Input('link-visual') link: CanvasLink; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/node/node-visual.component.css b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/node/node-visual.component.css deleted file mode 100644 index 819748f7..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/node/node-visual.component.css +++ /dev/null @@ -1,18 +0,0 @@ -.node-visual { - cursor: pointer; - transition: stroke-width 0.1s ease-out, - fill 0.1s ease-out, - stroke 0.1s ease-out; - - stroke: white; - stroke-width: 0.25; -} - -.node-name { - font-family: 'Lato'; - text-anchor: middle; - alignment-baseline: central; - font-weight: 300; - font-size: 12px; - fill: black; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/node/node-visual.component.ts b/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/node/node-visual.component.ts deleted file mode 100644 index 68a7cb7f..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-canvas/visuals/node/node-visual.component.ts +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Component, Input } from '@angular/core'; -import { CanvasNode } from '@dataservices/virtualization/view-editor/view-canvas/models'; -import { CanvasService } from '@dataservices/virtualization/view-editor/view-canvas/canvas.service'; -import { CanvasConstants } from '@dataservices/virtualization/view-editor/view-canvas/canvas-constants'; -import * as _ from "lodash"; - -@Component({ - selector: '[node-visual]', - template: ` - - - - - - - - {{node.label}} - - - - - - - - - - `, - styleUrls: ['./node-visual.component.css'] -}) - -export class NodeVisualComponent { - - @Input('node-visual') public node: CanvasNode; - - private canvasService: CanvasService; - - constructor(canvasService: CanvasService) { - this.canvasService = canvasService; - } - - /** - * @return an id for the object type - * based on the node's own id - */ - public id(type: string): string { - return this.node.id + '-' + type; - } - - public get icon(): string { - if (this.node.type === CanvasConstants.SOURCE_TYPE) - return "/assets/table.png"; - else if (this.node.type === CanvasConstants.COMPOSITION_TYPE) - return "/assets/composition.png"; - - return "/assets/iconfinder/Natalya-Skidan/question-mark.png"; - } - - public cmdIcon(type: string): string { - return this.canvasService.commandIcon(type, false); - } - - /** - * @return the width of the bounding box of this element - */ - public get bboxWidth(): number { - const bbox = this.canvasService.boundingBox(this.id('group')); - if (! bbox) - return 100; - - return bbox.width + 10; - } - - /** - * @return the height of the bounding box of this element - */ - public get bboxHeight(): number { - const bbox = this.canvasService.boundingBox(this.id('group')); - if (! bbox) - return 100; - - return bbox.height + 20; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.css b/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.css deleted file mode 100644 index 9b87ebfc..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.css +++ /dev/null @@ -1,7 +0,0 @@ -/* - * A type for the header title - */ -.view-editor-header-title { - margin-left: 10px; -} - diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.html b/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.html deleted file mode 100644 index 6167371c..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.html +++ /dev/null @@ -1,10 +0,0 @@ -
    - - - - -
    -

    Virtualization Name: {{virtualizationName}}

    -
    - -
    diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.spec.ts deleted file mode 100644 index 9eb4201b..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { HttpModule } from "@angular/http"; -import { FormsModule } from "@angular/forms"; -import { RouterTestingModule } from "@angular/router/testing"; -import { LoggerService } from "@core/logger.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { ViewEditorHeaderComponent } from '@dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component'; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { TableModule } from "patternfly-ng"; -import { SelectionService } from "@core/selection.service"; -import { BsModalService } from "ngx-bootstrap"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; - -describe('ViewEditorHeaderComponent', () => { - let component: ViewEditorHeaderComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, - HttpModule, - RouterTestingModule, - TableModule - ], - declarations: [ ViewEditorHeaderComponent ], - providers: [ - BsModalService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ViewEditorService - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ViewEditorHeaderComponent); - component = fixture.componentInstance; - - const selService = TestBed.get( SelectionService ); - const ds: Dataservice = new Dataservice(); - ds.setId("testDs"); - ds.setServiceVdbName("testDsVdb"); - // noinspection JSUnusedAssignment - selService.setSelectedVirtualization( ds ); - - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.ts b/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.ts deleted file mode 100644 index bb46a189..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnDestroy, OnInit, ViewEncapsulation } from "@angular/core"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-view-editor-header", - templateUrl: "./view-editor-header.component.html", - styleUrls: ["./view-editor-header.component.css"] -}) -export class ViewEditorHeaderComponent implements OnInit, OnDestroy { - - private readonly editorService: ViewEditorService; - - constructor( editorService: ViewEditorService) { - this.editorService = editorService; - } - - /** - * Cleanup code when destroying the view editor header. - */ - public ngOnDestroy(): void { - - } - - /** - * Initialization code run after construction. - */ - public ngOnInit(): void { - } - - /** - * @returns {boolean} `true` if view being edited is readonly - */ - public get readOnly(): boolean { - return !this.editorService.getEditorView() || this.editorService.isReadOnly(); - } - - /** - * @returns {string} the name of the dataservice of the view being edited - */ - public get virtualizationName(): string { - const virtualization = this.editorService.getEditorVirtualization(); - - if ( virtualization ) { - return virtualization.getId(); - } - - // should always have a virtualization name so shouldn't get here - return "< error >"; - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor-i18n.ts b/ui/src/app/dataservices/virtualization/view-editor/view-editor-i18n.ts deleted file mode 100644 index 40ca54cd..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor-i18n.ts +++ /dev/null @@ -1,128 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class ViewEditorI18n { - - // shared - public static readonly cancelButtonText = "Cancel"; - public static readonly okButtonText = "OK"; - public static readonly finishButtonText = "Finish"; - public static readonly wizardNextButtonText = "Next >"; - - // commands - public static readonly addSourcesCommandName = "Add Sources"; - public static readonly addCompositionCommandName = "Add Composition"; - public static readonly sampleDataCommandName = "Sample Data"; - public static readonly noOpCommandName = "No operation"; - public static readonly removeCompositionCommandName = "Remove Composition"; - public static readonly removeSourcesCommandName = "Remove Sources"; - public static readonly updateViewNameCommandName = "Update View Name"; - public static readonly updateViewDescriptionCommandName = "Update View Description"; - public static readonly updateProjectedColumnsCommandName = "Update Projected Columns"; - - // connection table dialog - public static readonly connectionTableSelectionDialogMessage = "Expand connection and select a source for your view"; - public static readonly connectionTableSelectionDialogTitle = "Select Source for View"; - public static readonly currentSelection = "Current Selection:"; - public static readonly noSelection = "Nothing selected"; - - // create views dialog - public static readonly createViewsDialogMessage = "Select the initial views for the virtualization"; - public static readonly createViewsDialogNewVirtualizationTitle = "Create Virtualization"; - public static readonly noViewsDisplayedMessage = "Select connection(s)"; - - // create view dialog - public static readonly createViewDialogMessage = "Enter name and description(optional) for the new view"; - public static readonly createViewDialogTitle = "Create View"; - - // set description dialog - public static readonly setDescriptionDialogTitle = "Set Virtualization Description"; - public static readonly setDescriptionDialogMessage = "Set the description for this virtualization"; - - // Add Composition Wizard - public static readonly addCompositionWizardTitle = "Add Composition"; - public static readonly addCompositionWizardSelectSourceMessage = "Expand connection and select a source for the composition"; - public static readonly addCompositionWizardCriteriaStepMessage = "Select the left and right columns, and define the criteria"; - public static readonly addCompositionWizardStep1Text = "Select Source"; - public static readonly addCompositionWizardStep2Text = "Define Composition"; - public static readonly addCompositionWizardLoadingPrimaryText = "Add Composition Wizard loading"; - public static readonly addCompositionWizardLoadingSecondaryText = "Please wait for the wizard to finish loading..."; - - // editor views - public static readonly messagesTabName = "Messages"; - public static readonly previewTabName = "Preview"; - - // message log - public static readonly contextColumnName = "Context"; - public static readonly descriptionColumnName = "Description"; - public static readonly idColumnName = "ID"; - public static readonly noMessagesFound = "No messages found"; - public static readonly typeColumnName = "Type"; - - // problems - public static readonly error0100 = "There must be a virtualization selected in order to use this editor."; - public static readonly error0110 = "A view must have a name."; - public static readonly error0120 = "A view must have at least one source."; - public static readonly error0130 = "A view with two or more sources must have at least one composition."; - - public static readonly warn0100 = "The view contains an orphan source which will be ignored"; - - // property editors - public static readonly columnsTabName = "Columns"; - public static readonly propertiesTabName = "Properties"; - - // view canvas - public static readonly noSourcesAlert = "Select a source for the view"; - - // view editor - public static readonly addCompositionActionTitle = "Add Composition"; - public static readonly addCompositionActionTooltip = "Add Composition"; - public static readonly sampleDataActionTitle = "Sample Data"; - public static readonly sampleDataActionTooltip = "Sample data from selected view or source"; - public static readonly addSourceDialogTitle = "Select View Source"; - public static readonly addSourceActionTitle = "Add Source"; - public static readonly addSourceActionTooltip = "Add Source"; - public static readonly deleteActionTitle = "Delete"; - public static readonly deleteActionTooltip = "Delete the selection(s)"; - public static readonly errorsActionTitle = "Errors"; - public static readonly errorsActionTooltip = "Show error messages"; - public static readonly errorRestoringViewEditorState = "There was an error restoring the view editor state: "; - public static readonly infosActionTitle = "Infos"; - public static readonly infosActionTooltip = "Show info messages"; - public static readonly redoActionTitle = "Redo"; - public static readonly redoActionTooltip = "Redo"; - public static readonly saveActionTitle = "Save"; - public static readonly saveActionTooltip = "Save"; - public static readonly serverError = "Server Error"; - public static readonly showEditorCanvasAndViewsActionTooltip = "Show full editor"; - public static readonly showEditorCanvasOnlyActionTooltip = "Show canvas and properties only"; - public static readonly showEditorViewsOnlyActionTooltip = "Show information views only"; - public static readonly undoActionTitle = "Undo"; - public static readonly undoActionTooltip = "Undo"; - public static readonly warningsActionTitle = "Warnings"; - public static readonly warningsActionTooltip = "Show warning messages"; - - // view editor header - public static readonly viewDescriptionLabel = "Selected View Description"; - public static readonly viewDescriptionPlaceholder = "Enter a view description"; - public static readonly noViewsDefined = "No views defined"; - - // view preview - public static readonly previewDataUnavailable = "Preview data unavailable"; - public static readonly rowNumberColumnName = "ROW #"; - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor-part.enum.ts b/ui/src/app/dataservices/virtualization/view-editor/view-editor-part.enum.ts deleted file mode 100644 index e7ceff3e..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor-part.enum.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export enum ViewEditorPart { - - /** - * The source of the event is the canvas part. - */ - CANVAS = "CANVAS", - - /** - * The source of the event is the editor. - */ - EDITOR = "EDITOR", - - /** - * The source of the event is the header part. - */ - HEADER = "HEADER", - - /** - * The source of the event is the message log part. - */ - MESSAGE_LOG = "MESSAGE_LOG", - - /** - * The source of the event is the preview part. - */ - PREVIEW = "PREVIEW", - - /** - * The source of the event is the properties editor part. - */ - PROPERTIES = "PROPERTIES", - - /** - * The source of the event is the projected columns editor part. - */ - PROJECTED_COLUMNS = "PROJECTED_COLUMNS" - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.css b/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.css deleted file mode 100644 index 9a69e1f9..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.css +++ /dev/null @@ -1,175 +0,0 @@ -/* - * The outermost container of the view editor. - */ -#view-editor { - align-content: stretch; - background-color: var(--page-background-color); - display: grid; - grid-column-gap: 0; - grid-row-gap: 0; - height: 90vh; - justify-content: stretch; - overflow-y: auto; - width: 100%; -} - -/* - * A view editor area (i.e., heading, toobar, canvas, properties). - */ -.view-editor-area { - background-color: #ededed; - border: 1px solid #bbbbbb; - padding: 0; -} - -/* - * The editor's breadcrumb bar. - */ -#view-editor-breadcrumbs { - background-color: white; -} - -/* - * A view editor showing only header, toolbar, canvas, and properties areas (missing editor views). - */ -.view-editor-canvas-only { - grid-template-areas: - "dataservices-breadcrumb-bar" - "header" - "toolbar" - "canvas"; - grid-template-columns: 1fr; - grid-template-rows: 5fr 10fr 5fr 80fr; -} - -/* - * View editor bottom section containing live sample results, message log, and maybe others. - */ -#view-editor-edit-container { - grid-area: canvas; - overflow-y: auto; -} - -/* - * A view editor showing all areas (header, toolbar, canvas, properties, and editor views). - */ -.view-editor-full { - grid-template-areas: - "dataservices-breadcrumb-bar" - "header" - "toolbar" - "canvas"; - grid-template-columns: 1fr; - grid-template-rows: 5fr 10fr 5fr 80fr; - grid-row-gap: 10px; -} - -/* - * View editor header section at top of editor containing virtualization name, description, etc. - */ -#view-editor-header-container { - grid-area: header; -} - -/* - * Removes some whitespace in the header form. - */ -#view-editor-header-container .form-group { - margin: 0; -} - -/* - * The view editor toolbar which is below the heading section. - */ -#view-editor-toolbar { - grid-area: toolbar; -} - -/* - * Changes margin to be smaller than default. - */ -#view-editor-toolbar .form-group { - margin: 2px; - padding-left: 5px; - padding-right: 5px; -} - -/* - * Remove default styling from the patternfly toolbar. - */ -#view-editor-toolbar .toolbar-pf { - background-color: inherit; - border: none; - box-shadow: none; - padding: 0px; -} - -/* - * Colors the delete button icon. - */ -#view-editor-toolbar-delete-button { - color: var(--alert-color); -} - -/* - * Gives the delete toolbar button icon a disabled look. - */ -[disabled] > #view-editor-toolbar-delete-button { - color: var(--disabled-color); -} - -/* - * Adds a margin to the right. Used in toolbar actions to end a group of actions. - */ -.view-editor-toolbar-end-group { - margin-right: 1em; -} - -/* - * Make the toolbar buttons smaller. - */ -.view-editor-toolbar-icon { - color: var(--card-action-icon-color); - font-size: larger; -} - -/* - * Gives the toolbar button icons a disabled look. - */ -[disabled] > .view-editor-toolbar-icon { - color: var(--disabled-color); -} - -/* - * Colors the redo button icon. - */ -#view-editor-toolbar-redo-button { - color: gold; -} - -/* - * Gives the redo toolbar button icon a disabled look. - */ -[disabled] > #view-editor-toolbar-redo-button { - color: var(--disabled-color); -} - -/* - * Colors the undo button icon. - */ -#view-editor-toolbar-undo-button { - color: gold; -} - -/* - * Gives the undo toolbar button icon a disabled look. - */ -[disabled] > #view-editor-toolbar-undo-button { - color: var(--disabled-color); -} - -/* - * View editor bottom section containing live sample results, message log, and maybe others. - */ -#view-editor-views-container { -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.html b/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.html deleted file mode 100644 index 50bbb4e8..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.html +++ /dev/null @@ -1,100 +0,0 @@ -
    - - - - -
    - -
  • -
  • -
    -
    - - - - -
    - -
    - - - - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{errorMsgCount}} - - - {{warningMsgCount}} - - - {{infoMsgCount}} - - - - -
    -
    - - - - -
    - -
    - - - - - -
    - -
    - -
    diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.spec.ts deleted file mode 100644 index 6afbb38b..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.spec.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormsModule } from "@angular/forms"; -import { RouterTestingModule } from "@angular/router/testing"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { MockConnectionService } from "@connections/shared/mock-connection.service"; -import { CoreModule } from "@core/core.module"; -import { AppSettingsService } from "@core/app-settings.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { SelectionService } from "@core/selection.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { ViewEditorComponent } from '@dataservices/virtualization/view-editor/view-editor.component'; -import { ViewCanvasComponent } from "@dataservices/virtualization/view-editor/view-canvas/view-canvas.component"; -import { ConnectionTableDialogComponent } from "@dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component"; -import { ConnectionTreeSelectorComponent } from "@dataservices/virtualization/view-editor/connection-table-dialog/connection-tree-selector/connection-tree-selector.component"; -import { EditorViewsComponent } from "@dataservices/virtualization/view-editor/editor-views/editor-views.component"; -import { MessageLogComponent } from "@dataservices/virtualization/view-editor/editor-views/message-log/message-log.component"; -import { ViewPreviewComponent } from "@dataservices/virtualization/view-editor/editor-views/view-preview/view-preview.component"; -import { ViewEditorHeaderComponent } from "@dataservices/virtualization/view-editor/view-editor-header/view-editor-header.component"; -import { ViewPropertyEditorsComponent } from "@dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component"; -import { TreeModule } from "angular-tree-component"; -import { TabsModule } from "ngx-bootstrap"; -import { - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - ToolbarModule, - WizardModule } from "patternfly-ng"; -import { - GraphVisualComponent, - LinkVisualComponent, - NodeVisualComponent -} from "@dataservices/virtualization/view-editor/view-canvas/visuals"; -import { CanvasService } from "@dataservices/virtualization/view-editor/view-canvas/canvas.service"; - -describe('ViewEditorComponent', () => { - let component: ViewEditorComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - CoreModule, - FormsModule, - ActionModule, - CardModule, - EmptyStateModule, - FilterModule, - ListModule, - NotificationModule, - SortModule, - TableModule, - ToolbarModule, - WizardModule, - RouterTestingModule, - TabsModule.forRoot(), - TreeModule - ], - declarations: [ - ConnectionTableDialogComponent, - ConnectionTreeSelectorComponent, - EditorViewsComponent, - GraphVisualComponent, - LinkVisualComponent, - NodeVisualComponent, - MessageLogComponent, - ViewCanvasComponent, - ViewEditorComponent, - ViewEditorHeaderComponent, - ViewPreviewComponent, - ViewPropertyEditorsComponent - ], - providers: [ - {provide: AppSettingsService, useClass: MockAppSettingsService}, - CanvasService, - {provide: ConnectionService, useClass: MockConnectionService}, - NotifierService, - SelectionService, - {provide: VdbService, useClass: MockVdbService} - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ViewEditorComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - // it('should be created', () => { - // expect(component).toBeTruthy(); - // }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.ts b/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.ts deleted file mode 100644 index 4f324715..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor.component.ts +++ /dev/null @@ -1,737 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, DoCheck, OnDestroy, OnInit, TemplateRef, ViewEncapsulation } from "@angular/core"; -import { LoggerService } from "@core/logger.service"; -import { SelectionService } from "@core/selection.service"; -import { Connection } from "@connections/shared/connection.model"; -import { ConnectionService } from "@connections/shared/connection.service"; -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { ViewEditorPart } from "@dataservices/virtualization/view-editor/view-editor-part.enum"; -import { ViewEditorEvent } from "@dataservices/virtualization/view-editor/event/view-editor-event"; -import { ViewEditorEventType } from "@dataservices/virtualization/view-editor/event/view-editor-event-type.enum"; -import { ConnectionTableDialogComponent } from "@dataservices/virtualization/view-editor/connection-table-dialog/connection-table-dialog.component"; -import { ViewEditorProgressChangeId } from "@dataservices/virtualization/view-editor/event/view-editor-save-progress-change-id.enum"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { CommandFactory } from "@dataservices/virtualization/view-editor/command/command-factory"; -import { BsModalService } from "ngx-bootstrap"; -import { Action, ActionConfig, ToolbarConfig, ToolbarView } from "patternfly-ng"; -import { Subscription } from "rxjs/Subscription"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { ConfirmDialogComponent } from "@shared/confirm-dialog/confirm-dialog.component"; -import { AddCompositionWizardComponent } from "@dataservices/virtualization/view-editor/add-composition-wizard/add-composition-wizard.component"; -import { AddSourcesCommand } from "@dataservices/virtualization/view-editor/command/add-sources-command"; -import { AddCompositionCommand } from "@dataservices/virtualization/view-editor/command/add-composition-command"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { Composition } from "@dataservices/shared/composition.model"; -import { Router } from "@angular/router"; -import { NavigationStart } from "@angular/router"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: "app-view-editor", - templateUrl: "./view-editor.component.html", - styleUrls: ["./view-editor.component.css"], - providers: [ ViewEditorService ] -}) -export class ViewEditorComponent implements DoCheck, OnDestroy, OnInit { - - private actionConfig: ActionConfig; - private connections: Connection[] = []; - private connectionService: ConnectionService; - private readonly editorService: ViewEditorService; - private readonly logger: LoggerService; - private modalService: BsModalService; - private readonly router: Router; - private selectionService: SelectionService; - private subscription: Subscription; - private saveInProgress = false; - private routeSub: Subscription; - - public toolbarConfig: ToolbarConfig; - public readonly virtualizationsLink = DataservicesConstants.dataservicesRootPath; - - // - // Editor CSS types. - // - private readonly canvasOnlyCssType = "view-editor-canvas-only"; - private readonly fullEditorCssType = "view-editor-full"; - private readonly viewsOnlyCssType = "view-editor-views-only"; - - // - // Toolbar action IDs - // - private readonly addCompositionActionId = "addCompositionActionId"; - private readonly addSourceActionId = "addSourceActionId"; - private readonly sampleDataActionId = "sampleDataActionId"; - private readonly deleteActionId = "deleteActionId"; - private readonly errorsActionId = "errorsActionId"; - private readonly infosActionId = "infosActionId"; - private readonly redoActionId = "redoActionId"; - private readonly saveActionId = "saveActionId"; - private readonly undoActionId = "undoActionId"; - private readonly warningsActionId = "warningsActionId"; - - // - // Toolbar action indexes (must stay in sync with the ActionConfig) - // - private readonly addSourceActionIndex = 0; - private readonly addCompositionActionIndex = 1; - private readonly sampleDataActionIndex = 2; - private readonly saveActionIndex = 3; - private readonly undoActionIndex = 4; - private readonly redoActionIndex = 5; - private readonly deleteActionIndex = 6; - private readonly errorsActionIndex = 7; - private readonly warningsActionIndex = 8; - private readonly infosActionIndex = 9; - - constructor( connectionService: ConnectionService, - selectionService: SelectionService, - logger: LoggerService, - editorService: ViewEditorService, - modalService: BsModalService, - router: Router ) { - this.connectionService = connectionService; - this.logger = logger; - this.modalService = modalService; - this.router = router; - this.selectionService = selectionService; - - // this is the service that is injected into all the editor parts - this.editorService = editorService; - this.editorService.setEditorVirtualization( selectionService.getSelectedVirtualization() ); - } - - /** - * Executed by javascript framework when something changes. Used to set then enable state of the toolbar buttons. - */ - public ngDoCheck(): void { - if (this.actionConfig ) { - this.actionConfig.primaryActions[ this.addCompositionActionIndex ].disabled = !this.canAddComposition(); - this.actionConfig.primaryActions[ this.addSourceActionIndex ].disabled = !this.canAddSource(); - this.actionConfig.primaryActions[ this.sampleDataActionIndex ].disabled = !this.canSampleData(); - this.actionConfig.primaryActions[ this.deleteActionIndex ].disabled = !this.canDelete(); - this.actionConfig.primaryActions[ this.errorsActionIndex ].disabled = !this.hasErrors(); - this.actionConfig.primaryActions[ this.infosActionIndex ].disabled = !this.hasInfos(); - this.actionConfig.primaryActions[ this.redoActionIndex ].disabled = !this.canRedo(); - this.actionConfig.primaryActions[ this.redoActionIndex ].tooltip = this.editorService.getRedoActionTooltip(); - this.actionConfig.primaryActions[ this.saveActionIndex ].disabled = !this.canSave(); - this.actionConfig.primaryActions[ this.undoActionIndex ].disabled = !this.canUndo(); - this.actionConfig.primaryActions[ this.undoActionIndex ].tooltip = this.editorService.getUndoActionTooltip(); - this.actionConfig.primaryActions[ this.warningsActionIndex ].disabled = !this.hasWarnings(); - } - } - - /** - * Cleanup code when destroying the editor. - */ - public ngOnDestroy(): void { - this.subscription.unsubscribe(); - this.routeSub.unsubscribe(); - } - - /** - * Initialization code run after construction. - */ - public ngOnInit(): void { - this.editorService.setEditorConfig( this.fullEditorCssType ); // this could be set via preference or last used config - this.subscription = this.editorService.editorEvent.subscribe( ( event ) => this.handleEditorEvent( event ) ); - - // Load the connections - const self = this; - this.connectionService - .getConnections(true, true) - .subscribe( - (connectionSummaries) => { - const conns = []; - for ( const connectionSummary of connectionSummaries ) { - const connStatus = connectionSummary.getStatus(); - const conn = connectionSummary.getConnection(); - conn.setStatus(connStatus); - conns.push(conn); - self.connections = conns; - } - }, - (error) => { - // self.logger.error("[ConnectionSchemaTreeComponent] Error getting connections: %o", error); - // self.connectionLoadingState = LoadingState.LOADED_INVALID; - } - ); - - // Listen for event when user moves away from this page - this.routeSub = this.router.events.pairwise().subscribe((event) => { - if (event[1] instanceof NavigationStart) { - if (this.editorService.hasChanges()) { - this.editorService.saveEditorState(); - } - } - }); - } - - /** - * Determine if a view is currently selected - */ - private get hasSelectedView(): boolean { - const selView = this.editorService.getEditorView(); - return (selView && selView !== null); - } - - /** - * @param {ViewEditorEvent} event the event being processed - */ - public handleEditorEvent( event: ViewEditorEvent ): void { - this.logger.debug( "ViewEditorComponent received event: " + event.toString() ); - - if ( event.typeIsShowEditorPart() ) { - if ( event.args.length !== 0 ) { - // make sure the bottom area is showing if part is an additional editor view - if ( ( event.args[ 0 ] === ViewEditorPart.PREVIEW || event.args[ 0 ] === ViewEditorPart.MESSAGE_LOG ) - && !this.isShowingAdditionalViews ) { - this.editorService.setEditorConfig( this.fullEditorCssType ); - } - } - } - else if (event.typeIsCreateSource()) { - if (event.sourceIsCanvas()) { - alert("Multiple compositions not yet supported"); - } else { - this.doAddSource(); - } - } - else if (event.typeIsCreateComposition()) { - this.doAddComposition(event.args); - } - else if (event.typeIsDeleteNode()) { - const selection = []; - let selectionStr = event.args[0]; - if ( event.args.length > 1 ) { - // selection.push(event.args[1]); - selectionStr += Command.identDivider + event.args[1]; - } - selection.push(selectionStr); - this.doDelete(selection); - } - else if (event.typeIsCanvasSelectionChanged()) { - this.doSelection(event.args); - } - else if ( event.typeIsEditorViewSaveProgressChanged() ) { - if ( event.args.length !== 0 ) { - // Detect changes in view editor save progress - if ( event.args[ 0 ] === ViewEditorProgressChangeId.IN_PROGRESS ) { - this.saveInProgress = true; - } else if ( event.args[ 0 ] === ViewEditorProgressChangeId.COMPLETED_SUCCESS ) { - this.editorService.updatePreviewResults(); - this.saveInProgress = false; - } else if ( event.args[ 0 ] === ViewEditorProgressChangeId.COMPLETED_FAILED ) { - this.editorService.setPreviewResults(null, null, ViewEditorPart.EDITOR); - this.saveInProgress = false; - } - } - } - } - - private canAddComposition(): boolean { - return this.hasSelectedView && - !this.editorService.isReadOnly() && - this.isShowingCanvas && - this.canvasSingleSourceSelected; - } - - private canAddSource(): boolean { - return this.hasSelectedView && - !this.editorService.isReadOnly() && - this.isShowingCanvas; - } - - private canSampleData(): boolean { - return !this.editorService.isReadOnly() && this.isShowingCanvas && this.canvasSingleSourceSelected; - } - - private canDelete(): boolean { - return this.hasSelectedView && - !this.editorService.isReadOnly() && - this.isShowingCanvas && - this.editorService.hasSelection(); - } - - private canRedo(): boolean { - return this.hasSelectedView && - this.editorService.canRedo(); - } - - private canSave(): boolean { - return this.hasSelectedView - && !this.editorService.isReadOnly() - && this.editorService.canSaveView() - && this.editorService.hasChanges() - && !this.saveInProgress; - } - - private canUndo(): boolean { - return this.hasSelectedView && - this.editorService.canUndo(); - } - - private doAddComposition(sourcePaths: string[]): void { - let sourcePath = null; - if (sourcePaths && sourcePaths.length === 1) { - sourcePath = sourcePaths[0]; - } - - // Show AddComposition Wizard, setting initial state - const initialState = { initialSourcePath: sourcePath, editorService: this.editorService}; - const modalConfig = {}; - const addCompositionModalRef = this.modalService.show(AddCompositionWizardComponent, - Object.assign({}, modalConfig, { class: 'modal-lg', initialState })); - - // Acts upon finish button click - addCompositionModalRef.content.finishAction.take(1).subscribe((composition) => { - // Check the composition and add any missing view sources - const leftSourcePath = composition.getLeftSourcePath(); - const rightSourcePath = composition.getRightSourcePath(); - const viewHasLeftSource = this.editorService.getEditorView().hasSourcePath(leftSourcePath); - const viewHasRightSource = this.editorService.getEditorView().hasSourcePath(rightSourcePath); - if ( !viewHasLeftSource ) { - this.fireAddSourcesCommand(leftSourcePath); - } - if ( !viewHasRightSource ) { - this.fireAddSourcesCommand(rightSourcePath); - } - - // Create and fire command to Add the Composition - this.fireAddCompositionCommand(composition); - - addCompositionModalRef.hide(); - }); - - // Acts upon cancel button click (closes wizard) - addCompositionModalRef.content.cancelAction.take(1).subscribe((composition) => { - addCompositionModalRef.hide(); - }); - } - - private doAddSource(): void { - // Open Source selection dialog - const initialState = { - title: ViewEditorI18n.addSourceDialogTitle, - cancelButtonText: ViewEditorI18n.cancelButtonText, - okButtonText: ViewEditorI18n.okButtonText - }; - - // Show Dialog, act upon confirmation click - const self = this; - const modalRef = this.modalService.show(ConnectionTableDialogComponent, {initialState}); - modalRef.content.okAction.take(1).subscribe((selectedNodes) => { - self.fireAddSourcesCommand(selectedNodes); - }); - } - - /** - * Generates the AddSourcesCommand for the supplied sources, and fires the viewEditor state change with the command. - * 'addedSources' must be an array of SchemaNodes -OR- - * string of the source paths (comma delimited) - path form: "connection=aConn/schema=aSchema/table=aTable" - * - * @param {string | SchemaNode} addedSources the string representation of the sources or the schema nodes of the sources - * being added (cannot be `null` or empty) - */ - private fireAddSourcesCommand(addedSources: string | SchemaNode[]): void { - const tempCmd = CommandFactory.createAddSourcesCommand( addedSources ); - - if ( tempCmd instanceof Command ) { - const cmd = tempCmd as Command; - this.editorService.fireViewStateHasChanged( ViewEditorPart.EDITOR, cmd ); - } else { - this.logger.error( "Failed to create AddSourcesCommand" ); - } - } - - /** - * Generates the AddCompositionCommand for the supplied composition, and fires the viewEditor state change with the command. - * - * @param {Composition} addedComposition the Composition being added (cannot be `null` or empty) - */ - private fireAddCompositionCommand(addedComposition: Composition): void { - const tempCmd = CommandFactory.createAddCompositionCommand( addedComposition ); - - if ( tempCmd instanceof Command ) { - const cmd = tempCmd as Command; - this.editorService.fireViewStateHasChanged( ViewEditorPart.EDITOR, cmd ); - } else { - this.logger.error( "Failed to create AddCompositionCommand" ); - } - } - - private doDelete(selectionArgs: string[]): void { - - if (!selectionArgs || selectionArgs.length === 0) { - alert("Nothing selected for delete"); - return; - } - - // Dialog Content - let message = "Do you really want to delete the " + selectionArgs.length; - if (selectionArgs.length > 1) - message = message + " items?"; - else - message = message + " item?"; - - const initialState = { - title: "Confirm Delete", - bodyContent: message, - cancelButtonText: "Cancel", - confirmButtonText: "Delete" - }; - - // Show Dialog, act upon confirmation click - const modalRef = this.modalService.show(ConfirmDialogComponent, {initialState}); - modalRef.content.confirmAction.take(1).subscribe((value) => { - // ------------------ - // the selection arguments contain the command object arg[0] and the metadata object arg[1] - // 1) need to loop through each selection - // 2) create corresponding command - // 3) fire view state changed event for each - // ------------------ - - selectionArgs.forEach( ( nextArg ) => { - - // get command type from the selection - const commandType = this.editorService.getSelectionCommandType(nextArg); - // the payload for src will be the source/connection path - // the payload for the composition will be the json representing the composition properties - const argPart = this.editorService.getSelectionPayload(nextArg); - - if ( commandType === AddSourcesCommand.id ) { - // Look for any composition with src paths links and remove if exist - const comps: Composition[] = this.editorService.getEditorView().getCompositions(); - comps.forEach( (nextComp) => { - const leftPath = nextComp.getLeftSourcePath(); - if (leftPath && leftPath != null && argPart === leftPath) { - const addCompCmd = CommandFactory.createRemoveCompositionCommand(nextComp.toString(), AddCompositionCommand.id); - if (addCompCmd && addCompCmd != null) { - this.notifyRemoved(addCompCmd); - } - } else { - const rightPath = nextComp.getRightSourcePath(); - if (rightPath && rightPath != null && argPart === rightPath) { - const addCompCmd = CommandFactory.createRemoveCompositionCommand(nextComp.toString(), AddCompositionCommand.id); - if (addCompCmd && addCompCmd != null) { - this.notifyRemoved(addCompCmd); - } - } - } - }); - - // Remove Source Command - const addSrcsCmd = CommandFactory.createRemoveSourcesCommand(argPart, commandType); - this.notifyRemoved(addSrcsCmd); - - } else if ( commandType === AddCompositionCommand.id ) { - // Remove composition - const addCompCmd = CommandFactory.createRemoveCompositionCommand(argPart, commandType); - this.notifyRemoved(addCompCmd); - } - - this.editorService.select(null); - }); - }); - } - - private notifyRemoved(command: Command): void { - if (command !== null ) { - const cmd = command as Command; - this.editorService.fireViewStateHasChanged(ViewEditorPart.EDITOR, cmd); - } else { - this.logger.error("Failed to create Remove Command"); - } - } - - private doSampleData(selection: string[]): void { - if (!selection || selection.length === 0) { - alert("Nothing selected for sample data"); - return; - } - const path = selection[0]; - this.editorService.updatePreviewResults(path); - } - - private doSelection(selection: string[]): void { - this.editorService.select(selection); - } - - private doDisplayLogMessages( actionId: string ): void { - this.editorService.fire( ViewEditorEvent.create( ViewEditorPart.EDITOR, - ViewEditorEventType.SHOW_EDITOR_PART, - [ ViewEditorPart.MESSAGE_LOG ] ) ); - } - - private doRedo(): void { - this.editorService.redo(); - } - - private doSave(): void { - this.editorService.saveEditorState(); - } - - private doUndo(): void { - this.editorService.undo(); - } - - /** - * @returns {string} argument array from the selection string - */ - private getArgs(selection?: string): string[] { - if ( selection !== null ) { - return selection.split(Command.identDivider); - } - return null; - } - - /** - * Callback for when a view icon is clicked on the toolbar. - * - * @param {ToolbarView} toolbarView the toolbar view representing the editor configuration to display - */ - public editorConfigChange( toolbarView: ToolbarView ): void { - if ( toolbarView.id !== this.editorService.getEditorConfig() ) { - this.editorService.setEditorConfig( toolbarView.id ); - } - } - - /** - * @returns {string} the current CSS type of the editor - */ - public get editorCssType(): string { - return this.editorService.getEditorConfig(); - } - - /** - * Callback for when the toolbar is configured. - * - * @param {TemplateRef} addSourceTemplate the template for the add source toolbar button - * @param {TemplateRef} addCompositionTemplate the template for the add composition toolbar button - * @param {TemplateRef} sampleDataTemplate the template for the sample data toolbar button - * @param {TemplateRef} undoTemplate the template for the undo toolbar button - * @param {TemplateRef} redoTemplate the template for the redo toolbar button - * @param {TemplateRef} saveTemplate the template for the save toolbar button - * @param {TemplateRef} deleteTemplate the template for the delete toolbar button - * @param {TemplateRef} errorsTemplate the template for the show errors toolbar button - * @param {TemplateRef} warningsTemplate the template for the show warnings toolbar button - * @param {TemplateRef} infosTemplate the template for the show infos toolbar button - * @returns {ActionConfig} - */ - public getActionConfig( addSourceTemplate: TemplateRef< any >, - addCompositionTemplate: TemplateRef< any >, - sampleDataTemplate: TemplateRef< any >, - undoTemplate: TemplateRef< any >, - redoTemplate: TemplateRef< any >, - saveTemplate: TemplateRef< any >, - deleteTemplate: TemplateRef< any >, - errorsTemplate: TemplateRef< any >, - warningsTemplate: TemplateRef< any >, - infosTemplate: TemplateRef< any > ): ActionConfig { - if ( !this.actionConfig ) { - this.actionConfig = { - primaryActions: [ - { - disabled: !this.canAddSource(), - id: this.addSourceActionId, - template: addSourceTemplate, - title: ViewEditorI18n.addSourceActionTitle, - tooltip: ViewEditorI18n.addSourceActionTooltip - }, - { - disabled: !this.canAddComposition(), - id: this.addCompositionActionId, - template: addCompositionTemplate, - title: ViewEditorI18n.addCompositionActionTitle, - tooltip: ViewEditorI18n.addCompositionActionTooltip - }, - { - disabled: !this.canSampleData(), - id: this.sampleDataActionId, - template: sampleDataTemplate, - title: ViewEditorI18n.sampleDataActionTitle, - tooltip: ViewEditorI18n.sampleDataActionTooltip - }, - { - disabled: !this.canSave(), - id: this.saveActionId, - styleClass: "view-editor-toolbar-end-group", - template: saveTemplate, - title: ViewEditorI18n.saveActionTitle, - tooltip: ViewEditorI18n.saveActionTooltip - }, - { - disabled: !this.canUndo(), - id: this.undoActionId, - template: undoTemplate, - title: ViewEditorI18n.undoActionTitle, - tooltip: ViewEditorI18n.undoActionTooltip - }, - { - disabled: !this.canRedo(), - id: this.redoActionId, - styleClass: "view-editor-toolbar-end-group", - template: redoTemplate, - title: ViewEditorI18n.redoActionTitle, - tooltip: ViewEditorI18n.redoActionTooltip - }, - { - disabled: !this.canDelete(), - id: this.deleteActionId, - styleClass: "view-editor-toolbar-end-group", - template: deleteTemplate, - title: ViewEditorI18n.deleteActionTitle, - tooltip: ViewEditorI18n.deleteActionTooltip - }, - { - disabled: !this.hasErrors(), - id: this.errorsActionId, - template: errorsTemplate, - title: ViewEditorI18n.errorsActionTitle, - tooltip: ViewEditorI18n.errorsActionTooltip - }, - { - disabled: !this.hasWarnings(), - id: this.warningsActionId, - template: warningsTemplate, - title: ViewEditorI18n.warningsActionTitle, - tooltip: ViewEditorI18n.warningsActionTooltip - }, - { - disabled: !this.hasInfos(), - id: this.infosActionId, - template: infosTemplate, - title: ViewEditorI18n.infosActionTitle, - tooltip: ViewEditorI18n.infosActionTooltip - } - ], - moreActions: [], - } as ActionConfig; - } - - return this.actionConfig; - } - - /** - * Callback for when a toolbar button is clicked. - * - * @param {Action} action the toolbar action that was clicked - */ - public handleAction( action: Action ): void { - switch ( action.id ) { - case this.addCompositionActionId: - this.doAddComposition([]); - break; - case this.addSourceActionId: - this.doAddSource(); - break; - case this.sampleDataActionId: - const singleSelection = this.editorService.getSelection(); - this.doSampleData(singleSelection); - break; - case this.deleteActionId: - const selection = this.editorService.getSelection(); - this.doDelete(selection); - break; - case this.errorsActionId: - this.doDisplayLogMessages( this.errorsActionId ); - break; - case this.infosActionId: - this.doDisplayLogMessages( this.infosActionId ); - break; - case this.redoActionId: - this.doRedo(); - break; - case this.saveActionId: - this.doSave(); - break; - case this.undoActionId: - this.doUndo(); - break; - case this.warningsActionId: - this.doDisplayLogMessages( this.warningsActionId ); - break; - default: - this.logger.error( `Unhandled action '${action.id}'` ); - } - } - - private hasErrors(): boolean { - return this.errorMsgCount !== 0; - } - - private hasInfos(): boolean { - return this.infoMsgCount !== 0; - } - - private hasWarnings(): boolean { - return this.warningMsgCount !== 0; - } - - /** - * @returns {number} the number of error messages - */ - public get errorMsgCount(): number { - return this.editorService.getErrorMessageCount(); - } - - /** - * @returns {number} the number of warning messages - */ - public get warningMsgCount(): number { - return this.editorService.getWarningMessageCount(); - } - - /** - * @returns {number} the number of informational messages - */ - public get infoMsgCount(): number { - return this.editorService.getInfoMessageCount(); - } - - /** - * Indicates if the results area should be shown. - * - * @returns {boolean} `true` if area should be shown - */ - public get isShowingAdditionalViews(): boolean { - return this.editorCssType === this.viewsOnlyCssType || this.editorCssType === this.fullEditorCssType; - } - - /** - * Indicates if the canvas and properties areas should be shown. - * - * @returns {boolean} `true` if areas should be shown - */ - public get isShowingCanvas(): boolean { - return this.editorCssType === this.canvasOnlyCssType || this.editorCssType === this.fullEditorCssType; - } - - /** - * Indicates if the canvas has a single source selected - * - * @returns {boolean} `true` if canvas has single source selection - */ - public get canvasSingleSourceSelected(): boolean { - const selections = this.editorService.getSelection(); - return selections && selections.length === 1; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor.service.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/view-editor.service.spec.ts deleted file mode 100644 index 7b6ce613..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor.service.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { TestBed, inject } from '@angular/core/testing'; -import { HttpModule } from "@angular/http"; -import { LoggerService } from "@core/logger.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { ViewEditorService } from '@dataservices/virtualization/view-editor/view-editor.service'; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { SelectionService } from "@core/selection.service"; - -describe('ViewEditorService', () => { - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule - ], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ViewEditorService - ] - }); - }); - - it('should be created', inject([ViewEditorService], ( service: ViewEditorService) => { - expect(service).toBeTruthy(); - })); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-editor.service.ts b/ui/src/app/dataservices/virtualization/view-editor/view-editor.service.ts deleted file mode 100644 index 1fb28f30..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-editor.service.ts +++ /dev/null @@ -1,815 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { EventEmitter, Injectable, Output } from "@angular/core"; -import { LoggerService } from "@core/logger.service"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { QueryResults } from "@dataservices/shared/query-results.model"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { ViewValidator } from "@dataservices/virtualization/view-editor/view-validator"; -import { ViewEditorPart } from "@dataservices/virtualization/view-editor/view-editor-part.enum"; -import { Message } from "@dataservices/virtualization/view-editor/editor-views/message-log/message"; -import { ViewEditorEvent } from "@dataservices/virtualization/view-editor/event/view-editor-event"; -import { ViewEditorEventType } from "@dataservices/virtualization/view-editor/event/view-editor-event-type.enum"; -import { ViewEditorProgressChangeId } from "@dataservices/virtualization/view-editor/event/view-editor-save-progress-change-id.enum"; -import { VdbsConstants } from "@dataservices/shared/vdbs-constants"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { UpdateViewDescriptionCommand } from "@dataservices/virtualization/view-editor/command/update-view-description-command"; -import { UpdateViewNameCommand } from "@dataservices/virtualization/view-editor/command/update-view-name-command"; -import { AddSourcesCommand } from "@dataservices/virtualization/view-editor/command/add-sources-command"; -import { RemoveSourcesCommand } from "@dataservices/virtualization/view-editor/command/remove-sources-command"; -import { UndoManager } from "@dataservices/virtualization/view-editor/command/undo-redo/undo-manager"; -import { CommandFactory } from "@dataservices/virtualization/view-editor/command/command-factory"; -import { Undoable } from "@dataservices/virtualization/view-editor/command/undo-redo/undoable"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { AddCompositionCommand } from "@dataservices/virtualization/view-editor/command/add-composition-command"; -import { RemoveCompositionCommand } from "@dataservices/virtualization/view-editor/command/remove-composition-command"; -import { ViewDefinition } from "@dataservices/shared/view-definition.model"; -import { ViewEditorState } from "@dataservices/shared/view-editor-state.model"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { SelectionService } from "@core/selection.service"; -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; -import { NoOpCommand } from "@dataservices/virtualization/view-editor/command/no-op-command"; -import { UpdateProjectedColumnsCommand } from "@dataservices/virtualization/view-editor/command/update-projected-columns-command"; -import { ProjectedColumn } from "@dataservices/shared/projected-column.model"; - -@Injectable() -export class ViewEditorService { - - /** - * An event fired when the state of the service has changed. - * - * @type {EventEmitter} - */ - @Output() public editorEvent: EventEmitter< ViewEditorEvent > = new EventEmitter(); - - private _editorConfig: string; - private _editorView: ViewDefinition; - private _editorVirtualization: Dataservice; - private _errorMsgCount = 0; - private _infoMsgCount = 0; - private readonly _logger: LoggerService; - private _messages: Message[] = []; - private _previewResults: QueryResults; - private _previewSql = ""; - private _readOnly = false; - private _shouldFireEvents = true; - private _undoMgr: UndoManager; - private readonly _dataserviceService: DataserviceService; - private readonly _selectionService: SelectionService; - private readonly _vdbService: VdbService; - private _warningMsgCount = 0; - private _selection: string[] = []; - private _originalView: ViewDefinition = null; - - constructor( logger: LoggerService, - dataserviceService: DataserviceService, - selectionService: SelectionService, - vdbService: VdbService ) { - this._logger = logger; - this._dataserviceService = dataserviceService; - this._selectionService = selectionService; - this._vdbService = vdbService; - this._undoMgr = new UndoManager(); - } - - /** - * @param {Message} msg the message being added - * @param {ViewEditorPart} source the source that is adding the message - */ - public addMessage( msg: Message, - source: ViewEditorPart ): void { - this._messages.push( msg ); - - if ( msg.isError() ) { - this._errorMsgCount++; - } else if ( msg.isWarning() ) { - this._warningMsgCount++; - } else if ( msg.isInfo() ) { - this._infoMsgCount++; - } else { - this._logger.error( "[ViewEditorService.addMessage] unhandled message type of '" + msg.type + "'"); - } - - this.fire( ViewEditorEvent.create( source, ViewEditorEventType.LOG_MESSAGE_ADDED, [ msg ] ) ); - } - - /** - * @returns {boolean} `true` if there is an available undo action - */ - public canRedo(): boolean { - return !this.isReadOnly() && this._undoMgr.canRedo(); - } - - /** - * @returns {boolean} `true` if there is an available redo action - */ - public canUndo(): boolean { - return !this.isReadOnly() && this._undoMgr.canUndo(); - } - - /** - * Clears all log messages. - * - * @param {ViewEditorPart} source the source that is deleting the message - * @param {string} context an optional context - */ - public clearMessages( source: ViewEditorPart, - context?: string ): void { - this._messages = []; - this._errorMsgCount = 0; - this._warningMsgCount = 0; - this._infoMsgCount = 0; - - if ( context ) { - this.fire( ViewEditorEvent.create( source, ViewEditorEventType.LOG_MESSAGES_CLEARED, [ context ] ) ); - } else { - this.fire( ViewEditorEvent.create( source, ViewEditorEventType.LOG_MESSAGES_CLEARED ) ); - } - } - - /** - * @param {string} msgId the ID of the message being deleted - * @param {ViewEditorPart} source the source that is deleting the message - */ - public deleteMessage( msgId: string, - source: ViewEditorPart ): void { - const index = this._messages.findIndex( ( msg ) => msg.id === msgId ); - - if ( index !== -1 ) { - const deleted = this._messages.splice( index, 1 ); - - if ( deleted[ 0 ].isError() ) { - this._errorMsgCount++; - } else if ( deleted[ 0 ].isWarning() ) { - this._warningMsgCount++; - } else if ( deleted[ 0 ].isInfo() ) { - this._infoMsgCount++; - } else { - this._logger.error( "[ViewEditorService.deleteMessage] unhandled message type of '" + deleted[ 0 ].type + "'"); - } - - this.fire( ViewEditorEvent.create( source, ViewEditorEventType.LOG_MESSAGE_DELETED, [ deleted[ 0 ] ] ) ); - } - } - - /** - * @param {ViewEditorEvent} event the event to broadcast - */ - public fire( event: ViewEditorEvent ): void { - this._logger.debug( "[ViewEditorService.fire] firing event: " + event ); - - if (this._shouldFireEvents ) { - this.editorEvent.emit( event ); - - // validate view when first set or when its state changes - if ( event.typeIsViewStateChanged() || event.typeIsEditedViewSet() ) { - this.validateView( event.type ); - } - } - } - - /** - * Fires a `ViewEditorEventType.VIEW_STATE_CHANGED`. - * - * @param {ViewEditorPart} source the source of the event - * @param {Command} command the command that was executed on the view being edited - */ - public fireViewStateHasChanged( source: ViewEditorPart, - command: Command ): void { - // update view model - this.updateViewState( command ); - - // add to undo manager - const tempCmd = CommandFactory.createUndoable( command ); - - if ( tempCmd instanceof Undoable ) { - const undoable = tempCmd as Undoable; - this._undoMgr.add( undoable ); - } - - // broadcast view change - this.fire( ViewEditorEvent.create( source, ViewEditorEventType.VIEW_STATE_CHANGED, [ command ] ) ); - } - - /** - * @returns {string} the editor's CSS class - */ - public getEditorConfig(): string { - return this._editorConfig; - } - - /** - * @param {string} viewName the view name - * @returns {string} the ID used to persist the editor state - */ - private getEditorStateId(viewName: string): string { - const serviceVdbName = this._editorVirtualization.getServiceVdbName().toLowerCase(); - return serviceVdbName + "." + viewName; - } - - /** - * @returns {ViewDefinition} the view being edited or `null` if not set - */ - public getEditorView(): ViewDefinition { - return this._editorView; - } - - /** - * @returns {Dataservice} the virtualization of the view being edited or `null` if not set - */ - public getEditorVirtualization(): Dataservice { - return this._editorVirtualization; - } - - /** - * @returns {number} the number of error messages - */ - public getErrorMessageCount(): number { - return this._errorMsgCount; - } - - /** - * @returns {Message[]} the error messages - */ - public getErrorMessages(): Message[] { - return this._messages.filter( ( msg ) => msg.isError() ); - } - - /** - * @returns {number} the number of informational messages - */ - public getInfoMessageCount(): number { - return this._infoMsgCount; - } - - /** - * @returns {Message[]} the informational messages - */ - public getInfoMessages(): Message[] { - return this._messages.filter( ( msg ) => msg.isInfo() ); - } - - /** - * @returns {number} the message count (includes error, warning, and info messages) - */ - public getMessageCount(): number { - return this.getMessages().length; - } - - /** - * @returns {Message[]} the log messages (error, warning, and info) - */ - public getMessages(): Message[] { - return this._messages; - } - - /** - * @returns {string} the preview sql - */ - public getPreviewSql(): string { - return this._previewSql; - } - - /** - * @returns {QueryResults} the preview results or `null` if not set - */ - public getPreviewResults(): QueryResults { - return this._previewResults; - } - - /** - * A label that changes dynamically based on the next available redo command. - * - * @returns {string} a short description suitable for use in a redo action - */ - public getRedoActionTooltip(): string { - return this._undoMgr.redoLabel(); - } - - /** - * A label that changes dynamically based on the next available undo command. - * - * @returns {string} a short description suitable for use in an undo action - */ - public getUndoActionTooltip(): string { - return this._undoMgr.undoLabel(); - } - - /** - * @returns {number} the number of warning messages - */ - public getWarningMessageCount(): number { - return this._warningMsgCount; - } - - /** - * @returns {Message[]} the warning messages - */ - public getWarningMessages(): Message[] { - return this._messages.filter( ( msg ) => msg.isWarning() ); - } - - /** - * @returns {boolean} `true` if the editor has unsaved changes - */ - public hasChanges(): boolean { - let hasChanged = false; - if ( this._editorView && this._editorView !== null ) { - hasChanged = !this._editorView.isEqual(this._originalView); - } - return hasChanged; - } - - /** - * @returns {boolean} `true` if the editor view can be saved - */ - public canSaveView(): boolean { - return this._editorView && this._editorView.getName() && this._editorView.getName().length > 0; - } - - /** - * @returns {boolean} `true` if editor is readonly or has not been set - */ - public isReadOnly(): boolean { - return this._readOnly; - } - - /** - * Executes the current redo command. - */ - public redo(): void { - if ( this.canRedo() ) { - const redoCmd = this._undoMgr.popRedoCommand(); - this.updateViewState( redoCmd ); - this.fire( ViewEditorEvent.create( ViewEditorPart.EDITOR, ViewEditorEventType.VIEW_STATE_CHANGED, [ redoCmd ] ) ); - } else { - this._logger.error( "[ViewEditorService.redo] Redo called when there is not a redo command available" ); - } - } - - private restoreUndoables(): void { - if ( this.getEditorVirtualization() && this.getEditorView() ) { - // fire editor state in progress event - this.fire( ViewEditorEvent.create( ViewEditorPart.EDITOR, - ViewEditorEventType.RESTORE_EDITOR_STATE, - [ ViewEditorProgressChangeId.IN_PROGRESS ] ) ); - - const self = this; - const editorId = this.getEditorStateId(this._editorView.getName()); - let errorMsg: string; - - this._logger.debug( "[ViewEditorService.restoreEditorState]: getViewEditorState for " + editorId ); - this._dataserviceService.getViewEditorState( editorId ).subscribe( - ( resp ) => { - const undoables = resp["undoables"]; - if ( undoables && undoables.length !== 0 ) { - for ( const json of undoables ) { - const temp = CommandFactory.decodeUndoable( json ); - - if ( temp instanceof Undoable ) { - const undoable = temp as Undoable; - - // update view - // this.updateViewState( undoable.redoCommand ); - - // add command to undo/redo manager - this._undoMgr.add( undoable ); - } else { - const error = temp as Error; - errorMsg = ViewEditorI18n.errorRestoringViewEditorState + error.message; - } - } - } - }, ( error ) => { - errorMsg = error.message ? error.message - : error.status ? `${error.status} - ${error.statusText}` - : ViewEditorI18n.serverError; - self._logger.error( "Unable to restore editor state '" + editorId + "'. Error: " + error ); - }, () => { - const args = errorMsg ? [ ViewEditorProgressChangeId.COMPLETED_FAILED, errorMsg ] - : [ ViewEditorProgressChangeId.COMPLETED_SUCCESS ]; - - // fire restore completed - this.fire( ViewEditorEvent.create( ViewEditorPart.EDITOR, - ViewEditorEventType.RESTORE_EDITOR_STATE, - [ args ] ) ); - } - ); - } - } - - /** - * Saves the current editor state. - */ - public saveEditorState(): void { - // fire save in progress event - this.fire( ViewEditorEvent.create( ViewEditorPart.EDITOR, - ViewEditorEventType.EDITOR_VIEW_SAVE_PROGRESS_CHANGED, - [ ViewEditorProgressChangeId.IN_PROGRESS ] ) ); - - // Save the current editorState - const viewName = this._editorView.getName(); - const editorId = this.getEditorStateId(viewName); - - // ViewEditorState contains Undoables array plus current ViewDefinition - const editorState = new ViewEditorState(); - editorState.setId(editorId); - editorState.setUndoables(this._undoMgr.toArray()); - editorState.setViewDefinition(this._editorView); - - const editorStates: ViewEditorState[] = []; - editorStates.push(editorState); - - const dataserviceName = this._selectionService.getSelectedVirtualization().getId(); - - const self = this; - this._dataserviceService.saveViewEditorStatesRefreshViews( editorStates, dataserviceName ).subscribe( () => { - // reset original view to saved state - self._originalView = ViewDefinition.create(this._editorView.toJSON()); - // any change to service view undeploys active serviceVdb - self.undeploySelectedVirtualization(); - // fire save editor state succeeded event - self.fire( ViewEditorEvent.create( ViewEditorPart.EDITOR, - ViewEditorEventType.EDITOR_VIEW_SAVE_PROGRESS_CHANGED, - [ ViewEditorProgressChangeId.COMPLETED_SUCCESS ] ) ); - }, () => { - // fire save editor state failed event - self.fire( ViewEditorEvent.create( ViewEditorPart.EDITOR, - ViewEditorEventType.EDITOR_VIEW_SAVE_PROGRESS_CHANGED, - [ ViewEditorProgressChangeId.COMPLETED_FAILED ] ) ); - } - ); - } - - /** - * Undeploy the selected virtualization (only if it is active) - */ - public undeploySelectedVirtualization(): void { - this._logger.debug( "[ViewEditorService.undeploySelectedVirtualization]" ); - const selectedVirt = this._selectionService.getSelectedVirtualization(); - if (selectedVirt && selectedVirt !== null && - (selectedVirt.serviceDeploymentActive || selectedVirt.serviceDeploymentFailed)) { - const serviceVdbName = selectedVirt.getServiceVdbName(); - const self = this; - this._vdbService.undeployVdb( serviceVdbName ).subscribe( () => { - self._dataserviceService.updateDataserviceStates(); - self._logger.debug( "[ViewEditorService.undeploySelectedVirtualization] - completed" ); - }, () => { - self._logger.error( "[ViewEditorService.undeploySelectedVirtualization] - error with undeploy" ); - } - ); - } - } - - /** - * Sets the view being edited. This is called when the editor is first constructed and can only be called once. - * Subsequent calls are ignored. - * - * @param {string} newCssClass the editor's CSS class - */ - public setEditorConfig( newCssClass: string ): void { - if ( this._editorConfig !== newCssClass ) { - this._editorConfig = newCssClass; - this.fire( ViewEditorEvent.create( ViewEditorPart.EDITOR, ViewEditorEventType.EDITOR_CONFIG_CHANGED, [ newCssClass ] ) ); - } - } - - /** - * Sets the view being edited. This should only be called once. Subsequent calls are ignored. Fires a - * `ViewEditorEventType.VIEW_CHANGED` event having the view definition as an argument. - * - * @param {ViewDefinition} viewDefn the view definition being edited - * @param {ViewEditorPart} source the source making the update - */ - public setEditorView( viewDefn: ViewDefinition, - source: ViewEditorPart ): void { - this._editorView = viewDefn; - this._selection = []; - if ( viewDefn !== null ) { - this._originalView = ViewDefinition.create(viewDefn.toJSON()); - } else { - this._originalView = null; - } - this.resetUndoManager(); - // Notify components that view has been reset - this.fire( ViewEditorEvent.create( source, ViewEditorEventType.EDITED_VIEW_SET, [ this._editorView ] ) ); - // Reset the preview panel for this view - this.updatePreviewResults(); - } - - /** - * Sets the virtualization whose view is being edited. This is called when the editor is first constructed and can - * only be called once. Subsequent calls are ignored. - * - * @param {Dataservice} virtualization the virtualization of the view being edited - */ - public setEditorVirtualization( virtualization: Dataservice ): void { - if ( !this._editorVirtualization ) { - this._editorVirtualization = virtualization; - } else { - this._logger.debug( "setEditorVirtualization called more than once" ); - } - } - - /** - * Update the preview results for the current view. This issues a query against the preview VDB and sets - * the previewResults - */ - public updatePreviewResults( sourcePath?: string ): void { - // Clear preview results - this.setPreviewResults(null, null, ViewEditorPart.EDITOR); - - if ( !this._editorView || this._editorView === null ) { - return; - } - let querySql = ""; - let isSelectAll = false; - if ( sourcePath != null && !sourcePath.startsWith(AddCompositionCommand.id) ) { - // Fetch new results for source table - querySql = this._editorView.getPreviewSql(sourcePath); - } else { - // Determine if view is select * - if (this._editorView.isProjectAllColumns()) { - isSelectAll = true; - } - // Fetch new results for view - querySql = this._editorView.getPreviewSql(); - } - - const self = this; - // Resets all of the views in the service VDB - this._vdbService.queryVdb(querySql, VdbsConstants.PREVIEW_VDB_NAME, 15, 0) - .subscribe( - (queryResult) => { - // If view query was select *, auto expand it and save - if (isSelectAll) { - self.expandProjCols(queryResult); - } - else { - self.setPreviewResults(querySql, queryResult, ViewEditorPart.EDITOR); - } - }, - (error) => { - this._logger.error( "[ViewEditorService.updatePreviewResults] - error getting results" ); - } - ); - } - - /** - * Expand the views projected columns using the query result columns, then save the view - * @param queryResults the query results - */ - private expandProjCols(queryResults: QueryResults): void { - const resultCols = queryResults.getColumns(); - const projCols: ProjectedColumn[] = []; - for (const resultCol of resultCols) { - const projCol: ProjectedColumn = new ProjectedColumn(); - projCol.setName(resultCol.getName()); - projCol.setType(resultCol.getType()); - projCol.selected = true; - projCols.push(projCol); - } - this._editorView.setProjectedColumns(projCols); - // After expanding, reset the view - this.setEditorView(this._editorView, ViewEditorPart.HEADER); - } - - /** - * Sets the preview results. Fires a `ViewEditorEventType.PREVIEW_RESULTS_CHANGED` event having the results as an - * argument. - * - * @param {string} sql the preview query - * @param {QueryResults} results the new preview results - * @param {ViewEditorPart} source the source making the update - */ - public setPreviewResults( sql: string, - results: QueryResults, - source: ViewEditorPart ): void { - this._previewSql = sql; - this._previewResults = results; - this.fire( ViewEditorEvent.create( source, ViewEditorEventType.PREVIEW_RESULTS_CHANGED ) ); - } - - /** - * Sets the readonly property of the editor. Fires a `ViewEditorEventType.READONLY_CHANGED` event having the - * readonly property as an argument. - * - * @param {boolean} newReadOnly the new readonly value - * @param {ViewEditorPart} source the source making the update - */ - public setReadOnly( newReadOnly: boolean, - source: ViewEditorPart ): void { - if ( this._readOnly !== newReadOnly ) { - this._readOnly = newReadOnly; - this.fire( ViewEditorEvent.create( source, ViewEditorEventType.READONLY_CHANGED, [ newReadOnly ] ) ); - } - } - - /** - * Executes the current undo command. - */ - public undo(): void { - if ( this.canUndo() ) { - const undoCmd = this._undoMgr.popUndoCommand(); - this.updateViewState( undoCmd ); - this.fire( ViewEditorEvent.create( ViewEditorPart.EDITOR, ViewEditorEventType.VIEW_STATE_CHANGED, [ undoCmd ] ) ); - } else { - this._logger.error( "[ViewEditorService.undo] Undo called when there is not an undo command available" ); - } - } - - private updateViewState( cmd: Command ): void { - switch ( cmd.id ) { - case AddSourcesCommand.id: { - const addSourcesCmd = cmd as AddSourcesCommand; - const paths = addSourcesCmd.getSourcePaths(); - - for ( const path of paths ) { - this.getEditorView().addSourcePath( path ); - } - - break; - } - case AddCompositionCommand.id: { - const addCompositionCmd = cmd as AddCompositionCommand; - const composition = addCompositionCmd.getComposition(); - - this.getEditorView().addComposition( composition ); - - // Adds left and right source paths if not on composition already - const lhSourcePath = composition.getLeftSourcePath(); - const rhSourcePath = composition.getRightSourcePath(); - this.getEditorView().addSourcePath(lhSourcePath); - this.getEditorView().addSourcePath(rhSourcePath); - - break; - } - case RemoveSourcesCommand.id: { - const removeSourcesCmd = cmd as RemoveSourcesCommand; - const paths = removeSourcesCmd.getSourcePaths(); - - for ( const path of paths ) { - this.getEditorView().removeSourcePath( path ); - } - - // Remove any compositions that have a left or right source equal to one of the removed sources - const comps = this.getEditorView().getCompositions(); - for ( const comp of comps ) { - let remove = false; - const leftSource = comp.getLeftSourcePath(); - const rightSource = comp.getRightSourcePath(); - for ( const removedPath of paths ) { - if ( removedPath === leftSource || removedPath === rightSource ) { - remove = true; - break; - } - } - if ( remove ) { - this.getEditorView().removeComposition(comp.getName()); - } - } - - break; - } - case RemoveCompositionCommand.id: { - const removeCompositionCmd = cmd as RemoveCompositionCommand; - const composition = removeCompositionCmd.getComposition(); - this.getEditorView().removeComposition(composition.getName()); - break; - } - case UpdateViewDescriptionCommand.id: { - this.getEditorView().setDescription( cmd.getArg( UpdateViewDescriptionCommand.newDescription ) ); - break; - } - case UpdateViewNameCommand.id: { - this.getEditorView().setName( cmd.getArg( UpdateViewNameCommand.newName ) ); - break; - } - case UpdateProjectedColumnsCommand.id: { - const updateProjColsCommand = cmd as UpdateProjectedColumnsCommand; - const newProjCols = updateProjColsCommand.getNewProjectedColumns(); - this.getEditorView().setProjectedColumns( newProjCols ); - break; - } - default: { - this._logger.error( "The '" + cmd.id + "' was not handled by updateViewState"); - break; - } - } - } - - private validateView( context?: string ): void { - const messages = ViewValidator.validate( this.getEditorView() ); - - // clear message log - if ( this.getMessageCount() !== 0 ) { - this.clearMessages( ViewEditorPart.EDITOR, context ); - } - - // add new messages - if ( messages.length !== 0 ) { - for ( const msg of messages ) { - this.addMessage( msg, ViewEditorPart.EDITOR ); - } - } - } - - /** - * Access the current selection - */ - public getSelection(): string[] { - return this._selection; - } - - /** - * Update the node selection - */ - public select(selection: string[]): void { - if (!selection) - selection = []; - - this._selection = selection; - - let msg = "View Editor selection updated to: [ "; - this._selection.forEach((id) => { - msg = msg + id + " "; - }); - - msg = msg + "]"; - - this._logger.debug(msg); - } - - public hasSelection(): boolean { - return this._selection.length > 0; - } - - /** - * Get the Command type from the selection string - * @param selection the selection - * @return {CommandType} the command type - */ - public getSelectionCommandType(selection?: string): CommandType { - let argStr = null; - if (selection !== null) { - const args = selection.split(Command.identDivider); - argStr = args[0]; - } - if ( argStr !== null ) { - if ( argStr.startsWith(AddSourcesCommand.id) ) { - return AddSourcesCommand.id; - } else if ( argStr.startsWith(AddCompositionCommand.id) ) { - return AddCompositionCommand.id; - } else if ( argStr.startsWith(RemoveCompositionCommand.id) ) { - return RemoveCompositionCommand.id; - } else if ( argStr.startsWith(RemoveSourcesCommand.id) ) { - return RemoveSourcesCommand.id; - } else if ( argStr.startsWith(NoOpCommand.id) ) { - return NoOpCommand.id; - } else if ( argStr.startsWith(UpdateViewDescriptionCommand.id) ) { - return UpdateViewDescriptionCommand.id; - } else if ( argStr.startsWith(UpdateViewNameCommand.id) ) { - return UpdateViewNameCommand.id; - } else if ( argStr.startsWith(UpdateProjectedColumnsCommand.id) ) { - return UpdateProjectedColumnsCommand.id; - } - } - - return null; - } - - /** - * Get the payload from the selection string - * @param selection the selection - * @return {string} the command id - */ - public getSelectionPayload(selection?: string): string { - if (selection !== null) { - const args = selection.split(Command.identDivider); - return args[1]; - } - return null; - } - - /** - * Reset the UndoManager - */ - private resetUndoManager(): void { - this._undoMgr = new UndoManager(); - } -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.css b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.css deleted file mode 100644 index 1ed7ad4d..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.css +++ /dev/null @@ -1,13 +0,0 @@ -/* - * The container for the projected columns editor - */ -#projected-columns-editor-container { - height: 100%; - margin-left: 15px; -} - -.datatable-body-row.active .datatable-row-group { - /* background-color: #0088ce !important; */ - /* border-bottom-color: #00659c !important; */ - /* color: #fff; */ -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.html b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.html deleted file mode 100644 index 3d61ebbe..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
    -
    -

    No View Selected

    -
    - -
    -

    View Columns

    - -
    -

    All view columns are included.

    -
    Save the view to populate columns table
    -
    - -
    - - -
    -
    -
    diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.spec.ts deleted file mode 100644 index 56a225c8..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.spec.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ProjectedColumnsEditorComponent } from './projected-columns-editor.component'; -import { TableModule } from "patternfly-ng"; -import { LoggerService } from "@core/logger.service"; -import { SelectionService } from "@core/selection.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { HttpModule } from "@angular/http"; - -describe('ProjectedColumnsEditorComponent', () => { - let component: ProjectedColumnsEditorComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule, - TableModule - ], - declarations: [ ProjectedColumnsEditorComponent ], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ViewEditorService - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ProjectedColumnsEditorComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.ts b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.ts deleted file mode 100644 index 4198c63f..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component.ts +++ /dev/null @@ -1,239 +0,0 @@ -import { Component, OnDestroy, OnInit } from '@angular/core'; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { SelectionService } from "@core/selection.service"; -import { EmptyStateConfig, TableConfig, TableEvent } from "patternfly-ng"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { ProjectedColumn } from "@dataservices/shared/projected-column.model"; -import { CommandFactory } from "@dataservices/virtualization/view-editor/command/command-factory"; -import { Command } from "@dataservices/virtualization/view-editor/command/command"; -import { ViewEditorPart } from "@dataservices/virtualization/view-editor/view-editor-part.enum"; -import { LoggerService } from "@core/logger.service"; -import { ViewEditorEvent } from "@dataservices/virtualization/view-editor/event/view-editor-event"; -import { Subscription } from "rxjs/Subscription"; -import { UpdateProjectedColumnsCommand } from "@dataservices/virtualization/view-editor/command/update-projected-columns-command"; -import { AddSourcesCommand } from "@dataservices/virtualization/view-editor/command/add-sources-command"; -import { RemoveSourcesCommand } from "@dataservices/virtualization/view-editor/command/remove-sources-command"; -import { AddCompositionCommand } from "@dataservices/virtualization/view-editor/command/add-composition-command"; -import { RemoveCompositionCommand } from "@dataservices/virtualization/view-editor/command/remove-composition-command"; - -@Component({ - selector: 'app-projected-columns-editor', - templateUrl: './projected-columns-editor.component.html', - styleUrls: ['./projected-columns-editor.component.css'] -}) -export class ProjectedColumnsEditorComponent implements OnInit, OnDestroy { - - public tableColumns: any[] = []; - public tableConfig: TableConfig; - - private readonly editorService: ViewEditorService; - private readonly selectionService: SelectionService; - private readonly logger: LoggerService; - private editorSubscription: Subscription; - - private readonly emptyStateConfig: EmptyStateConfig; - public projectedColumns: ProjectedColumn[] = []; - private originalColumns: ProjectedColumn[] = []; - - constructor( selectionService: SelectionService, - logger: LoggerService, - editorService: ViewEditorService ) { - this.selectionService = selectionService; - this.editorService = editorService; - this.logger = logger; - - // ---------------------------------- - // View Table configurations - // ---------------------------------- - this.tableColumns = [ - { - draggable: false, - name: "Name", - prop: "name", - resizeable: true, - sortable: false, - width: "60" - }, - { - draggable: false, - name: "Type", - prop: "type", - resizeable: true, - sortable: false, - width: "60" - } - ]; - - this.emptyStateConfig = { - title: ViewEditorI18n.noViewsDisplayedMessage - } as EmptyStateConfig; - - this.tableConfig = { - showCheckbox: true, - emptyStateConfig: this.emptyStateConfig, - } as TableConfig; - - this.editorService.setEditorVirtualization( selectionService.getSelectedVirtualization() ); - } - - public ngOnInit(): void { - this.editorSubscription = this.editorService.editorEvent.subscribe( ( event ) => this.handleEditorEvent( event ) ); - } - - /** - * Cleanup code when destroying the canvas and properties parts. - */ - public ngOnDestroy(): void { - this.editorSubscription.unsubscribe(); - } - - /** - * @param {ViewEditorEvent} event the event being processed - */ - public handleEditorEvent( event: ViewEditorEvent ): void { - this.logger.debug( "ProjectedColumnsEditor received event: " + event.toString() ); - - // Initialize the projected columns editor when the ViewDefinition is set - if ( event.typeIsEditedViewSet()) { - const viewDefn = this.editorService.getEditorView(); - this.initProjectedColumns(viewDefn.getProjectedColumns()); - } - else if (event.typeIsViewStateChanged()) { - // Reset project columns if change came from the editor - if ( event.sourceIsEditor() ) { - if ( event.args.length === 1 && event.args[ 0 ] instanceof Command ) { - const cmd = event.args[ 0 ] as Command; - - // Handle updated projected columns - if ( cmd instanceof UpdateProjectedColumnsCommand ) { - this.updateProjectedColumns(cmd.getNewProjectedColumns()); - } - // Change in sources or compositions - forces a reset of the columns - else if ( cmd instanceof AddSourcesCommand || cmd instanceof RemoveSourcesCommand || - cmd instanceof AddCompositionCommand || cmd instanceof RemoveCompositionCommand ) { - const viewDefn = this.editorService.getEditorView(); - this.initProjectedColumns(viewDefn.getProjectedColumns()); - } - } - } - } - else { - this.logger.debug( "ProjectedColumnsEditor not handling received editor event: " + event.toString()); - } - } - - /** - * Initializes the projected columns - * @param {ProjectedColumn[]} prjCols the projected columns - */ - private initProjectedColumns(prjCols: ProjectedColumn[]): void { - this.projectedColumns = []; - this.originalColumns = []; - - // Clone view definition projected columns; save original state - const copyPrjCols: ProjectedColumn[] = []; - const copyOrigCols: ProjectedColumn[] = []; - if (prjCols && prjCols !== null) { - for (const pCol of prjCols) { - copyPrjCols.push(ProjectedColumn.create(pCol)); - copyOrigCols.push(ProjectedColumn.create(pCol)); - } - } - this.projectedColumns = copyPrjCols; - this.originalColumns = copyOrigCols; - - this.projectedColumns = [...this.projectedColumns]; - } - - /** - * Updates the projected columns - * @param {ProjectedColumn[]} prjCols the projected columns - */ - private updateProjectedColumns(prjCols: ProjectedColumn[]): void { - const copyPrjCols: ProjectedColumn[] = []; - const copyOrigCols: ProjectedColumn[] = []; - if (prjCols && prjCols !== null) { - for (const pCol of prjCols) { - copyPrjCols.push(ProjectedColumn.create(pCol)); - copyOrigCols.push(ProjectedColumn.create(pCol)); - } - } - this.originalColumns = copyOrigCols; - // Handle case where current columns are SELECT * - if (this.hasSelectAllProjectedColumns) { - // Incoming is also SELECT * - no need to do anything - if (this.isSelectStar(copyPrjCols)) { - return; - } - // Incoming is full column set. Need to remove current SELECT * - else { - this.projectedColumns = []; - for (const col of copyPrjCols) { - this.projectedColumns.push(col); - } - } - } - // Iterate existing columns, setting selection state - else { - for (const col of copyPrjCols) { - for (const projCol of this.projectedColumns) { - if (projCol.getName() === col.getName()) { - projCol.selected = col.selected; - break; - } - } - } - } - } - - /** - * Determine if a view has select all projected columns - * - * @return {boolean} 'true' if view has select all projected columns - */ - public get hasSelectAllProjectedColumns(): boolean { - return this.isSelectStar(this.projectedColumns); - } - - private isSelectStar(projCols: ProjectedColumn[]): boolean { - return projCols && projCols !== null && projCols.length === 1 && projCols[0].getName() === "ALL" && projCols[0].getType() === "ALL"; - } - - /** - * Determine whether the editor has a view currently selected - * - * @return {boolean} 'true' if has a view selection - */ - public get hasSelectedView(): boolean { - const selView = this.editorService.getEditorView(); - return (selView && selView !== null); - } - - /** - * Handles change in Column selections - * @param {TableEvent} $event the column selection event - */ - public handleColumnSelectionChange($event: TableEvent): void { - // Change in projected column selections fire change event - if (this.hasSelectedView) { - // Fire update event with new and old columns - const temp = CommandFactory.createUpdateProjectedColumnsCommand( JSON.stringify(this.projectedColumns), JSON.stringify(this.originalColumns) ); - if ( temp instanceof Command ) { - this.editorService.fireViewStateHasChanged( ViewEditorPart.PROJECTED_COLUMNS, temp as Command ); - } else { - const error = temp as Error; - this.logger.error( error.message ); - } - // Update the original columns - const origCols: ProjectedColumn[] = []; - for (const col of this.projectedColumns) { - origCols.push(ProjectedColumn.create(col)); - } - this.originalColumns = origCols; - } else { - // shouldn't get here as description text input should be disabled if no view being edited - this.logger.error( "Trying to set description but there is no view being edited" ); - } - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.css b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.css deleted file mode 100644 index 5aeac588..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.css +++ /dev/null @@ -1,7 +0,0 @@ -/* - * The container for the property editor - */ -#property-editor-container { - height: 100%; - margin-left: 15px; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.html b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.html deleted file mode 100644 index 1b00991e..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.html +++ /dev/null @@ -1,35 +0,0 @@ -
    -
    -

    No View Selected

    -
    - -
    -

    Multiple Items Selected

    -
    - -
    -

    {{getFirstSelection().getSelectionType()}} Properties

    -
    -
    Name:
    -
    {{getFirstSelection().getSourceName()}}
    -
    Connection:
    -
    {{getFirstSelection().getSourceConnectionName()}}
    -
    -
    -
    Name:
    -
    {{getFirstSelection().getComposition().getName()}}
    -
    Type:
    -
    {{getFirstSelection().getComposition().getType()}}
    -
    Left Source:
    -
    {{getFirstSelection().getComposition().getLeftSourceDisplay()}}
    -
    Right Source:
    -
    {{getFirstSelection().getComposition().getRightSourceDisplay()}}
    -
    Criteria:
    -
    {{getFirstSelection().getComposition().getCriteriaDisplay()}}
    -
    -
    - -
    -

    No item selected

    -
    -
    diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.spec.ts deleted file mode 100644 index e49e34be..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PropertyEditorComponent } from './property-editor.component'; -import { SelectionService } from "@core/selection.service"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { LoggerService } from "@core/logger.service"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { HttpModule } from "@angular/http"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; - -describe('PropertyEditorComponent', () => { - let component: PropertyEditorComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule, - ], - declarations: [ PropertyEditorComponent ], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ViewEditorService - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(PropertyEditorComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.ts b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.ts deleted file mode 100644 index efe39eed..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { SelectionService } from "@core/selection.service"; -import { SelectionItem } from "@dataservices/virtualization/view-editor/view-property-editors/property-editor/selection-item.model"; -import { SelectionType } from "@dataservices/virtualization/view-editor/view-property-editors/property-editor/selection-type.enum"; - -@Component({ - selector: 'app-property-editor', - templateUrl: './property-editor.component.html', - styleUrls: ['./property-editor.component.css'] -}) -/** - * PropertyEditorComponent - display and edit selected items - */ -export class PropertyEditorComponent implements OnInit { - - private readonly editorService: ViewEditorService; - private readonly selectionService: SelectionService; - - private selectedObject: SelectionItem; - - constructor( selectionService: SelectionService, - editorService: ViewEditorService ) { - this.selectionService = selectionService; - this.editorService = editorService; - this.editorService.setEditorVirtualization( selectionService.getSelectedVirtualization() ); - } - - public ngOnInit(): void { - // Nothing to do - } - - /** - * Determine whether the editor has a view currently selected - * - * @return {boolean} 'true' if has a view selection - */ - public get hasSelectedView(): boolean { - const selView = this.editorService.getEditorView(); - return (selView && selView !== null); - } - - /** - * Determine if the first selection item is Source type - * @return {boolean} 'true' if the first item in the list is a 'Source' - */ - public get firstSelectionIsSource(): boolean { - const selectedItem = this.getFirstSelection(); - return selectedItem.getSelectionType() === SelectionType.SOURCE; - } - - /** - * Determine if the first selection item is Composition type - * @return {boolean} 'true' if the first item in the list is a 'Composition' - */ - public get firstSelectionIsComposition(): boolean { - const selectedItem = this.getFirstSelection(); - return selectedItem.getSelectionType() === SelectionType.COMPOSITION; - } - - /** - * Get the number of selected items - * @return {number} the number of selected items - */ - public get numberSelectedItems(): number { - const selections = this.editorService.getSelection(); - if (selections) { - return selections.length; - } - return 0; - } - - /** - * Get the first item in the selections - * @return {SelectionItem} the first item in the selection list - */ - public getFirstSelection(): SelectionItem { - const selectedObj = new SelectionItem(this.editorService); - const selections = this.editorService.getSelection(); - if (selections && selections.length > 0) { - selectedObj.setSelection(selections[0]); - } - return selectedObj; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/selection-item.model.ts b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/selection-item.model.ts deleted file mode 100644 index 0528e2d7..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/selection-item.model.ts +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommandType } from "@dataservices/virtualization/view-editor/command/command-type.enum"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { Composition } from "@dataservices/shared/composition.model"; -import { PathUtils } from "@dataservices/shared/path-utils"; -import { SelectionType } from "@dataservices/virtualization/view-editor/view-property-editors/property-editor/selection-type.enum"; - -/** - * SelectionItem model - interprets the selection string and provides the payload in object form - */ -export class SelectionItem { - - private editorService: ViewEditorService; - private selectionType = SelectionType.UNKNOWN; - private srcPath = ""; - private comp: Composition; - - constructor(editorService: ViewEditorService) { - this.editorService = editorService; - } - - /** - * Set the selection string - * @param {string} selection the selection - */ - public setSelection( selection: string ): void { - if ( !selection || selection === null ) return; - - const commandType = this.editorService.getSelectionCommandType(selection); - const payload = this.editorService.getSelectionPayload(selection); - - if ( commandType === CommandType.ADD_SOURCES_COMMAND ) { - this.selectionType = SelectionType.SOURCE; - this.srcPath = payload; - } else if ( commandType === CommandType.ADD_COMPOSITION_COMMAND ) { - this.selectionType = SelectionType.COMPOSITION; - this.comp = Composition.create(JSON.parse(payload)); - } else { - this.selectionType = SelectionType.UNKNOWN; - } - } - - /** - * Get the type of selection - * @return {SelectionType} the selection type - */ - public getSelectionType(): SelectionType { - return this.selectionType; - } - - /** - * Get the source connection name - * @return {string} the source connection name - */ - public getSourceConnectionName(): string { - return PathUtils.getConnectionName(this.srcPath); - } - - /** - * Get the source name - * @return {string} the source name - */ - public getSourceName(): string { - return PathUtils.getSourceName(this.srcPath); - } - - /** - * Get the composition - * @return {Composition} the composition - */ - public getComposition(): Composition { - return this.comp; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/selection-type.enum.ts b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/selection-type.enum.ts deleted file mode 100644 index 3aac347e..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/property-editor/selection-type.enum.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Enumeration for property editor item types - */ -export enum SelectionType { - - /** - * Source type - */ - SOURCE = "Source", - - /** - * Composition type - */ - COMPOSITION = "Composition", - - /** - * Unknown type - */ - UNKNOWN = "Unknown" - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.css b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.css deleted file mode 100644 index ec7ccda2..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.css +++ /dev/null @@ -1,29 +0,0 @@ -/* - * The editor views tabset. - */ -#property-editors-tabs .tab-content { -} - -/* - * Customs settings for the tab. - */ -#property-editors-tabs .nav-link { - border: 1px solid #bbbbbb; - border-radius: 8px 8px 0 0; - margin: 0; - padding: 4px 10px; -} - -/* - * Custom settings for the tab heading. - */ -.property-editors-tab-heading { - font-size: smaller; -} - -/* - * Adds a space to the right of the icon and before the tab heading. - */ -.property-editors-tab-icon:after { - margin-right: 2px; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.html b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.html deleted file mode 100644 index e47785f7..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - {{propertiesTabName}} - - - - - - - {{columnsTabName}} - - - - diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.spec.ts deleted file mode 100644 index 33cbe53f..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ViewPropertyEditorsComponent } from './view-property-editors.component'; -import { TabsModule } from "ngx-bootstrap"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { HttpModule } from "@angular/http"; -import { LoggerService } from "@core/logger.service"; -import { VdbService } from "@dataservices/shared/vdb.service"; -import { MockVdbService } from "@dataservices/shared/mock-vdb.service"; -import { AppSettingsService } from "@core/app-settings.service"; -import { MockAppSettingsService } from "@core/mock-app-settings.service"; -import { NotifierService } from "@dataservices/shared/notifier.service"; -import { DataserviceService } from "@dataservices/shared/dataservice.service"; -import { MockDataserviceService } from "@dataservices/shared/mock-dataservice.service"; -import { SelectionService } from "@core/selection.service"; -import { PropertyEditorComponent } from "@dataservices/virtualization/view-editor/view-property-editors/property-editor/property-editor.component"; -import { ProjectedColumnsEditorComponent } from "@dataservices/virtualization/view-editor/view-property-editors/projected-columns-editor/projected-columns-editor.component"; -import { TableModule } from "patternfly-ng"; - -describe('ViewPropertyEditorsComponent', () => { - let component: ViewPropertyEditorsComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpModule, - TableModule, - TabsModule.forRoot() - ], - declarations: [ ProjectedColumnsEditorComponent, PropertyEditorComponent, ViewPropertyEditorsComponent ], - providers: [ - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ViewEditorService - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ViewPropertyEditorsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.ts b/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.ts deleted file mode 100644 index 472257c6..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-property-editors/view-property-editors.component.ts +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; -import { LoggerService } from "@core/logger.service"; -import { ViewEditorI18n } from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import { ViewEditorService } from "@dataservices/virtualization/view-editor/view-editor.service"; -import { ViewEditorEvent } from "@dataservices/virtualization/view-editor/event/view-editor-event"; -import { Subscription } from "rxjs/Subscription"; -import 'dragula/dist/dragula.css'; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: 'app-view-property-editors', - templateUrl: './view-property-editors.component.html', - styleUrls: ['./view-property-editors.component.css'] -}) -export class ViewPropertyEditorsComponent implements OnInit, OnDestroy { - - public readonly columnsTabName = ViewEditorI18n.columnsTabName; - public readonly propertiesTabName = ViewEditorI18n.propertiesTabName; - - private columnEditorIsEnabled = true; - private readonly editorService: ViewEditorService; - private readonly logger: LoggerService; - private subscription: Subscription; - private viewEditorIsEnabled = true; - - private readonly propertyIndex = 0; - private readonly columnIndex = 1; - - /** - * The tabs component configuration. - */ - public tabs = [ - { - "active": true // properties - }, - { - "active": false // columns - }, - ]; - - constructor( editorService: ViewEditorService, - logger: LoggerService ) { - this.editorService = editorService; - this.logger = logger; - } - - /** - * @param {ViewEditorEvent} event the event being processed - */ - public handleEditorEvent( event: ViewEditorEvent ): void { - this.logger.debug( "ViewPropertyEditorsComponent received event: " + event.toString() ); - - if ( event.typeIsCanvasSelectionChanged() ) { - // if single item is selected, show the properties tab - if ( event.args.length === 1 ) { - this.tabs[ this.propertyIndex ].active = true; - this.tabs[ this.columnIndex ].active = false; - } - } - } - - /** - * Cleanup code when destroying the view editor header. - */ - public ngOnDestroy(): void { - this.subscription.unsubscribe(); - } - - /** - * Initialization code run after construction. - */ - public ngOnInit(): void { - this.subscription = this.editorService.editorEvent.subscribe( ( event ) => this.handleEditorEvent( event ) ); - } - - /** - * @param tab the editor tab being removed - */ - public removeTab( tab: any ): void { - this.tabs.splice( this.tabs.indexOf( tab ), 1); - } - - /** - * Callback for when a tab is clicked. - * - * @param tab the tab being select or deselected - * @param selected `true` is selected - */ - public tabSelected( tab, selected ): void { - tab.active = selected; - } - - public get numberSelectedItems(): number { - const selections = this.editorService.getSelection(); - if (selections) { - return selections.length; - } - return 0; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/view-validator.ts b/ui/src/app/dataservices/virtualization/view-editor/view-validator.ts deleted file mode 100644 index 1a2a6d75..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/view-validator.ts +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Message } from "@dataservices/virtualization/view-editor/editor-views/message-log/message"; -import { Problem } from "@dataservices/virtualization/view-editor/editor-views/message-log/problem"; -import { ViewDefinition } from "@dataservices/shared/view-definition.model"; -import { Composition } from "@dataservices/shared/composition.model"; - -export class ViewValidator { - - /** - * Validates the stated of the specified view definition. - * - * @param {ViewDefinition} viewDefn the view definition whose state is being validated. - * @returns {Message[]} the validation messages (never `null` but can be empty) - */ - public static validate( viewDefn: ViewDefinition ): Message[] { - const messages: Message[] = []; - - if ( !viewDefn || viewDefn === null ) { - messages.push(Message.create( Problem.ERR0110)); - } - else { - // View must have a name - if ( !viewDefn.getName() || viewDefn.getName().length === 0 ) { - messages.push( Message.create( Problem.ERR0110 ) ); - } - - // View must have at least one source - if ( !viewDefn.getSourcePaths() || viewDefn.getSourcePaths().length === 0 ) { - messages.push( Message.create( Problem.ERR0120 ) ); - } - - // View with 2 or more sources must have a composition - if ( viewDefn.getSourcePaths().length > 1 ) { - // View with 2 or more sources must have a composition - if ( viewDefn.getCompositions().length === 0 ) { - messages.push( Message.create( Problem.ERR0130 ) ); - // Warning message that there is an 'orpaned source' (not associated with a composition) - } else { - const sources = viewDefn.getSourcePaths(); - for ( const source of sources ) { - if ( !this.hasAssociatedComposition(source, viewDefn.getCompositions()) ) { - messages.push( Message.create( Problem.WARN0100 ) ); - break; - } - } - } - } - } - - return messages; - } - - /** - * Determine if the supplied source is used in any of the supplied compositions - * @param source - * @param compositions - */ - private static hasAssociatedComposition( source: string, compositions: Composition[] ): boolean { - let hasComposition = false; - for ( const comp of compositions ) { - const leftSrc = comp.getLeftSourcePath(); - const rightSrc = comp.getRightSourcePath(); - if ( leftSrc === source || rightSrc === source ) { - hasComposition = true; - break; - } - } - return hasComposition; - } - -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.css b/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.css deleted file mode 100644 index c0ccdd80..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.css +++ /dev/null @@ -1,79 +0,0 @@ -.list-pf-container { - -ms-flex-align: start; - align-items: flex-start; - display: -ms-flexbox; - display: flex; - padding: 0; -} - -.views-list-title { - padding-left: 10px; - text-align: left; -} - -.create-delete-buttons { - horiz-align: left; - padding-top: 5px; - padding-bottom: 5px; - grid-row-gap: 1px; - vertical-align: middle; -} - -.views-list-create-button { - margin-left: 0px; - padding-left: 0; - padding-top: 8px; - padding-bottom: 8px; - background-color: aquamarine; -} - -.views-list-delete-button { - padding-left: 0px; - padding-top: 8px; - padding-bottom: 8px; -} - -.views-list-description-area { - padding-left: 0; - margin-left: 0; -} - -.views-list-div { - padding-left: 1px; - padding-right: 1px; - margin-bottom: 5px; - min-height: 400px; - max-height: 400px; - height: 100%; - width: 100%; - border: 1px inset grey; - overflow-y: auto; -} - -/* - * Style the empty state component so that it is centered and extends the entire width. - */ -#views-list-table .blank-slate-pf { - background-color: inherit; - min-width: 200px; - border: none; - padding: 0; - min-height: 400px; - max-height: 400px; -} - -/* - * Style text in blank slate for table - */ -#views-list-table h1, .h1 { - font-size: 14px; -} - -/* - * The view description text area. - */ -#views-list-description-input { - min-height: 20px; - min-width: 300px; - vertical-align: top; -} diff --git a/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.html b/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.html deleted file mode 100644 index 18ccdd3b..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.html +++ /dev/null @@ -1,37 +0,0 @@ -
    - -
    -
    - Views -
    - - - -
    - -
    -
    - -
    -
    - - - - - -
    -
    - - -
    -
    - -
    diff --git a/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.spec.ts b/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.spec.ts deleted file mode 100644 index 50ea4c2c..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ViewsListComponent } from './views-list.component'; -import {SelectionService} from "@core/selection.service"; -import {Dataservice} from "@dataservices/shared/dataservice.model"; -import {ViewEditorService} from "@dataservices/virtualization/view-editor/view-editor.service"; -import {MockAppSettingsService} from "@core/mock-app-settings.service"; -import {LoggerService} from "@core/logger.service"; -import {AppSettingsService} from "@core/app-settings.service"; -import {DataserviceService} from "@dataservices/shared/dataservice.service"; -import {MockVdbService} from "@dataservices/shared/mock-vdb.service"; -import {BsModalService, ComponentLoaderFactory} from "ngx-bootstrap"; -import {MockDataserviceService} from "@dataservices/shared/mock-dataservice.service"; -import {NotifierService} from "@dataservices/shared/notifier.service"; -import {VdbService} from "@dataservices/shared/vdb.service"; -import {HttpModule} from "@angular/http"; -import {FormsModule} from "@angular/forms"; -import {TableModule} from "patternfly-ng"; -import {RouterTestingModule} from "@angular/router/testing"; - -describe('ViewsListComponent', () => { - let component: ViewsListComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - FormsModule, - HttpModule, - RouterTestingModule, - TableModule - ], - declarations: [ ViewsListComponent ], - providers: [ - BsModalService, - { provide: AppSettingsService, useClass: MockAppSettingsService }, - { provide: DataserviceService, useClass: MockDataserviceService }, - LoggerService, - NotifierService, - SelectionService, - { provide: VdbService, useClass: MockVdbService }, - ComponentLoaderFactory, - ViewEditorService - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ViewsListComponent); - component = fixture.componentInstance; - - const selService = TestBed.get( SelectionService ); - const ds: Dataservice = new Dataservice(); - ds.setId("testDs"); - ds.setServiceVdbName("testDsVdb"); - // noinspection JSUnusedAssignment - selService.setSelectedVirtualization( ds ); - - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.ts b/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.ts deleted file mode 100644 index 1a67a828..00000000 --- a/ui/src/app/dataservices/virtualization/view-editor/views-list/views-list.component.ts +++ /dev/null @@ -1,472 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import {AfterViewInit, Component, OnDestroy, OnInit, ViewEncapsulation} from '@angular/core'; -import {LoadingState} from "@shared/loading-state.enum"; -import {ViewDefinition} from "@dataservices/shared/view-definition.model"; -import {ViewEditorPart} from "@dataservices/virtualization/view-editor/view-editor-part.enum"; -import {EmptyStateConfig, NgxDataTableConfig, TableConfig} from "patternfly-ng"; -import {ViewEditorI18n} from "@dataservices/virtualization/view-editor/view-editor-i18n"; -import {ViewEditorProgressChangeId} from "@dataservices/virtualization/view-editor/event/view-editor-save-progress-change-id.enum"; -import {ViewEditorState} from "@dataservices/shared/view-editor-state.model"; -import {ViewEditorService} from "@dataservices/virtualization/view-editor/view-editor.service"; -import {Dataservice} from "@dataservices/shared/dataservice.model"; -import {LoggerService} from "@core/logger.service"; -import {ViewEditorEvent} from "@dataservices/virtualization/view-editor/event/view-editor-event"; -import {Subscription} from "rxjs/Subscription"; -import {BsModalService} from "ngx-bootstrap"; -import {DataserviceService} from "@dataservices/shared/dataservice.service"; -import {SelectionService} from "@core/selection.service"; -import {ConfirmDialogComponent} from "@shared/confirm-dialog/confirm-dialog.component"; -import {CommandFactory} from "@dataservices/virtualization/view-editor/command/command-factory"; -import {Command} from "@dataservices/virtualization/view-editor/command/command"; -import {CreateViewDialogComponent} from "@dataservices/virtualization/view-editor/create-view-dialog/create-view-dialog.component"; -import {ChangeDetectorRef} from "@angular/core"; - -@Component({ - encapsulation: ViewEncapsulation.None, - selector: 'app-views-list', - templateUrl: './views-list.component.html', - styleUrls: ['./views-list.component.css'] -}) -export class ViewsListComponent implements OnInit, OnDestroy, AfterViewInit { - - // used by html - public readonly viewDescriptionLabel = ViewEditorI18n.viewDescriptionLabel; - public readonly viewDescriptionPlaceholder = ViewEditorI18n.viewDescriptionPlaceholder; - - public ngxTableConfig: NgxDataTableConfig; - public tableConfig: TableConfig; - public tableColumns: any[] = []; - public tableRows: ViewDefinition[] = []; - private emptyStateConfig: EmptyStateConfig; - - private readonly logger: LoggerService; - private readonly editorService: ViewEditorService; - private subscription: Subscription; - private modalService: BsModalService; - private dataserviceService: DataserviceService; - private selectionService: SelectionService; - private viewsLoadingState: LoadingState = LoadingState.LOADING; - private selectedVirtualization: Dataservice; - private viewSavedUponCompletion: ViewDefinition; - private cdRef: ChangeDetectorRef; - - constructor( editorService: ViewEditorService, - dataserviceService: DataserviceService, - selectionService: SelectionService, - logger: LoggerService, - modalService: BsModalService, - cdRef: ChangeDetectorRef) { - this.editorService = editorService; - this.dataserviceService = dataserviceService; - this.selectionService = selectionService; - this.logger = logger; - this.modalService = modalService; - this.cdRef = cdRef; - } - - /** - * @param {ViewEditorEvent} event the event being processed - */ - public handleEditorEvent( event: ViewEditorEvent ): void { - this.logger.debug( "ViewsListComponent received event: " + event.toString() ); - - if ( event.typeIsEditorViewSaveProgressChanged() ) { - if ( event.args.length !== 0 ) { - // Detect changes in view editor save progress - if ( event.args[ 0 ] === ViewEditorProgressChangeId.COMPLETED_SUCCESS || - event.args[ 0 ] === ViewEditorProgressChangeId.COMPLETED_FAILED ) { - if (this.viewSavedUponCompletion && this.viewSavedUponCompletion !== null) { - this.createNewView(this.viewSavedUponCompletion); - } - } - } - } - } - - /** - * Cleanup code when destroying the view editor header. - */ - public ngOnDestroy(): void { - this.subscription.unsubscribe(); - } - - /** - * Initialization code run after construction. - */ - public ngOnInit(): void { - this.subscription = this.editorService.editorEvent.subscribe( ( event ) => this.handleEditorEvent( event ) ); - - // ---------------------------------- - // View Table configurations - // ---------------------------------- - this.tableColumns = [ - { - draggable: false, - name: "Views", - prop: "viewName", - resizeable: true, - sortable: false, - width: "100" - } - ]; - - this.ngxTableConfig = { - headerHeight: 0, - rowHeight: 20, - reorderable: false, - selectionType: "'single'" - } as NgxDataTableConfig; - - this.emptyStateConfig = { - title: ViewEditorI18n.noViewsDefined - } as EmptyStateConfig; - - this.tableConfig = { - emptyStateConfig: this.emptyStateConfig - } as TableConfig; - - } - - public ngAfterViewInit(): void { - // init the available views - this.initViews(); - this.cdRef.detectChanges(); - } - - /* - * Initialize the views for the current dataservice. Makes a rest call to get the ViewEditorStates for the serviceVdb - */ - private initViews( ): void { - this.viewsLoadingState = LoadingState.LOADING; - this.selectedVirtualization = this.selectionService.getSelectedVirtualization(); - if ( !this.selectedVirtualization || this.selectedVirtualization === null ) { - this.tableRows = []; - } - - const selectedView = this.selectionService.getSelectedViewDefinition(); - - const vdbName = this.selectedVirtualization.getServiceVdbName(); - const editorStatesPattern = vdbName.toLowerCase() + "*"; - - const self = this; - this.dataserviceService - .getViewEditorStates(editorStatesPattern) - .subscribe( - (viewEditorStates) => { - const viewDefns: ViewDefinition[] = []; - for ( const viewState of viewEditorStates ) { - const viewDefn = viewState.getViewDefinition(); - if ( viewDefn ) { - viewDefns.push( viewDefn ); - } - } - self.tableRows = viewDefns.sort( (left, right): number => { - if (left.getName() < right.getName()) return -1; - if (left.getName() > right.getName()) return 1; - return 0; - }); - - let initialView: ViewDefinition = null; - if (!selectedView || selectedView === null) { - initialView = (self.tableRows && self.tableRows.length > 0) ? self.tableRows[0] : null; - } else { - initialView = self.tableRows.find((x) => x.getName() === selectedView.getName()); - } - self.viewsLoadingState = LoadingState.LOADED_VALID; - if( initialView !== null) { - self.selectView(initialView); - } - }, - (error) => { - self.logger.error("[VirtualizationComponent] Error updating the views for the virtualization: %o", error); - self.viewsLoadingState = LoadingState.LOADED_INVALID; - self.tableRows = []; - } - ); - } - - /** - * @returns {boolean} `true` if view being edited is readonly - */ - public get readOnly(): boolean { - return !this.editorService.getEditorView() || this.editorService.isReadOnly(); - } - - /** - * @returns {boolean} `true` if views are being loaded - */ - public get viewsLoading(): boolean { - return this.viewsLoadingState === LoadingState.LOADING; - } - - /** - * Handles view selection from table - * @param $event - */ - public viewSelectionChanged( $event ): void { - const selectedViews: ViewDefinition[] = $event.selected; - // If the current view has pending changes, auto save it - if ( this.editorService.hasChanges() ) { - this.editorService.saveEditorState(); - } - this.selectView(selectedViews[0]); - } - - public get deleteViewButtonEnabled(): boolean { - return ( this.getSelectedView() !== null ); - } - - private createNewView(viewDefn: ViewDefinition): void { - const selectedDs = this.selectionService.getSelectedVirtualization(); - const editorId = this.getEditorStateId(selectedDs, viewDefn); - - // Create new editor state to save - const editorState = new ViewEditorState(); - editorState.setId(editorId); - editorState.setViewDefinition(viewDefn); - - const editorStates: ViewEditorState[] = []; - editorStates.push(editorState); - - this.viewsLoadingState = LoadingState.LOADING; - - const self = this; - this.dataserviceService - .saveViewEditorStatesRefreshViews(editorStates, selectedDs.getId()) - .subscribe( - (wasSuccess) => { - // Add the new ViewDefinition to the table - self.addViewDefinitionToList(viewDefn); - self.viewSavedUponCompletion = null; - self.viewsLoadingState = LoadingState.LOADED_VALID; - }, - (error) => { - self.logger.error("[VirtualizationComponent] Error saving the editor state: %o", error); - self.viewSavedUponCompletion = null; - self.viewsLoadingState = LoadingState.LOADED_INVALID; - } - ); - } - - /** - * Handle creation of a new View. Displays the createView dialog, - * then saves the viewDefinition and adds it to the list - */ - public onCreateView(): void { - // Open New View dialog - const initialState = { - title: ViewEditorI18n.createViewDialogTitle, - cancelButtonText: ViewEditorI18n.cancelButtonText, - okButtonText: ViewEditorI18n.okButtonText - }; - - // Show Dialog, act upon confirmation click - const modalRef = this.modalService.show(CreateViewDialogComponent, {initialState}); - modalRef.content.okAction.take(1).subscribe((viewDefn) => { - // If the current view has pending changes, save them first - if ( this.editorService.hasChanges() ) { - this.viewSavedUponCompletion = viewDefn; - this.editorService.saveEditorState(); - } else { - this.createNewView(viewDefn); - } - // addition of a view undeploys active serviceVdb - this.editorService.undeploySelectedVirtualization(); - }); - } - - /** - * Construct id for the editor state - * @param {Dataservice} dataservice the dataservice - * @param {ViewDefinition} viewDefn the view definition - * @returns {string} the ID used to persist the editor state - */ - private getEditorStateId(dataservice: Dataservice, viewDefn: ViewDefinition): string { - return dataservice.getServiceVdbName().toLowerCase() + "." + viewDefn.getName(); - } - - /** - * Handle Delete of the selected View - * @param {string} viewName - */ - public onDeleteView( ): void { - const viewName = this.getSelectedView().getName(); - - // Dialog Content - const message = "Do you really want to delete View '" + viewName + "'?"; - const initialState = { - title: "Confirm Delete", - bodyContent: message, - cancelButtonText: "Cancel", - confirmButtonText: "Delete" - }; - - // Show Dialog, act upon confirmation click - const modalRef = this.modalService.show(ConfirmDialogComponent, {initialState}); - modalRef.content.confirmAction.take(1).subscribe((value) => { - this.doDeleteView(viewName); - }); - } - - /** - * Deletes the specified ViewEditorState from the userProfile, and removes ViewDefinition from the current list. - * @param {string} viewDefnName the name of the view - */ - private doDeleteView(viewDefnName: string): void { - const selectedViewDefn = this.tableRows.find((x) => x.getName() === viewDefnName); - const selectedDs = this.selectionService.getSelectedVirtualization(); - const vdbName = selectedDs.getServiceVdbName(); - const editorStateId = vdbName.toLowerCase() + "." + viewDefnName; - const dataserviceName = selectedDs.getId(); - - this.viewsLoadingState = LoadingState.LOADING; - // Note: we can only doDelete selected items that we can see in the UI. - this.logger.debug("[VirtualizationComponent] Deleting selected Virtualization View."); - const self = this; - this.dataserviceService - .deleteViewEditorStateRefreshViews(editorStateId, dataserviceName) - .subscribe( - (wasSuccess) => { - self.removeViewDefinitionFromList(selectedViewDefn); - // deletion of a view undeploys active serviceVdb - self.editorService.undeploySelectedVirtualization(); - this.viewsLoadingState = LoadingState.LOADED_VALID; - }, - (error) => { - self.logger.error("[VirtualizationComponent] Error deleting the editor state: %o", error); - this.viewsLoadingState = LoadingState.LOADED_INVALID; - } - ); - } - - /* - * Add the specified ViewDefinition to the view definitions table - * @param {ViewDefinition} viewDefn the view definition to add - */ - private addViewDefinitionToList(viewDefn: ViewDefinition): void { - const newRows: ViewDefinition[] = []; - newRows.push(viewDefn); - for ( const row of this.tableRows ) { - if ( row.getName() !== viewDefn.getName() ) { - newRows.push( row ); - } - } - this.tableRows = newRows.sort( (left, right): number => { - if (left.getName() < right.getName()) return -1; - if (left.getName() > right.getName()) return 1; - return 0; - }); - this.selectView(viewDefn); - } - - /* - * Remove the specified ViewDefinition from the view definitions table - * @param {ViewDefinition} viewDefn the view definition to remove - */ - private removeViewDefinitionFromList(viewDefn: ViewDefinition): void { - const origIndex = this.tableRows.findIndex( ( defn ) => defn.getName() === viewDefn.getName() ); - - const newRows: ViewDefinition[] = []; - for ( const row of this.tableRows ) { - if ( row.getName() !== viewDefn.getName() ) { - newRows.push( row ); - } - } - this.tableRows = newRows; - - // auto select another row - if ( this.tableRows.length > origIndex ) { - this.selectView( this.tableRows[origIndex] ); - } else if ( this.tableRows.length > 0 ) { - this.selectView( this.tableRows[origIndex - 1] ); - } else if ( this.tableRows.length === 0 ) { - this.selectView( null ); - } - } - - private selectView( selView: ViewDefinition ): void { - // Updates table selection display - let viewSelection = null; - if ( selView && selView !== null ) { - for (const view of this.tableRows) { - if (view.getName() === selView.getName()) { - view.setSelected(true); - viewSelection = view; - } else { - view.setSelected(false); - } - } - } - // Update selection service, then fire event - this.selectionService.setSelectedViewDefinition(this.selectedVirtualization, viewSelection); - this.editorService.setEditorView(viewSelection, ViewEditorPart.HEADER); - } - - private getSelectedView( ): ViewDefinition { - let selectedView: ViewDefinition = null; - for (const view of this.tableRows) { - if (view.selected) { - selectedView = view; - break; - } - } - return selectedView; - } - - /** - * @returns {string} the view description - */ - public get viewDescription(): string { - if ( this.editorService.getEditorView() ) { - return this.editorService.getEditorView().getDescription(); - } - - return ""; - } - - /** - * @param {string} newDescription the new description - */ - public set viewDescription( newDescription: string ) { - if ( this.editorService.getEditorView() ) { - if ( newDescription !== this.editorService.getEditorView().getDescription() ) { - const oldDescription = this.editorService.getEditorView().getDescription(); - const temp = CommandFactory.createUpdateViewDescriptionCommand( newDescription, oldDescription ); - - if ( temp instanceof Command ) { - this.editorService.fireViewStateHasChanged( ViewEditorPart.HEADER, temp as Command ); - } else { - const error = temp as Error; - this.logger.error( error.message ); - } - } - } else { - // shouldn't get here as description text input should be disabled if no view being edited - this.logger.error( "Trying to set description but there is no view being edited" ); - } - } - - /** - * Called when text in the view description textarea changes. - * - * @param {string} newDescription the new description of the view - */ - public viewDescriptionChanged( newDescription: string ): void { - this.viewDescription = newDescription; - } -} diff --git a/ui/src/app/shared/abstract-page.component.ts b/ui/src/app/shared/abstract-page.component.ts deleted file mode 100644 index 94feca48..00000000 --- a/ui/src/app/shared/abstract-page.component.ts +++ /dev/null @@ -1,100 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { OnInit } from "@angular/core"; -import { Response } from "@angular/http"; -import { ActivatedRoute } from "@angular/router"; -import { LoggerService } from "@core/logger.service"; -import "rxjs/add/observable/combineLatest"; -import { Observable } from "rxjs/Observable"; - -export abstract class AbstractPageComponent implements OnInit { - - public dataLoaded: Map = new Map(); - public pageError: Response; - protected route: ActivatedRoute; - public logger: LoggerService; - - /** - * C'tor. - * @param {ActivatedRoute} route - * @param {LoggerService} logger the logging service - */ - protected constructor(route: ActivatedRoute, logger: LoggerService) { - this.route = route; - this.logger = logger; - } - - /** - * Called when the page is initialized. Triggers the loading of asynchronous - * page data. - */ - public ngOnInit(): void { - const combined = Observable.combineLatest(this.route.params, this.route.queryParams, (params, qparams) => ({params, qparams})); - const self = this; - combined.subscribe( (ap) => { - self.loadAsyncPageData(ap.params, ap.qparams); - }); - } - - /** - * Called to kick off loading the page's async data. Subclasses should - * override to provide page-specific data loading. - * - * If you are referencing the component instance in the callback handler code, make sure to save the component - * reference in a constant and use that object in the handler code. - * @param pathParams - * @param queryParams - */ - public loadAsyncPageData(pathParams: any, queryParams: any): void { - // nothing to do - } - - /** - * Called by a subclass (page) to report an error during loading of data. - * @param error - * @param errorMsg optional message for the logger - */ - public error(error: Response, errorMsg?: string): void { - let logMessage = "[" + this.constructor.name + "] "; - if (errorMsg) { - logMessage = logMessage.concat(errorMsg + ": %o"); - } else { - logMessage = logMessage.concat(" Error: %o"); - } - this.logger.error(logMessage, error); - this.pageError = error; - } - - /** - * Called when page data has been loaded. - * @param key - */ - public loaded(key: string): void { - this.dataLoaded[key] = true; - } - - /** - * Called to determine whether some page data has been loaded yet. - * @param key - * @return {boolean} - */ - public isLoaded(key: string): boolean { - return !!this.dataLoaded[ key ]; - } - -} diff --git a/ui/src/app/shared/confirm-dialog/confirm-dialog.component.css b/ui/src/app/shared/confirm-dialog/confirm-dialog.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/shared/confirm-dialog/confirm-dialog.component.html b/ui/src/app/shared/confirm-dialog/confirm-dialog.component.html deleted file mode 100644 index 95eccf72..00000000 --- a/ui/src/app/shared/confirm-dialog/confirm-dialog.component.html +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/ui/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts b/ui/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts deleted file mode 100644 index 2f71fd4c..00000000 --- a/ui/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { BsModalRef } from "ngx-bootstrap"; -import { ConfirmDialogComponent } from "./confirm-dialog.component"; - -describe("ConfirmDialogComponent", () => { - let component: ConfirmDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ConfirmDialogComponent ], - providers: [ - BsModalRef - ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ConfirmDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/shared/confirm-dialog/confirm-dialog.component.ts b/ui/src/app/shared/confirm-dialog/confirm-dialog.component.ts deleted file mode 100644 index 6f52c40d..00000000 --- a/ui/src/app/shared/confirm-dialog/confirm-dialog.component.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Component, OnInit } from "@angular/core"; -import { Output } from "@angular/core"; -import { EventEmitter } from "@angular/core"; -import { BsModalRef } from "ngx-bootstrap"; - -@Component({ - selector: "app-confirm-dialog", - templateUrl: "./confirm-dialog.component.html", - styleUrls: ["./confirm-dialog.component.css"] -}) -/** - * Confirmation Dialog. Invoke this from another component as follows: - * - * this.modalRef = this.modalService.show(ConfirmDialogComponent, {initialState}); - * this.modalRef.content.confirmAction.take(1).subscribe((value) => { - * this.doSomethingOnConfirm(); - * }); - * - * The expected initial state is as follows: - * const initialState = { - * title: "The dialog title", - * bodyContent: "The dialog message", - * cancelButtonText: "Text for cancel button", - * confirmButtonText: "Text for confirm button" - * }; - */ -export class ConfirmDialogComponent implements OnInit { - - @Output() public confirmAction = new EventEmitter(); - @Output() public cancelAction = new EventEmitter(); - - public title = "Title"; - public bodyContent = "Confirmation Message"; - public cancelButtonText = "Cancel"; - public confirmButtonText = "Confirm"; - public bsModalRef: BsModalRef; - - constructor(bsModalRef: BsModalRef) { - this.bsModalRef = bsModalRef; - } - - public ngOnInit(): void { - // Nothing to do - } - - public onConfirmSelected(): void { - this.confirmAction.emit(true); - this.bsModalRef.hide(); - } - - public onCancelSelected(): void { - this.cancelAction.emit(true); - this.bsModalRef.hide(); - } - -} diff --git a/ui/src/app/shared/id-filter.ts b/ui/src/app/shared/id-filter.ts deleted file mode 100644 index 0c958b13..00000000 --- a/ui/src/app/shared/id-filter.ts +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Identifiable } from "@shared/identifiable"; - -const emptyPattern = ""; - -/** - * A string identifier filter. - */ -export class IdFilter { - - private pattern: string = emptyPattern; - private regex: string = emptyPattern; - - constructor() { - // nothing to do - } - - /** - * @param {Identifiable} obj the object whose ID is being compared to the filter - * @returns {boolean} true if the ID matches the filter - */ - public accepts( obj: Identifiable< string > ): boolean { - if ( this.pattern === emptyPattern ) { - return true; - } - - const id: string = obj.getId(); - return id.match( this.regex ) != null; - } - - /** - * @returns {string} the pattern being matched to - */ - public getPattern(): string { - return this.pattern; - } - - /** - * Resets the pattern so that all IDs will match the pattern. - */ - public reset(): void { - this.pattern = emptyPattern; - this.regex = emptyPattern; - } - - /** - * @param {string} pattern the pattern to match IDs with (can be empty or null) - */ - public setFilter( pattern?: string ): void { - if ( pattern ) { - this.pattern = pattern; - this.regex = pattern.replace( ".", "\\." ); - this.regex = "^" + this.regex.replace( "*", ".*" ); - } else { - this.pattern = emptyPattern; - this.regex = emptyPattern; - } - } - -} diff --git a/ui/src/app/shared/identifiable.ts b/ui/src/app/shared/identifiable.ts deleted file mode 100644 index a1480cf9..00000000 --- a/ui/src/app/shared/identifiable.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * An object that has an identifiable property. - */ -export interface Identifiable< T > { - - /** - * @typedef { object } T the type of the property that is used to identify the object - * @param {Identifiable} that the object being compared to - * @returns {number} 0 if IDs are equal, -1 if this ID is less than, or 1 if this ID is greater than - */ - compareTo( that: Identifiable< T > ): number; - - /** - * @typedef { object } T the type of the property that is used to identify the object - * @returns {T} the object identifier (can be null) - */ - getId(): T; - -} diff --git a/ui/src/app/shared/layout-type.enum.ts b/ui/src/app/shared/layout-type.enum.ts deleted file mode 100644 index bd457faa..00000000 --- a/ui/src/app/shared/layout-type.enum.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * An enumeration of valid collection member layout types. - */ -export enum LayoutType { - - /** - * Members of a collection are represented by a card. - */ - CARD, - - /** - * Members of a collections are represented as an item in the list. - */ - LIST - -} diff --git a/ui/src/app/shared/loading-state.enum.ts b/ui/src/app/shared/loading-state.enum.ts deleted file mode 100644 index f367589f..00000000 --- a/ui/src/app/shared/loading-state.enum.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * An enumeration of loading state - */ -export enum LoadingState { - - /** - * loading - */ - LOADING, - - /** - * loaded and valid - */ - LOADED_VALID, - - /** - * loaded and invalid - */ - LOADED_INVALID - -} diff --git a/ui/src/app/shared/page-error/page-error.component.css b/ui/src/app/shared/page-error/page-error.component.css deleted file mode 100644 index 4b01f5de..00000000 --- a/ui/src/app/shared/page-error/page-error.component.css +++ /dev/null @@ -1,14 +0,0 @@ -.card-pf-error { - border-top-color: red; -} - -.card-pf-error .card-pf-title .fa { - color: red; -} - -.card-pf-error .card-pf-body .details { -} -.card-pf-error .card-pf-body .details pre { - max-height: 350px; - overflow-y: auto; -} diff --git a/ui/src/app/shared/page-error/page-error.component.html b/ui/src/app/shared/page-error/page-error.component.html deleted file mode 100644 index 63235d91..00000000 --- a/ui/src/app/shared/page-error/page-error.component.html +++ /dev/null @@ -1,115 +0,0 @@ -
    -
    -
    -
    - - -
    -
    -

    - - Server Error Encountered -

    -
    -
    -

    - Error was encountered communicating with the server. Please reload the page. -

    -
    - -
    -
    -
    -

    Server Error Details

    -
    {{ stackTrace() }}
    -
    -
    - -
    - - -
    -
    -

    - - Page Not Found -

    -
    -
    -

    - You attempted to navigate to a page that does not exist! Please hit the back button - or go back to home (button below). -

    - -
    -
    - - -
    -
    -

    - - Data Already Exists -

    -
    -
    -

    - It appears you attempted to add or create something that already exists. Instead of adding it again, - try finding the existing resource and editing. -

    -
    - Back to Home - -
    -
    -
    - - -
    -
    -

    - - Connection Error - (Could Not Reach Server) -

    -
    -
    -

    - We couldn't reach the server. Try reloading the page in a few minutes or check your internet connection. -

    -
    - -
    -
    -
    - - -
    -
    -

    - - Unexpected Error on Page - ( - {{ errorMessage() }} - ) -

    -
    -
    -

    - Something unexpected happened. Please try reloading the page, or you could just go back to Home. - See the buttons below... -

    -
    - Back to Dashboard - -
    -
    -
    - -
    -
    -
    diff --git a/ui/src/app/shared/page-error/page-error.component.spec.ts b/ui/src/app/shared/page-error/page-error.component.spec.ts deleted file mode 100644 index 9938b625..00000000 --- a/ui/src/app/shared/page-error/page-error.component.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { HttpModule, Response, ResponseOptions } from "@angular/http"; -import { PageErrorComponent } from "@shared/page-error/page-error.component"; - -describe("PageErrorComponent", () => { - let component: PageErrorComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ HttpModule ], - declarations: [ PageErrorComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(PageErrorComponent); - component = fixture.componentInstance; - component.error = new Response( new ResponseOptions( { status: 404 } ) ); - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [PageErrorComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/shared/page-error/page-error.component.ts b/ui/src/app/shared/page-error/page-error.component.ts deleted file mode 100644 index df27c3a7..00000000 --- a/ui/src/app/shared/page-error/page-error.component.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, Input } from "@angular/core"; -import { Response } from "@angular/http"; - -@Component({ - moduleId: module.id, - selector: "app-page-error", - templateUrl: "./page-error.component.html", - styleUrls: ["./page-error.component.css"] -}) -export class PageErrorComponent { - - @Input() public error: Response; - - private eobj: any = null; - private showDetails = false; - - /** - * Returns whether details should be shown. - */ - public shouldShowDetails(): boolean { - return this.showDetails; - } - - /** - * Called to toggle the error details. - */ - public toggleDetails(): void { - this.showDetails = !this.showDetails; - } - - /** - * Returns the error code. - */ - public errorCode(): number { - return this.error ? this.error.status : 0; - } - - /** - * Returns the error type. Only valid when the error code is 500. - * @return {()=>string} - */ - public errorMessage(): string { - return this.error.statusText; - } - - /** - * Returns the error stack trace. Only valid when the error code is 500. - */ - public stackTrace(): string { - return this.errorObj().trace; - } - - /** - * Returns the error type. Only valid when the error code is 500. - * @return {()=>string} - */ - public errorType(): string { - return this.errorObj().errorType; - } - - /** - * Called to reload the browser page. - */ - public reloadPage(): void { - window.location.reload(); - } - - /** - * Returns the parsed error body. - * @return {any} - */ - private errorObj(): any { - if (this.eobj === null) { - this.eobj = this.error.json(); - } - return this.eobj; - } - -} diff --git a/ui/src/app/shared/page-not-found/page-not-found.component.css b/ui/src/app/shared/page-not-found/page-not-found.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/shared/page-not-found/page-not-found.component.html b/ui/src/app/shared/page-not-found/page-not-found.component.html deleted file mode 100644 index fbe549a3..00000000 --- a/ui/src/app/shared/page-not-found/page-not-found.component.html +++ /dev/null @@ -1 +0,0 @@ -

    Page not found

    diff --git a/ui/src/app/shared/page-not-found/page-not-found.component.spec.ts b/ui/src/app/shared/page-not-found/page-not-found.component.spec.ts deleted file mode 100644 index f2c135f3..00000000 --- a/ui/src/app/shared/page-not-found/page-not-found.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { PageNotFoundComponent } from "@shared/page-not-found/page-not-found.component"; - -describe("PageNotFoundComponent", () => { - let component: PageNotFoundComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ PageNotFoundComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(PageNotFoundComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [PageNotFoundComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/shared/page-not-found/page-not-found.component.ts b/ui/src/app/shared/page-not-found/page-not-found.component.ts deleted file mode 100644 index dc011f8f..00000000 --- a/ui/src/app/shared/page-not-found/page-not-found.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component } from "@angular/core"; - -@Component({ - selector: "app-page-not-found", - templateUrl: "./page-not-found.component.html", - styleUrls: ["./page-not-found.component.css"] -}) -export class PageNotFoundComponent { - - constructor() { - // nothing to do - } - -} diff --git a/ui/src/app/shared/progress-dialog/progress-dialog.component.css b/ui/src/app/shared/progress-dialog/progress-dialog.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/shared/progress-dialog/progress-dialog.component.html b/ui/src/app/shared/progress-dialog/progress-dialog.component.html deleted file mode 100644 index 384f81e8..00000000 --- a/ui/src/app/shared/progress-dialog/progress-dialog.component.html +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/ui/src/app/shared/progress-dialog/progress-dialog.component.spec.ts b/ui/src/app/shared/progress-dialog/progress-dialog.component.spec.ts deleted file mode 100644 index b6a8cc45..00000000 --- a/ui/src/app/shared/progress-dialog/progress-dialog.component.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ProgressDialogComponent } from './progress-dialog.component'; -import { BsModalRef } from "ngx-bootstrap"; - -describe('ProgressDialogComponent', () => { - let component: ProgressDialogComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ProgressDialogComponent ], - providers: [ - BsModalRef - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ProgressDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/shared/progress-dialog/progress-dialog.component.ts b/ui/src/app/shared/progress-dialog/progress-dialog.component.ts deleted file mode 100644 index db86c8dd..00000000 --- a/ui/src/app/shared/progress-dialog/progress-dialog.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { BsModalRef } from "ngx-bootstrap"; - -@Component({ - selector: 'app-progress-dialog', - templateUrl: './progress-dialog.component.html', - styleUrls: ['./progress-dialog.component.css'] -}) -export class ProgressDialogComponent implements OnInit { - - public title = "Title"; - public bodyContent = "Progress Message"; - public bsModalRef: BsModalRef; - - constructor(bsModalRef: BsModalRef) { - this.bsModalRef = bsModalRef; - } - - public ngOnInit(): void { - // Nothing to do - } - -} diff --git a/ui/src/app/shared/property-form/property-control-type.enum.ts b/ui/src/app/shared/property-form/property-control-type.enum.ts deleted file mode 100644 index f3f9c1a4..00000000 --- a/ui/src/app/shared/property-form/property-control-type.enum.ts +++ /dev/null @@ -1,74 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { PropertyDefinition } from "@shared/property-form/property-definition.model"; - -/** - * An enumeration of control types for a property. - */ - -export enum PropertyControlType { - - /** - * Render the property as a checkbox. - */ - CHECKBOX, - - /** - * Render the property as a dropdown. - */ - DROPDOWN, - - /** - * Render the property as a masked textbox. - */ - PASSWORD, - - /** - * Render the property as a textbox. - */ - TEXT - -} - -/** - * Namespace to allow methods on the enum. - */ -export namespace PropertyControlType { - - /** - * @param {PropertyDefinition} propDefn the property whose control type is being requested - * @returns {PropertyControlType} the control type to render the property value - */ - export function toControlType( propDefn: PropertyDefinition< any > ): PropertyControlType { - if ( propDefn.isConstrainedToAllowedValues() ) { - return PropertyControlType.DROPDOWN; - } - - if ( propDefn.getTypeClassName() === "java.lang.Boolean" ) { - return PropertyControlType.CHECKBOX; - } - - if ( propDefn.isMasked() || propDefn.getId() === "password" ) { - return PropertyControlType.PASSWORD; - } - - // defaults to a text control - return PropertyControlType.TEXT; - } - -} diff --git a/ui/src/app/shared/property-form/property-definition.model.ts b/ui/src/app/shared/property-form/property-definition.model.ts deleted file mode 100644 index 60c8bf55..00000000 --- a/ui/src/app/shared/property-form/property-definition.model.ts +++ /dev/null @@ -1,239 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export class PropertyDefinition { - private keng__id: string; - private value: T; - private displayName: string; - private defaultValue: string; - private description: string; - private category: string; - private typeClassName: string; - private required: boolean; - private advanced: boolean; - private masked: boolean; - private modifiable: boolean; - private constrainedToAllowedValues: boolean; - private allowedValues: string[]; - - /** - * @param {Object} json the JSON representation of a Property - * @returns {PropertyDefinition} the new PropertyDefinition (never null) - */ - public static create( json: object = {} ): PropertyDefinition { - const property = new PropertyDefinition(); - property.setValues( json ); - return property; - } - - constructor() { - // nothing to do - } - - /** - * @typedef { object } T the type of the property being queried - * @returns {T} the property value (can be null) - */ - public getValue(): T { - return this.value; - } - - /** - * @returns {string} the property id - */ - public getId(): string { - return this.keng__id; - } - - /** - * @returns {string} the property displayName (can be null) - */ - public getDisplayName(): string { - return this.displayName; - } - - /** - * @returns {string} the property default value (can be null) - */ - public get theDefaultValue(): string { - return this.defaultValue; - } - - /** - * @returns {string} the property description (can be null) - */ - public getDescription(): string { - return this.description; - } - - /** - * @returns {string} the property category (can be null) - */ - public getCategory(): string { - return this.category; - } - - /** - * @returns {string} the property typeClassName (can be null) - */ - public getTypeClassName(): string { - return this.typeClassName; - } - - /** - * @returns {boolean} 'true' if required - */ - public isRequired(): boolean { - return this.required; - } - - /** - * @returns {boolean} 'true' if advanced - */ - public isAdvanced(): boolean { - return this.advanced; - } - - /** - * @returns {boolean} 'true' if masked - */ - public isMasked(): boolean { - return this.masked; - } - - /** - * @returns {boolean} 'true' if modifiable - */ - public isModifiable(): boolean { - return this.modifiable; - } - - /** - * @returns {boolean} 'true' if constrainedToAllowedValues - */ - public isConstrainedToAllowedValues(): boolean { - return this.constrainedToAllowedValues; - } - - /** - * @returns {string[]} the array of allowed values - */ - public getAllowedValues(): string[] { - return this.allowedValues; - } - - /** - * @typedef { object } T the type of the property being set - * @param {T} value the property value - */ - public setValue( value?: T ): void { - this.value = value ? value : null; - } - - /** - * @param {string} id the property id - */ - public setId( id?: string ): void { - this.keng__id = id ? id : null; - } - - /** - * @param {string} displayName the property displayName - */ - public setDisplayName( displayName?: string ): void { - this.displayName = displayName ? displayName : null; - } - - /** - * @param {string} defaultValue the property default value - */ - public setDefaultValue(defaultValue: string): void { - this.defaultValue = defaultValue; - } - - /** - * @param {string} description the property description - */ - public setDescription(description: string): void { - this.description = description; - } - - /** - * @param {string} category the property category - */ - public setCategory(category: string): void { - this.category = category; - } - - /** - * @param {string} typeClassName the property typeClassName - */ - public setTypeClassName(typeClassName: string): void { - this.typeClassName = typeClassName; - } - - /** - * @param {boolean} required 'true' if property is required - */ - public setRequired( required?: boolean ): void { - this.required = required ? required : null; - } - - /** - * @param {boolean} advanced 'true' if property is advanced - */ - public setAdvanced( advanced?: boolean ): void { - this.advanced = advanced ? advanced : null; - } - - /** - * @param {boolean} masked 'true' if property is masked - */ - public setMasked( masked?: boolean ): void { - this.masked = masked ? masked : null; - } - - /** - * @param {boolean} modifiable 'true' if property is modifiable - */ - public setModifiable( modifiable?: boolean ): void { - this.modifiable = modifiable ? modifiable : null; - } - - /** - * @param {boolean} constrained 'true' if property is constrained - */ - public setConstraintedToAllowedValues( constrained?: boolean ): void { - this.constrainedToAllowedValues = constrained ? constrained : null; - } - - /** - * @param {string[]} allowedValues the array of allowed values - */ - public setAllowedValues( allowedValues?: string[] ): void { - this.allowedValues = allowedValues ? allowedValues : null; - } - - /** - * Set all object values using the supplied Connection json - * @param {Object} values - */ - public setValues(values: object = {}): void { - Object.assign(this, values); - } - -} diff --git a/ui/src/app/shared/property-form/property-form-property/property-form-property.component.css b/ui/src/app/shared/property-form/property-form-property/property-form-property.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/shared/property-form/property-form-property/property-form-property.component.html b/ui/src/app/shared/property-form/property-form-property/property-form-property.component.html deleted file mode 100644 index cecad09e..00000000 --- a/ui/src/app/shared/property-form/property-form-property/property-form-property.component.html +++ /dev/null @@ -1,23 +0,0 @@ -
    - - -
    - - - - - - - - - -
    {{ validationErrorMessage }}
    -
    - -
    diff --git a/ui/src/app/shared/property-form/property-form-property/property-form-property.component.spec.ts b/ui/src/app/shared/property-form/property-form-property/property-form-property.component.spec.ts deleted file mode 100644 index 8f830ba7..00000000 --- a/ui/src/app/shared/property-form/property-form-property/property-form-property.component.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; - -import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms"; -import { FormGroup } from "@angular/forms"; -import { PropertyDefinition } from "@shared/property-form/property-definition.model"; -import { PropertyFormPropertyComponent } from "./property-form-property.component"; - -describe("PropertyFormPropertyComponent", () => { - let component: PropertyFormPropertyComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ FormsModule, ReactiveFormsModule ], - declarations: [ PropertyFormPropertyComponent ], - providers: [ FormBuilder ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - // TODO: Figure out how to setup this test - beforeEach(() => { - fixture = TestBed.createComponent(PropertyFormPropertyComponent); - component = fixture.componentInstance; - component.setPropertyDefinition(new PropertyDefinition()); - const fb = new FormBuilder(); - const fg: FormGroup = fb.group({ - name: ["name", Validators.required] - }); - component.setFormGroup(fg); - fixture.detectChanges(); - }); - - // it("should be created", () => { - // expect(component).toBeTruthy(); - // }); -}); diff --git a/ui/src/app/shared/property-form/property-form-property/property-form-property.component.ts b/ui/src/app/shared/property-form/property-form-property/property-form-property.component.ts deleted file mode 100644 index c55cf7d2..00000000 --- a/ui/src/app/shared/property-form/property-form-property/property-form-property.component.ts +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, Input } from "@angular/core"; -import { AbstractControl, FormGroup } from "@angular/forms"; - -import { PropertyControlType } from "@shared/property-form/property-control-type.enum"; -import { PropertyDefinition } from "@shared/property-form/property-definition.model"; - -@Component({ - selector: "app-form-property", - templateUrl: "./property-form-property.component.html" -}) - -export class PropertyFormPropertyComponent { - - public controlType = PropertyControlType; // need local ref of enum for html to use - - @Input() public property: PropertyDefinition; - @Input() public form: FormGroup; - - public setPropertyDefinition(prop: PropertyDefinition): void { - this.property = prop; - } - - public setFormGroup(fg: FormGroup): void { - this.form = fg; - } - - /* - * Return the property valid state - */ - get isValid(): boolean { - return this.form.controls[this.property.getId()].valid; - } - - /* - * Return the property error message, if the property is invalid - * The first error found is returned - */ - get validationErrorMessage(): string { - const control: AbstractControl = this.form.controls[this.property.getId()]; - if (control.invalid) { - // The first error found is returned - if (control.errors.required) { - return this.property.getId() + " is a required property"; - } else if (control.errors.validName) { - return this.property.getId() + " is an invalid name"; - } else if (control.errors.max) { - return this.property.getId() + " exceeds the max allowable value"; - } - } - return ""; - } -} diff --git a/ui/src/app/shared/property-form/property-form.component.css b/ui/src/app/shared/property-form/property-form.component.css deleted file mode 100644 index e69de29b..00000000 diff --git a/ui/src/app/shared/property-form/property-form.component.html b/ui/src/app/shared/property-form/property-form.component.html deleted file mode 100644 index 95ac15ae..00000000 --- a/ui/src/app/shared/property-form/property-form.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
    -
    -
    - -
    -
    -
    diff --git a/ui/src/app/shared/property-form/property-form.component.spec.ts b/ui/src/app/shared/property-form/property-form.component.spec.ts deleted file mode 100644 index 80233727..00000000 --- a/ui/src/app/shared/property-form/property-form.component.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { ReactiveFormsModule } from "@angular/forms"; -import { PropertyFormPropertyComponent } from "@shared/property-form/property-form-property/property-form-property.component"; -import { PropertyFormComponent } from "@shared/property-form/property-form.component"; - -describe("PropertyFormComponent", () => { - let component: PropertyFormComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ ReactiveFormsModule ], - declarations: [ PropertyFormComponent, PropertyFormPropertyComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(PropertyFormComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - console.log("========== [PropertyFormComponent] should be created"); - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/shared/property-form/property-form.component.ts b/ui/src/app/shared/property-form/property-form.component.ts deleted file mode 100644 index 3acdaf3f..00000000 --- a/ui/src/app/shared/property-form/property-form.component.ts +++ /dev/null @@ -1,119 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; -import { FormControl, FormGroup, Validators } from "@angular/forms"; - -import { ObjectUtils } from "@core/utils/object-utils"; -import { PropertyDefinition } from "@shared/property-form/property-definition.model"; - -@Component({ - selector: "app-property-form", - templateUrl: "./property-form.component.html", - providers: [ ] -}) -export class PropertyFormComponent implements OnInit { - - @Input() public formProperties: Array> = []; - @Output() public formInitialized: EventEmitter = new EventEmitter(); - @Output() public formChanged: EventEmitter = new EventEmitter(); - public form: FormGroup; - - constructor( ) { - // Nothing to do - } - - public updateForm(): void { - this.form = this.toFormGroup(this.formProperties); - } - - public ngOnInit(): void { - this.form = this.toFormGroup(this.formProperties); - this.formInitialized.emit(this.form.valid); - const self = this; - this.form.valueChanges.subscribe((val) => { - self.formChanged.emit(this.form.valid); - }); - } - - public get valid( ): boolean { - return this.form.valid; - } - - /* - * Get the properties from the form that have values that aren't default values - */ - public get propertyValuesNonDefault(): Map { - const propertyMap: Map = new Map(); - for (const property of this.formProperties) { - const theValue = this.form.controls[property.getId()].value; - if (!ObjectUtils.isNullOrUndefined(theValue)) { - if (typeof theValue === "string" && theValue.length > 0) { - if (theValue !== property.theDefaultValue) { - propertyMap.set(property.getId(), theValue); - } - } else if (typeof theValue === "boolean") { - if (theValue.toString() !== property.theDefaultValue) { - propertyMap.set(property.getId(), theValue.toString()); - } - } - } - } - return propertyMap; - } - - /* - * Get the property value - */ - public getPropertyValue(name: string): string { - const theValue = this.form.controls[name].value; - if (typeof theValue === "string") { - return theValue; - } else { - return theValue.toString(); - } - } - - /* - NOTE: The appropriate Validators for properties are applied in this function. Angular has a number of built-in - validators. For a complete listing of the built-in validators, go here : https://angular.io/api/forms/Validators - */ - private toFormGroup(properties: Array> ): FormGroup { - const group: any = {}; - - properties.forEach((property) => { - - // Determine the validators for each property, based on the property characteristics - const propValidators = []; - // Validator if required - if (property.isRequired()) { - propValidators.push(Validators.required); - } - - // Numeric max validators - if (property.getTypeClassName() === "java.lang.Long") { - propValidators.push(Validators.max(9223372036854775807)); - } else if (property.getTypeClassName() === "java.lang.Integer") { - propValidators.push(Validators.max(2147483647)); - } - - group[property.getId()] = new FormControl(property.getValue() || "", propValidators ); - }); - return new FormGroup(group); - } - -} diff --git a/ui/src/app/shared/shared.module.ts b/ui/src/app/shared/shared.module.ts deleted file mode 100644 index b56f68b9..00000000 --- a/ui/src/app/shared/shared.module.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommonModule } from "@angular/common"; -import { NgModule } from "@angular/core"; -import { ReactiveFormsModule } from "@angular/forms"; - -import { PageErrorComponent } from "@shared/page-error/page-error.component"; -import { TestDataService } from "@shared/test-data.service"; -import { ModalModule } from "ngx-bootstrap"; -import { ConfirmDialogComponent } from "./confirm-dialog/confirm-dialog.component"; -import { PageNotFoundComponent } from "./page-not-found/page-not-found.component"; -import { PropertyFormPropertyComponent } from "./property-form/property-form-property/property-form-property.component"; -import { PropertyFormComponent } from "./property-form/property-form.component"; -import { SlideInComponent } from "./slide-in/slide-in.component"; -import { ProgressDialogComponent } from './progress-dialog/progress-dialog.component'; - -@NgModule({ - imports: [ - CommonModule, - ModalModule.forRoot(), - ReactiveFormsModule - ], - declarations: [ - ConfirmDialogComponent, - PageErrorComponent, - PageNotFoundComponent, - PropertyFormComponent, - PropertyFormPropertyComponent, - SlideInComponent, - ProgressDialogComponent - ], - exports: [ - ConfirmDialogComponent, - PageErrorComponent, - PageNotFoundComponent, - ProgressDialogComponent, - PropertyFormComponent, - PropertyFormPropertyComponent, - SlideInComponent - ], - providers: [ - TestDataService - ], -}) -export class SharedModule { -} diff --git a/ui/src/app/shared/slide-in/slide-in.component.css b/ui/src/app/shared/slide-in/slide-in.component.css deleted file mode 100644 index 24543fc0..00000000 --- a/ui/src/app/shared/slide-in/slide-in.component.css +++ /dev/null @@ -1,48 +0,0 @@ -.slide-in { - height: 100%; - position: fixed; - z-index: 5000; - top: 0; - margin-top: 60px; /* match height of header */ - padding-top: 5em; - overflow-x: hidden; - background-color: #fffffc; - transition: 0.5s; -} - -.slide-in-left { - left: 0; - margin-left: 200px /* match the width of the .nav-pf-vertical */ -} - -.slide-in-right { - right: 0; -} - -.slide-in .closebtn { - position: absolute; - top: 0; - right: 25px; - font-size: 36px; - margin-left: 50px; - text-shadow: -1px -1px 1px #fff, 1px 1px 1px #000; - color: #9c8468; - opacity: 0.3; -} - -.slide-in .closebtn:hover { - text-decoration: none; - color: #e4dada; -} - -#slide-in-body { - -webkit-box-shadow: inset 0px 10px 15px 0px rgba(180, 180, 180, 0.5); - -moz-box-shadow: inset 0px 10px 15px 0px rgba(180, 180, 180, 0.5); - box-shadow: inset 0px 10px 15px 0px rgba(180, 180, 180, 0.5); -} - -#slide-in-body div { - padding-left: 1em; - padding-right: 1em; - padding-bottom: 0.5em; -} diff --git a/ui/src/app/shared/slide-in/slide-in.component.html b/ui/src/app/shared/slide-in/slide-in.component.html deleted file mode 100644 index 2be62459..00000000 --- a/ui/src/app/shared/slide-in/slide-in.component.html +++ /dev/null @@ -1,10 +0,0 @@ -
    - -
    - -
    - × -
    - -
    -
    diff --git a/ui/src/app/shared/slide-in/slide-in.component.spec.ts b/ui/src/app/shared/slide-in/slide-in.component.spec.ts deleted file mode 100644 index 4834e34d..00000000 --- a/ui/src/app/shared/slide-in/slide-in.component.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { async, ComponentFixture, TestBed } from "@angular/core/testing"; -import { SlideInComponent } from "./slide-in.component"; - -describe("SlideInComponent", () => { - let component: SlideInComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SlideInComponent ] - }) - .compileComponents().then(() => { - // nothing to do - }); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SlideInComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should be created", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ui/src/app/shared/slide-in/slide-in.component.ts b/ui/src/app/shared/slide-in/slide-in.component.ts deleted file mode 100644 index 1693c81f..00000000 --- a/ui/src/app/shared/slide-in/slide-in.component.ts +++ /dev/null @@ -1,132 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, ElementRef, Input, Output, EventEmitter } from "@angular/core"; - -@Component({ - selector: "slide-in", - templateUrl: "./slide-in.component.html", - styleUrls: ["./slide-in.component.css"] -}) -/** - * Slide In. Invoke this from another component as follows: - * - * - *
    - * - * - * - * - * - * - *
    - *
    - * - *
    - *
    - */ -export class SlideInComponent { - - @Input() - private openedWidth = '30%'; - - @Output() - private onBeforeOpen: EventEmitter = new EventEmitter(); - - @Output() - private onAfterOpen: EventEmitter = new EventEmitter(); - - @Output() - private onBeforeClose: EventEmitter = new EventEmitter(); - - @Output() - private onAfterClose: EventEmitter = new EventEmitter(); - - private state = false; - - private readonly hostElement: ElementRef; - - constructor(elRef: ElementRef) { - this.hostElement = elRef; - } - - private beforeStateChange(): void { - if (! this.state) { - // state is closed and about to be opened - this.onBeforeOpen.emit(); - } else { - // state is opened and about to be closed - this.onBeforeClose.emit(); - } - } - - private afterStateChange(): void { - if (this.state) { - // state has been changed to open - this.onAfterOpen.emit(); - } else { - // state has been changed to closed - this.onAfterClose.emit(); - } - } - - public showHide(): void { - this.beforeStateChange(); - - this.state = !this.state; - - this.afterStateChange(); - } - - public close(): void { - this.beforeStateChange(); - - this.state = false; - - this.afterStateChange(); - } - - public slideInWidth(): string { - if (this.state) - return this.openedWidth; - else - return "0"; - } - - public slideInClasses(): string { - let classes = 'slide-in'; - const screenWidth = window.screen.width; - if (this.hostElement && this.hostElement.nativeElement) { - const posLeft = this.hostElement.nativeElement.offsetLeft; - const screenMiddle = screenWidth / 2; - if (posLeft > screenMiddle) - classes = classes + ' slide-in-left'; - else - classes = classes + ' slide-in-right'; - } - - return classes; - } -} diff --git a/ui/src/app/shared/sort-direction.enum.ts b/ui/src/app/shared/sort-direction.enum.ts deleted file mode 100644 index 9b33aff1..00000000 --- a/ui/src/app/shared/sort-direction.enum.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * An enumeration of valid sort directions. - */ -export enum SortDirection { - - /** - * Sort connections in ascending order. - */ - ASC, - - /** - * Sort connections in descending order. - */ - DESC - -} diff --git a/ui/src/app/shared/test-data.service.spec.ts b/ui/src/app/shared/test-data.service.spec.ts deleted file mode 100644 index 83ff021a..00000000 --- a/ui/src/app/shared/test-data.service.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { inject, TestBed } from "@angular/core/testing"; -import { TestDataService } from "@shared/test-data.service"; - -describe("TestDataService", () => { - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [TestDataService] - }); - }); - - it("should be created", inject([TestDataService], (service: TestDataService) => { - expect(service).toBeTruthy(); - })); -}); diff --git a/ui/src/app/shared/test-data.service.ts b/ui/src/app/shared/test-data.service.ts deleted file mode 100644 index 99f8926c..00000000 --- a/ui/src/app/shared/test-data.service.ts +++ /dev/null @@ -1,2132 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Injectable } from "@angular/core"; -import { ConnectionStatus } from "@connections/shared/connection-status"; -import { Connection } from "@connections/shared/connection.model"; -import { SchemaNode } from "@connections/shared/schema-node.model"; -import { ServiceCatalogSource } from "@connections/shared/service-catalog-source.model"; -import { ConnectionSummary } from "@dataservices/shared/connection-summary.model"; -import { Dataservice } from "@dataservices/shared/dataservice.model"; -import { PublishState } from "@dataservices/shared/publish-state.enum"; -import { QueryResults } from "@dataservices/shared/query-results.model"; -import { VdbStatus } from "@dataservices/shared/vdb-status.model"; -import { Vdb } from "@dataservices/shared/vdb.model"; -import { Virtualization } from "@dataservices/shared/virtualization.model"; -import { Column } from "@dataservices/shared/column.model"; -import { ViewEditorState } from "@dataservices/shared/view-editor-state.model"; - -@Injectable() -export class TestDataService { - - private static readonly connectionVdbSuffix = "btlconn"; - private static readonly connectionSchemaModelSuffix = "schemamodel"; - private static readonly connectionSchemaVdbSuffix = "schemavdb"; - - private static readonly pgConnCatalogSourceId = "postgresql-persistent-lq6sg"; - private static readonly catalogSourceId1 = "postgresql-persistent-j9vqv"; - private static readonly catalogSourceId2 = "postgresql-persistent-a8xrt"; - private static readonly catalogSourceId3 = "mysql-persistent-t3irv"; - private static readonly catalogSourceId4 = "mongodb-persistent-x9prt"; - private static readonly catalogSourceId5 = "mongodb-persistent-z8amy"; - - // ================================================================= - // VDBs - // ================================================================= - - private static accountsVdb = Vdb.create( - { - keng__id: "AccountsVDB", - vdb__description: "This is an accounts VDB.", - keng__dataPath: "/path/in/repository/AccountsVDB", - keng__kType: "Vdb", - vdb__name: "AccountsVDB", - vdb__originalFile: "/Users/dsbUser/vdbs/accounts.vdb", - vdb__preview: false, - vdb__version: "1" - } - ); - - private static employeesVdb = Vdb.create( - { - keng__id: "EmployeesVDB", - vdb__description: "This is an employees VDB.", - keng__dataPath: "/path/in/repository/EmployeesVDB", - keng__kType: "Vdb", - vdb__name: "EmployeesVDB", - vdb__originalFile: "/Users/dsbUser/vdbs/employees.vdb", - vdb__preview: false, - vdb__version: "1" - } - ); - - private static productsVdb = Vdb.create( - { - keng__id: "ProductsVDB", - vdb__description: "This is a products VDB.", - keng__dataPath: "/path/in/repository/ProductsVDB", - keng__kType: "Vdb", - vdb__name: "ProductsVDB", - vdb__originalFile: "/Users/dsbUser/vdbs/products.vdb", - vdb__preview: false, - vdb__version: "1" - } - ); - - // ================================================================= - // VDB Status - // ================================================================= - - private static status1 = VdbStatus.create( - { - "name": TestDataService.accountsVdb.getName(), - "deployedName": TestDataService.accountsVdb.getName() + "-vdb.xml", - "version": TestDataService.accountsVdb.getVersion(), - "active": true, - "loading": false, - "failed": false, - "errors": [] - } - ); - - private static status2 = VdbStatus.create( - { - "name": TestDataService.employeesVdb.getName(), - "deployedName": TestDataService.employeesVdb.getName() + "-vdb.xml", - "version": TestDataService.employeesVdb.getVersion(), - "active": true, - "loading": false, - "failed": false, - "errors": [] - } - ); - - private static status3 = VdbStatus.create( - { - "name": TestDataService.productsVdb.getName(), - "deployedName": TestDataService.productsVdb.getName() + "-vdb.xml", - "version": TestDataService.productsVdb.getVersion(), - "active": true, - "loading": false, - "failed": false, - "errors": [] - } - ); - - private static readonly vdbStatuses = - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.142.nip.io/vdb-builder/v1/", - "vdbs": [ - { - "name": TestDataService.accountsVdb.getName(), - "deployedName": TestDataService.accountsVdb.getName() + "-vdb.xml", - "version": TestDataService.accountsVdb.getVersion(), - "active": true, - "loading": false, - "failed": false, - "errors": [] - }, - { - "name": TestDataService.employeesVdb.getName(), - "deployedName": TestDataService.employeesVdb.getName() + "-vdb.xml", - "version": TestDataService.employeesVdb.getVersion(), - "active": true, - "loading": false, - "failed": false, - "errors": [] - }, - { - "name": TestDataService.productsVdb.getName(), - "deployedName": TestDataService.productsVdb.getName() + "-vdb.xml", - "version": TestDataService.productsVdb.getVersion(), - "active": true, - "loading": false, - "failed": false, - "errors": [] - } - ], - "keng___links": [ - { - "rel": "self", - "href": "http://localhost:4200/vdb-builder/v1/metadata/status/vdbs" - }, - { - "rel": "parent", - "href": "http://localhost:4200/vdb-builder/v1/metadata/status" - } - ] - }; - - // ================================================================= - // ServiceCatalog DataSources - // ================================================================= - private static pgConnCatalogSource = TestDataService.createServiceCatalogSource( - TestDataService.pgConnCatalogSourceId, - TestDataService.pgConnCatalogSourceId, - "postgresql", - true ); - private static catalogSource1 = TestDataService.createServiceCatalogSource( - TestDataService.catalogSourceId1, - TestDataService.catalogSourceId1, - "postgresql", - true ); - private static catalogSource2 = TestDataService.createServiceCatalogSource( - TestDataService.catalogSourceId2, - TestDataService.catalogSourceId2, - "postgresql", - true ); - private static catalogSource3 = TestDataService.createServiceCatalogSource( - TestDataService.catalogSourceId3, - TestDataService.catalogSourceId3, - "mysql", - true ); - private static catalogSourceMongo1 = TestDataService.createServiceCatalogSource( - TestDataService.catalogSourceId4, - TestDataService.catalogSourceId4, - "mongodb", - true ); - private static catalogSourceMongo2 = TestDataService.createServiceCatalogSource( - TestDataService.catalogSourceId5, - TestDataService.catalogSourceId5, - "mongodb", - true ); - - // ================================================================= - // Connections - // ================================================================= - - private static pgConn = Connection.create( - { - "keng__baseUri": "http://localhost:4200/vdb-builder/v1/", - "keng__id": "PGConn", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/PGConn", - "keng__kType": "Connection", - "keng__hasChildren": false, - "dv__jndiName": "java:/postgresql-persistent-lq6sg", - "dv__driverName": "postgresql", - "dv__type": true, - "keng__properties": [ - { - "name": "description", - "value": "Postgres connection" - }, - { - "name": "serviceCatalogSource", - "value": "postgresql-persistent-lq6sg" - } - ], - "keng___links": [ - { - "rel": "self", - "href": "http://localhost:4200/vdb-builder/v1/workspace/connections/PGConn" - }, - { - "rel": "parent", - "href": "http://localhost:4200/vdb-builder/v1/workspace/connections" - }, - { - "rel": "children", - "href": "http://localhost:4200/vdb-builder/v1/workspace/search?parent=%2Ftko%3Akomodo%2Ftko%3Aworkspace%2Fadmin%2FPGConn" - } - ] - } - ); - - private static conn1 = Connection.create( - { - "keng__baseUri": "http://localhost:4200/vdb-builder/v1/", - "keng__id": "conn1", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/conn1", - "keng__kType": "Connection", - "keng__hasChildren": false, - "dv__jndiName": "java:/postgresql-persistent-j9vqv", - "dv__driverName": "postgresql", - "dv__type": true, - "keng__properties": [ - { - "name": "description", - "value": "Postgres connection" - }, - { - "name": "serviceCatalogSource", - "value": "postgresql-persistent-j9vqv" - } - ], - "keng___links": [ - { - "rel": "self", - "href": "http://localhost:4200/vdb-builder/v1/workspace/connections/conn1" - }, - { - "rel": "parent", - "href": "http://localhost:4200/vdb-builder/v1/workspace/connections" - }, - { - "rel": "children", - "href": "http://localhost:4200/vdb-builder/v1/workspace/search?parent=%2Ftko%3Akomodo%2Ftko%3Aworkspace%2Fadmin%2Fconn1" - } - ] - } - ); - - private static conn2 = Connection.create( - { - "keng__baseUri": "http://localhost:4200/vdb-builder/v1/", - "keng__id": "conn2", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/conn2", - "keng__kType": "Connection", - "keng__hasChildren": false, - "dv__jndiName": "java:/postgresql-persistent-a8xrt", - "dv__driverName": "postgresql", - "dv__type": true, - "keng__properties": [ - { - "name": "description", - "value": "Postgres connection" - }, - { - "name": "serviceCatalogSource", - "value": "postgresql-persistent-a8xrt" - } - ], - "keng___links": [ - { - "rel": "self", - "href": "http://localhost:4200/vdb-builder/v1/workspace/connections/conn2" - }, - { - "rel": "parent", - "href": "http://localhost:4200/vdb-builder/v1/workspace/connections" - }, - { - "rel": "children", - "href": "http://localhost:4200/vdb-builder/v1/workspace/search?parent=%2Ftko%3Akomodo%2Ftko%3Aworkspace%2Fadmin%2Fconn2" - } - ] - } - ); - - private static conn3 = Connection.create( - { - "keng__baseUri": "http://localhost:4200/vdb-builder/v1/", - "keng__id": "conn3", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/conn3", - "keng__kType": "Connection", - "keng__hasChildren": false, - "dv__jndiName": "java:/mysql-persistent-t3irv", - "dv__driverName": "mysql", - "dv__type": true, - "keng__properties": [ - { - "name": "description", - "value": "MySQL connection" - }, - { - "name": "serviceCatalogSource", - "value": "mysql-persistent-t3irv" - } - ], - "keng___links": [ - { - "rel": "self", - "href": "http://localhost:4200/vdb-builder/v1/workspace/connections/conn3" - }, - { - "rel": "parent", - "href": "http://localhost:4200/vdb-builder/v1/workspace/connections" - }, - { - "rel": "children", - "href": "http://localhost:4200/vdb-builder/v1/workspace/search?parent=%2Ftko%3Akomodo%2Ftko%3Aworkspace%2Fadmin%2Fconn3" - } - ] - } - ); - - // ================================================================= - // ConnectionStatus - // ================================================================= - - private static conn1Status = ConnectionStatus.create( - { - "connectionName": TestDataService.conn1.getId(), - "vdbState": "ACTIVE", - "vdbName": TestDataService.conn1.getId() + TestDataService.connectionVdbSuffix, - "schemaState": "ACTIVE", - "schemaVdbName": TestDataService.conn1.getId() + TestDataService.connectionSchemaVdbSuffix, - "schemaModelName": TestDataService.conn1.getId() + TestDataService.connectionSchemaModelSuffix, - "errors": [] - }, - ); - - private static conn2Status = ConnectionStatus.create( - { - "connectionName": TestDataService.conn2.getId(), - "vdbState": "ACTIVE", - "vdbName": TestDataService.conn2.getId() + TestDataService.connectionVdbSuffix, - "schemaState": "ACTIVE", - "schemaVdbName": TestDataService.conn2.getId() + TestDataService.connectionSchemaVdbSuffix, - "schemaModelName": TestDataService.conn2.getId() + TestDataService.connectionSchemaModelSuffix, - "errors": [] - }, - ); - - private static conn3Status = ConnectionStatus.create( - { - "connectionName": TestDataService.conn3.getId(), - "vdbState": "ACTIVE", - "vdbName": TestDataService.conn3.getId() + TestDataService.connectionVdbSuffix, - "schemaState": "ACTIVE", - "schemaVdbName": TestDataService.conn3.getId() + TestDataService.connectionSchemaVdbSuffix, - "schemaModelName": TestDataService.conn3.getId() + TestDataService.connectionSchemaModelSuffix, - "errors": [] - }, - ); - - // ================================================================= - // Connection Summaries - // ================================================================= - - private static connSummariesConnOnly = [ - TestDataService.createConnectionSummary(TestDataService.conn1, null), - TestDataService.createConnectionSummary(TestDataService.conn2, null), - // TestDataService.createConnectionSummary(TestDataService.conn3, null) - ]; - - private static connSummariesSchemaStatusOnly = [ - TestDataService.createConnectionSummary(null, TestDataService.conn1Status), - TestDataService.createConnectionSummary(null, TestDataService.conn2Status), - // TestDataService.createConnectionSummary(null, TestDataService.conn3Status) - ]; - - private static connSummariesBothConnAndStatus = [ - TestDataService.createConnectionSummary(TestDataService.conn1, TestDataService.conn1Status), - TestDataService.createConnectionSummary(TestDataService.conn2, TestDataService.conn2Status), - // TestDataService.createConnectionSummary(TestDataService.conn3, TestDataService.conn3Status) - ]; - - // ================================================================= - // Schemas for the connections - // ================================================================= - private static pgConnSchemaJson = { - "connectionName": "pgConn", - "name": "restaurants", - "type": "collection", - "path": "collection=restaurants", - "queryable": true, - "children": [ - { - "connectionName": "pgConn", - "name": "grades", - "type": "embedded", - "path": "collection=restaurants/embedded=grades", - "queryable": true, - "children": [] - }, - { - "connectionName": "pgConn", - "name": "location", - "type": "embedded", - "path": "collection=restaurants/embedded=location", - "queryable": true, - "children": [] - } - ] - }; - - private static conn1SchemaJson = { - "connectionName": "conn1", - "name": "public", - "type": "schema", - "path": "schema=public", - "queryable": false, - "children": [ - { - "connectionName": "conn1", - "name": "customer", - "type": "table", - "path": "schema=public/table=customer", - "queryable": true, - "children": [] - }, - { - "connectionName": "conn1", - "name": "stuff", - "type": "table", - "path": "schema=public/table=stuff", - "queryable": true, - "children": [] - } - ] - }; - - private static conn2SchemaJson = { - "connectionName": "conn2", - "name": "restaurants", - "type": "collection", - "path": "collection=restaurants", - "queryable": true, - "children": [ - { - "connectionName": "conn2", - "name": "grades", - "type": "embedded", - "path": "collection=restaurants/embedded=grades", - "queryable": true, - "children": [] - }, - { - "connectionName": "conn2", - "name": "location", - "type": "embedded", - "path": "collection=restaurants/embedded=location", - "queryable": true, - "children": [] - } - ] - }; - - private static conn3SchemaJson = { - "connectionName": "conn3", - "name": "public", - "type": "schema", - "path": "schema=public", - "queryable": false, - "children": [ - { - "connectionName": "conn3", - "name": "customer", - "type": "table", - "path": "schema=public/table=customer", - "queryable": true, - "children": [] - }, - { - "connectionName": "conn3", - "name": "stuff", - "type": "table", - "path": "schema=public/table=stuff", - "queryable": true, - "children": [] - } - ] - }; - - // ================================================================= - // Result sets - // ================================================================= - private static employeeJson = { - "columns": [ - { - "name": "ssn", - "label": "ssn", - "type": "string" - }, - { - "name": "firstname", - "label": "firstname", - "type": "string" - }, - { - "name": "lastname", - "label": "lastname", - "type": "string" - }, - { - "name": "st_address", - "label": "st_address", - "type": "string" - }, - { - "name": "apt_number", - "label": "apt_number", - "type": "string" - }, - { - "name": "city", - "label": "city", - "type": "string" - }, - { - "name": "state", - "label": "state", - "type": "string" - }, - { - "name": "zipcode", - "label": "zipcode", - "type": "string" - }, - { - "name": "phone", - "label": "phone", - "type": "string" - } - ], - "rows": [ - { - "row": [ - "CST01002 ", - "Joseph", - "Smith", - "1234 Main Street", - "Apartment 56", - "New York", - "New York", - "10174", - "(646)555-1776" - ] - }, - { - "row": [ - "CST01003 ", - "Nicholas", - "Ferguson", - "202 Palomino Drive", - "", - "Pittsburgh", - "Pennsylvania", - "15071", - "(412)555-4327" - ] - }, - { - "row": [ - "CST01004 ", - "Jane", - "Aire", - "15 State Street", - "", - "Philadelphia", - "Pennsylvania", - "19154", - "(814)555-6789" - ] - }, - { - "row": [ - "CST01005 ", - "Charles", - "Jones", - "1819 Maple Street", - "Apartment 17F", - "Stratford", - "Connecticut", - "06614", - "(203)555-3947" - ] - }, - { - "row": [ - "CST01006 ", - "Virginia", - "Jefferson", - "1710 South 51st Street", - "Apartment 3245", - "New York", - "New York", - "10175", - "(718)555-2693" - ] - }, - { - "row": [ - "CST01007 ", - "Ralph", - "Bacon", - "57 Barn Swallow Avenue", - "", - "Charlotte", - "North Carolina", - "28205", - "(704)555-4576" - ] - }, - { - "row": [ - "CST01008 ", - "Bonnie", - "Dragon", - "88 Cinderella Lane", - "", - "Jacksonville", - "Florida", - "32225", - "(904)555-6514" - ] - }, - { - "row": [ - "CST01009 ", - "Herbert", - "Smith", - "12225 Waterfall Way", - "Building 100, Suite 9", - "Portland", - "Oregon", - "97220", - "(971)555-7803" - ] - }, - { - "row": [ - "CST01015 ", - "Jack", - "Corby", - "1 Lone Star Way", - "", - "Dallas", - "Texas", - "75231", - "(469)555-8023" - ] - }, - { - "row": [ - "CST01019 ", - "Robin", - "Evers", - "1814 Falcon Avenue", - "", - "Atlanta", - "Georgia", - "30355", - "(470)555-4390" - ] - }, - { - "row": [ - "CST01020 ", - "Lloyd", - "Abercrombie", - "1954 Hughes Parkway", - "", - "Los Angeles", - "California", - "90099", - "(213)555-2312" - ] - }, - { - "row": [ - "CST01021 ", - "Scott", - "Watters", - "24 Mariner Way", - "", - "Seattle", - "Washington", - "98124", - "(206)555-6790" - ] - }, - { - "row": [ - "CST01022 ", - "Sandra", - "King", - "96 Lakefront Parkway", - "", - "Minneapolis", - "Minnesota", - "55426", - "(651)555-9017" - ] - }, - { - "row": [ - "CST01027 ", - "Maryanne", - "Peters", - "35 Grand View Circle", - "Apartment 5F", - "Cincinnati", - "Ohio", - "45232", - "(513)555-9067" - ] - }, - { - "row": [ - "CST01034 ", - "Corey", - "Snyder", - "1760 Boston Commons Avenue", - "Suite 543", - "Boston", - "Massachusetts", - "02136 ", - "(617)555-3546" - ] - } - ] - }; - - // ================================================================= - // Dataservices - // ================================================================= - - private static accountsService = Dataservice.create( - { - "keng__baseUri": "http://localhost:4200/vdb-builder/v1/", - "keng__id": "Accounts", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/Accounts", - "keng__kType": "Dataservice", - "keng__hasChildren": true, - "tko__description": "A dataservice for accounts.", - "serviceVdbName": TestDataService.accountsVdb.getName(), - "serviceVdbVersion": TestDataService.accountsVdb.getVersion(), - "serviceViewModel": "views", - "serviceViewDefinitions": [ - ], - "serviceViewTables": [ - "connection=" + TestDataService.conn1.getId().toLowerCase() + "/schema=public/table=tbl1", - "connection=" + TestDataService.conn1.getId().toLowerCase() + "/schema=public/table=tbl1" - ], - "connections": 0, - "drivers": 0, - "keng___links": [ - { - "rel": "self", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices/Accounts" - }, - { - "rel": "parent", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices" - }, - { - "rel": "children", - "href": "http://localhost:4200/vdb-builder/v1/workspace/search?parent=%2Ftko%3Akomodo%2Ftko%3Aworkspace%2Fadmin%2FAccounts" - }, - { - "rel": "vdbs", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices/CustService/Vdbs" - }, - { - "rel": "connections", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices/CustService/connections" - } - ] - } - ); - - private static employeesService = Dataservice.create( - { - "keng__baseUri": "http://localhost:4200/vdb-builder/v1/", - "keng__id": "Employees", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/Employees", - "keng__kType": "Dataservice", - "keng__hasChildren": true, - "tko__description": "A dataservice for employees.", - "serviceVdbName": TestDataService.employeesVdb.getName(), - "serviceVdbVersion": TestDataService.employeesVdb.getVersion(), - "serviceViewModel": "views", - "serviceViewDefinitions": [ - "employeesView1", - "employeesView2" - ], - "serviceViewTables": [ - "connection=" + TestDataService.conn2.getId().toLowerCase() + "/schema=public/table=tbl1", - "connection=" + TestDataService.conn2.getId().toLowerCase() + "/schema=public/table=tbl2", - "connection=" + TestDataService.conn2.getId().toLowerCase() + "/schema=public/table=tbl3", - "connection=" + TestDataService.conn2.getId().toLowerCase() + "/schema=public/table=tbl4" - ], - "connections": 0, - "drivers": 0, - "keng___links": [ - { - "rel": "self", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices/Employees" - }, - { - "rel": "parent", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices" - }, - { - "rel": "children", - "href": "http://localhost:4200/vdb-builder/v1/workspace/search?parent=%2Ftko%3Akomodo%2Ftko%3Aworkspace%2Fadmin%2FEmployees" - }, - { - "rel": "vdbs", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices/CustService/Vdbs" - }, - { - "rel": "connections", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices/CustService/connections" - } - ] - } - ); - - private static productsService = Dataservice.create( - { - "keng__baseUri": "http://localhost:4200/vdb-builder/v1/", - "keng__id": "Products", - "keng__dataPath": "/tko:komodo/tko:workspace/admin/Products", - "keng__kType": "Dataservice", - "keng__hasChildren": true, - "tko__description": "A dataservice for products. Make this a much longer description, to see what happens... Make this a much longer description, to see what happens... Make this a much longer description, to see what happens... Make this a much longer description, to see what happens... Make this a much longer description, to see what happens... Make it even longer now and longer", - "serviceVdbName": TestDataService.productsVdb.getName(), - "serviceVdbVersion": TestDataService.productsVdb.getVersion(), - "serviceViewModel": "views", - "serviceViewDefinitions": [ - "productsView1", - "productsView2", - "productsView3" - ], - "serviceViewTables": [ - "connection=" + TestDataService.conn3.getId().toLowerCase() + "/schema=public/table=tbl1", - "connection=" + TestDataService.conn3.getId().toLowerCase() + "/schema=public/table=tbl2", - "connection=" + TestDataService.conn3.getId().toLowerCase() + "/schema=public/table=tbl3", - "connection=" + TestDataService.conn3.getId().toLowerCase() + "/schema=public/table=tbl4", - "connection=" + TestDataService.conn3.getId().toLowerCase() + "/schema=public/table=tbl5", - "connection=" + TestDataService.conn3.getId().toLowerCase() + "/schema=public/table=tbl6" - ], - "connections": 0, - "drivers": 0, - "keng___links": [ - { - "rel": "self", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices/Products" - }, - { - "rel": "parent", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices" - }, - { - "rel": "children", - "href": "http://localhost:4200/vdb-builder/v1/workspace/search?parent=%2Ftko%3Akomodo%2Ftko%3Aworkspace%2Fadmin%2FProducts" - }, - { - "rel": "vdbs", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices/CustService/Vdbs" - }, - { - "rel": "connections", - "href": "http://localhost:4200/vdb-builder/v1/workspace/dataservices/CustService/connections" - } - ] - } - ); - - // ================================================================= - // Virtualizations - // ================================================================= - - private static accountsVirtualization = Virtualization.create( - { - "vdb_name": TestDataService.accountsVdb.getName(), - "build_name": TestDataService.accountsVdb.getName() + "-build-1", - "deployment_name": TestDataService.accountsVdb.getName() + "-deployment-1", - "build_status": "RUNNING", /* NOTFOUND, BUILDING, DEPLOYING, RUNNING, FAILED, CANCELLED */ - "build_status_message": "Accounts VDB build was successful", - "namespace": "beetle-studio", - "last_updated": "2018-03-29T17:02:51.181Z", - "publishState": PublishState.PUBLISHED, - "routes": [ - { - "name": TestDataService.accountsVdb.getName() + "-odata", - "protocol": "odata", - "target": TestDataService.accountsVdb.getName() + "-odata", - "host": TestDataService.accountsVdb.getName() + "-odata" + "-beetle-studio.192.168.xx.yy", - "port": "odata", - "secure": true - } - ] - } - ); - - private static employeesVirtualization = Virtualization.create( - { - "vdb_name": TestDataService.employeesVdb.getName(), - "build_name": TestDataService.employeesVdb.getName() + "-build-1", - "deployment_name": TestDataService.employeesVdb.getName() + "-deployment-1", - "build_status": "RUNNING", /* NOTFOUND, BUILDING, DEPLOYING, RUNNING, FAILED, CANCELLED */ - "build_status_message": "Employees VDB build was successful", - "namespace": "beetle-studio", - "last_updated": "2018-03-29T17:02:51.181Z", - "publishState": PublishState.PUBLISHED, - "routes": [ - { - "name": TestDataService.employeesVdb.getName() + "-odata", - "protocol": "odata", - "target": TestDataService.employeesVdb.getName() + "-odata", - "host": TestDataService.employeesVdb.getName() + "-odata" + "-beetle-studio.192.168.xx.yy", - "port": "odata", - "secure": true - } - ] - } - ); - - private static productsVirtualization = Virtualization.create( - { - "vdb_name": TestDataService.productsVdb.getName(), - "build_name": TestDataService.productsVdb.getName() + "-build-1", - "deployment_name": TestDataService.productsVdb.getName() + "-deployment-1", - "build_status": "RUNNING", /* NOTFOUND, BUILDING, DEPLOYING, RUNNING, FAILED, CANCELLED */ - "build_status_message": "Products VDB build was successful", - "namespace": "beetle-studio", - "last_updated": "2018-03-29T17:02:51.181Z", - "publishState": PublishState.PUBLISHED, - "routes": [ - { - "name": TestDataService.productsVdb.getName() + "-odata", - "protocol": "odata", - "target": TestDataService.productsVdb.getName() + "-odata", - "host": TestDataService.productsVdb.getName() + "-odata" + "-beetle-studio.192.168.xx.yy", - "port": "odata", - "secure": true - } - ] - } - ); - - // ================================================================= - // ViewEditorStates - // ================================================================= - - private static employeesViewState1 = ViewEditorState.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "id": "employeesvdb.employeesView1", - "undoables": [ - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "oldName": "v" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v", - "oldName": "vi" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "vie" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "vi" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "view" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "view", - "oldName": "vie" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "removedSourcePaths": "connection=pgConn/schema=public/table=account" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "addedSourcePaths": "connection=pgConn/schema=public/table=account" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "removedSourcePaths": "connection=pgConn/schema=public/table=product" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "addedSourcePaths": "connection=pgConn/schema=public/table=product" - } - } - }, - { - "undo": { - "id": "RemoveCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "removedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - }, - "redo": { - "id": "AddCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "addedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - } - } - ], - "viewDefinition": - { - "viewName": "employeesView1", - "keng__description": "Single Source", - "isComplete": true, - "sourcePaths": - [ - "connection=conn1/schema=public/table=customer" - ], - "projectedColumns": [ - { - "name": "SSN", - "type": "string", - "selected": false - }, - { - "name": "FIRSTNAME", - "type": "string", - "selected": true - }, - { - "name": "LASTNAME", - "type": "string", - "selected": true - }, - { - "name": "ST_ADDRESS", - "type": "string", - "selected": false - }, - { - "name": "APT_NUMBER", - "type": "string", - "selected": false - }, - { - "name": "CITY", - "type": "string", - "selected": true - }, - { - "name": "STATE", - "type": "string", - "selected": true - }, - { - "name": "ZIPCODE", - "type": "string", - "selected": true - }, - { - "name": "PHONE", - "type": "string", - "selected": false - } - ] - } - } - ); - - private static employeesViewState2 = ViewEditorState.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "id": "employeesvdb.employeesView2", - "undoables": [ - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "oldName": "v" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v", - "oldName": "vi" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "vie" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "vi" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "view" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "view", - "oldName": "vie" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "removedSourcePaths": "connection=pgConn/schema=public/table=account" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "addedSourcePaths": "connection=pgConn/schema=public/table=account" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "removedSourcePaths": "connection=pgConn/schema=public/table=product" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "addedSourcePaths": "connection=pgConn/schema=public/table=product" - } - } - }, - { - "undo": { - "id": "RemoveCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "removedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - }, - "redo": { - "id": "AddCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "addedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - } - } - ], - "viewDefinition": - { - "viewName": "employeesView2", - "keng__description": "Join between customer and stuff", - "isComplete": true, - "sourcePaths": - [ - "connection=conn1/schema=public/table=customer", - "connection=conn1/schema=public/table=stuff" - ], - "compositions": - [ - { - "name": "customer-stuff", - "leftSourcePath": "connection=conn1/schema=public/table=customer", - "rightSourcePath": "connection=conn1/schema=public/table=stuff", - "leftCriteriaColumn": "leftCriteriaCol", - "rightCriteriaColumn": "rightCriteriaCol", - "type": "INNER_JOIN", - "operator": "EQ" - } - ], - "projectedColumns": [ - { - "name": "SSN", - "type": "string", - "selected": false - }, - { - "name": "FIRSTNAME", - "type": "string", - "selected": true - }, - { - "name": "LASTNAME", - "type": "string", - "selected": true - }, - { - "name": "ST_ADDRESS", - "type": "string", - "selected": false - }, - { - "name": "APT_NUMBER", - "type": "string", - "selected": false - }, - { - "name": "CITY", - "type": "string", - "selected": true - }, - { - "name": "STATE", - "type": "string", - "selected": true - }, - { - "name": "ZIPCODE", - "type": "string", - "selected": true - }, - { - "name": "PHONE", - "type": "string", - "selected": false - } - ] - } - } - ); - - private static productsViewState1 = ViewEditorState.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "id": "productsvdb.productsView1", - "undoables": [ - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "oldName": "v" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v", - "oldName": "vi" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "vie" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "vi" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "view" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "view", - "oldName": "vie" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "removedSourcePaths": "connection=pgConn/schema=public/table=account" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "addedSourcePaths": "connection=pgConn/schema=public/table=account" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "removedSourcePaths": "connection=pgConn/schema=public/table=product" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "addedSourcePaths": "connection=pgConn/schema=public/table=product" - } - } - }, - { - "undo": { - "id": "RemoveCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "removedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - }, - "redo": { - "id": "AddCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "addedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - } - } - ], - "viewDefinition": - { - "viewName": "productsView1", - "keng__description": "signle source conn1 stuff", - "isComplete": true, - "sourcePaths": - [ - "connection=conn1/schema=public/table=stuff" - ], - "projectedColumns": [ - { - "name": "SSN", - "type": "string", - "selected": false - }, - { - "name": "FIRSTNAME", - "type": "string", - "selected": true - }, - { - "name": "LASTNAME", - "type": "string", - "selected": true - }, - { - "name": "ST_ADDRESS", - "type": "string", - "selected": false - }, - { - "name": "APT_NUMBER", - "type": "string", - "selected": false - }, - { - "name": "CITY", - "type": "string", - "selected": true - }, - { - "name": "STATE", - "type": "string", - "selected": true - }, - { - "name": "ZIPCODE", - "type": "string", - "selected": true - }, - { - "name": "PHONE", - "type": "string", - "selected": false - } - ] - } - } - ); - - private static productsViewState2 = ViewEditorState.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "id": "productsvdb.productsView2", - "undoables": [ - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "oldName": "v" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v", - "oldName": "vi" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "vie" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "vi" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "view" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "view", - "oldName": "vie" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "removedSourcePaths": "connection=pgConn/schema=public/table=account" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "addedSourcePaths": "connection=pgConn/schema=public/table=account" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "removedSourcePaths": "connection=pgConn/schema=public/table=product" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "addedSourcePaths": "connection=pgConn/schema=public/table=product" - } - } - }, - { - "undo": { - "id": "RemoveCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "removedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - }, - "redo": { - "id": "AddCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "addedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - } - } - ], - "viewDefinition": - { - "viewName": "productsView2", - "keng__description": "join restaurants and grades", - "isComplete": true, - "sourcePaths": - [ - "connection=conn2/collections=restaurants", - "connection=conn2/collections=restaurants/embedded=grades" - ], - "compositions": - [ - { - "name": "compositionName", - "leftSourcePath": "connection=conn2/collections=restaurants", - "rightSourcePath": "connection=conn2/collections=restaurants/embedded=grades", - "leftCriteriaColumn": "leftCriteriaCol", - "rightCriteriaColumn": "rightCriteriaCol", - "type": "INNER_JOIN", - "operator": "EQ" - } - ], - "projectedColumns": [ - { - "name": "ALL", - "type": "ALL", - "selected": true - } - ] - } - } - ); - - private static productsViewState3 = ViewEditorState.create( - { - "keng__baseUri": "http://das-beetle-studio.192.168.42.154.nip.io/vdb-builder/v1/", - "id": "productsvdb.productsView3", - "undoables": [ - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "oldName": "v" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "v", - "oldName": "vi" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "v" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vi", - "oldName": "vie" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "vi" - } - } - }, - { - "undo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "vie", - "oldName": "view" - } - }, - "redo": { - "id": "UpdateViewNameCommand", - "args": { - "newName": "view", - "oldName": "vie" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "removedSourcePaths": "connection=pgConn/schema=public/table=account" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727452660", - "addedSourcePaths": "connection=pgConn/schema=public/table=account" - } - } - }, - { - "undo": { - "id": "RemoveSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "removedSourcePaths": "connection=pgConn/schema=public/table=product" - } - }, - "redo": { - "id": "AddSourcesCommand", - "args": { - "ObjectId": "AddSourcesCommand1532727472867", - "addedSourcePaths": "connection=pgConn/schema=public/table=product" - } - } - }, - { - "undo": { - "id": "RemoveCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "removedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - }, - "redo": { - "id": "AddCompositionCommand", - "args": { - "ObjectId": "AddCompositionCommand1532727472875", - "addedComposition": "{\"name\":\"account-product\",\"leftSourcePath\":\"connection=pgConn/schema=public/table=account\",\"rightSourcePath\":\"connection=pgConn/schema=public/table=product\",\"leftCriteriaColumn\":\"account_id\",\"rightCriteriaColumn\":\"id\",\"type\":\"INNER_JOIN\",\"operator\":\"EQ\"}" - } - } - } - ], - "viewDefinition": - { - "viewName": "productsView3", - "keng__description": "join restaurants and customer", - "isComplete": true, - "sourcePaths": - [ - "connection=conn2/collections=restaurants", - "connection=conn1/schema=public/table=customer" - ], - "compositions": - [ - { - "name": "compositionName", - "leftSourcePath": "connection=conn2/collections=restaurants", - "rightSourcePath": "connection=conn1/schema=public/table=customer", - "leftCriteriaColumn": "leftCriteriaCol", - "rightCriteriaColumn": "rightCriteriaCol", - "type": "INNER_JOIN", - "operator": "EQ" - } - ], - "projectedColumns": [ - { - "name": "SSN", - "type": "string", - "selected": false - }, - { - "name": "FIRSTNAME", - "type": "string", - "selected": true - }, - { - "name": "LASTNAME", - "type": "string", - "selected": true - }, - { - "name": "ST_ADDRESS", - "type": "string", - "selected": false - }, - { - "name": "APT_NUMBER", - "type": "string", - "selected": false - }, - { - "name": "CITY", - "type": "string", - "selected": true - }, - { - "name": "STATE", - "type": "string", - "selected": true - }, - { - "name": "ZIPCODE", - "type": "string", - "selected": true - }, - { - "name": "PHONE", - "type": "string", - "selected": false - } - ] - } - } - ); - - private catalogSources: ServiceCatalogSource[] = [ - TestDataService.pgConnCatalogSource, - TestDataService.catalogSource1, - TestDataService.catalogSource2, - TestDataService.catalogSource3, - TestDataService.catalogSourceMongo1, - TestDataService.catalogSourceMongo2]; - - private connections: Connection[] = [ - TestDataService.pgConn, - TestDataService.conn1, - TestDataService.conn2, - TestDataService.conn3]; - - private vdbs: Vdb[] = [ - TestDataService.accountsVdb, - TestDataService.employeesVdb, - TestDataService.productsVdb - ]; - - private readonly vdbStatuses: VdbStatus[]; - private readonly virtualizations: Virtualization[]; - private readonly dataServices: Dataservice[]; - - /** - * Create a ServiceCatalogSource using the specified info - * @param {string} id the id - * @param {string} name the name - * @param {string} type the type - * @param {boolean} bound 'true' if bound - * @returns {ServiceCatalogSource} - */ - private static createServiceCatalogSource( id: string, name: string, type: string, bound: boolean ): ServiceCatalogSource { - const catalogSource = new ServiceCatalogSource(); - catalogSource.setId(id); - catalogSource.setName(name); - catalogSource.setType(type); - catalogSource.setBound(bound); - return catalogSource; - } - - /** - * Create a ConnectionSummary using the specified info - * @param {Connection} conn the connection - * @param {ConnectionStatus} status the connection status - * @returns {ConnectionSummary} - */ - private static createConnectionSummary( conn: Connection, status: ConnectionStatus ): ConnectionSummary { - const connectionSummary = new ConnectionSummary(); - connectionSummary.setConnection(conn); - connectionSummary.setStatus(status); - return connectionSummary; - } - - constructor() { - this.vdbStatuses = TestDataService.vdbStatuses.vdbs.map(( vdbStatus ) => VdbStatus.create( vdbStatus ) ); - this.virtualizations = [ - TestDataService.accountsVirtualization, - TestDataService.employeesVirtualization, - TestDataService.productsVirtualization - ]; - this.dataServices = []; - const svc1: Dataservice = TestDataService.accountsService; - const svc2: Dataservice = TestDataService.employeesService; - const svc3: Dataservice = TestDataService.productsService; - - this.dataServices.push(svc1); - this.dataServices.push(svc2); - this.dataServices.push(svc3); - } - - /** - * Get connection summaries based on supplied parameters - * @param {boolean} includeConnection include connection in the summary - * @param {boolean} includeSchemaStatus include schema status in the summary - * @returns {Connection[]} the array of test connections - */ - public getConnectionSummaries(includeConnection: boolean, includeSchemaStatus: boolean): ConnectionSummary[] { - if (includeConnection && includeSchemaStatus) { - return TestDataService.connSummariesBothConnAndStatus; - } else if (includeConnection && !includeSchemaStatus) { - return TestDataService.connSummariesConnOnly; - } else if (includeSchemaStatus && !includeConnection) { - return TestDataService.connSummariesSchemaStatusOnly; - } - } - - /** - * @returns {ServiceCatalogSource[]} the array of test Service Catalog datasources - */ - public getServiceCatalogSources(): ServiceCatalogSource[] { - return this.catalogSources; - } - - /** - * @returns {Dataservice[]} the array of test dataservices - */ - public getDataservices(): Dataservice[] { - return this.dataServices; - } - - /** - * @returns {QueryResults} test query results - */ - public getQueryResults(): QueryResults { - - return new QueryResults(TestDataService.employeeJson); - } - - /** - * @returns {Map} the array of SchemaNodes for connection - */ - public getConnectionSchemaMap(): Map { - const nodesMap = new Map(); - - const pgConnSchemaRoots: SchemaNode[] = []; - const sNode = SchemaNode.create(TestDataService.pgConnSchemaJson); - pgConnSchemaRoots.push(sNode); - - const conn1SchemaRoots: SchemaNode[] = []; - const sNode1 = SchemaNode.create(TestDataService.conn1SchemaJson); - conn1SchemaRoots.push(sNode1); - - const conn2SchemaRoots: SchemaNode[] = []; - const sNode2 = SchemaNode.create(TestDataService.conn2SchemaJson); - conn2SchemaRoots.push(sNode2); - - const conn3SchemaRoots: SchemaNode[] = []; - const sNode3 = SchemaNode.create(TestDataService.conn3SchemaJson); - conn3SchemaRoots.push(sNode3); - - // nodesMap.set( TestDataService.pgConn.getId(), pgConnSchemaRoots ); - nodesMap.set( TestDataService.conn1.getId(), conn1SchemaRoots ); - nodesMap.set( TestDataService.conn2.getId(), conn2SchemaRoots ); - // nodesMap.set( TestDataService.conn3.getId(), conn3SchemaRoots ); - return nodesMap; - } - - /** - * @returns {Map} the array of Columns for connection:tableOption - */ - public getConnectionSchemaColumnsMap(): Map { - const columnsMap = new Map(); - - const col1 = new Column(); - col1.setName("col1"); - col1.setDatatype("string"); - col1.setSize(6); - col1.setSelected(false); - const col2 = new Column(); - col2.setName("col2"); - col2.setDatatype("string"); - col2.setSize(6); - col2.setSelected(false); - const col3 = new Column(); - col3.setName("col3"); - col3.setDatatype("string"); - col3.setSize(6); - col3.setSelected(false); - const col4 = new Column(); - col4.setName("col4"); - col4.setDatatype("string"); - col4.setSize(6); - col4.setSelected(false); - const col5 = new Column(); - col5.setName("col5"); - col5.setDatatype("string"); - col5.setSize(6); - col5.setSelected(false); - const col6 = new Column(); - col6.setName("col6"); - col6.setDatatype("string"); - col6.setSize(6); - col6.setSelected(false); - const col7 = new Column(); - col7.setName("col7"); - col7.setDatatype("string"); - col7.setSize(6); - col7.setSelected(false); - const col8 = new Column(); - col8.setName("col8"); - col8.setDatatype("string"); - col8.setSize(6); - col8.setSelected(false); - const col9 = new Column(); - col9.setName("col9"); - col9.setDatatype("string"); - col9.setSize(6); - col9.setSelected(false); - const col10 = new Column(); - col10.setName("col10"); - col10.setDatatype("string"); - col10.setSize(6); - col10.setSelected(false); - - const conn1Table1Id = TestDataService.conn1.getId() + ":" + "schema=public/table=customer"; - const conn1Table2Id = TestDataService.conn1.getId() + ":" + "schema=public/table=stuff"; - const conn2Table1Id = TestDataService.conn2.getId() + ":" + "collection=restaurants"; - const conn2Table2Id = TestDataService.conn2.getId() + ":" + "collection=restaurants/embedded=grades"; - const conn2Table3Id = TestDataService.conn2.getId() + ":" + "collection=restaurants/embedded=location"; - columnsMap.set( conn1Table1Id, [col1, col2] ); - columnsMap.set( conn1Table2Id, [col3, col5, col4] ); - columnsMap.set( conn2Table1Id, [col6] ); - columnsMap.set( conn2Table2Id, [col7, col8] ); - columnsMap.set( conn2Table3Id, [col9, col10] ); - return columnsMap; - } - - /** - * @returns {Vdb[]} the VDB collection - */ - public getVdbs(): Vdb[] { - return this.vdbs; - } - - /** - * @returns {VdbStatus[]} the VDB status collection - */ - public getVdbStatuses(): VdbStatus[] { - return this.vdbStatuses; - } - - /** - * @returns {Virtualization[]} the virtualization collection - */ - public getVirtualizations(): Virtualization[] { - return this.virtualizations; - } - - /** - * @returns {Map} the ViewEditorState by id map - */ - public getViewEditorStateMap(): Map { - const stateMap = new Map(); - - const state1 = ViewEditorState.create(TestDataService.employeesViewState1); - const state2 = ViewEditorState.create(TestDataService.employeesViewState2); - const state3 = ViewEditorState.create(TestDataService.productsViewState1); - const state4 = ViewEditorState.create(TestDataService.productsViewState2); - const state5 = ViewEditorState.create(TestDataService.productsViewState3); - - stateMap.set(state1.getId(), state1); - stateMap.set(state2.getId(), state2); - stateMap.set(state3.getId(), state3); - stateMap.set(state4.getId(), state4); - stateMap.set(state5.getId(), state5); - - return stateMap; - } - -} diff --git a/ui/src/app/shared/validators/name-validator.ts b/ui/src/app/shared/validators/name-validator.ts deleted file mode 100644 index fca0d405..00000000 --- a/ui/src/app/shared/validators/name-validator.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { AbstractControl } from "@angular/forms"; - -// TODO this is a sample validator. -export function validateName(control: AbstractControl): any { - if (!control.value.startsWith("a")) { - return { validName: control.value }; - } - return null; -} diff --git a/ui/src/assets/MongoDB_70x40.png b/ui/src/assets/MongoDB_70x40.png deleted file mode 100644 index f7afb192..00000000 Binary files a/ui/src/assets/MongoDB_70x40.png and /dev/null differ diff --git a/ui/src/assets/MySQL_70x40.png b/ui/src/assets/MySQL_70x40.png deleted file mode 100644 index f5e58dba..00000000 Binary files a/ui/src/assets/MySQL_70x40.png and /dev/null differ diff --git a/ui/src/assets/PostgresSql_70x40.png b/ui/src/assets/PostgresSql_70x40.png deleted file mode 100644 index 3751bd5c..00000000 Binary files a/ui/src/assets/PostgresSql_70x40.png and /dev/null differ diff --git a/ui/src/assets/composition.png b/ui/src/assets/composition.png deleted file mode 100644 index 32932718..00000000 Binary files a/ui/src/assets/composition.png and /dev/null differ diff --git a/ui/src/assets/graphicsfuel/database-64.png b/ui/src/assets/graphicsfuel/database-64.png deleted file mode 100644 index 0c64d3f7..00000000 Binary files a/ui/src/assets/graphicsfuel/database-64.png and /dev/null differ diff --git a/ui/src/assets/graphicsfuel/readme.txt b/ui/src/assets/graphicsfuel/readme.txt deleted file mode 100644 index 62c80ff1..00000000 --- a/ui/src/assets/graphicsfuel/readme.txt +++ /dev/null @@ -1,18 +0,0 @@ -Thank you for downloading the graphic resource from GraphicsFuel.com. - -TERMS OF USAGE: - -* The freebie resources provided on GraphicsFuel.com are royalty free, and can be used in both personal and commercial projects including but not limited to websites, templates, themes, skins , blogs, Themeforest themes, games, software programs, prints. - -* Attribution is not necessary, but is always appreciated. - -Please do not host source files on your server and or redistribute them as your own either in part or whole. If you want to share the files on your site, please link back to the appropriate source page on GraphicsFuel. - -______________________________ - -http://www.graphicsfuel.com/ - -Subscribe to GraphicsFuel at: http://feeds.feedburner.com/GraphicsFuel - - - diff --git a/ui/src/assets/iconfinder/Aha-soft/license.pdf b/ui/src/assets/iconfinder/Aha-soft/license.pdf deleted file mode 100644 index 494900d1..00000000 Binary files a/ui/src/assets/iconfinder/Aha-soft/license.pdf and /dev/null differ diff --git a/ui/src/assets/iconfinder/Aha-soft/minus-depressed.png b/ui/src/assets/iconfinder/Aha-soft/minus-depressed.png deleted file mode 100644 index e6a0c453..00000000 Binary files a/ui/src/assets/iconfinder/Aha-soft/minus-depressed.png and /dev/null differ diff --git a/ui/src/assets/iconfinder/Aha-soft/minus.png b/ui/src/assets/iconfinder/Aha-soft/minus.png deleted file mode 100644 index 0f1f932b..00000000 Binary files a/ui/src/assets/iconfinder/Aha-soft/minus.png and /dev/null differ diff --git a/ui/src/assets/iconfinder/Aha-soft/plus-depressed.png b/ui/src/assets/iconfinder/Aha-soft/plus-depressed.png deleted file mode 100644 index 7c411f37..00000000 Binary files a/ui/src/assets/iconfinder/Aha-soft/plus-depressed.png and /dev/null differ diff --git a/ui/src/assets/iconfinder/Aha-soft/plus.png b/ui/src/assets/iconfinder/Aha-soft/plus.png deleted file mode 100644 index 40657475..00000000 Binary files a/ui/src/assets/iconfinder/Aha-soft/plus.png and /dev/null differ diff --git a/ui/src/assets/iconfinder/Natalya-Skidan/license.pdf b/ui/src/assets/iconfinder/Natalya-Skidan/license.pdf deleted file mode 120000 index 63d9c5de..00000000 --- a/ui/src/assets/iconfinder/Natalya-Skidan/license.pdf +++ /dev/null @@ -1 +0,0 @@ -../creative-commons.pdf \ No newline at end of file diff --git a/ui/src/assets/iconfinder/Natalya-Skidan/question-mark.png b/ui/src/assets/iconfinder/Natalya-Skidan/question-mark.png deleted file mode 100644 index 5474a490..00000000 Binary files a/ui/src/assets/iconfinder/Natalya-Skidan/question-mark.png and /dev/null differ diff --git a/ui/src/assets/iconfinder/creative-commons.pdf b/ui/src/assets/iconfinder/creative-commons.pdf deleted file mode 100644 index 494900d1..00000000 Binary files a/ui/src/assets/iconfinder/creative-commons.pdf and /dev/null differ diff --git a/ui/src/assets/redhat-iot.png b/ui/src/assets/redhat-iot.png deleted file mode 100644 index 2198fffa..00000000 Binary files a/ui/src/assets/redhat-iot.png and /dev/null differ diff --git a/ui/src/assets/salesforce_40x40.png b/ui/src/assets/salesforce_40x40.png deleted file mode 100644 index 8dd91e35..00000000 Binary files a/ui/src/assets/salesforce_40x40.png and /dev/null differ diff --git a/ui/src/assets/table.png b/ui/src/assets/table.png deleted file mode 100644 index 99a133d4..00000000 Binary files a/ui/src/assets/table.png and /dev/null differ diff --git a/ui/src/assets/teiid-lizard-gradient-bgd.png b/ui/src/assets/teiid-lizard-gradient-bgd.png deleted file mode 100644 index fa7eb424..00000000 Binary files a/ui/src/assets/teiid-lizard-gradient-bgd.png and /dev/null differ diff --git a/ui/src/assets/vdb.png b/ui/src/assets/vdb.png deleted file mode 100644 index 2a369bf4..00000000 Binary files a/ui/src/assets/vdb.png and /dev/null differ diff --git a/ui/src/browserslist b/ui/src/browserslist new file mode 100644 index 00000000..37371cb0 --- /dev/null +++ b/ui/src/browserslist @@ -0,0 +1,11 @@ +# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries +# +# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 \ No newline at end of file diff --git a/ui/src/environments/environment.prod.ts b/ui/src/environments/environment.prod.ts index db7f4673..3612073b 100644 --- a/ui/src/environments/environment.prod.ts +++ b/ui/src/environments/environment.prod.ts @@ -1,67 +1,3 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; - -export const komodoEngine = "vdb-builder"; - -export const komodoRestVersion = "v1"; - -export const localKomodoPrefix = "http://localhost:8080/"; - -export const openshiftKomodoPrefix = "/"; - -// ----------------------------------------------------------- -// komodoUrlPrefix -// - openshiftKomodoPrefix (openshift deployment) -// - localKomodoPrefix (development on local teiid-komodo) -// ----------------------------------------------------------- -export const komodoUrlPrefix = openshiftKomodoPrefix; - export const environment = { - - production: true, - - komodoEngine, - - komodoRestVersion, - - // the home page path - homePagePath: DataservicesConstants.dataservicesRootPath, - - // REST URL - Komodo import export url - komodoImportExportUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/importexport", - - // REST URL - Komodo workspace - komodoWorkspaceUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/workspace", - - // REST URL - Komodo teiid server - komodoTeiidUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/metadata", - - // REST URL - Komodo service - komodoServiceUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/service", - - // Indicates if in UI development mode where OpenShift will not be used. - uiDevMode: false, - - userProfileUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/service/userProfile", - - viewEditorState: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/service/userProfile/viewEditorState", - - viewEditorStates: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/service/userProfile/viewEditorStates" - + production: true }; diff --git a/ui/src/environments/environment.ts b/ui/src/environments/environment.ts index f5b0480f..7b4f817a 100644 --- a/ui/src/environments/environment.ts +++ b/ui/src/environments/environment.ts @@ -1,70 +1,16 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { DataservicesConstants } from "@dataservices/shared/dataservices-constants"; - -// The file contents for the current environment will overwrite these during build. -// The build system defaults to the dev environment which uses `environment.ts`, but if you do -// `ng build --env=prod` then `environment.prod.ts` will be used instead. -// The list of which env maps to which file can be found in `.angular-cli.json`. - -export const komodoEngine = "vdb-builder"; - -export const komodoRestVersion = "v1"; - -export const localKomodoPrefix = "http://localhost:8080/"; - -export const openshiftKomodoPrefix = "/"; - -// ----------------------------------------------------------- -// komodoUrlPrefix -// - openshiftKomodoPrefix (openshift deployment) -// - localKomodoPrefix (development on local teiid-komodo) -// ----------------------------------------------------------- -export const komodoUrlPrefix = openshiftKomodoPrefix; +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. export const environment = { - production: false, - - komodoEngine, - - komodoRestVersion, - - // the home page path - homePagePath: DataservicesConstants.dataservicesRootPath, - - // REST URL - Komodo import export url - komodoImportExportUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/importexport", - - // REST URL - Komodo workspace - komodoWorkspaceUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/workspace", - - // REST URL - Komodo teiid server - komodoTeiidUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/metadata", - - // REST URL - Komodo service - komodoServiceUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/service", - - // Indicates if in UI development mode where OpenShift will not be used. - uiDevMode: false, - - userProfileUrl: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/service/userProfile", - - viewEditorState: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/service/userProfile/viewEditorState", - - viewEditorStates: komodoUrlPrefix + komodoEngine + "/" + komodoRestVersion + "/service/userProfile/viewEditorStates" - + production: false }; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/ui/src/index.html b/ui/src/index.html index 3afd81e7..2abfaa98 100644 --- a/ui/src/index.html +++ b/ui/src/index.html @@ -2,7 +2,7 @@ - Beetle Studio + Ui diff --git a/ui/src/karma.conf.js b/ui/src/karma.conf.js new file mode 100644 index 00000000..b6e00421 --- /dev/null +++ b/ui/src/karma.conf.js @@ -0,0 +1,31 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/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 + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../coverage'), + reports: ['html', 'lcovonly'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; \ No newline at end of file diff --git a/ui/src/main.ts b/ui/src/main.ts index b4662e5b..28bfa9e1 100644 --- a/ui/src/main.ts +++ b/ui/src/main.ts @@ -1,29 +1,13 @@ -/** - * @license - * Copyright 2017 JBoss Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { enableProdMode } from "@angular/core"; -import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; -import { AppModule } from "@app/app.module"; -import { environment } from "@environments/environment"; +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; if (environment.production) { enableProdMode(); } -platformBrowserDynamic().bootstrapModule( AppModule ) - .then( (success) => console.log( `Bootstrap success` ) ) - .catch( (err) => console.error( err ) ); +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); + diff --git a/ui/src/polyfills.ts b/ui/src/polyfills.ts index de45784c..d310405a 100644 --- a/ui/src/polyfills.ts +++ b/ui/src/polyfills.ts @@ -18,50 +18,63 @@ * BROWSER POLYFILLS */ -// IE9, IE10 and IE11 requires all of the following polyfills. -import "core-js/es6/array"; -import "core-js/es6/date"; -import "core-js/es6/function"; -import "core-js/es6/map"; -import "core-js/es6/math"; -import "core-js/es6/number"; -import "core-js/es6/object"; -import "core-js/es6/parse-float"; -import "core-js/es6/parse-int"; -import "core-js/es6/regexp"; -import "core-js/es6/set"; -import "core-js/es6/string"; -import "core-js/es6/symbol"; -import "core-js/es6/weak-map"; +/** 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/weak-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`. -// Evergreen browsers require these. -import "core-js/es6/reflect"; -import "core-js/es7/reflect"; +/** IE10 and IE11 requires the following for the Reflect API. */ +// import 'core-js/es6/reflect'; + + +/** Evergreen browsers require these. **/ +// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. +import 'core-js/es7/reflect'; + /** - * Required to support Web Animations `@angular/animation`. - * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation - */ + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + **/ // import 'web-animations-js'; // Run `npm install --save web-animations-js`. -/*************************************************************************************************** - * Zone JS is required by Angular itself. +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags */ -import "zone.js/dist/zone"; // Included with Angular CLI. -/*************************************************************************************************** - * APPLICATION IMPORTS + // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + + /* + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge */ +// (window as any).__Zone_enable_cross_context_check = true; -/** - * Date, currency, decimal and percent pipes. - * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. */ -// import 'intl'; // Run `npm install --save intl`. -/** - * Need to import at least one locale-data with intl. +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS */ -// import 'intl/locale-data/jsonp/en'; diff --git a/ui/src/styles.css b/ui/src/styles.css index d9ddf1f8..90d4ee00 100644 --- a/ui/src/styles.css +++ b/ui/src/styles.css @@ -1,369 +1 @@ /* You can add global styles to this file, and also import other style files */ - -@import "~angular-tree-component/dist/angular-tree-component.css"; -@import "~codemirror/lib/codemirror.css"; -@import "~codemirror/theme/mdn-like.css"; -@import "~codemirror/theme/neat.css"; -@import "~patternfly/dist/css/patternfly.css"; -@import "~patternfly/dist/css/patternfly-additions.css"; -@import "~patternfly-ng/dist/css/patternfly-ng.css"; - -:root { - --alert-color: darkred; - --hover-color: #ddeaff; - --disabled-color: lightgrey; - --card-action-icon-color: var(--card-border-color); - --card-action-icon-cursor: pointer; - --card-action-icon-disabled-color: var(--disabled-color); - --card-action-icon-font-size: 1.5em; - --card-action-icon-height: 16px !important; - --card-action-icon-margin-left: 2px; - --card-action-icon-margin-right: 2px; - --card-action-icon-margin-top: 4px; - --card-action-icon-width: 16px !important; - --card-body-background-color: var(--page-background-color); - --card-body-color: #72767b; - --card-body-title-background-color: var(--card-body-color); - --card-body-title-color: white; - --card-border-color: #39a5dc; - --card-border-style: double; - --card-border-width: 2px; - --card-description-color: slategray; - --card-description-height: 75px; - --card-description-overflow: auto; - --card-description-margin-bottom: 10px; - --card-description-padding: 0 5px 5px 5px; - --card-footer-background-color: #ececec; - --card-height: 300px; - --card-hover-color: var(--hover-color); - --card-title-font-size: 16px; - --card-title-font-weight: bold; - --card-title-margin: 10px 0 !important; - --card-toolbar-border-bottom: 1px solid lightgrey; - --card-toolbar-border-top: 1px solid lightgrey; - --card-toolbar-dropdown-form-group-margin-bottom: 0; - --card-toolbar-dropdown-form-group-padding: 0 8px; - --card-toolbar-dropdown-action-icon-color: var(--card-action-icon-color); - --card-toolbar-dropdown-action-icon-display: inline-block; - --card-toolbar-dropdown-action-icon-margin-bottom: 0; - --card-toolbar-dropdown-action-icon-margin-right: 10px; - --card-toolbar-dropdown-action-icon-margin-top: 0; - --card-toolbar-kebab-margin-left: 0 !important; - --card-toolbar-kebab-margin-right: 4px; - --card-toolbar-margin-bottom: 6px; - --card-toolbar-margin-top: 0; - --card-toolbar-padding: 0 0 0 4px; - --card-width: 300px; - --inline-icon-color: var(--card-border-color); - --inline-icon-display: inline-block; - --page-background-color: #fafafa; -} - -/**********************************************************************/ -/* Beetle Studio Global Types */ -/**********************************************************************/ - -.blank-slate-pf { - background-color: white; - width: 50%; - min-width: 500px; - margin-left: auto; - margin-right: auto; - margin-top: 15px; -} - -.card-action-icon-disabled, -.card-action-icon { - color: var(--card-action-icon-color); - cursor: var(--card-action-icon-cursor); - font-size: var(--card-action-icon-font-size); - height: var(--card-action-icon-height); - margin-left: var(--card-action-icon-margin-left); - margin-right: var(--card-action-icon-margin-right); - margin-top: var(--card-action-icon-margin-top); - width: var(--card-action-icon-width); -} - -.card-action-icon-disabled { - color: var(--card-action-icon-disabled-color); -} - -.card-footer-action-icon { - margin-left: 10px; -} - -.card-toolbar { - border-bottom: var(--card-toolbar-border-bottom); - border-top: var(--card-toolbar-border-top); - margin-bottom: var(--card-toolbar-margin-bottom); - margin-top: var(--card-toolbar-margin-top); - padding: var(--card-toolbar-padding); -} - -.card-toolbar-dropdown-action-group { - margin-bottom: var(--card-toolbar-dropdown-form-group-margin-bottom); - padding: var(--card-toolbar-dropdown-form-group-padding); -} - -.card-toolbar-kebab { - margin-left: var(--card-toolbar-kebab-margin-left); - margin-right: var(--card-toolbar-kebab-margin-right); -} - -.clickable-icon { - cursor: pointer; -} - -.object-card, -.object-card-selected { - -webkit-transition: background-color 300ms; - -moz-transition: background-color 300ms; -//-ms-transition: background-color 300ms; - -o-transition: background-color 300ms; - transition: background-color 300ms; -} - -.object-card .card-pf, -.object-card-selected .card-pf { - margin: 8px 0; - flex: 0 0 var(--card-width); -} - -.object-card-container { - display: grid; - grid-row-gap: 10px; - grid-column-gap: 10px; - grid-template-columns: repeat( auto-fill, var(--card-width) ); - grid-template-rows: repeat( auto-fill, minmax( 225px, 225px) ); -} - -.object-card-container>* { - margin: 5px; -} - -.object-card-selected .card-pf { - border: var(--card-border-width) var(--card-border-style) var(--card-border-color); -} - -.object-card-selected .card-pf:hover, -.object-card .card-pf:hover { - background-color: var(--card-hover-color); -} - -.object-card-selected .card-pf .card-pf-body, -.object-card .card-pf .card-pf-body { - margin: 0; - padding: 0; -} - -.object-card-selected .card-pf .card-pf-footer, -.object-card .card-pf .card-pf-footer { - background-color: var(--card-footer-background-color); - margin: 0 !important; - min-height: 20px; - padding: 4px 0 4px 0; -} - -.object-card-selected .card-pf .card-pf-heading, -.object-card .card-pf .card-pf-heading { - border-bottom: none !important; -} - -.object-card-body { - margin: 0; - max-height: 200px; - overflow-y: auto; -} - -.object-card-body .pfng-list-content { - width: 100%; -} - -.object-card-body-title-selected, -.object-card-body-title { - background-color: var(--card-body-title-background-color); - color: var(--card-body-title-color); - margin: 0; - text-align: center; -} - -.object-card-description { - color: var(--card-description-color); - height: var(--card-description-height); - margin-bottom: var(--card-description-margin-bottom); - overflow: var(--card-description-overflow); - padding: var(--card-description-padding); -} - -.object-card-title { - font-size: var(--card-title-font-size); - font-weight: var(--card-title-font-weight); - margin: var(--card-title-margin); -} - -.object-collection-page { - background-color: var(--page-background-color); -} - -.object-collection-page .empty-state { - text-align: center; -} - -.object-collection-page .none-matched-state .alert { - background-color: white; -} - -.object-list .close { - float: left; -} - -.object-list .list-pf-actions { - flex-grow: 1; - justify-content: flex-end; -} - -/* Usage: "fa fa-xxx inline-icon" */ -.object-inline-icon { - color: var(--inline-icon-color); - display: var(--inline-icon-display); -} - -.object-name-link { - margin-left: 4px !important; - padding-left: 0; -} - -.properties-group-selected, -.properties-group { - padding: 0 4px; -} - -.properties-group-selected { -} - -.properties-group .list-pf-container { - margin: 0; - padding: 4px 0; -} - -.properties-group-selected .list-pf-container { - margin: 0; - padding: 4px 0; -} - -.property-name { - display: inline-flex; - flex-grow: 0; - font-weight: bold; - justify-content: right; - padding: 0 4px; - text-align: left; -} - -.property-value { - color: gray; - display: inline-flex; - flex-grow: 0; - justify-content: left; - padding: 0 4px; - text-align: left; -} - -/* - * Puts a red asterisk to the left of the component. Use with form labels of required inputs. - */ -.required-field:before { - color: #cc0000; - content: "*"; - margin-right: 2px; -} - -/**************************************************************/ -/* PatternFly Types */ -/**************************************************************/ - -.card-pf-footer-text { - margin-left: 20px; -} - -.pfng-list-expansion .list-pf-content { - width: 100%; -} - -.pfng-list-expansion .pfng-list-content { - width: 100%; -} - -.wizard-pf-body .pfng-wizard-position-override { - height: 50vh; - overflow-y: auto; -} - -/* Patternfly-NG kebab dropdown actions. */ -.secondary-action:before { - color: var(--card-toolbar-dropdown-action-icon-color); - display: var(--card-toolbar-dropdown-action-icon-display); - margin-bottom: var(--card-toolbar-dropdown-action-icon-margin-bottom); - margin-right: var(--card-toolbar-dropdown-action-icon-margin-right); - margin-top: var(--card-toolbar-dropdown-action-icon-margin-top); -} - -/* Adds a red trashcan icon to the left of the delete action item in dropdown of kebab. */ -.secondary-action[title*="Delete"]:before { - color: var(--alert-color); - content: "\f014"; - font-family: "FontAwesome"; -} - -.toolbar-pf-actions { - margin-bottom: 0; -} - -.wizard-pf-steps-indicator { - height: 90px; - padding: 15px 0 0 0; -} - -/**************************************************************/ -/* Schema Tree Types */ -/**************************************************************/ -.object-tree .node-content-wrapper, .tree-children { - position: relative; -} - -.object-tree .node-content-wrapper::before, .tree-children::after { - content: ""; - position: absolute; -} - -.object-tree .node-content-wrapper::before { - border-bottom: 1px solid lightgrey; - border-left: 1px solid lightgrey; - height: 28px; - top: -17px; - width: 20px; - left: -28px; -} - -.object-tree .tree-node-level-1 > tree-node-wrapper > .node-wrapper > .node-content-wrapper::before { - display: none; -} - -.object-tree .tree-node-leaf > .node-wrapper > .node-content-wrapper::before { - width: 25px; -} - -.object-tree .tree-children::after { - border-left: 1px solid lightgrey; - height: 100%; - top: -15px; - left: -15px; -} - -.object-tree .tree-node:last-child > .tree-node > .tree-children::after { - border-left: none; -} - -.object-tree .toggle-children { - z-index: 1; -} diff --git a/ui/src/test.ts b/ui/src/test.ts index 881917fd..16317897 100644 --- a/ui/src/test.ts +++ b/ui/src/test.ts @@ -1,37 +1,20 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files -import "zone.js/dist/long-stack-trace-zone"; -import "zone.js/dist/proxy.js"; -import "zone.js/dist/sync-test"; -// noinspection TsLint -import "zone.js/dist/jasmine-patch"; -// noinspection TsLint -import "zone.js/dist/async-test"; -import "zone.js/dist/fake-async-test"; -// noinspection TsLint -import { getTestBed } from "@angular/core/testing"; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting -} from "@angular/platform-browser-dynamic/testing"; +} from '@angular/platform-browser-dynamic/testing'; -// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. -declare const __karma__: any; declare const require: any; -// Prevent Karma from running prematurely. -__karma__.loaded = () => { - // Nothing to do -}; - // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting() ); // Then we find all the tests. -const context = require.context("./", true, /\.spec\.ts$/); +const context = require.context('./', true, /\.spec\.ts$/); // And load the modules. context.keys().map(context); -// Finally, start Karma to run the tests. -__karma__.start(); diff --git a/ui/src/tsconfig.app.json b/ui/src/tsconfig.app.json index 39ba8dba..190fd300 100644 --- a/ui/src/tsconfig.app.json +++ b/ui/src/tsconfig.app.json @@ -2,8 +2,6 @@ "extends": "../tsconfig.json", "compilerOptions": { "outDir": "../out-tsc/app", - "baseUrl": "./", - "module": "es2015", "types": [] }, "exclude": [ diff --git a/ui/src/tsconfig.spec.json b/ui/src/tsconfig.spec.json index 63d89ff2..de773363 100644 --- a/ui/src/tsconfig.spec.json +++ b/ui/src/tsconfig.spec.json @@ -2,16 +2,14 @@ "extends": "../tsconfig.json", "compilerOptions": { "outDir": "../out-tsc/spec", - "baseUrl": "./", - "module": "commonjs", - "target": "es5", "types": [ "jasmine", "node" ] }, "files": [ - "test.ts" + "test.ts", + "polyfills.ts" ], "include": [ "**/*.spec.ts", diff --git a/ui/src/tslint.json b/ui/src/tslint.json new file mode 100644 index 00000000..52e2c1a5 --- /dev/null +++ b/ui/src/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ] + } +} diff --git a/ui/src/typings.d.ts b/ui/src/typings.d.ts deleted file mode 100644 index e20662ca..00000000 --- a/ui/src/typings.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* SystemJS module definition */ -// noinspection ES6ConvertVarToLetConst -declare var module: NodeModule; -interface NodeModule { - id: string; -} diff --git a/ui/start.sh b/ui/start.sh deleted file mode 100755 index 69079698..00000000 --- a/ui/start.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -# Check node is available -command -v node >/dev/null 2>&1 || { echo >&2 "Requires 'node' but it's not installed. Aborting."; exit 1; } - -# Check ng is available - should be post 'npm install' -NG=`find . -type f -name ng | head -1` -if [ ! -f ${NG} ]; then - echo "Error: cannot find 'ng' so nothing can be executed... exiting" - exit 1 -fi - -################# -# -# Show help and exit -# -################# -function show_help { - echo "Usage: $0 [-d] [-h]" - echo "-d: run in development mode" - echo "" - echo "To passthrough additional arguments, enter '--' followed by the extra arguments" - exit 1 -} - -# -# Determine the command line options -# -while getopts ":d" opt; -do - case $opt in - d) DEV=1 ;; - h) show_help ;; - esac -done -shift "$(expr $OPTIND - 1)" - -if [ "${DEV}" == "1" ]; then - ${NG} serve --host 0.0.0.0 --port 8080 --disable-host-check -else - ${NG} build && node ./server.js -fi diff --git a/ui/tsconfig.json b/ui/tsconfig.json index 188b91d9..8731b52c 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -1,18 +1,11 @@ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "src", - "paths": { - "@app/*": ["app/*"], - "@connections/*": ["app/connections/*"], - "@core/*": ["app/core/*"], - "@dataservices/*": ["app/dataservices/*"], - "@environments/*": ["environments/*"], - "@shared/*": ["app/shared/*"] - }, + "baseUrl": "./", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, + "module": "es2015", "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, @@ -23,6 +16,14 @@ "lib": [ "es2017", "dom" - ] + ], + "paths": { + "beetle-lib": [ + "dist/beetle-lib" + ], + "beetle-lib/*": [ + "dist/beetle-lib/*" + ] + } } -} +} \ No newline at end of file diff --git a/ui/tslint.json b/ui/tslint.json index a6859687..6ddb6b29 100644 --- a/ui/tslint.json +++ b/ui/tslint.json @@ -1,20 +1,8 @@ { - "extends": [ - "tslint:recommended" - ], "rulesDirectory": [ "node_modules/codelyzer" ], "rules": { - "adjacent-overload-signatures": false, - "align": [ - true, - "members", - "parameters", - "statements" - ], - "angular-whitespace": false, - "array-type": false, "arrow-return-shorthand": true, "callable-types": true, "class-name": true, @@ -22,49 +10,41 @@ true, "check-space" ], - "component-class-suffix": true, - "component-selector": false, - "curly": false, - "deprecation": true, - "directive-class-suffix": true, - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], + "curly": true, + "deprecation": { + "severity": "warn" + }, "eofline": true, "forin": true, "import-blacklist": [ true, - "rxjs" + "rxjs/Rx" ], "import-spacing": true, "indent": [ true, "spaces" ], - "interface-name": false, "interface-over-type-literal": true, - "invoke-injectable": true, "label-position": true, - "max-classes-per-file": [true, 1], "max-line-length": [ true, 140 ], - "max-line-length": false, - "member-access": true, + "member-access": false, "member-ordering": [ true, - "static-before-instance", - "variables-before-functions" + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } ], - "new-parens": true, - "no-access-missing-member": true, "no-arg": true, "no-bitwise": true, - "no-consecutive-blank-lines": [ true ], "no-console": [ true, "debug", @@ -75,21 +55,17 @@ ], "no-construct": true, "no-debugger": true, - "no-duplicate-imports": false, "no-duplicate-super": true, - "no-empty": true, + "no-empty": false, "no-empty-interface": true, "no-eval": true, - "no-input-rename": true, - "no-output-rename": true, "no-inferrable-types": [ true, "ignore-params" ], "no-misused-new": true, - "no-namespace": false, "no-non-null-assertion": true, - "no-parameter-properties": true, + "no-redundant-jsdoc": true, "no-shadowed-variable": true, "no-string-literal": false, "no-string-throw": true, @@ -99,43 +75,28 @@ "no-unused-expression": true, "no-use-before-declare": true, "no-var-keyword": true, - "object-literal-key-quotes": false, "object-literal-sort-keys": false, "one-line": [ true, "check-open-brace", "check-catch", + "check-else", "check-whitespace" ], - "one-variable-per-declaration": [ - true, - "ignore-for-loop" - ], - "ordered-imports": [ - false - ], "prefer-const": true, "quotemark": [ - false + true, + "single" ], "radix": true, - "restrict-plus-operands": false, "semicolon": [ true, "always" ], - "switch-default": true, - "templates-use-public": true, - "trailing-comma": false, "triple-equals": [ true, "allow-null-check" ], - "typedef": [ - true, - "call-signature", - "property-declaration" - ], "typedef-whitespace": [ true, { @@ -146,26 +107,25 @@ "variable-declaration": "nospace" } ], - "typeof-compare": true, "unified-signatures": true, - "variable-name": [ - true, - "ban-keywords" - ], + "variable-name": false, "whitespace": [ true, "check-branch", "check-decl", "check-operator", - "check-module", - "check-preblock", "check-separator", "check-type" ], - "use-host-property-decorator": true, + "no-output-on-prefix": true, "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 + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true } } diff --git a/ui/ui-0.0.0.tgz b/ui/ui-0.0.0.tgz new file mode 100644 index 00000000..7fbbf953 Binary files /dev/null and b/ui/ui-0.0.0.tgz differ