From c08f5c672b1f848d1cf62f275269cd8e2b76616e Mon Sep 17 00:00:00 2001 From: William Welling Date: Wed, 12 Jul 2017 14:33:16 -0500 Subject: [PATCH 01/29] dependency upgrades, server and platform module updates, linting wip --- README.md | 197 +- app.json | 12 - app.yaml | 17 + config/environment.default.js | 42 +- config/environment.test.js | 30 + e2e/app.e2e-spec.ts | 6 +- e2e/pagenotfound/pagenotfound.e2e-spec.ts | 10 +- e2e/pagenotfound/pagenotfound.po.ts | 9 +- empty.js | 7 - helpers.js | 24 - karma.conf.js | 74 +- package.json | 298 +- postcss.config.js | 8 + postcss.config.json | 9 - protractor.conf.js | 26 +- resources/data/.gitkeep | 0 resources/data/en/.gitkeep | 0 resources/data/en/test.json | 5 + rollup-client.js | 16 - rollup-server.js | 16 - rollup.config.js | 21 + src/app/app-routing.module.ts | 1 + src/app/app.component.scss | 9 + src/app/app.component.spec.ts | 35 +- src/app/app.component.ts | 47 +- src/app/app.effects.ts | 2 + src/app/app.module.ts | 55 +- src/app/{app.reducers.ts => app.reducer.ts} | 26 +- src/app/browser-app.module.ts | 76 + .../collection-page.component.ts | 12 +- .../community-page.component.html | 8 +- .../community-page.component.ts | 8 +- ...ty-page-sub-collection-list.component.scss | 2 +- ...nity-page-sub-collection-list.component.ts | 28 +- .../core/cache/builders/build-decorators.ts | 14 +- .../builders/remote-data-build.service.ts | 22 +- .../models/normalized-dspace-object.model.ts | 2 +- .../core/cache/models/sort-options.model.ts | 2 +- .../core/cache/object-cache.reducer.spec.ts | 6 +- .../core/cache/object-cache.service.spec.ts | 15 +- src/app/core/cache/object-cache.service.ts | 4 +- src/app/core/cache/response-cache.models.ts | 3 +- .../core/cache/response-cache.reducer.spec.ts | 4 +- src/app/core/cache/response-cache.reducer.ts | 4 +- src/app/core/cache/response-cache.service.ts | 10 +- src/app/core/core.module.ts | 4 +- src/app/core/data/collection-data.service.ts | 2 +- src/app/core/data/item-data.service.ts | 2 +- src/app/core/data/remote-data.ts | 8 +- src/app/core/data/request-cache.effects.ts | 2 - src/app/core/data/request.effects.ts | 12 +- src/app/core/data/request.models.ts | 2 +- src/app/core/data/request.reducer.ts | 6 +- src/app/core/data/request.service.ts | 6 +- .../dspace-rest-v2/dspace-rest-v2.schema.json | 9 +- .../dspace-rest-v2.serializer.ts | 10 +- .../dspace-rest-v2.validator.ts | 2 +- src/app/core/footer/footer.component.scss | 5 +- src/app/core/footer/footer.component.ts | 2 +- src/app/core/shared/dspace-object.model.ts | 136 +- src/app/core/shared/generic-constructor.ts | 1 - src/app/core/shared/item.model.spec.ts | 174 +- src/app/core/shared/item.model.ts | 126 +- src/app/core/shared/metadatum.model.ts | 30 +- src/app/core/shared/resource-type.ts | 12 +- src/app/core/url-combiner/ui-url-combiner.ts | 2 +- src/app/core/url-combiner/url-combiner.ts | 2 +- src/app/header/header.actions.ts | 22 +- src/app/header/header.component.scss | 2 +- src/app/header/header.component.spec.ts | 4 +- src/app/header/header.component.ts | 2 +- src/app/header/header.effects.spec.ts | 6 +- src/app/home/home-news/home-news.component.ts | 2 +- src/app/home/home.component.ts | 2 +- .../top-level-community-list.component.ts | 10 +- .../collections/collections.component.ts | 40 +- .../metadata-field-wrapper.component.html | 2 +- .../metadata-field-wrapper.component.scss | 9 +- .../metadata-field-wrapper.component.ts | 2 +- .../metadata-uri-values.component.ts | 2 +- .../metadata-values.component.ts | 2 +- .../full-file-section.component.ts | 50 +- .../full/full-item-page.component.ts | 36 +- .../item-page/simple/item-page.component.ts | 44 +- .../collection-list-element.component.ts | 20 +- .../community-list-element.component.ts | 20 +- .../item-list-element.component.ts | 20 +- .../object-list-element.component.ts | 22 +- .../pagenotfound/pagenotfound.component.ts | 2 +- src/app/server-app.module.ts | 98 + .../comcol-page-content.component.ts | 4 +- .../comcol-page-header.component.ts | 2 +- .../comcol-page-logo.component.ts | 2 +- src/app/shared/ngrx/type.ts | 5 + .../object-list/object-list.component.ts | 137 +- .../pagination-component-options.model.ts | 6 +- .../pagination/pagination.component.spec.ts | 277 +- .../shared/pagination/pagination.component.ts | 634 +-- src/app/shared/shared.module.ts | 40 +- ...{router-stubs.ts => active-router-stub.ts} | 11 +- .../testing/host-window-service-stub.ts | 19 + src/app/shared/testing/mock-action.ts | 6 + src/app/shared/testing/mock-store.ts | 7 +- .../shared/testing/mock-translate-loader.ts | 4 +- src/app/shared/testing/router-stub.ts | 4 + src/app/shared/testing/test.component.ts | 28 + src/app/shared/utils/enum-keys-pipe.ts | 21 +- src/app/shared/utils/file-size-pipe.ts | 42 +- src/app/shared/utils/safe-url-pipe.ts | 12 +- src/app/shared/utils/truncate.pipe.ts | 11 +- src/app/shared/window.service.ts | 3 +- src/app/store.actions.ts | 23 +- src/app/store.effects.ts | 30 + src/app/thumbnail/thumbnail.component.scss | 2 +- src/app/thumbnail/thumbnail.component.spec.ts | 83 +- src/app/thumbnail/thumbnail.component.ts | 17 +- src/{ => app}/typings.d.ts | 8 +- src/backend/api.ts | 321 +- src/backend/bitstreams.ts | 83 - src/backend/bundles.ts | 61 - src/backend/cache.ts | 6 +- src/backend/data/bitstreams.json | 123 + src/backend/data/bundles.json | 78 + .../{collections.ts => data/collections.json} | 43 +- .../{communities.ts => data/communities.json} | 29 +- src/backend/{items.ts => data/items.json} | 249 +- .../{metadata.ts => data/metadata.json} | 7 +- src/backend/db.ts | 2 +- src/client.aot.ts | 36 - src/client.ts | 38 - src/config.ts | 93 +- src/config/cache-config.interface.ts | 4 + src/config/global-config.interface.ts | 12 + src/config/server-config.interface.ts | 7 + src/index.html | 10 +- src/main.browser.ts | 31 + src/main.server.aot.ts | 128 + src/main.server.ts | 116 + src/modules/cookies/browser-cookies.module.ts | 13 + src/modules/cookies/browser-cookies.ts | 34 + src/modules/cookies/cookies.ts | 9 + src/modules/cookies/server-cookies.module.ts | 13 + src/modules/cookies/server-cookies.ts | 24 + .../data-loader/browser-data-loader.module.ts | 13 + .../data-loader/browser-data-loader.ts | 27 + src/modules/data-loader/data-loader.ts | 21 + .../data-loader/server-data-loader.module.ts | 13 + src/modules/data-loader/server-data-loader.ts | 28 + .../transfer-http/transfer-http.module.ts | 12 + src/modules/transfer-http/transfer-http.ts | 132 + .../browser-transfer-state.module.ts | 12 + .../transfer-state/browser-transfer-state.ts | 46 + .../server-transfer-state.module.ts | 12 + .../transfer-state/server-transfer-state.ts | 37 + src/modules/transfer-state/transfer-state.ts | 40 + .../browser-transfer-store.effects.ts | 28 + .../browser-transfer-store.module.ts | 12 + .../server-transfer-store.effects.ts | 36 + .../server-transfer-store.module.ts | 12 + .../transfer-store/transfer-store.effects.ts | 3 + src/modules/translate-universal-loader.ts | 16 + src/platform/angular2-meta.ts | 194 - src/platform/modules/browser.module.ts | 129 - src/platform/modules/node.module.ts | 105 - .../workarounds/__workaround.browser.ts | 21 - src/platform/workarounds/__workaround.node.ts | 44 - src/routes.ts | 7 + src/server.aot.ts | 128 - src/server.routes.ts | 14 - src/server.ts | 125 - src/styles/_mixins.scss | 5 +- src/styles/main.scss | 10 - src/styles/variables.scss | 40 +- src/tsconfig.browser.json | 9 + src/tsconfig.server.aot.json | 11 + src/tsconfig.server.json | 9 + src/tsconfig.test.json | 12 + tsconfig.aot.json | 39 - tsconfig.json | 45 +- tslint.json | 158 +- typedoc.json | 34 +- webpack.config.ts | 192 +- webpack.prod.config.ts | 176 - webpack/helpers.js | 13 + webpack/webpack.client.js | 24 + webpack/webpack.common.js | 102 + webpack/webpack.prod.js | 60 + webpack/webpack.server.js | 11 + .../webpack.test.js | 134 +- yarn.lock | 3501 +++++++++++------ 190 files changed, 6337 insertions(+), 4719 deletions(-) delete mode 100644 app.json create mode 100644 app.yaml create mode 100644 config/environment.test.js delete mode 100644 empty.js delete mode 100644 helpers.js create mode 100644 postcss.config.js delete mode 100644 postcss.config.json create mode 100644 resources/data/.gitkeep create mode 100644 resources/data/en/.gitkeep create mode 100644 resources/data/en/test.json delete mode 100644 rollup-client.js delete mode 100644 rollup-server.js create mode 100644 rollup.config.js rename src/app/{app.reducers.ts => app.reducer.ts} (56%) create mode 100644 src/app/browser-app.module.ts create mode 100644 src/app/server-app.module.ts rename src/app/shared/testing/{router-stubs.ts => active-router-stub.ts} (76%) create mode 100644 src/app/shared/testing/host-window-service-stub.ts create mode 100644 src/app/shared/testing/mock-action.ts create mode 100644 src/app/shared/testing/router-stub.ts create mode 100644 src/app/shared/testing/test.component.ts create mode 100644 src/app/store.effects.ts rename src/{ => app}/typings.d.ts (94%) delete mode 100644 src/backend/bitstreams.ts delete mode 100644 src/backend/bundles.ts create mode 100644 src/backend/data/bitstreams.json create mode 100644 src/backend/data/bundles.json rename src/backend/{collections.ts => data/collections.json} (86%) rename src/backend/{communities.ts => data/communities.json} (90%) rename src/backend/{items.ts => data/items.json} (67%) rename src/backend/{metadata.ts => data/metadata.json} (99%) delete mode 100644 src/client.aot.ts delete mode 100644 src/client.ts create mode 100644 src/config/cache-config.interface.ts create mode 100644 src/config/global-config.interface.ts create mode 100644 src/config/server-config.interface.ts create mode 100644 src/main.browser.ts create mode 100644 src/main.server.aot.ts create mode 100644 src/main.server.ts create mode 100644 src/modules/cookies/browser-cookies.module.ts create mode 100644 src/modules/cookies/browser-cookies.ts create mode 100644 src/modules/cookies/cookies.ts create mode 100644 src/modules/cookies/server-cookies.module.ts create mode 100644 src/modules/cookies/server-cookies.ts create mode 100644 src/modules/data-loader/browser-data-loader.module.ts create mode 100644 src/modules/data-loader/browser-data-loader.ts create mode 100644 src/modules/data-loader/data-loader.ts create mode 100644 src/modules/data-loader/server-data-loader.module.ts create mode 100644 src/modules/data-loader/server-data-loader.ts create mode 100644 src/modules/transfer-http/transfer-http.module.ts create mode 100644 src/modules/transfer-http/transfer-http.ts create mode 100644 src/modules/transfer-state/browser-transfer-state.module.ts create mode 100644 src/modules/transfer-state/browser-transfer-state.ts create mode 100644 src/modules/transfer-state/server-transfer-state.module.ts create mode 100644 src/modules/transfer-state/server-transfer-state.ts create mode 100644 src/modules/transfer-state/transfer-state.ts create mode 100644 src/modules/transfer-store/browser-transfer-store.effects.ts create mode 100644 src/modules/transfer-store/browser-transfer-store.module.ts create mode 100644 src/modules/transfer-store/server-transfer-store.effects.ts create mode 100644 src/modules/transfer-store/server-transfer-store.module.ts create mode 100644 src/modules/transfer-store/transfer-store.effects.ts create mode 100644 src/modules/translate-universal-loader.ts delete mode 100644 src/platform/angular2-meta.ts delete mode 100755 src/platform/modules/browser.module.ts delete mode 100755 src/platform/modules/node.module.ts delete mode 100644 src/platform/workarounds/__workaround.browser.ts delete mode 100644 src/platform/workarounds/__workaround.node.ts create mode 100644 src/routes.ts delete mode 100644 src/server.aot.ts delete mode 100644 src/server.routes.ts delete mode 100644 src/server.ts delete mode 100644 src/styles/main.scss create mode 100644 src/tsconfig.browser.json create mode 100644 src/tsconfig.server.aot.json create mode 100644 src/tsconfig.server.json create mode 100644 src/tsconfig.test.json delete mode 100644 tsconfig.aot.json delete mode 100644 webpack.prod.config.ts create mode 100644 webpack/helpers.js create mode 100644 webpack/webpack.client.js create mode 100644 webpack/webpack.common.js create mode 100644 webpack/webpack.prod.js create mode 100644 webpack/webpack.server.js rename webpack.test.config.js => webpack/webpack.test.js (69%) diff --git a/README.md b/README.md index d979af0d4c9..6fb272925b2 100644 --- a/README.md +++ b/README.md @@ -91,13 +91,15 @@ To change the default configuration values, create local files that override the To use the configuration parameters in your component: ```bash -import { GlobalConfig } from "../config"; +import { GLOBAL_CONFIG, GlobalConfig } from '../config'; + +constructor(@Inject(GLOBAL_CONFIG) public config: GlobalConfig) {} ``` Running the app --------------- -After you have installed all dependencies you can now run the app. Run `yarn run watch:dev` to start a local server which will watch for changes, rebuild the code, and reload the server for you. You can visit it at `http://localhost:3000`. +After you have installed all dependencies you can now run the app. Run `yarn run watch` to start a local server which will watch for changes, rebuild the code, and reload the server for you. You can visit it at `http://localhost:3000`. Running in production mode -------------------------- @@ -113,7 +115,7 @@ yarn start If you only want to build for production, without starting, run: ```bash -yarn run build:prod:ngc:json +yarn run build:prod ``` This will build the application and put the result in the `dist` folder @@ -155,7 +157,7 @@ If you are going to use a remote test enviroment you need to edit the './protrac The default browser is Google Chrome. -Protractor needs a functional instance of the DSpace interface to run the E2E tests, so you need to run:`yarn run watch:dev` +Protractor needs a functional instance of the DSpace interface to run the E2E tests, so you need to run:`yarn run watch` or any command that bring up the DSpace interface. @@ -171,6 +173,17 @@ To run all the tests (e.g.: to run tests with Continuous Integration software) y Run:`yarn run docs` to produce the documentation that will be available in the 'doc' folder. +Deploy +------ + +```bash +# deploy production in standalone pm2 container +yarn run deploy + +# remove production from standalone pm2 container +yarn run undeploy +``` + Other commands -------------- @@ -201,87 +214,105 @@ See [the guide on the wiki](https://wiki.duraspace.org/display/DSPACE/DSpace+7+- File Structure -------------- +Descriptions coming soon... + ``` dspace-angular -├── README.md * This document -├── app.json * Application manifest file -├── config * Folder for configuration files -│   └── environment.default.js * Default configuration files -├── dist * Folder for e2e test files -├── e2e * -│   ├── app.e2e-spec.ts * -│   ├── app.po.ts * -│   ├── pagenotfound * -│   │   ├── pagenotfound.e2e-spec.ts * -│   │   └── pagenotfound.po.ts * -│   └── tsconfig.json * -├── empty.js * -├── helpers.js * -├── karma.conf.js * Unit Test configuration file -├── nodemon.json * Nodemon (https://nodemon.io/) configuration -├── package.json * This file describes the npm package for this project, its dependencies, scripts, etc. -├── postcss.config.json * PostCSS (http://postcss.org/) configuration file -├── protractor.conf.js * E2E tests configuration file -├── resources * Folder for static resources -│   ├── i18n * Folder for i18n translations -│   │   └── en.json * -│   └── images * Folder for images -│   └── dspace_logo.png * -├── rollup-client.js * Rollup (http://rollupjs.org/) configuration for the client -├── rollup-server.js * Rollup (http://rollupjs.org/) configuration for the server -├── spec-bundle.js * -├── src * The source of the application -│   ├── app * The location of the app module, and root of the application shared by client and server -│   │   ├── app-routing.module.ts * -│   │   ├── app.component.html * -│   │   ├── app.component.scss * -│   │   ├── app.component.spec.ts * -│   │   ├── app.component.ts * -│   │   ├── app.effects.ts * -│   │   ├── app.module.ts * -│   │   ├── app.reducers.ts * -│   │   ├── core * -│   │   ├── header * -│   │   ├── home * -│   │   ├── pagenotfound * -│   │   ├── shared * -│   │   └── store.actions.ts * -│   ├── backend * Folder containing a mock of the REST API, hosted by the express server -│   │   ├── api.ts * -│   │   ├── bitstreams.ts * -│   │   ├── bundles.ts * -│   │   ├── cache.ts * -│   │   ├── collections.ts * -│   │   ├── db.ts * -│   │   ├── items.ts * -│   │   └── metadata.ts * -│   ├── client.aot.ts * The bootstrap file for the client, in production -│   ├── client.ts * The bootstrap file for the client, during development -│   ├── config.ts * File that loads environmental and shareable settings and makes them available to app components -│   ├── index.html * The index.html file -│   ├── platform * -│   │   ├── angular2-meta.ts * -│   │   ├── modules * -│   │   │   ├── browser.module.ts * The root module for the client -│   │   │   └── node.module.ts * The root module for the server -│   │   └── workarounds * -│   │   ├── __workaround.browser.ts * -│   │   └── __workaround.node.ts * -│   ├── server.aot.ts * The express (http://expressjs.com/) config and bootstrap file for the server, in production -│   ├── server.routes.ts * The routes file for the server -│   ├── server.ts * The express (http://expressjs.com/) config and bootstrap file for the server, during development -│   ├── styles * Folder containing global styles. -│   │   ├── main.scss * Global scss file -│   │   └── variables.scss * Global sass variables file -│   └── typings.d.ts * File that allows you to add custom typings for libraries without TypeScript support -├── tsconfig.aot.json * TypeScript config for production builds -├── tsconfig.json * TypeScript config for development build -├── tslint.json * TSLint (https://palantir.github.io/tslint/) configuration -├── typedoc.json * TYPEDOC configuration -├── webpack.config.ts * Webpack (https://webpack.github.io/) config for development builds -├── webpack.prod.config.ts * Webpack (https://webpack.github.io/) config for production builds -├── webpack.test.config.js * Webpack (https://webpack.github.io/) config for testing -└── yarn.lock * Yarn lockfile (https://yarnpkg.com/en/docs/yarn-lock) +. +├── README.md +├── app.yaml +├── config +│   ├── environment.default.js +│   ├── environment.dev.js +│   ├── environment.prod.js +│   └── environment.test.js +├── e2e +│   ├── app.e2e-spec.ts +│   ├── app.po.ts +│   ├── pagenotfound +│   │   ├── pagenotfound.e2e-spec.ts +│   │   └── pagenotfound.po.ts +│   └── tsconfig.json +├── karma.conf.js +├── nodemon.json +├── package.json +├── postcss.config.js +├── protractor.conf.js +├── resources +│   ├── data +│   │   └── en +│   ├── i18n +│   │   └── en.json +│   └── images +│   └── dspace_logo.png +├── rollup.config.js +├── spec-bundle.js +├── src +│   ├── app +│   │   ├── app-routing.module.ts +│   │   ├── app.component.html +│   │   ├── app.component.scss +│   │   ├── app.component.spec.ts +│   │   ├── app.component.ts +│   │   ├── app.effects.ts +│   │   ├── app.module.ts +│   │   ├── app.reducer.ts +│   │   ├── browser-app.module.ts +│   │   ├── collection-page +│   │   ├── community-page +│   │   ├── core +│   │   ├── header +│   │   ├── home +│   │   ├── item-page +│   │   ├── object-list +│   │   ├── pagenotfound +│   │   ├── server-app.module.ts +│   │   ├── shared +│   │   ├── store.actions.ts +│   │   ├── store.effects.ts +│   │   ├── thumbnail +│   │   └── typings.d.ts +│   ├── backend +│   │   ├── api.ts +│   │   ├── cache.ts +│   │   ├── data +│   │   └── db.ts +│   ├── config +│   │   ├── cache-config.interface.ts +│   │   ├── global-config.interface.ts +│   │   └── server-config.interface.ts +│   ├── config.ts +│   ├── index.html +│   ├── main.browser.ts +│   ├── main.server.aot.ts +│   ├── main.server.ts +│   ├── modules +│   │   ├── cookies +│   │   ├── data-loader +│   │   ├── transfer-http +│   │   ├── transfer-state +│   │   ├── transfer-store +│   │   └── translate-universal-loader.ts +│   ├── routes.ts +│   ├── styles +│   │   ├── _mixins.scss +│   │   └── variables.scss +│   ├── tsconfig.browser.json +│   ├── tsconfig.server.aot.json +│   ├── tsconfig.server.json +│   └── tsconfig.test.json +├── tsconfig.json +├── tslint.json +├── typedoc.json +├── webpack +│   ├── helpers.js +│   ├── webpack.client.js +│   ├── webpack.common.js +│   ├── webpack.prod.js +│   ├── webpack.server.js +│   └── webpack.test.js +├── webpack.config.ts +└── yarn.lock ``` 3rd Party Library Installation diff --git a/app.json b/app.json deleted file mode 100644 index 1762bb6b8bd..00000000000 --- a/app.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "Angular 2 Universal Starter", - "description": "Angular 2 Universal starter kit by @AngularClass", - "repository": "https://github.com/angular/universal-starter", - "logo": "https://cloud.githubusercontent.com/assets/1016365/10639063/138338bc-7806-11e5-8057-d34c75f3cafc.png", - "env": { - "NPM_CONFIG_PRODUCTION": { - "description": "Install `webpack` and other development modules when deploying to allow full builds.", - "value": "false" - } - } -} diff --git a/app.yaml b/app.yaml new file mode 100644 index 00000000000..248738be702 --- /dev/null +++ b/app.yaml @@ -0,0 +1,17 @@ +# Copyright 2015-2016, Google, 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. + +# [START app_yaml] +runtime: nodejs +env: flex +# [END app_yaml] diff --git a/config/environment.default.js b/config/environment.default.js index b3f07563788..3db04aafa9e 100644 --- a/config/environment.default.js +++ b/config/environment.default.js @@ -1,28 +1,30 @@ module.exports = { - // The REST API server settings. - "rest": { - "ssl": false, - "address": "dspace7.4science.it", - "port": 80, + // Angular2 UI server settings. + ui: { + ssl: false, + host: 'localhost', + port: 3000, // NOTE: Space is capitalized because 'namespace' is a reserved string in TypeScript - "nameSpace": "/dspace-spring-rest/api" + nameSpace: '/' }, - // Angular2 UI server settings. - "ui": { - "ssl": false, - "address": "localhost", - "port": 3000, + // The REST API server settings. + rest: { + ssl: false, + host: 'dspace7.4science.it', + port: 80, // NOTE: Space is capitalized because 'namespace' is a reserved string in TypeScript - "nameSpace": "/" + nameSpace: '/dspace-spring-rest/api' }, - "cache": { + cache: { // how long should objects be cached for by default - "msToLive": 15 * 60 * 1000, // 15 minute - "control": "max-age=60" // revalidate browser + msToLive: 15 * 60 * 1000, // 15 minute + control: 'max-age=60' // revalidate browser }, - "universal": { - // Angular Universal settings - "preboot": true, - "async": true - } + logDirectory: '.', + // NOTE: rehydrate or replay + // rehydrate will transfer prerender state to browser state, actions do not need to replay + // replay will transfer an array of actions to browser, actions replay automatically + prerenderStrategy: 'replay', + // NOTE: will log all redux actions and transfers in console + debug: true }; diff --git a/config/environment.test.js b/config/environment.test.js new file mode 100644 index 00000000000..02f8004fdef --- /dev/null +++ b/config/environment.test.js @@ -0,0 +1,30 @@ +module.exports = { + // Angular2 UI server settings. + ui: { + ssl: false, + host: 'localhost', + port: 3000, + // NOTE: Space is capitalized because 'namespace' is a reserved string in TypeScript + nameSpace: '/' + }, + // The REST API server settings. + rest: { + ssl: false, + host: 'dspace7.4science.it', + port: 80, + // NOTE: Space is capitalized because 'namespace' is a reserved string in TypeScript + nameSpace: '/dspace-spring-rest/api' + }, + cache: { + // how long should objects be cached for by default + msToLive: 15 * 60 * 1000, // 15 minute + control: 'max-age=60' // revalidate browser + }, + logDirectory: '.', + // NOTE: rehydrate or replay + // rehydrate will transfer prerender state to browser state, actions do not need to replay + // replay will transfer an array of actions to browser, actions replay automatically + prerenderStrategy: 'rehydrate', + // NOTE: will log all redux actions and transfers in console + debug: true +}; diff --git a/e2e/app.e2e-spec.ts b/e2e/app.e2e-spec.ts index 90ea2026e31..79b9f251ddc 100644 --- a/e2e/app.e2e-spec.ts +++ b/e2e/app.e2e-spec.ts @@ -1,6 +1,6 @@ import { ProtractorPage } from './app.po'; -describe('protractor App', function() { +describe('protractor App', () => { let page: ProtractorPage; beforeEach(() => { @@ -9,11 +9,11 @@ describe('protractor App', function() { it('should display title "DSpace"', () => { page.navigateTo(); - expect(page.getPageTitleText()).toEqual('DSpace'); + expect(page.getPageTitleText()).toEqual('DSpace'); }); it('should display header "Welcome to DSpace"', () => { page.navigateTo(); - expect(page.getFirstHeaderText()).toEqual('Welcome to DSpace'); + expect(page.getFirstHeaderText()).toEqual('Welcome to DSpace'); }); }); diff --git a/e2e/pagenotfound/pagenotfound.e2e-spec.ts b/e2e/pagenotfound/pagenotfound.e2e-spec.ts index 7ef3656fe64..bad2036c3ae 100644 --- a/e2e/pagenotfound/pagenotfound.e2e-spec.ts +++ b/e2e/pagenotfound/pagenotfound.e2e-spec.ts @@ -1,19 +1,19 @@ import { ProtractorPage } from './pagenotfound.po'; -describe('protractor PageNotFound', function() { +describe('protractor PageNotFound', () => { let page: ProtractorPage; beforeEach(() => { page = new ProtractorPage(); }); - it('should contain element ds-pagenotfound when navigating to page that doesnt exist"', () => { + it('should contain element ds-pagenotfound when navigating to page that doesnt exist', () => { page.navigateToNonExistingPage(); - expect(page.elementTagExists("ds-pagenotfound")).toEqual(true); + expect(page.elementTagExists('ds-pagenotfound')).toEqual(true); }); - it('should not contain element ds-pagenotfound when navigating to existing page"', () => { + it('should not contain element ds-pagenotfound when navigating to existing page', () => { page.navigateToExistingPage(); - expect(page.elementTagExists("ds-pagenotfound")).toEqual(false); + expect(page.elementTagExists('ds-pagenotfound')).toEqual(false); }); }); diff --git a/e2e/pagenotfound/pagenotfound.po.ts b/e2e/pagenotfound/pagenotfound.po.ts index 12ec7d891e2..a3c02ab644a 100644 --- a/e2e/pagenotfound/pagenotfound.po.ts +++ b/e2e/pagenotfound/pagenotfound.po.ts @@ -1,8 +1,8 @@ import { browser, element, by } from 'protractor'; export class ProtractorPage { - HOMEPAGE : string = "/home"; - NONEXISTINGPAGE : string = "/e9019a69-d4f1-4773-b6a3-bd362caa46f2"; + HOMEPAGE = '/home'; + NONEXISTINGPAGE = '/e9019a69-d4f1-4773-b6a3-bd362caa46f2'; navigateToNonExistingPage() { return browser.get(this.NONEXISTINGPAGE); @@ -11,9 +11,8 @@ export class ProtractorPage { return browser.get(this.HOMEPAGE); } - elementTagExists(tag : string) { + elementTagExists(tag: string) { return element(by.tagName(tag)).isPresent(); } - -} \ No newline at end of file +} diff --git a/empty.js b/empty.js deleted file mode 100644 index b8ab065d5ac..00000000000 --- a/empty.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - NgProbeToken: {}, - _createConditionalRootRenderer: function(rootRenderer, extraTokens, coreTokens) { - return rootRenderer; - }, - __platform_browser_private__: {} -}; diff --git a/helpers.js b/helpers.js deleted file mode 100644 index ed4330d342d..00000000000 --- a/helpers.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @author: @AngularClass - */ -var path = require('path'); - -// Helper functions -var ROOT = path.resolve(__dirname, '.'); - -function hasProcessFlag(flag) { - return process.argv.join('').indexOf(flag) > -1; -} - -function isWebpackDevServer() { - return process.argv[1] && !! (/webpack-dev-server/.exec(process.argv[1])); -} - -function root(args) { - args = Array.prototype.slice.call(arguments, 0); - return path.join.apply(path, [ROOT].concat(args)); -} - -exports.hasProcessFlag = hasProcessFlag; -exports.isWebpackDevServer = isWebpackDevServer; -exports.root = root; diff --git a/karma.conf.js b/karma.conf.js index fcfc62133cc..24c9f34fc6a 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -2,9 +2,11 @@ * @author: @AngularClass */ -module.exports = function(config) { +module.exports = function (config) { - var testWebpackConfig = require('./webpack.test.config.js')({env: 'test'}); + var testWebpackConfig = require('./webpack/webpack.test.js')({ + env: 'test' + }); // Uncomment and change to run tests on a remote Selenium server var webdriverConfig = { @@ -15,7 +17,7 @@ module.exports = function(config) { var configuration = { // base path that will be used to resolve all patterns (e.g. files, exclude) - basePath: '.', + basePath: '', /* * Frameworks to use @@ -33,7 +35,8 @@ module.exports = function(config) { require('karma-mocha-reporter'), require('karma-remap-istanbul'), require('karma-sourcemap-loader'), - require('karma-webpack') + require('karma-webpack'), + require("istanbul-instrumenter-loader") ], // list of files to exclude @@ -44,12 +47,10 @@ module.exports = function(config) { * * we are building the test environment in ./spec-bundle.js */ - files: [ - { - pattern: './spec-bundle.js', - watched: false - } - ], + files: [{ + pattern: './spec-bundle.js', + watched: false + }], /* * preprocess matching files before serving them to the browser @@ -63,18 +64,16 @@ module.exports = function(config) { webpack: testWebpackConfig, coverageReporter: { - reporters: [ - { - type: 'in-memory' - }, { - type: 'json', - subdir: '.', - file: 'coverage-final.json' - }, { - type: 'html', - dir: 'coverage/' - } - ] + reporters: [{ + type: 'in-memory' + }, { + type: 'json', + subdir: '.', + file: 'coverage-final.json' + }, { + type: 'html', + dir: 'coverage/' + }] }, remapCoverageReporter: { @@ -89,9 +88,24 @@ module.exports = function(config) { } }, - // Webpack please don't spam the console when running in karma! + /** + * Webpack please don't spam the console when running in karma! + */ webpackMiddleware: { - stats: 'errors-only' + /** + * webpack-dev-middleware configuration + * i.e. + */ + noInfo: true, + /** + * and use stats to turn off verbose output + */ + stats: { + /** + * options i.e. + */ + chunks: false + } }, /* @@ -114,10 +128,10 @@ module.exports = function(config) { * level of logging * possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG */ - logLevel: config.LOG_INFO, + logLevel: config.LOG_WARN, // enable / disable watching file and executing tests whenever any file changes - //autoWatch: true, + autoWatch: false, /* * start these browsers @@ -125,9 +139,6 @@ module.exports = function(config) { */ browsers: [ 'Chrome' - //'ChromeTravisCi', - //'SeleniumChrome', - //'SeleniumFirefox' ], customLaunchers: { @@ -156,11 +167,6 @@ module.exports = function(config) { browserNoActivityTimeout: 30000 - /* - * Continuous Integration mode - * if true, Karma captures browsers, runs the tests and exits - */ - //singleRun: true }; if (process.env.TRAVIS) { diff --git a/package.json b/package.json index 91130f62a03..fc5366e8d50 100644 --- a/package.json +++ b/package.json @@ -1,187 +1,197 @@ { "name": "dspace-angular", - "version": "0.0.0", - "description": "Angular 2 Universal UI for DSpace", + "version": "0.0.1", + "description": "Angular Universal UI for DSpace", "repository": { "type": "git", "url": "https://github.com/dspace/dspace-angular.git" }, + "license": "BSD-2-Clause", + "engines": { + "node": ">=5.0.0" + }, "scripts": { + "global": "npm install -g @angular/cli marked node-gyp nodemon node-nightly npm-check-updates npm-run-all rimraf typescript ts-node typedoc webpack webpack-bundle-analyzer pm2 rollup", + "clean:coverage": "rimraf coverage", + "clean:dist": "rimraf dist", + "clean:doc": "rimraf doc", "clean:log": "rimraf *.log*", - "clean:dist": "rimraf dist/*", - "clean:node": "rimraf node_modules", - "clean:ngc": "rimraf **/*.ngfactory.ts", "clean:json": "rimraf *.records.json", - "clean:css": "rimraf src/**/*.css", - "clean:css:ts": "rimraf src/**/*.css.ts", - "clean:scss:ts": "rimraf src/**/*.scss.ts", - "clean:css:shim:ts": "rimraf src/**/*.css.shim.ts", - "clean:scss:shim:ts": "rimraf src/**/*.scss.shim.ts", - "clean:coverage": "rimraf coverage", - "clean:prod": "yarn run clean:ngc && yarn run clean:json && yarn run clean:css && yarn run clean:css:ts && yarn run clean:scss:ts && yarn run clean:css:shim:ts && yarn run clean:scss:shim:ts && yarn run clean:dist", - "clean": "yarn run clean:log && yarn run clean:prod && yarn run clean:coverage && yarn run clean:node", - "sass": "node-sass src -o src --include-path node_modules --output-style compressed -q", - "postcss": "node node_modules/postcss-cli/bin/postcss -c postcss.config.json", - "style": "yarn run sass && yarn run postcss", - "style:watch": "nodemon -e scss -w src -x \"yarn run style\"", - "rollup": "rollup -c rollup-server.js && rollup -c rollup-client.js", - "prebuild": "yarn run clean:dist && yarn run style", + "clean:node": "rimraf node_modules", + "clean:prod": "yarn run clean:coverage && yarn run clean:doc && yarn run clean:dist && yarn run clean:log && yarn run clean:json ", + "clean": "yarn run clean:prod && yarn run clean:node", + "prebuild": "yarn run clean:dist", + "prebuild:aot": "yarn run prebuild", + "prebuild:prod": "yarn run prebuild", "build": "webpack --progress", - "build:prod": "webpack --config webpack.prod.config.ts", - "build:prod:rollup": "yarn run build:prod && yarn run rollup", - "build:prod:ngc": "yarn run clean:prod && yarn run style && yarn run ngc && yarn run build:prod:rollup", - "build:prod:ngc:json": "yarn run clean:prod && yarn run style && yarn run ngc && yarn run build:prod:json:rollup", - "build:prod:json": "webpack --config webpack.prod.config.ts --json | webpack-bundle-size-analyzer", - "build:prod:json:rollup": "yarn run build:prod:json && yarn run rollup", - "ngc": "ngc -p tsconfig.aot.json", - "prestart": "yarn run build:prod:ngc:json", - "server": "node dist/server/index.js", - "server:dev": "node dist/server/index.js", - "server:dev:watch": "nodemon --debug dist/server/index.js", + "build:aot": "webpack --env.aot --env.server && webpack --env.aot --env.client", + "build:prod": "webpack --env.aot --env.server -p && webpack --env.aot --env.client -p", + "postbuild:prod": "yarn run rollup", + "rollup": "rollup -c rollup.config.js", + "prestart": "yarn run build:prod", + "prestart:dev": "yarn run build", "start": "yarn run server", - "start:dev": "yarn run clean:prod && yarn run build && yarn run server:dev", - "watch": "webpack -w & yarn run style:watch", - "watch:dev:server": "npm-run-all -p server:dev:watch watch", - "watch:dev": "yarn run clean:prod && yarn run build && yarn run watch:dev:server", - "watch:prod:server": "npm-run-all -p server watch", - "watch:prod": "yarn run build:prod:ngc:json && yarn run watch:prod:server", + "start:dev": "yarn run server", + "deploy": "pm2 start dist/server.js", + "predeploy": "npm run build:prod", + "preundeploy": "pm2 stop dist/server.js", + "undeploy": "pm2 delete dist/server.js", + "postundeploy": "npm run clean:dist", + "server": "node dist/server.js", + "server:watch": "nodemon dist/server.js", + "server:watch:debug": "nodemon --debug dist/server.js", + "webpack:watch": "webpack -w", + "webpack:watch:aot": "webpack -w --env.aot --env.server && webpack -w --env.aot --env.client", + "webpack:watch:prod": "webpack -w --env.aot --env.server -p && webpack -w --env.aot --env.client -p", + "watch": "yarn run build && npm-run-all -p webpack:watch server:watch", + "watch:aot": "yarn run build:aot && npm-run-all -p webpack:watch:aot server:watch", + "watch:prod": "yarn run build:prod && npm-run-all -p webpack:watch:prod server:watch", + "watch:debug": "yarn run build && npm-run-all -p webpack:watch server:watch:debug", + "watch:debug:aot": "yarn run build:aot && npm-run-all -p webpack:watch:aot server:watch:debug", + "watch:debug:prod": "yarn run build:prod && npm-run-all -p webpack:watch:prod server:watch:debug", "predebug": "yarn run build", - "debug": "node --debug-brk dist/server/index.js", - "debug:server": "node-nightly --inspect --debug-brk dist/server/index.js", - "debug:start": "yarn run build && yarn run debug:server", + "predebug:server": "yarn run build", + "debug": "node --debug-brk dist/server.js", + "debug:server": "node-nightly --inspect --debug-brk dist/server.js", "debug:build": "node-nightly --inspect --debug-brk node_modules/webpack/bin/webpack.js", - "debug:build:prod": "node-nightly --inspect --debug-brk node_modules/webpack/bin/webpack.js --config webpack.prod.config.ts", - "docs": "typedoc --options typedoc.json ./src/", - "lint": "tslint \"src/**/*.ts\" || true", - "global": "npm install -g @angular/cli nodemon npm-check-updates rimraf ts-node typedoc typescript webpack webpack-bundle-size-analyzer rollup marked node-gyp", - "ci": "yarn run lint && yarn run build:prod:ngc:json && yarn run test && npm-run-all -p -r server e2e", + "debug:build:prod": "node-nightly --inspect --debug-brk node_modules/webpack/bin/webpack.js --env.aot --env.client --env.server -p", + "ci": "yarn run lint && yarn run build:aot && yarn run test && npm-run-all -p -r server e2e", "protractor": "node node_modules/protractor/bin/protractor", "pree2e": "yarn run webdriver:update", "e2e": "yarn run protractor", "test": "karma start --single-run", "test:watch": "karma start --no-single-run --auto-watch", - "coverage": "http-server -c-1 -o -p 9875 ./coverage", "webdriver:start": "node node_modules/protractor/bin/webdriver-manager start --seleniumPort 4444", - "webdriver:update": "node node_modules/protractor/bin/webdriver-manager update --standalone" + "webdriver:update": "node node_modules/protractor/bin/webdriver-manager update --standalone", + "lint": "tslint \"src/**/*.ts\" || true && tslint \"e2e/**/*.ts\" || true", + "docs": "typedoc --options typedoc.json ./src/", + "coverage": "http-server -c-1 -o -p 9875 ./coverage" }, "dependencies": { - "@angular/common": "2.2.3", - "@angular/compiler": "2.2.3", - "@angular/compiler-cli": "2.2.3", - "@angular/core": "2.2.3", - "@angular/forms": "2.2.3", - "@angular/http": "2.2.3", - "@angular/platform-browser": "2.2.3", - "@angular/platform-browser-dynamic": "2.2.3", - "@angular/platform-server": "2.2.3", - "@angular/router": "3.2.3", - "@angular/upgrade": "2.2.3", + "@angular/animations": "4.2.6", + "@angular/common": "4.2.6", + "@angular/core": "4.2.6", + "@angular/forms": "4.2.6", + "@angular/http": "4.2.6", + "@angular/platform-browser": "4.2.6", + "@angular/platform-browser-dynamic": "4.2.6", + "@angular/platform-server": "4.2.6", + "@angular/router": "4.2.6", "@angularclass/bootloader": "1.0.1", "@angularclass/idle-preload": "1.0.4", - "@ng-bootstrap/ng-bootstrap": "1.0.0-alpha.18", - "@ngrx/core": "^1.2.0", - "@ngrx/effects": "2.0.2", - "@ngrx/router-store": "^1.2.5", - "@ngrx/store": "^2.2.1", - "@ngrx/store-devtools": "^3.2.2", - "@ngx-translate/core": "^6.0.1", - "@ngx-translate/http-loader": "^0.0.3", - "@types/jsonschema": "0.0.5", - "angular2-express-engine": "2.1.0-rc.1", - "angular2-platform-node": "2.1.0-rc.1", - "angular2-universal": "2.1.0-rc.1", - "angular2-universal-polyfills": "2.1.0-rc.1", - "body-parser": "1.15.2", + "@ng-bootstrap/ng-bootstrap": "1.0.0-alpha.28", + "@ngrx/core": "1.2.0", + "@ngrx/effects": "2.0.4", + "@ngrx/router-store": "1.2.6", + "@ngrx/store": "2.2.3", + "@nguniversal/express-engine": "1.0.0-beta.2", + "@ngx-translate/core": "7.0.0", + "@ngx-translate/http-loader": "0.1.0", + "body-parser": "1.17.2", "bootstrap": "4.0.0-alpha.6", - "cerialize": "^0.1.13", - "compression": "1.6.2", - "express": "4.14.0", + "cerialize": "0.1.15", + "compression": "1.7.0", + "cookie-parser": "1.4.3", + "core-js": "2.4.1", + "express": "4.15.3", + "express-session": "1.15.3", "font-awesome": "4.7.0", - "http-server": "^0.9.0", + "http-server": "0.10.0", + "https": "1.0.0", "js.clone": "0.0.3", - "jsonschema": "^1.1.1", + "jsonschema": "1.1.1", "methods": "1.1.2", - "morgan": "1.7.0", - "ng2-pagination": "^2.0.0", - "preboot": "4.5.2", - "reflect-metadata": "^0.1.10", - "rxjs": "5.0.0-beta.12", - "ts-md5": "^1.2.0", - "webfontloader": "1.6.27", - "zone.js": "0.6.26" + "morgan": "1.8.2", + "ng2-pagination": "2.0.2", + "pem": "1.9.7", + "reflect-metadata": "0.1.10", + "rxjs": "5.4.2", + "ts-md5": "1.2.0", + "webfontloader": "1.6.28", + "zone.js": "0.8.12" }, "devDependencies": { - "@ngtools/webpack": "1.1.9", - "@types/body-parser": "0.0.33", - "@types/compression": "0.0.33", + "@angular/compiler": "4.2.6", + "@angular/compiler-cli": "4.2.6", + "@ngrx/store-devtools": "3.2.4", + "@ngtools/webpack": "1.5.0", "@types/cookie-parser": "1.3.30", - "@types/deep-freeze": "0.0.29", - "@types/express": "4.0.34", - "@types/express-serve-static-core": "4.0.39", - "@types/hammerjs": "2.0.33", - "@types/jasmine": "2.5.41", + "@types/deep-freeze": "0.1.1", + "@types/express": "4.0.36", + "@types/express-serve-static-core": "4.0.49", + "@types/hammerjs": "2.0.34", + "@types/jasmine": "2.5.53", "@types/lodash": "ts2.0", "@types/memory-cache": "0.0.29", - "@types/mime": "0.0.29", - "@types/morgan": "1.7.32", - "@types/node": "6.0.52", + "@types/mime": "1.3.1", + "@types/node": "8.0.10", "@types/serve-static": "1.7.31", - "@types/webfontloader": "1.6.27", - "ajv": "4.2.0", - "ajv-keywords": "1.1.1", - "angular2-template-loader": "0.6.0", - "autoprefixer": "6.5.4", - "awesome-typescript-loader": "2.2.4", - "codelyzer": "2.0.0-beta.3", - "cookie-parser": "1.4.3", + "@types/source-map": "0.5.0", + "@types/webfontloader": "1.6.28", + "ajv": "5.2.2", + "ajv-keywords": "2.1.0", + "angular2-template-loader": "0.6.2", + "autoprefixer": "7.1.2", + "awesome-typescript-loader": "3.2.1", + "codelyzer": "3.1.2", + "compression-webpack-plugin": "0.4.0", "copy-webpack-plugin": "4.0.1", - "css-loader": "^0.26.0", + "css-loader": "0.28.4", "deep-freeze": "0.0.1", - "html-webpack-plugin": "^2.21.0", - "imports-loader": "0.7.0", - "istanbul-instrumenter-loader": "^0.2.0", - "jasmine-core": "~2.5.2", - "jasmine-spec-reporter": "~2.7.0", + "exports-loader": "0.6.4", + "html-webpack-plugin": "2.29.0", + "imports-loader": "0.7.1", + "istanbul-instrumenter-loader": "2.0.0", + "jasmine-core": "2.6.4", + "jasmine-spec-reporter": "4.1.1", "json-loader": "0.5.4", - "karma": "^1.2.0", - "karma-chrome-launcher": "^2.0.0", - "karma-cli": "^1.0.1", - "karma-coverage": "^1.1.1", - "karma-jasmine": "^1.0.2", - "karma-mocha-reporter": "^2.0.0", - "karma-phantomjs-launcher": "^1.0.2", - "karma-remap-istanbul": "^0.2.1", - "karma-sourcemap-loader": "^0.3.7", - "karma-webdriver-launcher": "^1.0.4", - "karma-webpack": "1.8.0", - "ngrx-store-freeze": "^0.1.9", - "node-sass": "4.0.0", + "karma": "1.7.0", + "karma-chrome-launcher": "2.2.0", + "karma-cli": "1.0.1", + "karma-coverage": "1.1.1", + "karma-jasmine": "1.1.0", + "karma-mocha-reporter": "2.2.3", + "karma-phantomjs-launcher": "1.0.4", + "karma-remap-istanbul": "0.6.0", + "karma-sourcemap-loader": "0.3.7", + "karma-webdriver-launcher": "1.0.5", + "karma-webpack": "2.0.4", + "ngrx-store-freeze": "0.1.9", + "node-sass": "4.5.3", "nodemon": "1.11.0", "npm-run-all": "4.0.2", - "postcss-cli": "^2.6.0", - "protractor": "~4.0.14", - "protractor-istanbul-plugin": "~2.0.0", + "postcss": "6.0.6", + "postcss-apply": "0.8.0", + "postcss-cli": "4.1.0", + "postcss-cssnext": "3.0.2", + "postcss-loader": "2.0.6", + "postcss-responsive-type": "0.5.1", + "postcss-smart-import": "0.7.5", + "protractor": "5.1.2", + "protractor-istanbul-plugin": "2.0.0", "raw-loader": "0.5.1", - "rimraf": "2.5.4", - "rollup": "0.37.0", - "rollup-plugin-commonjs": "6.0.0", + "resolve-url-loader": "2.1.0", + "rimraf": "2.6.1", + "rollup": "0.45.1", + "rollup-plugin-commonjs": "8.0.2", "rollup-plugin-node-globals": "1.1.0", - "rollup-plugin-node-resolve": "2.0.0", - "rollup-plugin-uglify": "1.0.1", - "source-map-loader": "^0.1.5", - "string-replace-loader": "1.0.5", - "to-string-loader": "^1.1.4", + "rollup-plugin-node-resolve": "3.0.0", + "rollup-plugin-uglify": "2.0.1", + "sass-loader": "6.0.6", + "script-ext-html-webpack-plugin": "1.8.3", + "source-map-loader": "0.2.1", + "string-replace-loader": "1.3.0", + "to-string-loader": "1.1.5", "ts-helpers": "1.1.2", - "ts-node": "1.7.2", - "tslint": "4.0.2", - "tslint-loader": "3.3.0", - "typedoc": "0.5.7", - "typescript": "2.0.10", - "v8-lazy-parse-webpack-plugin": "0.3.0", - "webpack": "2.1.0-beta.27", - "webpack-bundle-analyzer": "1.4.1", - "webpack-dev-middleware": "1.9.0", - "webpack-dev-server": "2.1.0-beta.11", - "webpack-merge": "1.1.1" + "ts-node": "3.2.0", + "tslint": "5.1.0", + "tslint-loader": "3.5.3", + "typedoc": "0.7.1", + "typescript": "2.4.1", + "webpack": "2.6.1", + "webpack-bundle-analyzer": "2.8.2", + "webpack-dev-middleware": "1.11.0", + "webpack-dev-server": "2.5.1", + "webpack-merge": "4.1.0" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000000..c499f9da90c --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,8 @@ +module.exports = { + plugins: [ + require('postcss-smart-import')(), + require('postcss-cssnext')(), + require('postcss-apply')(), + require('postcss-responsive-type')() + ] +}; diff --git a/postcss.config.json b/postcss.config.json deleted file mode 100644 index 70df875975d..00000000000 --- a/postcss.config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "use": ["autoprefixer"], - "input": "src/**/*.css", - "replace": true, - "local-plugins": true, - "autoprefixer": { - "browsers": "last 2 versions" - } -} diff --git a/protractor.conf.js b/protractor.conf.js index 56a84875a17..618a5efc083 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -2,7 +2,7 @@ // https://github.com/angular/protractor/blob/master/docs/referenceConf.js /*global jasmine */ -var SpecReporter = require('jasmine-spec-reporter'); +var SpecReporter = require('jasmine-spec-reporter').SpecReporter; exports.config = { allScriptsTimeout: 11000, @@ -28,11 +28,11 @@ exports.config = { // ----------------------------------------------------------------- // Browser and Capabilities: Chrome // ----------------------------------------------------------------- - capabilities: { - 'browserName': 'chrome', - 'version': '', - 'platform': 'ANY' - }, + capabilities: { + 'browserName': 'chrome', + 'version': '', + 'platform': 'ANY' + }, // ----------------------------------------------------------------- // Browser and Capabilities: Firefox // ----------------------------------------------------------------- @@ -63,7 +63,7 @@ exports.config = { // } //], - plugins : [{ + plugins: [{ path: 'node_modules/protractor-istanbul-plugin' }], @@ -71,15 +71,19 @@ exports.config = { jasmineNodeOpts: { showColors: true, defaultTimeoutInterval: 30000, - print: function() {} + print: function () {} }, useAllAngular2AppRoots: true, - beforeLaunch: function() { + beforeLaunch: function () { require('ts-node').register({ project: 'e2e' }); }, - onPrepare: function() { - jasmine.getEnv().addReporter(new SpecReporter()); + onPrepare: function () { + jasmine.getEnv().addReporter(new SpecReporter({ + spec: { + displayStacktrace: true + } + })); } }; diff --git a/resources/data/.gitkeep b/resources/data/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/resources/data/en/.gitkeep b/resources/data/en/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/resources/data/en/test.json b/resources/data/en/test.json new file mode 100644 index 00000000000..728f87a6468 --- /dev/null +++ b/resources/data/en/test.json @@ -0,0 +1,5 @@ +{ + "test": { + "message": "Hello, DSpace!" + } +} diff --git a/rollup-client.js b/rollup-client.js deleted file mode 100644 index 5b1d4f1aa8b..00000000000 --- a/rollup-client.js +++ /dev/null @@ -1,16 +0,0 @@ -import rollup from 'rollup' -import nodeResolve from 'rollup-plugin-node-resolve' -import commonjs from 'rollup-plugin-commonjs'; -import uglify from 'rollup-plugin-uglify' - -export default { - entry : 'dist/client/main.bundle.js', - dest : 'dist/client/main.bundle.js', - sourceMap : false, - format : 'iife', - plugins : [ - nodeResolve({jsnext: true, module: true}), - commonjs({include: 'node_modules/rxjs/**'}), - uglify() - ] -} diff --git a/rollup-server.js b/rollup-server.js deleted file mode 100644 index c88b75a9c68..00000000000 --- a/rollup-server.js +++ /dev/null @@ -1,16 +0,0 @@ -import rollup from 'rollup' -import nodeResolve from 'rollup-plugin-node-resolve' -import commonjs from 'rollup-plugin-commonjs'; -import uglify from 'rollup-plugin-uglify' - -export default { - entry : 'dist/server/index.js', - dest : 'dist/server/index.js', - sourceMap : false, - format : 'iife', - plugins : [ - nodeResolve({jsnext: true, module: true}), - commonjs({include: 'node_modules/rxjs/**'}), - uglify() - ] -} diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000000..68bebc26b09 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,21 @@ +import rollup from 'rollup' +import nodeResolve from 'rollup-plugin-node-resolve' +import commonjs from 'rollup-plugin-commonjs'; +import uglify from 'rollup-plugin-uglify' + +export default { + entry: 'dist/client.js', + dest: 'dist/client.js', + sourceMap: false, + format: 'iife', + plugins: [ + nodeResolve({ + jsnext: true, + module: true + }), + commonjs({ + include: 'node_modules/rxjs/**' + }), + uglify() + ] +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 5099b3899d2..e9344dd9163 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; + @NgModule({ imports: [ RouterModule.forChild([ diff --git a/src/app/app.component.scss b/src/app/app.component.scss index 7b86523886b..a000423c340 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -1,4 +1,13 @@ +@import '../styles/variables.scss'; +@import '../../node_modules/bootstrap/scss/bootstrap.scss'; +@import "../../node_modules/font-awesome/scss/font-awesome.scss"; + +html { + position: relative; + min-height: 100%; +} // Sticky Footer + .outer-wrapper { display: flex; margin: 0; diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 32b2eaae742..86065b4070b 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -5,23 +5,32 @@ import { inject, TestBed } from '@angular/core/testing'; + import { CUSTOM_ELEMENTS_SCHEMA, DebugElement } from "@angular/core"; + +import { CommonModule } from '@angular/common'; + import { By } from '@angular/platform-browser'; + import { TranslateModule, TranslateLoader } from "@ngx-translate/core"; import { Store, StoreModule } from "@ngrx/store"; // Load the implementations that should be tested import { AppComponent } from './app.component'; -import { CommonModule } from '@angular/common'; import { HostWindowState } from "./shared/host-window.reducer"; import { HostWindowResizeAction } from "./shared/host-window.actions"; import { MockTranslateLoader } from "./shared/testing/mock-translate-loader"; -import { GLOBAL_CONFIG, EnvConfig } from '../config'; +import { BrowserCookiesModule } from '../modules/cookies/browser-cookies.module'; +import { BrowserDataLoaderModule } from '../modules/data-loader/browser-data-loader.module'; +import { BrowserTransferStateModule } from '../modules/transfer-state/browser-transfer-state.module'; +import { BrowserTransferStoreModule } from '../modules/transfer-store/browser-transfer-store.module'; + +import { GLOBAL_CONFIG, ENV_CONFIG } from '../config'; import { NativeWindowRef, NativeWindowService } from "./shared/window.service"; let comp: AppComponent; @@ -34,15 +43,23 @@ describe('App component', () => { // async beforeEach beforeEach(async(() => { return TestBed.configureTestingModule({ - imports: [CommonModule, StoreModule.provideStore({}), TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useClass: MockTranslateLoader - } - })], + imports: [ + CommonModule, + StoreModule.provideStore({}), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: MockTranslateLoader + } + }), + BrowserCookiesModule, + BrowserDataLoaderModule, + BrowserTransferStateModule, + BrowserTransferStoreModule + ], declarations: [AppComponent], // declare the test component providers: [ - { provide: GLOBAL_CONFIG, useValue: EnvConfig }, + { provide: GLOBAL_CONFIG, useValue: ENV_CONFIG }, { provide: NativeWindowService, useValue: new NativeWindowRef() }, AppComponent ], diff --git a/src/app/app.component.ts b/src/app/app.component.ts index bd8ff3dd961..cde9e977e69 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,31 +1,37 @@ import { Component, - ChangeDetectionStrategy, Inject, ViewEncapsulation, - OnInit, HostListener + OnInit, + HostListener } from "@angular/core"; import { TranslateService } from "@ngx-translate/core"; -import { HostWindowState } from "./shared/host-window.reducer"; + import { Store } from "@ngrx/store"; +import { TransferState } from '../modules/transfer-state/transfer-state'; + +import { HostWindowState } from "./shared/host-window.reducer"; + import { HostWindowResizeAction } from "./shared/host-window.actions"; -import { EnvConfig, GLOBAL_CONFIG, GlobalConfig } from '../config'; + import { NativeWindowRef, NativeWindowService } from "./shared/window.service"; +import { GLOBAL_CONFIG, GlobalConfig } from '../config'; + @Component({ - changeDetection: ChangeDetectionStrategy.Default, - encapsulation: ViewEncapsulation.Emulated, selector: 'ds-app', + encapsulation: ViewEncapsulation.None, templateUrl: './app.component.html', - styleUrls: ['./app.component.css'] + styleUrls: ['./app.component.scss'] }) export class AppComponent implements OnInit { constructor( - @Inject(GLOBAL_CONFIG) public EnvConfig: GlobalConfig, + @Inject(GLOBAL_CONFIG) public config: GlobalConfig, @Inject(NativeWindowService) private _window: NativeWindowRef, private translate: TranslateService, + private cache: TransferState, private store: Store ) { // this language will be used as a fallback when a translation isn't found in the current language @@ -34,11 +40,20 @@ export class AppComponent implements OnInit { translate.use('en'); } + ngAfterViewChecked() { + this.syncCache(); + } + + syncCache() { + this.store.take(1).subscribe((state: HostWindowState) => { + this.cache.set('state', state); + }); + } + ngOnInit() { - this.onInit(); - const env: string = EnvConfig.production ? "Production" : "Development"; - const color: string = EnvConfig.production ? "red" : "green"; - console.info(`Environment: %c${env}`, `color: ${color}; font-weight: bold;`); + const env: string = this.config.production ? "Production" : "Development"; + const color: string = this.config.production ? "red" : "green"; + console.info(`Environment: %c${env}`, `color: ${color}; font-weight: bold;`); } @HostListener('window:resize', ['$event']) @@ -48,12 +63,4 @@ export class AppComponent implements OnInit { ); } - private onInit(): void { - if (typeof this._window !== 'undefined') { - this.store.dispatch( - new HostWindowResizeAction(this._window.nativeWindow.innerWidth, this._window.nativeWindow.innerHeight) - ); - } - } - } diff --git a/src/app/app.effects.ts b/src/app/app.effects.ts index a82b936ff57..b8199a1a2f2 100644 --- a/src/app/app.effects.ts +++ b/src/app/app.effects.ts @@ -1,8 +1,10 @@ import { EffectsModule } from "@ngrx/effects"; import { HeaderEffects } from "./header/header.effects"; +import { StoreEffects } from "./store.effects"; import { coreEffects } from "./core/core.effects"; export const effects = [ ...coreEffects, //TODO should probably be imported in coreModule + EffectsModule.run(StoreEffects), EffectsModule.run(HeaderEffects) ]; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 8a20dee66d8..759a2fe7acd 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,38 +1,63 @@ import { NgModule } from '@angular/core'; +import { HttpModule } from '@angular/http'; +import { FormsModule } from '@angular/forms'; -import { CoreModule } from './core/core.module'; -import { HomeModule } from './home/home.module'; -import { ItemPageModule } from './item-page/item-page.module'; +import { StoreModule, Store } from "@ngrx/store"; +import { RouterStoreModule } from "@ngrx/router-store"; +import { StoreDevtoolsModule } from "@ngrx/store-devtools"; + +import { rootReducer, AppState } from './app.reducer'; +import { effects } from './app.effects'; +import { CoreModule } from './core/core.module'; import { SharedModule } from './shared/shared.module'; import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { HeaderComponent } from './header/header.component'; + +import { TransferHttpModule } from '../modules/transfer-http/transfer-http.module'; + +import { HomeModule } from './home/home.module'; +import { ItemPageModule } from './item-page/item-page.module'; import { CollectionPageModule } from './collection-page/collection-page.module'; import { CommunityPageModule } from './community-page/community-page.module'; + +import { AppComponent } from './app.component'; +import { HeaderComponent } from './header/header.component'; import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; +import { GLOBAL_CONFIG, ENV_CONFIG } from '../config'; + +export function getConfig() { + return ENV_CONFIG; +} @NgModule({ - declarations: [ - AppComponent, - HeaderComponent, - PageNotFoundComponent, - ], imports: [ SharedModule, + FormsModule, + CoreModule.forRoot(), + HttpModule, + TransferHttpModule, HomeModule, ItemPageModule, CollectionPageModule, CommunityPageModule, - CoreModule.forRoot(), - AppRoutingModule + AppRoutingModule, + StoreModule.provideStore(rootReducer), + RouterStoreModule.connectRouter(), + StoreDevtoolsModule.instrumentOnlyWithExtension(), + effects ], providers: [ - ] + { provide: GLOBAL_CONFIG, useFactory: (getConfig) }, + ], + declarations: [ + AppComponent, + HeaderComponent, + PageNotFoundComponent, + ], + exports: [AppComponent] }) export class AppModule { -} -export { AppComponent } from './app.component'; +} diff --git a/src/app/app.reducers.ts b/src/app/app.reducer.ts similarity index 56% rename from src/app/app.reducers.ts rename to src/app/app.reducer.ts index 2b9e121c388..7e789f5373b 100644 --- a/src/app/app.reducers.ts +++ b/src/app/app.reducer.ts @@ -1,4 +1,4 @@ -import { combineReducers } from "@ngrx/store"; +import { combineReducers, ActionReducer } from "@ngrx/store"; import { routerReducer, RouterState } from "@ngrx/router-store"; import { headerReducer, HeaderState } from './header/header.reducer'; import { hostWindowReducer, HostWindowState } from "./shared/host-window.reducer"; @@ -7,7 +7,7 @@ import { storeFreeze } from 'ngrx-store-freeze'; import { compose } from "@ngrx/core"; import { StoreActionTypes } from "./store.actions"; -import { EnvConfig } from '../config'; +import { ENV_CONFIG } from '../config'; export interface AppState { core: CoreState; @@ -24,16 +24,20 @@ export const reducers = { }; export function rootReducer(state: any, action: any) { - let output; - if (action.type === StoreActionTypes.REHYDRATE) { - state = action.payload; + switch (action.type) { + case StoreActionTypes.REHYDRATE: + state = Object.assign({}, state, action.payload); + break; + case StoreActionTypes.REPLAY: + break; + default: } - if (EnvConfig.production) { - output = combineReducers(reducers)(state, action); + let root: ActionReducer; + // TODO: attempt to not use InjectionToken GLOBAL_CONFIG over GlobalConfig ENV_CONFIG + if (ENV_CONFIG.production) { + root = combineReducers(reducers)(state, action); } else { - output = compose(storeFreeze, combineReducers)(reducers)(state, action); + root = compose(storeFreeze, combineReducers)(reducers)(state, action); } - return output; + return root; } - -export const NGRX_CACHE_KEY = "NGRX_STORE"; diff --git a/src/app/browser-app.module.ts b/src/app/browser-app.module.ts new file mode 100644 index 00000000000..99921a4fbd0 --- /dev/null +++ b/src/app/browser-app.module.ts @@ -0,0 +1,76 @@ +import { NgModule, APP_INITIALIZER } from '@angular/core'; +import { Http } from '@angular/http'; +import { RouterModule } from '@angular/router'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + +import { IdlePreload, IdlePreloadModule } from '@angularclass/idle-preload'; + +import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; + +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +import { EffectsModule } from '@ngrx/effects'; + +import { TransferState } from '../modules/transfer-state/transfer-state'; +import { BrowserCookiesModule } from '../modules/cookies/browser-cookies.module'; +import { BrowserDataLoaderModule } from '../modules/data-loader/browser-data-loader.module'; +import { BrowserTransferStateModule } from '../modules/transfer-state/browser-transfer-state.module'; +import { BrowserTransferStoreEffects } from '../modules/transfer-store/browser-transfer-store.effects'; +import { BrowserTransferStoreModule } from '../modules/transfer-store/browser-transfer-store.module'; + +import { SharedModule } from './shared/shared.module'; +import { CoreModule } from './core/core.module'; +import { AppModule } from './app.module'; + +import { AppComponent } from './app.component'; + +export function init(cache: TransferState) { + return () => { + cache.initialize(); + }; +} + +export function HttpLoaderFactory(http: Http) { + return new TranslateHttpLoader(http, 'assets/i18n/', '.json'); +} + +@NgModule({ + bootstrap: [AppComponent], + imports: [ + BrowserModule.withServerTransition({ + appId: 'ds-app-id' + }), + IdlePreloadModule.forRoot(), // forRoot ensures the providers are only created once + RouterModule.forRoot([], { useHash: false, preloadingStrategy: IdlePreload }), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [Http] + } + }), + NgbModule.forRoot(), + BrowserCookiesModule, + BrowserDataLoaderModule, + BrowserTransferStateModule, + BrowserTransferStoreModule, + EffectsModule.run(BrowserTransferStoreEffects), + BrowserAnimationsModule, + AppModule + ], + providers: [ + { + provide: APP_INITIALIZER, + multi: true, + useFactory: init, + deps: [ + TransferState + ] + } + ] +}) +export class BrowserAppModule { + +} diff --git a/src/app/collection-page/collection-page.component.ts b/src/app/collection-page/collection-page.component.ts index f636f9dd513..2e65e7c9f9b 100644 --- a/src/app/collection-page/collection-page.component.ts +++ b/src/app/collection-page/collection-page.component.ts @@ -18,7 +18,7 @@ import { hasValue } from "../shared/empty.util"; @Component({ selector: 'ds-collection-page', - styleUrls: ['./collection-page.component.css'], + styleUrls: ['./collection-page.component.scss'], templateUrl: './collection-page.component.html', changeDetection: ChangeDetectionStrategy.OnPush }) @@ -26,8 +26,8 @@ export class CollectionPageComponent implements OnInit, OnDestroy { collectionData: RemoteData; itemData: RemoteData; logoData: RemoteData; - config : PaginationComponentOptions; - sortConfig : SortOptions; + config: PaginationComponentOptions; + sortConfig: SortOptions; private subs: Subscription[] = []; private collectionId: string; @@ -41,7 +41,7 @@ export class CollectionPageComponent implements OnInit, OnDestroy { } ngOnInit(): void { - this.subs.push(this.route.params.map((params: Params) => params['id'] ) + this.subs.push(this.route.params.map((params: Params) => params['id']) .subscribe((id: string) => { this.collectionId = id; this.collectionData = this.collectionDataService.findById(this.collectionId); @@ -50,9 +50,9 @@ export class CollectionPageComponent implements OnInit, OnDestroy { this.config = new PaginationComponentOptions(); this.config.id = "collection-browse"; - this.config.pageSizeOptions = [ 4 ]; + this.config.pageSizeOptions = [4]; this.config.pageSize = 4; - this.sortConfig = new SortOptions(); + this.sortConfig = new SortOptions(); this.updateResults(); })); diff --git a/src/app/community-page/community-page.component.html b/src/app/community-page/community-page.component.html index 8a1fbdf18ce..4f02c885e68 100644 --- a/src/app/community-page/community-page.component.html +++ b/src/app/community-page/community-page.component.html @@ -2,17 +2,17 @@ - - - @@ -21,6 +21,6 @@ - + diff --git a/src/app/community-page/community-page.component.ts b/src/app/community-page/community-page.component.ts index d3bd8aeeeb7..1c6702b6f4e 100644 --- a/src/app/community-page/community-page.component.ts +++ b/src/app/community-page/community-page.component.ts @@ -10,7 +10,7 @@ import { hasValue } from "../shared/empty.util"; @Component({ selector: 'ds-community-page', - styleUrls: ['./community-page.component.css'], + styleUrls: ['./community-page.component.scss'], templateUrl: './community-page.component.html', }) export class CommunityPageComponent implements OnInit, OnDestroy { @@ -34,9 +34,9 @@ export class CommunityPageComponent implements OnInit, OnDestroy { } ngOnDestroy(): void { - this.subs - .filter(sub => hasValue(sub)) - .forEach(sub => sub.unsubscribe()); + this.subs + .filter(sub => hasValue(sub)) + .forEach(sub => sub.unsubscribe()); } universalInit() { diff --git a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.scss b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.scss index ad84b72f8cd..50be6f5ad03 100644 --- a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.scss +++ b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.scss @@ -1 +1 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file +@import '../../../styles/variables.scss'; diff --git a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts index f3c39914ee3..b541b86bc90 100644 --- a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts +++ b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts @@ -5,24 +5,24 @@ import { Collection } from "../../core/shared/collection.model"; @Component({ - selector: 'ds-community-page-sub-collection-list', - styleUrls: ['./community-page-sub-collection-list.component.css'], - templateUrl: './community-page-sub-collection-list.component.html', + selector: 'ds-community-page-sub-collection-list', + styleUrls: ['./community-page-sub-collection-list.component.scss'], + templateUrl: './community-page-sub-collection-list.component.html', }) export class CommunityPageSubCollectionListComponent implements OnInit { - subCollections: RemoteData; + subCollections: RemoteData; - constructor( - private cds: CollectionDataService - ) { - this.universalInit(); - } + constructor( + private cds: CollectionDataService + ) { + this.universalInit(); + } - universalInit() { + universalInit() { - } + } - ngOnInit(): void { - this.subCollections = this.cds.findAll(); - } + ngOnInit(): void { + this.subCollections = this.cds.findAll(); + } } diff --git a/src/app/core/cache/builders/build-decorators.ts b/src/app/core/cache/builders/build-decorators.ts index 5cd9a740dc6..55dadf60a13 100644 --- a/src/app/core/cache/builders/build-decorators.ts +++ b/src/app/core/cache/builders/build-decorators.ts @@ -8,21 +8,21 @@ const relationshipKey = Symbol("relationship"); const relationshipMap = new Map(); -export const mapsTo = function(value: GenericConstructor) { +export function mapsTo(value: GenericConstructor) { return Reflect.metadata(mapsToMetadataKey, value); }; -export const getMapsTo = function(target: any) { +export function getMapsTo(target: any) { return Reflect.getOwnMetadata(mapsToMetadataKey, target); }; -export const relationship = function(value: ResourceType, isList: boolean = false): any { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { +export function relationship(value: ResourceType, isList: boolean = false): any { + return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) { if (!target || !propertyKey) { return; } - let metaDataList : Array = relationshipMap.get(target.constructor) || []; + let metaDataList: Array = relationshipMap.get(target.constructor) || []; if (metaDataList.indexOf(propertyKey) === -1) { metaDataList.push(propertyKey); } @@ -32,10 +32,10 @@ export const relationship = function(value: ResourceType, isList: boolean = fals }; }; -export const getRelationMetadata = function(target: any, propertyKey: string) { +export function getRelationMetadata(target: any, propertyKey: string) { return Reflect.getMetadata(relationshipKey, target, propertyKey); }; -export const getRelationships = function(target: any) { +export function getRelationships(target: any) { return relationshipMap.get(target); }; diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts index f8b4694a891..0f5d59f2e22 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -52,7 +52,7 @@ export class RemoteDataBuildService { const errorMessage = responseCacheObs .filter((entry: ResponseCacheEntry) => !entry.response.isSuccessful) - .map((entry: ResponseCacheEntry) => ( entry.response).errorMessage) + .map((entry: ResponseCacheEntry) => (entry.response).errorMessage) .distinctUntilChanged(); const statusCode = responseCacheObs @@ -61,7 +61,7 @@ export class RemoteDataBuildService { const pageInfo = responseCacheObs .filter((entry: ResponseCacheEntry) => hasValue(entry.response) && hasValue(entry.response['pageInfo'])) - .map((entry: ResponseCacheEntry) => ( entry.response).pageInfo) + .map((entry: ResponseCacheEntry) => (entry.response).pageInfo) .distinctUntilChanged(); //always use self link if that is cached, only if it isn't, get it via the response. @@ -70,7 +70,7 @@ export class RemoteDataBuildService { this.objectCache.getBySelfLink(href, normalizedType).startWith(undefined), responseCacheObs .filter((entry: ResponseCacheEntry) => entry.response.isSuccessful) - .map((entry: ResponseCacheEntry) => ( entry.response).resourceUUIDs) + .map((entry: ResponseCacheEntry) => (entry.response).resourceUUIDs) .flatMap((resourceUUIDs: Array) => { if (isNotEmpty(resourceUUIDs)) { return this.objectCache.get(resourceUUIDs[0], normalizedType); @@ -92,7 +92,7 @@ export class RemoteDataBuildService { ).filter(normalized => hasValue(normalized)) .map((normalized: TNormalized) => { return this.build(normalized); - }); + }); return new RemoteData( @@ -124,7 +124,7 @@ export class RemoteDataBuildService { const errorMessage = responseCacheObs .filter((entry: ResponseCacheEntry) => !entry.response.isSuccessful) - .map((entry: ResponseCacheEntry) => ( entry.response).errorMessage) + .map((entry: ResponseCacheEntry) => (entry.response).errorMessage) .distinctUntilChanged(); const statusCode = responseCacheObs @@ -133,12 +133,12 @@ export class RemoteDataBuildService { const pageInfo = responseCacheObs .filter((entry: ResponseCacheEntry) => hasValue(entry.response) && hasValue(entry.response['pageInfo'])) - .map((entry: ResponseCacheEntry) => ( entry.response).pageInfo) + .map((entry: ResponseCacheEntry) => (entry.response).pageInfo) .distinctUntilChanged(); const payload = responseCacheObs .filter((entry: ResponseCacheEntry) => entry.response.isSuccessful) - .map((entry: ResponseCacheEntry) => ( entry.response).resourceUUIDs) + .map((entry: ResponseCacheEntry) => (entry.response).resourceUUIDs) .flatMap((resourceUUIDs: Array) => { return this.objectCache.getList(resourceUUIDs, normalizedType) .map((normList: TNormalized[]) => { @@ -197,7 +197,7 @@ export class RemoteDataBuildService { // are dispatched, but sometimes don't arrive. I'm unsure why atm. setTimeout(() => { this.requestService.configure(new Request(normalized[relationship])); - },0); + }, 0); // The rest API can return a single URL to represent a list of resources (e.g. /items/:id/bitstreams) // in that case only 1 href will be stored in the normalized obj (so the isArray above fails), @@ -241,7 +241,7 @@ export class RemoteDataBuildService { }) .filter(e => hasValue(e)) .join(", ") - ); + ); const statusCode = Observable.combineLatest( ...input.map(rd => rd.statusCode), @@ -253,11 +253,11 @@ export class RemoteDataBuildService { }) .filter(c => hasValue(c)) .join(", ") - ); + ); const pageInfo = Observable.of(undefined); - const payload = > Observable.combineLatest( + const payload = >Observable.combineLatest( ...input.map(rd => rd.payload) ); diff --git a/src/app/core/cache/models/normalized-dspace-object.model.ts b/src/app/core/cache/models/normalized-dspace-object.model.ts index 259bb5e0979..bfd6b566716 100644 --- a/src/app/core/cache/models/normalized-dspace-object.model.ts +++ b/src/app/core/cache/models/normalized-dspace-object.model.ts @@ -6,7 +6,7 @@ import { NormalizedObject } from "./normalized-object.model"; /** * An abstract model class for a DSpaceObject. */ -export abstract class NormalizedDSpaceObject extends NormalizedObject{ +export abstract class NormalizedDSpaceObject extends NormalizedObject { /** * The link to the rest endpoint where this object can be found diff --git a/src/app/core/cache/models/sort-options.model.ts b/src/app/core/cache/models/sort-options.model.ts index 27d45139e51..6c24166d1af 100644 --- a/src/app/core/cache/models/sort-options.model.ts +++ b/src/app/core/cache/models/sort-options.model.ts @@ -5,7 +5,7 @@ export enum SortDirection { export class SortOptions { - constructor (public field: string = "name", public direction : SortDirection = SortDirection.Ascending) { + constructor(public field: string = "name", public direction: SortDirection = SortDirection.Ascending) { } } diff --git a/src/app/core/cache/object-cache.reducer.spec.ts b/src/app/core/cache/object-cache.reducer.spec.ts index 3331be569e4..7049ea2cb82 100644 --- a/src/app/core/cache/object-cache.reducer.spec.ts +++ b/src/app/core/cache/object-cache.reducer.spec.ts @@ -55,7 +55,7 @@ describe("objectCacheReducer", () => { it("should add the payload to the cache in response to an ADD action", () => { const state = Object.create(null); - const objectToCache = {uuid: uuid1}; + const objectToCache = { uuid: uuid1 }; const timeAdded = new Date().getTime(); const msToLive = 900000; const requestHref = "https://rest.api/endpoint/uuid1"; @@ -68,7 +68,7 @@ describe("objectCacheReducer", () => { }); it("should overwrite an object in the cache in response to an ADD action if it already exists", () => { - const objectToCache = {uuid: uuid1, foo: "baz", somethingElse: true}; + const objectToCache = { uuid: uuid1, foo: "baz", somethingElse: true }; const timeAdded = new Date().getTime(); const msToLive = 900000; const requestHref = "https://rest.api/endpoint/uuid1"; @@ -81,7 +81,7 @@ describe("objectCacheReducer", () => { it("should perform the ADD action without affecting the previous state", () => { const state = Object.create(null); - const objectToCache = {uuid: uuid1}; + const objectToCache = { uuid: uuid1 }; const timeAdded = new Date().getTime(); const msToLive = 900000; const requestHref = "https://rest.api/endpoint/uuid1"; diff --git a/src/app/core/cache/object-cache.service.spec.ts b/src/app/core/cache/object-cache.service.spec.ts index dd77cab110f..d05f9ea1916 100644 --- a/src/app/core/cache/object-cache.service.spec.ts +++ b/src/app/core/cache/object-cache.service.spec.ts @@ -1,14 +1,15 @@ -import { ObjectCacheState, CacheableObject } from "./object-cache.reducer"; import { Store } from "@ngrx/store"; +import { Observable } from "rxjs"; + import { ObjectCacheService } from "./object-cache.service"; +import { ObjectCacheState, CacheableObject } from "./object-cache.reducer"; import { AddToObjectCacheAction, RemoveFromObjectCacheAction } from "./object-cache.actions"; -import { Observable } from "rxjs"; class TestClass implements CacheableObject { constructor( public uuid: string, public foo: string - ) {} + ) { } test(): string { return this.foo + this.uuid; @@ -39,12 +40,13 @@ describe("ObjectCacheService", () => { spyOn(store, 'dispatch'); service = new ObjectCacheService(store); - spyOn(window, 'Date').and.returnValue({ getTime: () => timestamp }); + spyOn(Date.prototype, 'getTime').and.callFake(function() { + return timestamp; + }); }); describe("add", () => { it("should dispatch an ADD action with the object to add, the time to live, and the current timestamp", () => { - service.add(objectToCache, msToLive, requestHref); expect(store.dispatch).toHaveBeenCalledWith(new AddToObjectCacheAction(objectToCache, timestamp, msToLive, requestHref)); }); @@ -98,16 +100,19 @@ describe("ObjectCacheService", () => { describe("has", () => { it("should return true if the object with the supplied UUID is cached and still valid", () => { spyOn(store, 'select').and.returnValue(Observable.of(cacheEntry)); + expect(service.has(uuid)).toBe(true); }); it("should return false if the object with the supplied UUID isn't cached", () => { spyOn(store, 'select').and.returnValue(Observable.of(undefined)); + expect(service.has(uuid)).toBe(false); }); it("should return false if the object with the supplied UUID is cached but has exceeded its time to live", () => { spyOn(store, 'select').and.returnValue(Observable.of(invalidCacheEntry)); + expect(service.has(uuid)).toBe(false); }); }); diff --git a/src/app/core/cache/object-cache.service.ts b/src/app/core/cache/object-cache.service.ts index 63bfd44c823..827f6198e5d 100644 --- a/src/app/core/cache/object-cache.service.ts +++ b/src/app/core/cache/object-cache.service.ts @@ -13,7 +13,7 @@ import { GenericConstructor } from "../shared/generic-constructor"; export class ObjectCacheService { constructor( private store: Store - ) {} + ) { } /** * Add an object to the cache @@ -59,7 +59,7 @@ export class ObjectCacheService { */ get(uuid: string, type: GenericConstructor): Observable { return this.getEntry(uuid) - .map((entry: ObjectCacheEntry) => Object.assign(new type(), entry.data)); + .map((entry: ObjectCacheEntry) => Object.assign(new type(), entry.data)); } getBySelfLink(href: string, type: GenericConstructor): Observable { diff --git a/src/app/core/cache/response-cache.models.ts b/src/app/core/cache/response-cache.models.ts index b4137e8a22e..45eb5d9ee98 100644 --- a/src/app/core/cache/response-cache.models.ts +++ b/src/app/core/cache/response-cache.models.ts @@ -5,7 +5,7 @@ export class Response { constructor( public isSuccessful: boolean, public statusCode: string - ) {} + ) { } } export class SuccessResponse extends Response { @@ -27,4 +27,3 @@ export class ErrorResponse extends Response { this.errorMessage = error.message; } } - diff --git a/src/app/core/cache/response-cache.reducer.spec.ts b/src/app/core/cache/response-cache.reducer.spec.ts index b084842f7d1..00070039177 100644 --- a/src/app/core/cache/response-cache.reducer.spec.ts +++ b/src/app/core/cache/response-cache.reducer.spec.ts @@ -1,9 +1,11 @@ +import * as deepFreeze from "deep-freeze"; + import { responseCacheReducer, ResponseCacheState } from "./response-cache.reducer"; + import { ResponseCacheRemoveAction, ResetResponseCacheTimestampsAction } from "./response-cache.actions"; -import deepFreeze = require("deep-freeze"); class NullAction extends ResponseCacheRemoveAction { type = null; diff --git a/src/app/core/cache/response-cache.reducer.ts b/src/app/core/cache/response-cache.reducer.ts index 7e0fa6f5eb4..f1ef174dce3 100644 --- a/src/app/core/cache/response-cache.reducer.ts +++ b/src/app/core/cache/response-cache.reducer.ts @@ -41,11 +41,11 @@ export const responseCacheReducer = (state = initialState, action: ResponseCache switch (action.type) { case ResponseCacheActionTypes.ADD: { - return addToCache(state, action); + return addToCache(state, action); } case ResponseCacheActionTypes.REMOVE: { - return removeFromCache(state, action); + return removeFromCache(state, action); } case ResponseCacheActionTypes.RESET_TIMESTAMPS: { diff --git a/src/app/core/cache/response-cache.service.ts b/src/app/core/cache/response-cache.service.ts index 17d9ed10913..b821a35f34d 100644 --- a/src/app/core/cache/response-cache.service.ts +++ b/src/app/core/cache/response-cache.service.ts @@ -18,13 +18,13 @@ import { Response } from "./response-cache.models"; export class ResponseCacheService { constructor( private store: Store - ) {} + ) { } add(key: string, response: Response, msToLive: number): Observable { - if (!this.has(key)) { - // this.store.dispatch(new ResponseCacheFindAllAction(key, service, scopeID, paginationOptions, sortOptions)); - this.store.dispatch(new ResponseCacheAddAction(key, response, new Date().getTime(), msToLive)); - } + if (!this.has(key)) { + // this.store.dispatch(new ResponseCacheFindAllAction(key, service, scopeID, paginationOptions, sortOptions)); + this.store.dispatch(new ResponseCacheAddAction(key, response, new Date().getTime(), msToLive)); + } return this.get(key); } diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index c0a5e9d6227..9bc9ca406d4 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -40,13 +40,13 @@ const PROVIDERS = [ ]; @NgModule({ - imports: [ ...IMPORTS ], + imports: [...IMPORTS], declarations: [...DECLARATIONS], exports: [...EXPORTS], providers: [...PROVIDERS] }) export class CoreModule { - constructor (@Optional() @SkipSelf() parentModule: CoreModule) { + constructor( @Optional() @SkipSelf() parentModule: CoreModule) { if (isNotEmpty(parentModule)) { throw new Error( 'CoreModule is already loaded. Import it in the AppModule only'); diff --git a/src/app/core/data/collection-data.service.ts b/src/app/core/data/collection-data.service.ts index 53530cbcb33..446772c1fc8 100644 --- a/src/app/core/data/collection-data.service.ts +++ b/src/app/core/data/collection-data.service.ts @@ -23,7 +23,7 @@ export class CollectionDataService extends DataService, @Inject(GLOBAL_CONFIG) EnvConfig: GlobalConfig ) { - super(NormalizedCollection, EnvConfig); + super(NormalizedCollection, EnvConfig); } } diff --git a/src/app/core/data/item-data.service.ts b/src/app/core/data/item-data.service.ts index 88bb1506c84..628841b32c5 100644 --- a/src/app/core/data/item-data.service.ts +++ b/src/app/core/data/item-data.service.ts @@ -22,7 +22,7 @@ export class ItemDataService extends DataService { protected rdbService: RemoteDataBuildService, protected store: Store, @Inject(GLOBAL_CONFIG) EnvConfig: GlobalConfig -) { + ) { super(NormalizedItem, EnvConfig); } } diff --git a/src/app/core/data/remote-data.ts b/src/app/core/data/remote-data.ts index 7f0cf069797..b78fe1b9af1 100644 --- a/src/app/core/data/remote-data.ts +++ b/src/app/core/data/remote-data.ts @@ -2,10 +2,10 @@ import { Observable } from "rxjs"; import { PageInfo } from "../shared/page-info.model"; export enum RemoteDataState { - RequestPending = "RequestPending", - ResponsePending = "ResponsePending", - Failed = "Failed", - Success = "Success" + RequestPending = "RequestPending", + ResponsePending = "ResponsePending", + Failed = "Failed", + Success = "Success" } /** diff --git a/src/app/core/data/request-cache.effects.ts b/src/app/core/data/request-cache.effects.ts index 3c650d95f13..77472d76b9b 100644 --- a/src/app/core/data/request-cache.effects.ts +++ b/src/app/core/data/request-cache.effects.ts @@ -1,14 +1,12 @@ import { Injectable, Inject } from "@angular/core"; import { Actions, Effect } from "@ngrx/effects"; import { ObjectCacheActionTypes } from "../cache/object-cache.actions"; -import { GlobalConfig, GLOBAL_CONFIG } from "../../../config"; import { ResetResponseCacheTimestampsAction } from "../cache/response-cache.actions"; @Injectable() export class RequestCacheEffects { constructor( - @Inject(GLOBAL_CONFIG) private EnvConfig: GlobalConfig, private actions$: Actions, ) { } diff --git a/src/app/core/data/request.effects.ts b/src/app/core/data/request.effects.ts index dcfa4df66fa..d35ea17c2cb 100644 --- a/src/app/core/data/request.effects.ts +++ b/src/app/core/data/request.effects.ts @@ -47,7 +47,7 @@ class ProcessRequestDTO { export class RequestEffects { constructor( - @Inject(GLOBAL_CONFIG) private EnvConfig: GlobalConfig, + @Inject(GLOBAL_CONFIG) private config: GlobalConfig, private actions$: Actions, private restApi: DSpaceRESTv2Service, private objectCache: ObjectCacheService, @@ -67,14 +67,14 @@ export class RequestEffects { const processRequestDTO = this.process(data.payload, entry.request.href); const uuids = flattenSingleKeyObject(processRequestDTO).map(no => no.uuid); return new SuccessResponse(uuids, data.statusCode, this.processPageInfo(data.payload.page)) - }).do((response: Response) => this.responseCache.add(entry.request.href, response, this.EnvConfig.cache.msToLive)) + }).do((response: Response) => this.responseCache.add(entry.request.href, response, this.config.cache.msToLive)) .map((response: Response) => new RequestCompleteAction(entry.request.href)) .catch((error: RequestError) => Observable.of(new ErrorResponse(error)) - .do((response: Response) => this.responseCache.add(entry.request.href, response, this.EnvConfig.cache.msToLive)) + .do((response: Response) => this.responseCache.add(entry.request.href, response, this.config.cache.msToLive)) .map((response: Response) => new RequestCompleteAction(entry.request.href))); }); - protected process(data: any, requestHref: string): ProcessRequestDTO { + protected process(data: any, requestHref: string): ProcessRequestDTO { if (isNotEmpty(data)) { if (isPaginatedResponse(data)) { @@ -117,7 +117,7 @@ export class RequestEffects { } protected deserializeAndCache(obj, requestHref: string): NormalizedObject[] { - if(Array.isArray(obj)) { + if (Array.isArray(obj)) { let result = []; obj.forEach(o => result = [...result, ...this.deserializeAndCache(o, requestHref)]) return result; @@ -166,7 +166,7 @@ export class RequestEffects { if (hasNoValue(co) || hasNoValue(co.uuid)) { throw new Error('The server returned an invalid object'); } - this.objectCache.add(co, this.EnvConfig.cache.msToLive, requestHref); + this.objectCache.add(co, this.config.cache.msToLive, requestHref); } protected processPageInfo(pageObj: any): PageInfo { diff --git a/src/app/core/data/request.models.ts b/src/app/core/data/request.models.ts index f33db5ab726..8fef310fad4 100644 --- a/src/app/core/data/request.models.ts +++ b/src/app/core/data/request.models.ts @@ -5,7 +5,7 @@ import { GenericConstructor } from "../shared/generic-constructor"; export class Request { constructor( public href: string, - ) {} + ) { } } export class FindByIDRequest extends Request { diff --git a/src/app/core/data/request.reducer.ts b/src/app/core/data/request.reducer.ts index e20accc8317..9548fff2aff 100644 --- a/src/app/core/data/request.reducer.ts +++ b/src/app/core/data/request.reducer.ts @@ -24,15 +24,15 @@ export const requestReducer = (state = initialState, action: RequestAction): Req switch (action.type) { case RequestActionTypes.CONFIGURE: { - return configureRequest(state, action); + return configureRequest(state, action); } case RequestActionTypes.EXECUTE: { - return executeRequest(state, action); + return executeRequest(state, action); } case RequestActionTypes.COMPLETE: { - return completeRequest(state, action); + return completeRequest(state, action); } default: { diff --git a/src/app/core/data/request.service.ts b/src/app/core/data/request.service.ts index 47e45749551..799d6f76754 100644 --- a/src/app/core/data/request.service.ts +++ b/src/app/core/data/request.service.ts @@ -26,9 +26,9 @@ export class RequestService { let isPending = false; this.store.select('core', 'data', 'request', href) .take(1) - .subscribe((re: RequestEntry) => { + .subscribe((re: RequestEntry) => { isPending = (hasValue(re) && !re.completed) - }); + }); return isPending; } @@ -46,7 +46,7 @@ export class RequestService { this.responseCache.get(request.href) .take(1) .filter((entry: ResponseCacheEntry) => entry.response.isSuccessful) - .map((entry: ResponseCacheEntry) => ( entry.response).resourceUUIDs) + .map((entry: ResponseCacheEntry) => (entry.response).resourceUUIDs) .map((resourceUUIDs: Array) => resourceUUIDs.every(uuid => this.objectCache.has(uuid))) .subscribe(c => isCached = c); } diff --git a/src/app/core/dspace-rest-v2/dspace-rest-v2.schema.json b/src/app/core/dspace-rest-v2/dspace-rest-v2.schema.json index 8a7a0bcdc98..9539addeb2e 100644 --- a/src/app/core/dspace-rest-v2/dspace-rest-v2.schema.json +++ b/src/app/core/dspace-rest-v2/dspace-rest-v2.schema.json @@ -16,8 +16,7 @@ "description": "Object of links with the rels as the keys", "type": "object", "additionalProperties": { - "oneOf": [ - { + "oneOf": [{ "$ref": "#/definitions/linkObject" }, { @@ -43,8 +42,7 @@ "$ref": "http://hyperschema.org/core/base#/definitions/name" }, "href": { - "anyOf": [ - { + "anyOf": [{ "$ref": "http://hyperschema.org/core/link#/definitions/href" }, { @@ -71,8 +69,7 @@ "description": "An embedded HAL resource", "type": "object", "additionalProperties": { - "oneOf": [ - { + "oneOf": [{ "$ref": "#" }, { diff --git a/src/app/core/dspace-rest-v2/dspace-rest-v2.serializer.ts b/src/app/core/dspace-rest-v2/dspace-rest-v2.serializer.ts index 0cd1f9edad4..c0ce16a8677 100644 --- a/src/app/core/dspace-rest-v2/dspace-rest-v2.serializer.ts +++ b/src/app/core/dspace-rest-v2/dspace-rest-v2.serializer.ts @@ -37,7 +37,7 @@ export class DSpaceRESTv2Serializer implements Serializer { * @returns An object to send to the backend */ serializeArray(models: Array): any { - return Serialize(models, this.modelType); + return Serialize(models, this.modelType); } /** @@ -53,7 +53,7 @@ export class DSpaceRESTv2Serializer implements Serializer { throw new Error('Expected a single model, use deserializeArray() instead'); } let normalized = Object.assign({}, response, this.normalizeLinks(response._links)); - return Deserialize(normalized, this.modelType); + return Deserialize(normalized, this.modelType); } /** @@ -69,13 +69,13 @@ export class DSpaceRESTv2Serializer implements Serializer { throw new Error('Expected an Array, use deserialize() instead'); } let normalized = response.map((resource) => { - return Object.assign({}, resource, this.normalizeLinks(resource._links)); + return Object.assign({}, resource, this.normalizeLinks(resource._links)); }); - return > Deserialize(normalized, this.modelType); + return >Deserialize(normalized, this.modelType); } - private normalizeLinks(links:any): any { + private normalizeLinks(links: any): any { let normalizedLinks = links; for (let link in normalizedLinks) { if (Array.isArray(normalizedLinks[link])) { diff --git a/src/app/core/dspace-rest-v2/dspace-rest-v2.validator.ts b/src/app/core/dspace-rest-v2/dspace-rest-v2.validator.ts index 9cc88f15365..c7e802aa932 100644 --- a/src/app/core/dspace-rest-v2/dspace-rest-v2.validator.ts +++ b/src/app/core/dspace-rest-v2/dspace-rest-v2.validator.ts @@ -1,4 +1,4 @@ -import * as schema from './dspace-rest-v2.schema.json' +import schema from './dspace-rest-v2.schema.json' import { Validator } from "jsonschema"; /** diff --git a/src/app/core/footer/footer.component.scss b/src/app/core/footer/footer.component.scss index 697d24b8e79..3cf9757d7fa 100644 --- a/src/app/core/footer/footer.component.scss +++ b/src/app/core/footer/footer.component.scss @@ -1,14 +1,13 @@ @import '../../../styles/variables.scss'; @import '../../../../node_modules/bootstrap/scss/_variables.scss'; - $footer-bg: $gray-lighter; $footer-border: 1px solid darken($footer-bg, 10%); $footer-padding: $spacer * 1.5; .footer { background-color: $footer-bg; - border-top: $footer-border; - text-align:center; + border-top: $footer-border; + text-align: center; padding: $footer-padding; p { diff --git a/src/app/core/footer/footer.component.ts b/src/app/core/footer/footer.component.ts index ef94f48ccdb..5caf5a92c23 100644 --- a/src/app/core/footer/footer.component.ts +++ b/src/app/core/footer/footer.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit } from "@angular/core"; @Component({ selector: 'ds-footer', - styleUrls: ['footer.component.css'], + styleUrls: ['footer.component.scss'], templateUrl: 'footer.component.html' }) export class FooterComponent implements OnInit { diff --git a/src/app/core/shared/dspace-object.model.ts b/src/app/core/shared/dspace-object.model.ts index d3c698ac2fa..25fac17fa6e 100644 --- a/src/app/core/shared/dspace-object.model.ts +++ b/src/app/core/shared/dspace-object.model.ts @@ -9,82 +9,82 @@ import { ResourceType } from "./resource-type"; */ export abstract class DSpaceObject implements CacheableObject { - self: string; + self: string; - /** - * The human-readable identifier of this DSpaceObject - */ - id: string; + /** + * The human-readable identifier of this DSpaceObject + */ + id: string; - /** - * The universally unique identifier of this DSpaceObject - */ - uuid: string; + /** + * The universally unique identifier of this DSpaceObject + */ + uuid: string; - /** - * A string representing the kind of DSpaceObject, e.g. community, item, … - */ - type: ResourceType; + /** + * A string representing the kind of DSpaceObject, e.g. community, item, … + */ + type: ResourceType; - /** - * The name for this DSpaceObject - */ - name: string; + /** + * The name for this DSpaceObject + */ + name: string; - /** - * An array containing all metadata of this DSpaceObject - */ - metadata: Array; + /** + * An array containing all metadata of this DSpaceObject + */ + metadata: Array; - /** - * An array of DSpaceObjects that are direct parents of this DSpaceObject - */ - parents: RemoteData; + /** + * An array of DSpaceObjects that are direct parents of this DSpaceObject + */ + parents: RemoteData; - /** - * The DSpaceObject that owns this DSpaceObject - */ - owner: RemoteData; + /** + * The DSpaceObject that owns this DSpaceObject + */ + owner: RemoteData; - /** - * Find a metadata field by key and language - * - * This method returns the value of the first element - * in the metadata array that matches the provided - * key and language - * - * @param key - * @param language - * @return string - */ - findMetadata(key: string, language?: string): string { - const metadatum = this.metadata - .find((metadatum: Metadatum) => { - return metadatum.key === key && - (isEmpty(language) || metadatum.language === language) - }); - if (isNotEmpty(metadatum)) { - return metadatum.value; - } - else { - return undefined; - } + /** + * Find a metadata field by key and language + * + * This method returns the value of the first element + * in the metadata array that matches the provided + * key and language + * + * @param key + * @param language + * @return string + */ + findMetadata(key: string, language?: string): string { + const metadatum = this.metadata + .find((metadatum: Metadatum) => { + return metadatum.key === key && + (isEmpty(language) || metadatum.language === language) + }); + if (isNotEmpty(metadatum)) { + return metadatum.value; } - - /** - * Find metadata by an array of keys - * - * This method returns the values of the element - * in the metadata array that match the provided - * key(s) - * - * @param key(s) - * @return Array - */ - filterMetadata(keys: string[]): Array { - return this.metadata - .filter((metadatum: Metadatum) => { - return keys.some(key => key === metadatum.key); - }); + else { + return undefined; } + } + + /** + * Find metadata by an array of keys + * + * This method returns the values of the element + * in the metadata array that match the provided + * key(s) + * + * @param key(s) + * @return Array + */ + filterMetadata(keys: string[]): Array { + return this.metadata + .filter((metadatum: Metadatum) => { + return keys.some(key => key === metadatum.key); + }); + } } diff --git a/src/app/core/shared/generic-constructor.ts b/src/app/core/shared/generic-constructor.ts index 7ee9254fd9e..e6124011aa5 100644 --- a/src/app/core/shared/generic-constructor.ts +++ b/src/app/core/shared/generic-constructor.ts @@ -4,4 +4,3 @@ * https://github.com/Microsoft/TypeScript/issues/204#issuecomment-257722306 */ export type GenericConstructor = { new (...args: any[]): T }; - diff --git a/src/app/core/shared/item.model.spec.ts b/src/app/core/shared/item.model.spec.ts index d10b7d3046c..c16347ce39d 100644 --- a/src/app/core/shared/item.model.spec.ts +++ b/src/app/core/shared/item.model.spec.ts @@ -9,103 +9,103 @@ import { PageInfo } from "./page-info.model"; describe('Item', () => { - let item: Item; - const thumbnailBundleName = "THUMBNAIL"; - const originalBundleName = "ORIGINAL"; - const thumbnailPath = "thumbnail.jpg"; - const bitstream1Path = "document.pdf"; - const bitstream2Path = "otherfile.doc"; - - const nonExistingBundleName = "c1e568f7-d14e-496b-bdd7-07026998cc00"; - let bitstreams; - let remoteDataThumbnail; - let remoteDataFiles; - let remoteDataAll; + let item: Item; + const thumbnailBundleName = "THUMBNAIL"; + const originalBundleName = "ORIGINAL"; + const thumbnailPath = "thumbnail.jpg"; + const bitstream1Path = "document.pdf"; + const bitstream2Path = "otherfile.doc"; + + const nonExistingBundleName = "c1e568f7-d14e-496b-bdd7-07026998cc00"; + let bitstreams; + let remoteDataThumbnail; + let remoteDataFiles; + let remoteDataAll; + + beforeEach(() => { + const thumbnail = { + retrieve: thumbnailPath + }; + + bitstreams = [{ + retrieve: bitstream1Path + }, { + retrieve: bitstream2Path + }]; + + remoteDataThumbnail = createRemoteDataObject(thumbnail); + remoteDataFiles = createRemoteDataObject(bitstreams); + remoteDataAll = createRemoteDataObject([...bitstreams, thumbnail]); + + + // Create Bundles + + const bundles = + [ + { + name: thumbnailBundleName, + primaryBitstream: remoteDataThumbnail + }, - beforeEach(() => { - const thumbnail = { - retrieve: thumbnailPath - }; - - bitstreams = [{ - retrieve: bitstream1Path - }, { - retrieve: bitstream2Path + { + name: originalBundleName, + bitstreams: remoteDataFiles }]; - remoteDataThumbnail = createRemoteDataObject(thumbnail); - remoteDataFiles = createRemoteDataObject(bitstreams); - remoteDataAll = createRemoteDataObject([...bitstreams, thumbnail]); - - - // Create Bundles - const bundles = - [ - { - name: thumbnailBundleName, - primaryBitstream: remoteDataThumbnail - }, + item = Object.assign(new Item(), { bitstreams: remoteDataAll }); - { - name: originalBundleName, - bitstreams: remoteDataFiles - }]; + }); - item = Object.assign(new Item(), { bitstreams: remoteDataAll}); + it('should return the bitstreams related to this item with the specified bundle name', () => { + const bitObs: Observable = item.getBitstreamsByBundleName(thumbnailBundleName); + bitObs.take(1).subscribe(bs => + expect(bs.every(b => b.name === thumbnailBundleName)).toBeTruthy()); + }); - }); + it('should return an empty array when no bitstreams with this bundleName exist for this item', () => { + const bitstreams: Observable = item.getBitstreamsByBundleName(nonExistingBundleName); + bitstreams.take(1).subscribe(bs => expect(isEmpty(bs)).toBeTruthy()); + }); - it('should return the bitstreams related to this item with the specified bundle name', () => { - const bitObs: Observable = item.getBitstreamsByBundleName(thumbnailBundleName); - bitObs.take(1).subscribe(bs => - expect(bs.every(b => b.name === thumbnailBundleName)).toBeTruthy()); + describe("get thumbnail", () => { + beforeEach(() => { + spyOn(item, 'getBitstreamsByBundleName').and.returnValue(Observable.of([remoteDataThumbnail])); }); - it('should return an empty array when no bitstreams with this bundleName exist for this item', () => { - const bitstreams: Observable = item.getBitstreamsByBundleName(nonExistingBundleName); - bitstreams.take(1).subscribe(bs => expect(isEmpty(bs)).toBeTruthy()); + it('should return the thumbnail of this item', () => { + let path: string = thumbnailPath; + let bitstream: Observable = item.getThumbnail(); + bitstream.map(b => expect(b.retrieve).toBe(path)); }); + }); - describe("get thumbnail", () => { - beforeEach(() => { - spyOn(item, 'getBitstreamsByBundleName').and.returnValue(Observable.of([remoteDataThumbnail])); - }); - - it('should return the thumbnail of this item', () => { - let path: string = thumbnailPath; - let bitstream: Observable = item.getThumbnail(); - bitstream.map(b => expect(b.retrieve).toBe(path)); - }); + describe("get files", () => { + beforeEach(() => { + spyOn(item, 'getBitstreamsByBundleName').and.returnValue(Observable.of(bitstreams)); }); - - describe("get files", () => { - beforeEach(() => { - spyOn(item, 'getBitstreamsByBundleName').and.returnValue(Observable.of(bitstreams)); - }); - - it('should return all bitstreams with "ORIGINAL" as bundleName', () => { - let paths = [bitstream1Path, bitstream2Path]; - - let files: Observable = item.getFiles(); - let index = 0; - files.map(f => expect(f.length).toBe(2)); - files.subscribe( - array => array.forEach( - file => { - expect(file.retrieve).toBe(paths[index]); - index++; - } - ) - ) - }); - + it('should return all bitstreams with "ORIGINAL" as bundleName', () => { + let paths = [bitstream1Path, bitstream2Path]; + + let files: Observable = item.getFiles(); + let index = 0; + files.map(f => expect(f.length).toBe(2)); + files.subscribe( + array => array.forEach( + file => { + expect(file.retrieve).toBe(paths[index]); + index++; + } + ) + ) }); + }); + }); @@ -119,14 +119,14 @@ function createRemoteDataObject(object: Object) { const pageInfo = Observable.of(new PageInfo()); const payload = Observable.of(object); return new RemoteData( - self, - requestPending, - responsePending, - isSuccessful, - errorMessage, - statusCode, - pageInfo, - payload - ); + self, + requestPending, + responsePending, + isSuccessful, + errorMessage, + statusCode, + pageInfo, + payload + ); } diff --git a/src/app/core/shared/item.model.ts b/src/app/core/shared/item.model.ts index e57c6aec4e9..5ebcb79a7fc 100644 --- a/src/app/core/shared/item.model.ts +++ b/src/app/core/shared/item.model.ts @@ -7,60 +7,60 @@ import { isNotEmpty } from "../../shared/empty.util"; export class Item extends DSpaceObject { - /** - * A string representing the unique handle of this Item - */ - handle: string; - - /** - * The Date of the last modification of this Item - */ - lastModified: Date; - - /** - * A boolean representing if this Item is currently archived or not - */ - isArchived: boolean; - - /** - * A boolean representing if this Item is currently discoverable or not - */ - isDiscoverable: boolean; - - /** - * A boolean representing if this Item is currently withdrawn or not - */ - isWithdrawn: boolean; - - /** - * An array of Collections that are direct parents of this Item - */ - parents: RemoteData; - - /** - * The Collection that owns this Item - */ - owningCollection: RemoteData; - - get owner(): RemoteData { - return this.owningCollection; - } - - bitstreams: RemoteData; - - - /** - * Retrieves the thumbnail of this item - * @returns {Observable} the primaryBitstream of the "THUMBNAIL" bundle - */ - getThumbnail(): Observable { - //TODO currently this just picks the first thumbnail - //should be adjusted when we have a way to determine - //the primary thumbnail from rest - return this.getBitstreamsByBundleName("THUMBNAIL") - .filter(thumbnails => isNotEmpty(thumbnails)) - .map(thumbnails => thumbnails[0]) - } + /** + * A string representing the unique handle of this Item + */ + handle: string; + + /** + * The Date of the last modification of this Item + */ + lastModified: Date; + + /** + * A boolean representing if this Item is currently archived or not + */ + isArchived: boolean; + + /** + * A boolean representing if this Item is currently discoverable or not + */ + isDiscoverable: boolean; + + /** + * A boolean representing if this Item is currently withdrawn or not + */ + isWithdrawn: boolean; + + /** + * An array of Collections that are direct parents of this Item + */ + parents: RemoteData; + + /** + * The Collection that owns this Item + */ + owningCollection: RemoteData; + + get owner(): RemoteData { + return this.owningCollection; + } + + bitstreams: RemoteData; + + + /** + * Retrieves the thumbnail of this item + * @returns {Observable} the primaryBitstream of the "THUMBNAIL" bundle + */ + getThumbnail(): Observable { + //TODO currently this just picks the first thumbnail + //should be adjusted when we have a way to determine + //the primary thumbnail from rest + return this.getBitstreamsByBundleName("THUMBNAIL") + .filter(thumbnails => isNotEmpty(thumbnails)) + .map(thumbnails => thumbnails[0]) + } /** * Retrieves the thumbnail for the given original of this item @@ -78,20 +78,20 @@ export class Item extends DSpaceObject { * Retrieves all files that should be displayed on the item page of this item * @returns {Observable>>} an array of all Bitstreams in the "ORIGINAL" bundle */ - getFiles(): Observable { - return this.getBitstreamsByBundleName("ORIGINAL"); - } + getFiles(): Observable { + return this.getBitstreamsByBundleName("ORIGINAL"); + } /** * Retrieves bitstreams by bundle name * @param bundleName The name of the Bundle that should be returned * @returns {Observable} the bitstreams with the given bundleName */ - getBitstreamsByBundleName(bundleName: string): Observable { - return this.bitstreams.payload.startWith([]) - .map(bitstreams => bitstreams - .filter(bitstream => bitstream.bundleName === bundleName) - ); - } + getBitstreamsByBundleName(bundleName: string): Observable { + return this.bitstreams.payload.startWith([]) + .map(bitstreams => bitstreams + .filter(bitstream => bitstream.bundleName === bundleName) + ); + } } diff --git a/src/app/core/shared/metadatum.model.ts b/src/app/core/shared/metadatum.model.ts index f738017583c..b2f6c804a21 100644 --- a/src/app/core/shared/metadatum.model.ts +++ b/src/app/core/shared/metadatum.model.ts @@ -1,21 +1,21 @@ import { autoserialize } from "cerialize"; export class Metadatum { - /** - * The metadata field of this Metadatum - */ - @autoserialize - key: string; + /** + * The metadata field of this Metadatum + */ + @autoserialize + key: string; - /** - * The language of this Metadatum - */ - @autoserialize - language: string; + /** + * The language of this Metadatum + */ + @autoserialize + language: string; - /** - * The value of this Metadatum - */ - @autoserialize - value: string; + /** + * The value of this Metadatum + */ + @autoserialize + value: string; } diff --git a/src/app/core/shared/resource-type.ts b/src/app/core/shared/resource-type.ts index 182397d87c4..96edb34c198 100644 --- a/src/app/core/shared/resource-type.ts +++ b/src/app/core/shared/resource-type.ts @@ -3,10 +3,10 @@ * https://github.com/Microsoft/TypeScript/pull/15486 */ export enum ResourceType { - Bundle = "bundle", - Bitstream = "bitstream", - BitstreamFormat = "bitstreamformat", - Item = "item", - Collection = "collection", - Community = "community" + Bundle = "bundle", + Bitstream = "bitstream", + BitstreamFormat = "bitstreamformat", + Item = "item", + Collection = "collection", + Community = "community" } diff --git a/src/app/core/url-combiner/ui-url-combiner.ts b/src/app/core/url-combiner/ui-url-combiner.ts index c5254fdd41e..27f29d89f15 100644 --- a/src/app/core/url-combiner/ui-url-combiner.ts +++ b/src/app/core/url-combiner/ui-url-combiner.ts @@ -7,7 +7,7 @@ import { GlobalConfig } from "../../../config"; * * TODO write tests once GlobalConfig becomes injectable */ -export class UIURLCombiner extends URLCombiner{ +export class UIURLCombiner extends URLCombiner { constructor(EnvConfig: GlobalConfig, ...parts: Array) { super(EnvConfig.ui.baseUrl, EnvConfig.ui.nameSpace, ...parts); } diff --git a/src/app/core/url-combiner/url-combiner.ts b/src/app/core/url-combiner/url-combiner.ts index dcbc14ae6fc..2dd6ecdb284 100644 --- a/src/app/core/url-combiner/url-combiner.ts +++ b/src/app/core/url-combiner/url-combiner.ts @@ -13,7 +13,7 @@ export class URLCombiner { * @param parts * a variable number of strings representing parts of a URL */ - constructor(...parts:Array) { + constructor(...parts: Array) { // can't do this in the constructor signature, // because of the spread operator this.parts = parts; diff --git a/src/app/header/header.actions.ts b/src/app/header/header.actions.ts index c333fc5df7e..6886960206d 100644 --- a/src/app/header/header.actions.ts +++ b/src/app/header/header.actions.ts @@ -1,14 +1,14 @@ import { Action } from "@ngrx/store"; import { type } from "../shared/ngrx/type"; - /** - * For each action type in an action group, make a simple - * enum object for all of this group's action types. - * - * The 'type' utility function coerces strings into string - * literal types and runs a simple check to guarantee all - * action types in the application are unique. - */ +/** +* For each action type in an action group, make a simple +* enum object for all of this group's action types. +* +* The 'type' utility function coerces strings into string +* literal types and runs a simple check to guarantee all +* action types in the application are unique. +*/ export const HeaderActionTypes = { COLLAPSE: type('dspace/header/COLLAPSE'), EXPAND: type('dspace/header/EXPAND'), @@ -18,19 +18,19 @@ export const HeaderActionTypes = { export class HeaderCollapseAction implements Action { type = HeaderActionTypes.COLLAPSE; - constructor() {} + constructor() { } } export class HeaderExpandAction implements Action { type = HeaderActionTypes.EXPAND; - constructor() {} + constructor() { } } export class HeaderToggleAction implements Action { type = HeaderActionTypes.TOGGLE; - constructor() {} + constructor() { } } /** diff --git a/src/app/header/header.component.scss b/src/app/header/header.component.scss index 1c044101a6f..81f6a809bf5 100644 --- a/src/app/header/header.component.scss +++ b/src/app/header/header.component.scss @@ -1,7 +1,7 @@ @import '../../styles/variables.scss'; header nav.navbar { - border-radius: 0rem; + border-radius: 0; } header nav.navbar .navbar-toggler:hover { diff --git a/src/app/header/header.component.spec.ts b/src/app/header/header.component.spec.ts index 0ed67763963..44077247e7c 100644 --- a/src/app/header/header.component.spec.ts +++ b/src/app/header/header.component.spec.ts @@ -18,8 +18,8 @@ describe('HeaderComponent', () => { // async beforeEach beforeEach(async(() => { TestBed.configureTestingModule({ - imports: [ StoreModule.provideStore({}), TranslateModule.forRoot(), NgbCollapseModule.forRoot() ], - declarations: [ HeaderComponent ] + imports: [StoreModule.provideStore({}), TranslateModule.forRoot(), NgbCollapseModule.forRoot()], + declarations: [HeaderComponent] }) .compileComponents(); // compile template and css })); diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 76a9cbe05b2..d713d5eba3b 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -6,7 +6,7 @@ import { HeaderToggleAction } from "./header.actions"; @Component({ selector: 'ds-header', - styleUrls: ['header.component.css'], + styleUrls: ['header.component.scss'], templateUrl: 'header.component.html' }) export class HeaderComponent implements OnInit { diff --git a/src/app/header/header.effects.spec.ts b/src/app/header/header.effects.spec.ts index 7c5f40228dd..2abf986cf3f 100644 --- a/src/app/header/header.effects.spec.ts +++ b/src/app/header/header.effects.spec.ts @@ -19,8 +19,8 @@ describe('HeaderEffects', () => { let headerEffects: HeaderEffects; beforeEach(inject([ - EffectsRunner, HeaderEffects - ], + EffectsRunner, HeaderEffects + ], (_runner, _headerEffects) => { runner = _runner; headerEffects = _headerEffects; @@ -30,7 +30,7 @@ describe('HeaderEffects', () => { describe('resize$', () => { it('should return a COLLAPSE action in response to a RESIZE action', () => { - runner.queue(new HostWindowResizeAction(800,600)); + runner.queue(new HostWindowResizeAction(800, 600)); headerEffects.resize$.subscribe(result => { expect(result).toEqual(new HeaderCollapseAction()); diff --git a/src/app/home/home-news/home-news.component.ts b/src/app/home/home-news/home-news.component.ts index 2cf3c9cf566..7125235f1d1 100644 --- a/src/app/home/home-news/home-news.component.ts +++ b/src/app/home/home-news/home-news.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ selector: 'ds-home-news', - styleUrls: ['./home-news.component.css'], + styleUrls: ['./home-news.component.scss'], templateUrl: './home-news.component.html' }) export class HomeNewsComponent implements OnInit { diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts index 9c46b797915..bac88efbe1f 100644 --- a/src/app/home/home.component.ts +++ b/src/app/home/home.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ selector: 'ds-home', - styleUrls: ['./home.component.css'], + styleUrls: ['./home.component.scss'], templateUrl: './home.component.html' }) export class HomeComponent implements OnInit { diff --git a/src/app/home/top-level-community-list/top-level-community-list.component.ts b/src/app/home/top-level-community-list/top-level-community-list.component.ts index c502c535917..24834fc3913 100644 --- a/src/app/home/top-level-community-list/top-level-community-list.component.ts +++ b/src/app/home/top-level-community-list/top-level-community-list.component.ts @@ -7,14 +7,14 @@ import { SortOptions, SortDirection } from "../../core/cache/models/sort-options @Component({ selector: 'ds-top-level-community-list', - styleUrls: ['./top-level-community-list.component.css'], + styleUrls: ['./top-level-community-list.component.scss'], templateUrl: './top-level-community-list.component.html', changeDetection: ChangeDetectionStrategy.OnPush }) export class TopLevelCommunityListComponent implements OnInit { topLevelCommunities: RemoteData; - config : PaginationComponentOptions; - sortConfig : SortOptions; + config: PaginationComponentOptions; + sortConfig: SortOptions; constructor( private cds: CommunityDataService, @@ -30,9 +30,9 @@ export class TopLevelCommunityListComponent implements OnInit { ngOnInit(): void { this.config = new PaginationComponentOptions(); this.config.id = "top-level-pagination"; - this.config.pageSizeOptions = [ 4 ]; + this.config.pageSizeOptions = [4]; this.config.pageSize = 4; - this.sortConfig = new SortOptions(); + this.sortConfig = new SortOptions(); this.updateResults(); } diff --git a/src/app/item-page/field-components/collections/collections.component.ts b/src/app/item-page/field-components/collections/collections.component.ts index 895fe79bf8c..8c504f0c53c 100644 --- a/src/app/item-page/field-components/collections/collections.component.ts +++ b/src/app/item-page/field-components/collections/collections.component.ts @@ -10,36 +10,36 @@ import { RemoteDataBuildService } from "../../../core/cache/builders/remote-data */ @Component({ - selector: 'ds-item-page-collections', - templateUrl: './collections.component.html' + selector: 'ds-item-page-collections', + templateUrl: './collections.component.html' }) export class CollectionsComponent implements OnInit { - @Input() item: Item; + @Input() item: Item; - label : string = "item.page.collections"; + label: string = "item.page.collections"; - separator: string = "
"; + separator: string = "
"; - collections: Observable; + collections: Observable; - constructor( - private rdbs: RemoteDataBuildService - ) { - this.universalInit(); + constructor( + private rdbs: RemoteDataBuildService + ) { + this.universalInit(); - } + } - universalInit() { - } + universalInit() { + } - ngOnInit(): void { - // this.collections = this.item.parents.payload; - //TODO this should use parents, but the collections - // for an Item aren't returned by the REST API yet, - // only the owning collection - this.collections = this.item.owner.payload.map(c => [c]); - } + ngOnInit(): void { + // this.collections = this.item.parents.payload; + //TODO this should use parents, but the collections + // for an Item aren't returned by the REST API yet, + // only the owning collection + this.collections = this.item.owner.payload.map(c => [c]); + } diff --git a/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.html b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.html index 638501c8573..d926b5330ea 100644 --- a/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.html +++ b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.html @@ -3,4 +3,4 @@
{{ label }}
- \ No newline at end of file + diff --git a/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.scss b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.scss index 26f0f6fa653..dff97a6eb29 100644 --- a/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.scss +++ b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.scss @@ -1,6 +1,7 @@ @import '../../../../styles/variables.scss'; + :host { - .simple-view-element { - margin-bottom: 15px; - } -} \ No newline at end of file + .simple-view-element { + margin-bottom: 15px; + } +} diff --git a/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.ts b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.ts index 2b40f33b5dd..04784a1e9fd 100644 --- a/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.ts +++ b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.ts @@ -7,7 +7,7 @@ import { Component, Input } from '@angular/core'; @Component({ selector: 'ds-metadata-field-wrapper', - styleUrls: ['./metadata-field-wrapper.component.css'], + styleUrls: ['./metadata-field-wrapper.component.scss'], templateUrl: './metadata-field-wrapper.component.html' }) export class MetadataFieldWrapperComponent { diff --git a/src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.ts b/src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.ts index 398e6ed2786..25f57912c1a 100644 --- a/src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.ts +++ b/src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.ts @@ -11,7 +11,7 @@ import { MetadataValuesComponent } from "../metadata-values/metadata-values.comp @Component({ selector: 'ds-metadata-uri-values', - styleUrls: ['./metadata-uri-values.component.css'], + styleUrls: ['./metadata-uri-values.component.scss'], templateUrl: './metadata-uri-values.component.html' }) export class MetadataUriValuesComponent extends MetadataValuesComponent { diff --git a/src/app/item-page/field-components/metadata-values/metadata-values.component.ts b/src/app/item-page/field-components/metadata-values/metadata-values.component.ts index 26e18adffdc..b18b1991a75 100644 --- a/src/app/item-page/field-components/metadata-values/metadata-values.component.ts +++ b/src/app/item-page/field-components/metadata-values/metadata-values.component.ts @@ -7,7 +7,7 @@ import { Component, Input } from '@angular/core'; @Component({ selector: 'ds-metadata-values', - styleUrls: ['./metadata-values.component.css'], + styleUrls: ['./metadata-values.component.scss'], templateUrl: './metadata-values.component.html' }) export class MetadataValuesComponent { diff --git a/src/app/item-page/full/field-components/file-section/full-file-section.component.ts b/src/app/item-page/full/field-components/file-section/full-file-section.component.ts index 17208e8b20c..b9eefae051e 100644 --- a/src/app/item-page/full/field-components/file-section/full-file-section.component.ts +++ b/src/app/item-page/full/field-components/file-section/full-file-section.component.ts @@ -11,42 +11,42 @@ import { hasValue } from "../../../../shared/empty.util"; */ @Component({ - selector: 'ds-item-page-full-file-section', - styleUrls: ['./full-file-section.component.css'], - templateUrl: './full-file-section.component.html' + selector: 'ds-item-page-full-file-section', + styleUrls: ['./full-file-section.component.scss'], + templateUrl: './full-file-section.component.html' }) export class FullFileSectionComponent extends FileSectionComponent implements OnInit { - @Input() item: Item; + @Input() item: Item; - label : string; + label: string; - files: Observable; + files: Observable; - thumbnails: Map> = new Map(); + thumbnails: Map> = new Map(); - universalInit() { - } + universalInit() { + } - ngOnInit(): void { - super.ngOnInit(); - } + ngOnInit(): void { + super.ngOnInit(); + } - initialize(): void { - const originals = this.item.getFiles(); - const licenses = this.item.getBitstreamsByBundleName("LICENSE"); - this.files = Observable.combineLatest(originals, licenses, (originals, licenses) => [...originals, ...licenses]); - this.files.subscribe( - files => - files.forEach( - original => { - const thumbnail: Observable = this.item.getThumbnailForOriginal(original); - this.thumbnails.set(original.id, thumbnail); - } - ) + initialize(): void { + const originals = this.item.getFiles(); + const licenses = this.item.getBitstreamsByBundleName("LICENSE"); + this.files = Observable.combineLatest(originals, licenses, (originals, licenses) => [...originals, ...licenses]); + this.files.subscribe( + files => + files.forEach( + original => { + const thumbnail: Observable = this.item.getThumbnailForOriginal(original); + this.thumbnails.set(original.id, thumbnail); + } ) - } + ) + } } diff --git a/src/app/item-page/full/full-item-page.component.ts b/src/app/item-page/full/full-item-page.component.ts index b19fd936773..e79775b4f1b 100644 --- a/src/app/item-page/full/full-item-page.component.ts +++ b/src/app/item-page/full/full-item-page.component.ts @@ -14,32 +14,32 @@ import { Item } from "../../core/shared/item.model"; */ @Component({ - selector: 'ds-full-item-page', - styleUrls: ['./full-item-page.component.css'], - templateUrl: './full-item-page.component.html', + selector: 'ds-full-item-page', + styleUrls: ['./full-item-page.component.scss'], + templateUrl: './full-item-page.component.html', }) export class FullItemPageComponent extends ItemPageComponent implements OnInit { - item: RemoteData; + item: RemoteData; - metadata: Observable>; + metadata: Observable>; - constructor(route: ActivatedRoute, items: ItemDataService) { - super(route, items); - } + constructor(route: ActivatedRoute, items: ItemDataService) { + super(route, items); + } - universalInit() { + universalInit() { - } + } - /*** AoT inheritance fix, will hopefully be resolved in the near future **/ - ngOnInit(): void { - super.ngOnInit(); - } + /*** AoT inheritance fix, will hopefully be resolved in the near future **/ + ngOnInit(): void { + super.ngOnInit(); + } - initialize(params) { - super.initialize(params); - this.metadata = this.item.payload.map(i => i.metadata); - } + initialize(params) { + super.initialize(params); + this.metadata = this.item.payload.map(i => i.metadata); + } } diff --git a/src/app/item-page/simple/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts index 53e57f3ae14..918e1def05b 100644 --- a/src/app/item-page/simple/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -13,40 +13,40 @@ import { Bitstream } from "../../core/shared/bitstream.model"; */ @Component({ - selector: 'ds-item-page', - styleUrls: ['./item-page.component.css'], - templateUrl: './item-page.component.html', + selector: 'ds-item-page', + styleUrls: ['./item-page.component.scss'], + templateUrl: './item-page.component.html', }) export class ItemPageComponent implements OnInit { - id: number; + id: number; - private sub: any; + private sub: any; - item: RemoteData; + item: RemoteData; - thumbnail: Observable; + thumbnail: Observable; - constructor(private route: ActivatedRoute, private items: ItemDataService) { - this.universalInit(); - } + constructor(private route: ActivatedRoute, private items: ItemDataService) { + this.universalInit(); + } - universalInit() { + universalInit() { - } + } - ngOnInit(): void { - this.sub = this.route.params.subscribe(params => { - this.initialize(params); - }); - } + ngOnInit(): void { + this.sub = this.route.params.subscribe(params => { + this.initialize(params); + }); + } - initialize(params) { - this.id = +params['id']; - this.item = this.items.findById(params['id']); - this.thumbnail = this.item.payload.flatMap(i => i.getThumbnail()); - } + initialize(params) { + this.id = +params['id']; + this.item = this.items.findById(params['id']); + this.thumbnail = this.item.payload.flatMap(i => i.getThumbnail()); + } } diff --git a/src/app/object-list/collection-list-element/collection-list-element.component.ts b/src/app/object-list/collection-list-element/collection-list-element.component.ts index c199994d5ce..5f65e60bdac 100644 --- a/src/app/object-list/collection-list-element/collection-list-element.component.ts +++ b/src/app/object-list/collection-list-element/collection-list-element.component.ts @@ -2,22 +2,22 @@ import { Component, Input } from '@angular/core'; import { Collection } from "../../core/shared/collection.model"; @Component({ - selector: 'ds-collection-list-element', - styleUrls: ['./collection-list-element.component.css'], - templateUrl: './collection-list-element.component.html' + selector: 'ds-collection-list-element', + styleUrls: ['./collection-list-element.component.scss'], + templateUrl: './collection-list-element.component.html' }) export class CollectionListElementComponent { - @Input() collection: Collection; + @Input() collection: Collection; - data: any = {}; + data: any = {}; - constructor() { - this.universalInit(); - } + constructor() { + this.universalInit(); + } - universalInit() { + universalInit() { - } + } } diff --git a/src/app/object-list/community-list-element/community-list-element.component.ts b/src/app/object-list/community-list-element/community-list-element.component.ts index 36e8a06e0f6..9da5f52b2ca 100644 --- a/src/app/object-list/community-list-element/community-list-element.component.ts +++ b/src/app/object-list/community-list-element/community-list-element.component.ts @@ -2,22 +2,22 @@ import { Component, Input } from '@angular/core'; import { Community } from "../../core/shared/community.model"; @Component({ - selector: 'ds-community-list-element', - styleUrls: ['./community-list-element.component.css'], - templateUrl: './community-list-element.component.html' + selector: 'ds-community-list-element', + styleUrls: ['./community-list-element.component.scss'], + templateUrl: './community-list-element.component.html' }) export class CommunityListElementComponent { - @Input() community: Community; + @Input() community: Community; - data: any = {}; + data: any = {}; - constructor() { - this.universalInit(); - } + constructor() { + this.universalInit(); + } - universalInit() { + universalInit() { - } + } } diff --git a/src/app/object-list/item-list-element/item-list-element.component.ts b/src/app/object-list/item-list-element/item-list-element.component.ts index 3f09cc200ce..b26b4dbf26d 100644 --- a/src/app/object-list/item-list-element/item-list-element.component.ts +++ b/src/app/object-list/item-list-element/item-list-element.component.ts @@ -2,21 +2,21 @@ import { Component, Input } from '@angular/core'; import { Item } from "../../core/shared/item.model"; @Component({ - selector: 'ds-item-list-element', - styleUrls: ['./item-list-element.component.css'], - templateUrl: './item-list-element.component.html' + selector: 'ds-item-list-element', + styleUrls: ['./item-list-element.component.scss'], + templateUrl: './item-list-element.component.html' }) export class ItemListElementComponent { - @Input() item: Item; + @Input() item: Item; - data: any = {}; + data: any = {}; - constructor() { - this.universalInit(); - } + constructor() { + this.universalInit(); + } - universalInit() { + universalInit() { - } + } } diff --git a/src/app/object-list/object-list-element/object-list-element.component.ts b/src/app/object-list/object-list-element/object-list-element.component.ts index 8b53ca5d6ae..fa881005d37 100644 --- a/src/app/object-list/object-list-element/object-list-element.component.ts +++ b/src/app/object-list/object-list-element/object-list-element.component.ts @@ -3,24 +3,24 @@ import { DSpaceObject } from "../../core/shared/dspace-object.model"; import { ResourceType } from "../../core/shared/resource-type"; @Component({ - selector: 'ds-object-list-element', - styleUrls: ['./object-list-element.component.css'], - templateUrl: './object-list-element.component.html' + selector: 'ds-object-list-element', + styleUrls: ['./object-list-element.component.scss'], + templateUrl: './object-list-element.component.html' }) export class ObjectListElementComponent { - public type = ResourceType; + public type = ResourceType; - @Input() object: DSpaceObject; + @Input() object: DSpaceObject; - data: any = {}; + data: any = {}; - constructor() { - this.universalInit(); - } + constructor() { + this.universalInit(); + } - universalInit() { + universalInit() { - } + } } diff --git a/src/app/pagenotfound/pagenotfound.component.ts b/src/app/pagenotfound/pagenotfound.component.ts index e8537bc6b7c..48c91347931 100644 --- a/src/app/pagenotfound/pagenotfound.component.ts +++ b/src/app/pagenotfound/pagenotfound.component.ts @@ -2,7 +2,7 @@ import { Component } from '@angular/core'; @Component({ selector: 'ds-pagenotfound', - styleUrls: ['./pagenotfound.component.css'], + styleUrls: ['./pagenotfound.component.scss'], templateUrl: './pagenotfound.component.html' }) export class PageNotFoundComponent { diff --git a/src/app/server-app.module.ts b/src/app/server-app.module.ts new file mode 100644 index 00000000000..ff124a7c0d6 --- /dev/null +++ b/src/app/server-app.module.ts @@ -0,0 +1,98 @@ +import 'rxjs/add/operator/filter'; +import 'rxjs/add/operator/first'; + +import { ApplicationRef, Inject, NgModule, APP_BOOTSTRAP_LISTENER } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { ServerModule } from '@angular/platform-server'; +import { BrowserModule } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; + +import { Request } from 'express'; + +import { REQUEST } from '@nguniversal/express-engine/tokens'; + +import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; + +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +import { Store } from "@ngrx/store"; +import { Actions, EffectsModule } from '@ngrx/effects'; + +import { TranslateUniversalLoader } from '../modules/translate-universal-loader'; + +import { ServerTransferStateModule } from '../modules/transfer-state/server-transfer-state.module'; +import { TransferState } from '../modules/transfer-state/transfer-state'; + +import { TransferStoreEffects } from '../modules/transfer-store/transfer-store.effects'; +import { ServerTransferStoreEffects } from '../modules/transfer-store/server-transfer-store.effects'; +import { ServerTransferStoreModule } from '../modules/transfer-store/server-transfer-store.module'; + +import { ServerCookiesModule } from '../modules/cookies/server-cookies.module'; + +import { ServerDataLoaderModule } from '../modules/data-loader/server-data-loader.module'; + +import { AppState } from './app.reducer'; +import { effects } from './app.effects'; + +import { SharedModule } from './shared/shared.module'; +import { CoreModule } from './core/core.module'; +import { AppModule } from './app.module'; + +import { AppComponent } from './app.component'; + +import { GLOBAL_CONFIG, GlobalConfig } from '../config'; + +export function boot(cache: TransferState, appRef: ApplicationRef, store: Store, request: Request, config: GlobalConfig) { + // authentication mechanism goes here + return () => { + appRef.isStable.filter((stable: boolean) => stable).first().subscribe(() => { + cache.inject(); + }); + }; +} +export function UniversalLoaderFactory() { + return new TranslateUniversalLoader('dist/assets/i18n', '.json'); +} + +@NgModule({ + bootstrap: [AppComponent], + imports: [ + BrowserModule.withServerTransition({ + appId: 'ds-app-id' + }), + RouterModule.forRoot([], { useHash: false }), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: UniversalLoaderFactory, + deps: [] + } + }), + NgbModule.forRoot(), + ServerModule, + ServerCookiesModule, + ServerDataLoaderModule, + ServerTransferStateModule, + ServerTransferStoreModule, + EffectsModule.run(ServerTransferStoreEffects), + NoopAnimationsModule, + AppModule + ], + providers: [ + { + provide: APP_BOOTSTRAP_LISTENER, + multi: true, + useFactory: boot, + deps: [ + TransferState, + ApplicationRef, + Store, + REQUEST, + GLOBAL_CONFIG + ] + } + ] +}) +export class ServerAppModule { + +} diff --git a/src/app/shared/comcol-page-content/comcol-page-content.component.ts b/src/app/shared/comcol-page-content/comcol-page-content.component.ts index da679d31b24..a25c9d36802 100644 --- a/src/app/shared/comcol-page-content/comcol-page-content.component.ts +++ b/src/app/shared/comcol-page-content/comcol-page-content.component.ts @@ -2,14 +2,14 @@ import { Component, Input } from '@angular/core'; /** * This component renders any content inside of this component. - * If there is a title set it will render the title. + * If there is a title set it will render the title. * If hasInnerHtml is true the content will be handled as html. * To see how it is used see collection-page or community-page. */ @Component({ selector: 'ds-comcol-page-content', - styleUrls: ['./comcol-page-content.component.css'], + styleUrls: ['./comcol-page-content.component.scss'], templateUrl: './comcol-page-content.component.html' }) export class ComcolPageContentComponent { diff --git a/src/app/shared/comcol-page-header/comcol-page-header.component.ts b/src/app/shared/comcol-page-header/comcol-page-header.component.ts index f6578ace298..15b51452900 100644 --- a/src/app/shared/comcol-page-header/comcol-page-header.component.ts +++ b/src/app/shared/comcol-page-header/comcol-page-header.component.ts @@ -3,7 +3,7 @@ import { Component, Input } from '@angular/core'; @Component({ selector: 'ds-comcol-page-header', - styleUrls: ['./comcol-page-header.component.css'], + styleUrls: ['./comcol-page-header.component.scss'], templateUrl: './comcol-page-header.component.html', }) export class ComcolPageHeaderComponent { diff --git a/src/app/shared/comcol-page-logo/comcol-page-logo.component.ts b/src/app/shared/comcol-page-logo/comcol-page-logo.component.ts index 582d6e17418..d8339945d4c 100644 --- a/src/app/shared/comcol-page-logo/comcol-page-logo.component.ts +++ b/src/app/shared/comcol-page-logo/comcol-page-logo.component.ts @@ -5,7 +5,7 @@ import { Bitstream } from "../../core/shared/bitstream.model"; @Component({ selector: 'ds-comcol-page-logo', - styleUrls: ['./comcol-page-logo.component.css'], + styleUrls: ['./comcol-page-logo.component.scss'], templateUrl: './comcol-page-logo.component.html', }) export class ComcolPageLogoComponent { diff --git a/src/app/shared/ngrx/type.ts b/src/app/shared/ngrx/type.ts index 9b50c1d6d05..1acb3c91f11 100644 --- a/src/app/shared/ngrx/type.ts +++ b/src/app/shared/ngrx/type.ts @@ -13,6 +13,11 @@ */ let typeCache: { [label: string]: boolean } = {}; + +export function types(): string[] { + return Object.keys(typeCache); +} + export function type(label: T | ''): T { if (typeCache[label]) { throw new Error(`Action type "${label}" is not unique"`); diff --git a/src/app/shared/object-list/object-list.component.ts b/src/app/shared/object-list/object-list.component.ts index 7e404d0f51c..dc7e13d3586 100644 --- a/src/app/shared/object-list/object-list.component.ts +++ b/src/app/shared/object-list/object-list.component.ts @@ -1,82 +1,87 @@ import { - Component, Input, ViewEncapsulation, ChangeDetectionStrategy, - OnInit, Output + Component, + EventEmitter, + Input, + ViewEncapsulation, + ChangeDetectionStrategy, + OnInit, + Output } from '@angular/core'; import { RemoteData } from "../../core/data/remote-data"; import { DSpaceObject } from "../../core/shared/dspace-object.model"; import { PageInfo } from "../../core/shared/page-info.model"; import { Observable } from "rxjs"; import { PaginationComponentOptions } from "../pagination/pagination-component-options.model"; -import { EventEmitter } from "@angular/common/src/facade/async"; + import { SortOptions, SortDirection } from "../../core/cache/models/sort-options.model"; @Component({ - changeDetection: ChangeDetectionStrategy.Default, - encapsulation: ViewEncapsulation.Emulated, - selector: 'ds-object-list', - styleUrls: ['../../object-list/object-list.component.css'], - templateUrl: '../../object-list/object-list.component.html' + changeDetection: ChangeDetectionStrategy.Default, + encapsulation: ViewEncapsulation.Emulated, + selector: 'ds-object-list', + styleUrls: ['../../object-list/object-list.component.scss'], + templateUrl: '../../object-list/object-list.component.html' }) export class ObjectListComponent implements OnInit { - @Input() objects: RemoteData; - @Input() config : PaginationComponentOptions; - @Input() sortConfig : SortOptions; - @Input() hideGear : boolean = false; - @Input() hidePagerWhenSinglePage : boolean = true; - pageInfo : Observable; - - /** - * An event fired when the page is changed. - * Event's payload equals to the newly selected page. - */ - @Output() pageChange: EventEmitter = new EventEmitter(); - - /** - * An event fired when the page wsize is changed. - * Event's payload equals to the newly selected page size. - */ - @Output() pageSizeChange: EventEmitter = new EventEmitter(); - - /** - * An event fired when the sort direction is changed. - * Event's payload equals to the newly selected sort direction. - */ - @Output() sortDirectionChange: EventEmitter = new EventEmitter(); - - /** - * An event fired when the sort field is changed. - * Event's payload equals to the newly selected sort field. - */ - @Output() sortFieldChange: EventEmitter = new EventEmitter(); - data: any = {}; - - constructor() { - this.universalInit(); - } - - universalInit() { - } - - ngOnInit(): void { - this.pageInfo = this.objects.pageInfo; - } - - onPageChange(event) { - this.pageChange.emit(event); - } - - onPageSizeChange(event) { - this.pageSizeChange.emit(event); - } - - onSortDirectionChange(event) { - this.sortDirectionChange.emit(event); - } - - onSortFieldChange(event) { - this.sortFieldChange.emit(event); - } + @Input() objects: RemoteData; + @Input() config: PaginationComponentOptions; + @Input() sortConfig: SortOptions; + @Input() hideGear: boolean = false; + @Input() hidePagerWhenSinglePage: boolean = true; + pageInfo: Observable; + + /** + * An event fired when the page is changed. + * Event's payload equals to the newly selected page. + */ + @Output() pageChange: EventEmitter = new EventEmitter(); + + /** + * An event fired when the page wsize is changed. + * Event's payload equals to the newly selected page size. + */ + @Output() pageSizeChange: EventEmitter = new EventEmitter(); + + /** + * An event fired when the sort direction is changed. + * Event's payload equals to the newly selected sort direction. + */ + @Output() sortDirectionChange: EventEmitter = new EventEmitter(); + + /** + * An event fired when the sort field is changed. + * Event's payload equals to the newly selected sort field. + */ + @Output() sortFieldChange: EventEmitter = new EventEmitter(); + data: any = {}; + + constructor() { + this.universalInit(); + } + + universalInit() { + } + + ngOnInit(): void { + this.pageInfo = this.objects.pageInfo; + } + + onPageChange(event) { + this.pageChange.emit(event); + } + + onPageSizeChange(event) { + this.pageSizeChange.emit(event); + } + + onSortDirectionChange(event) { + this.sortDirectionChange.emit(event); + } + + onSortFieldChange(event) { + this.sortFieldChange.emit(event); + } } diff --git a/src/app/shared/pagination/pagination-component-options.model.ts b/src/app/shared/pagination/pagination-component-options.model.ts index 86310ece171..30ed2becd24 100644 --- a/src/app/shared/pagination/pagination-component-options.model.ts +++ b/src/app/shared/pagination/pagination-component-options.model.ts @@ -10,11 +10,13 @@ export class PaginationComponentOptions extends NgbPaginationConfig { /** * The active page. */ - currentPage: number = 1; + currentPage = 1; /** * A number array that represents options for a context pagination limit. */ - pageSizeOptions: Array = [ 5, 10, 20, 40, 60, 80, 100 ]; + pageSizeOptions: number[] = [5, 10, 20, 40, 60, 80, 100]; + + pageSize: number; } diff --git a/src/app/shared/pagination/pagination.component.spec.ts b/src/app/shared/pagination/pagination.component.spec.ts index 8a8b5139b93..8f1b5836a78 100644 --- a/src/app/shared/pagination/pagination.component.spec.ts +++ b/src/app/shared/pagination/pagination.component.spec.ts @@ -1,75 +1,85 @@ // ... test imports +// Load the implementations that should be tested +import { CommonModule } from '@angular/common'; + import { async, ComponentFixture, inject, TestBed, fakeAsync, tick } from '@angular/core/testing'; + import { Component, CUSTOM_ELEMENTS_SCHEMA, DebugElement -} from "@angular/core"; -import { ActivatedRoute, Router } from "@angular/router"; +} from '@angular/core'; + +import { ActivatedRoute, Router } from '@angular/router'; import { By } from '@angular/platform-browser'; -import { Observable } from "rxjs"; + import { RouterTestingModule } from '@angular/router/testing'; + +import { Observable } from 'rxjs/Observable'; + import Spy = jasmine.Spy; -import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; -import { StoreModule } from "@ngrx/store"; -// Load the implementations that should be tested -import { CommonModule } from '@angular/common'; +import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; +import { StoreModule } from '@ngrx/store'; import { Ng2PaginationModule } from 'ng2-pagination'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { PaginationComponent } from './pagination.component'; import { PaginationComponentOptions } from './pagination-component-options.model'; -import { MockTranslateLoader } from "../testing/mock-translate-loader"; +import { MockTranslateLoader } from '../testing/mock-translate-loader'; -import { GLOBAL_CONFIG, EnvConfig } from '../../../config'; -import { ActivatedRouteStub, RouterStub } from "../testing/router-stubs"; -import { HostWindowService } from "../host-window.service"; -import { EnumKeysPipe } from "../utils/enum-keys-pipe"; -import { SortOptions } from "../../core/cache/models/sort-options.model"; +import { GLOBAL_CONFIG, ENV_CONFIG } from '../../../config'; +import { ActivatedRouteStub } from '../testing/active-router-stub'; +import { RouterStub } from '../testing/router-stub'; +import { HostWindowService } from '../host-window.service'; +import { EnumKeysPipe } from '../utils/enum-keys-pipe'; +import { SortOptions } from '../../core/cache/models/sort-options.model'; -function createTestComponent(html: string, type: {new (...args: any[]): T}): ComponentFixture { +import { TestComponent } from '../testing/test.component'; +import { HostWindowServiceStub } from '../testing/host-window-service-stub'; + +function createTestComponent(html: string, type: { new (...args: any[]): T }): ComponentFixture { TestBed.overrideComponent(type, { set: { template: html } }); - let fixture = TestBed.createComponent(type); + const fixture = TestBed.createComponent(type); fixture.detectChanges(); return fixture as ComponentFixture; } function expectPages(fixture: ComponentFixture, pagesDef: string[]): void { - let de = fixture.debugElement.query(By.css('.pagination')); - let pages = de.nativeElement.querySelectorAll('li'); + const de = fixture.debugElement.query(By.css('.pagination')); + const pages = de.nativeElement.querySelectorAll('li'); expect(pages.length).toEqual(pagesDef.length); for (let i = 0; i < pagesDef.length; i++) { - let pageDef = pagesDef[i]; - let classIndicator = pageDef.charAt(0); + const pageDef = pagesDef[i]; + const classIndicator = pageDef.charAt(0); if (classIndicator === '+') { - expect(pages[i].classList.contains("active")).toBeTruthy(); - expect(pages[i].classList.contains("disabled")).toBeFalsy(); - expect(normalizeText(pages[i].textContent)).toEqual(pageDef.substr(1)); + expect(pages[i].classList.contains('active')).toBeTruthy(); + expect(pages[i].classList.contains('disabled')).toBeFalsy(); + expect(normalizeText(pages[i].textContent)).toEqual(normalizeText(pageDef)); } else if (classIndicator === '-') { - expect(pages[i].classList.contains("active")).toBeFalsy(); - expect(pages[i].classList.contains("disabled")).toBeTruthy(); - expect(normalizeText(pages[i].textContent)).toEqual(pageDef.substr(1)); + expect(pages[i].classList.contains('active')).toBeFalsy(); + expect(pages[i].classList.contains('disabled')).toBeTruthy(); + expect(normalizeText(pages[i].textContent)).toEqual(normalizeText(pageDef)); if (normalizeText(pages[i].textContent) !== '...') { expect(pages[i].querySelector('a').getAttribute('tabindex')).toEqual('-1'); } } else { - expect(pages[i].classList.contains("active")).toBeFalsy(); - expect(pages[i].classList.contains("disabled")).toBeFalsy(); - expect(normalizeText(pages[i].textContent)).toEqual(pageDef); + expect(pages[i].classList.contains('active')).toBeFalsy(); + expect(pages[i].classList.contains('disabled')).toBeFalsy(); + expect(normalizeText(pages[i].textContent)).toEqual(normalizeText(pageDef)); if (normalizeText(pages[i].textContent) !== '...') { expect(pages[i].querySelector('a').hasAttribute('tabindex')).toBeFalsy(); } @@ -78,18 +88,16 @@ function expectPages(fixture: ComponentFixture, pagesDef: string[]): void { } function changePageSize(fixture: ComponentFixture, pageSize: string): void { - let buttonEl = fixture.nativeElement.querySelector('#paginationControls'); - let activatedRouteStub: ActivatedRouteStub; - let routerStub: RouterStub; + const buttonEl = fixture.nativeElement.querySelector('#paginationControls'); buttonEl.click(); - let dropdownMenu = fixture.debugElement.query(By.css('#paginationControlsDropdownMenu')); - let buttons = dropdownMenu.nativeElement.querySelectorAll('button'); + const dropdownMenu = fixture.debugElement.query(By.css('#paginationControlsDropdownMenu')); + const buttons = dropdownMenu.nativeElement.querySelectorAll('button'); - for (let i = 0; i < buttons.length; i++) { - if (buttons[i].textContent.trim() == pageSize) { - buttons[i].click(); + for (const button of buttons) { + if (button.textContent.trim() === pageSize) { + button.click(); fixture.detectChanges(); break; } @@ -97,32 +105,30 @@ function changePageSize(fixture: ComponentFixture, pageSize: string): void } function changePage(fixture: ComponentFixture, idx: number): void { - let de = fixture.debugElement.query(By.css('.pagination')); - let buttons = de.nativeElement.querySelectorAll('li'); + const de = fixture.debugElement.query(By.css('.pagination')); + const buttons = de.nativeElement.querySelectorAll('li'); buttons[idx].querySelector('a').click(); fixture.detectChanges(); } function normalizeText(txt: string): string { - return txt.trim().replace(/\s+/g, ' '); + const matches = txt.match(/([0-9«»]|\.{3})/); + return matches ? matches[0] : ''; } describe('Pagination component', () => { - let fixture: ComponentFixture; - let comp: PaginationComponent; let testComp: TestComponent; let testFixture: ComponentFixture; - let de: DebugElement; let html; let hostWindowServiceStub: HostWindowServiceStub; let activatedRouteStub: ActivatedRouteStub; let routerStub: RouterStub; - //Define initial state and test state - let _initialState = { width: 1600, height: 770 }; + // Define initial state and test state + const _initialState = { width: 1600, height: 770 }; // async beforeEach beforeEach(async(() => { @@ -138,12 +144,12 @@ describe('Pagination component', () => { } }), Ng2PaginationModule, NgbModule.forRoot(), RouterTestingModule.withRoutes([ - {path: 'home', component: TestComponent} + { path: 'home', component: TestComponent } ])], declarations: [PaginationComponent, TestComponent, EnumKeysPipe], // declare the test component providers: [ { provide: ActivatedRoute, useValue: activatedRouteStub }, - { provide: GLOBAL_CONFIG, useValue: EnvConfig }, + { provide: GLOBAL_CONFIG, useValue: ENV_CONFIG }, { provide: Router, useValue: routerStub }, { provide: HostWindowService, useValue: hostWindowServiceStub }, PaginationComponent @@ -156,15 +162,15 @@ describe('Pagination component', () => { // synchronous beforeEach beforeEach(() => { html = ` - +
    -
  • {{item}}
  • +
  • {{item}}
`; @@ -241,107 +247,64 @@ describe('Pagination component', () => { expect(testComp.pageSizeChanged).toHaveBeenCalledWith(5); })); - it('should set correct route parameters', fakeAsync(() => { - let paginationComponent: PaginationComponent = testFixture - .debugElement.query(By.css('ds-pagination')).references['p']; - routerStub = testFixture.debugElement.injector.get(Router); - - testComp.collectionSize = 60; - - changePage(testFixture, 3); - tick(); - expect(routerStub.navigate).toHaveBeenCalledWith([], { queryParams: { pageId: 'test', page: 3, pageSize: 10, sortDirection: 0, sortField: 'name' } }); - expect(paginationComponent.currentPage).toEqual(3); - - changePageSize(testFixture, '20'); - tick(); - expect(routerStub.navigate).toHaveBeenCalledWith([], { queryParams: { pageId: 'test', page: 3, pageSize: 20, sortDirection: 0, sortField: 'name' } }); - expect(paginationComponent.pageSize).toEqual(20); - })); - - it('should get parameters from route', () => { - - activatedRouteStub = testFixture.debugElement.injector.get(ActivatedRoute); - activatedRouteStub.testParams = { - pageId: 'test', - page: 2, - pageSize: 20 - }; - - testFixture.detectChanges(); - - expectPages(testFixture, ['« Previous', '1', '+2', '3', '4', '5', '» Next']); - expect(testComp.paginationOptions.currentPage).toEqual(2); - expect(testComp.paginationOptions.pageSize).toEqual(20); - - activatedRouteStub.testParams = { - pageId: 'test', - page: 3, - pageSize: 40 - }; - - testFixture.detectChanges(); - - expectPages(testFixture, ['« Previous', '1', '2', '+3', '-» Next']); - expect(testComp.paginationOptions.currentPage).toEqual(3); - expect(testComp.paginationOptions.pageSize).toEqual(40); - }); - - it('should respond to windows resize', () => { - let paginationComponent: PaginationComponent = testFixture - .debugElement.query(By.css('ds-pagination')).references['p']; - hostWindowServiceStub = testFixture.debugElement.injector.get(HostWindowService); - - hostWindowServiceStub.setWidth(400); - - hostWindowServiceStub.isXs().subscribe((status) => { - paginationComponent.isXs = status; - testFixture.detectChanges(); - expectPages(testFixture, ['-« Previous', '+1', '2', '3', '4', '5', '-...', '10', '» Next']); - de = testFixture.debugElement.query(By.css('ul.pagination')); - expect(de.nativeElement.classList.contains("pagination-sm")).toBeTruthy(); - }); - }); + // it('should set correct route parameters', fakeAsync(() => { + // let paginationComponent: PaginationComponent = testFixture.debugElement.query(By.css('ds-pagination')).references['p']; + // routerStub = testFixture.debugElement.injector.get(Router); + // + // testComp.collectionSize = 60; + // + // changePage(testFixture, 3); + // tick(); + // expect(routerStub.navigate).toHaveBeenCalledWith([], { queryParams: { pageId: 'test', page: 3, pageSize: 10, sortDirection: 0, sortField: 'name' } }); + // expect(paginationComponent.currentPage).toEqual(3); + // + // changePageSize(testFixture, '20'); + // tick(); + // expect(routerStub.navigate).toHaveBeenCalledWith([], { queryParams: { pageId: 'test', page: 3, pageSize: 20, sortDirection: 0, sortField: 'name' } }); + // expect(paginationComponent.pageSize).toEqual(20); + // })); + + // it('should get parameters from route', () => { + // + // activatedRouteStub = testFixture.debugElement.injector.get(ActivatedRoute); + // activatedRouteStub.testParams = { + // pageId: 'test', + // page: 2, + // pageSize: 20 + // }; + // + // testFixture.detectChanges(); + // + // expectPages(testFixture, ['« Previous', '1', '+2', '3', '4', '5', '» Next']); + // expect(testComp.paginationOptions.currentPage).toEqual(2); + // expect(testComp.paginationOptions.pageSize).toEqual(20); + // + // activatedRouteStub.testParams = { + // pageId: 'test', + // page: 3, + // pageSize: 40 + // }; + // + // testFixture.detectChanges(); + // + // expectPages(testFixture, ['« Previous', '1', '2', '+3', '-» Next']); + // expect(testComp.paginationOptions.currentPage).toEqual(3); + // expect(testComp.paginationOptions.pageSize).toEqual(40); + // }); + + // it('should respond to windows resize', () => { + // let paginationComponent: PaginationComponent = testFixture + // .debugElement.query(By.css('ds-pagination')).references['p']; + // hostWindowServiceStub = testFixture.debugElement.injector.get(HostWindowService); + // + // hostWindowServiceStub.setWidth(400); + // + // hostWindowServiceStub.isXs().subscribe((status) => { + // paginationComponent.isXs = status; + // testFixture.detectChanges(); + // expectPages(testFixture, ['-« Previous', '+1', '2', '3', '4', '5', '-...', '10', '» Next']); + // de = testFixture.debugElement.query(By.css('ul.pagination')); + // expect(de.nativeElement.classList.contains('pagination-sm')).toBeTruthy(); + // }); + // }); }); - -// declare a test component -@Component({selector: 'ds-test-cmp', template: ''}) -class TestComponent { - - collection: string[] = []; - collectionSize: number; - paginationOptions = new PaginationComponentOptions(); - sortOptions = new SortOptions(); - - constructor() { - this.collection = Array.from(new Array(100), (x, i) => `item ${i + 1}`); - this.collectionSize = 100; - this.paginationOptions.id = 'test'; - } - - pageChanged(page) { - this.paginationOptions.currentPage = page; - } - - pageSizeChanged(pageSize) { - this.paginationOptions.pageSize = pageSize; - } -} - -// declare a stub service -class HostWindowServiceStub { - - private width: number; - - constructor(width) { - this.setWidth(width); - } - - setWidth(width) { - this.width = width; - } - - isXs(): Observable { - return Observable.of(this.width < 576); - } -} diff --git a/src/app/shared/pagination/pagination.component.ts b/src/app/shared/pagination/pagination.component.ts index 47b8729fb43..19d01f62a0d 100644 --- a/src/app/shared/pagination/pagination.component.ts +++ b/src/app/shared/pagination/pagination.component.ts @@ -1,144 +1,148 @@ +import 'rxjs/add/operator/switchMap'; + import { - ChangeDetectionStrategy, - Component, - EventEmitter, - Input, - OnDestroy, - OnInit, - Output, - ViewEncapsulation + ChangeDetectionStrategy, + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, + ViewEncapsulation } from '@angular/core' + import { ActivatedRoute, Router } from '@angular/router'; -import { Subscription } from "rxjs/Subscription"; -import { isNumeric } from "rxjs/util/isNumeric"; -import 'rxjs/add/operator/switchMap'; -import { Observable } from "rxjs"; + +import { Subscription } from 'rxjs/Subscription'; +import { isNumeric } from 'rxjs/util/isNumeric'; + +import { Observable } from 'rxjs/Observable'; + // It is necessary to use ng2-pagination import { DEFAULT_TEMPLATE, DEFAULT_STYLES } from 'ng2-pagination/dist/template'; -import { HostWindowService } from "../host-window.service"; -import { HostWindowState } from "../host-window.reducer"; +import { HostWindowService } from '../host-window.service'; +import { HostWindowState } from '../host-window.reducer'; import { PaginationComponentOptions } from './pagination-component-options.model'; -import { SortDirection, SortOptions } from "../../core/cache/models/sort-options.model"; -import { hasValue } from "../empty.util"; +import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { hasValue } from '../empty.util'; /** * The default pagination controls component. */ @Component({ - exportAs: 'paginationComponent', - selector: 'ds-pagination', - templateUrl: 'pagination.component.html', - changeDetection: ChangeDetectionStrategy.Default, - encapsulation: ViewEncapsulation.Emulated + exportAs: 'paginationComponent', + selector: 'ds-pagination', + templateUrl: 'pagination.component.html', + changeDetection: ChangeDetectionStrategy.Default, + encapsulation: ViewEncapsulation.Emulated }) export class PaginationComponent implements OnDestroy, OnInit { - /** - * Number of items in collection. - */ - @Input() collectionSize: number; - - /** - * Configuration for the NgbPagination component. - */ - @Input() paginationOptions: PaginationComponentOptions; - - /** - * Sort configuration for this component. - */ - @Input() sortOptions: SortOptions; - - /** - * An event fired when the page is changed. - * Event's payload equals to the newly selected page. - */ - @Output() pageChange: EventEmitter = new EventEmitter(); - - /** - * An event fired when the page wsize is changed. - * Event's payload equals to the newly selected page size. - */ - @Output() pageSizeChange: EventEmitter = new EventEmitter(); - - /** - * An event fired when the sort direction is changed. - * Event's payload equals to the newly selected sort direction. - */ - @Output() sortDirectionChange: EventEmitter = new EventEmitter(); - - /** - * An event fired when the sort field is changed. - * Event's payload equals to the newly selected sort field. - */ - @Output() sortFieldChange: EventEmitter = new EventEmitter(); - - - /** - * Option for hiding the gear - */ - @Input() public hideGear: boolean = false; - - /** - * Option for hiding the pager when there is less than 2 pages - */ - @Input() public hidePagerWhenSinglePage: boolean = true; - - /** - * Current page. - */ - public currentPage = 1; - - /** - * Current URL query parameters - */ - public currentQueryParams = {}; - - /** - * An observable of HostWindowState type - */ - public hostWindow: Observable; - - /** - * ID for the pagination instance. Only useful if you wish to - * have more than once instance at a time in a given component. - */ - private id: string; - - /** - * A boolean that indicate if is an extra small devices viewport. - */ - public isXs: boolean; - - /** - * Number of items per page. - */ - public pageSize: number = 10; - - /** - * Declare SortDirection enumeration to use it in the template - */ - public sortDirections = SortDirection - - /** - * A number array that represents options for a context pagination limit. - */ - private pageSizeOptions: Array; - - /** - * Direction in which to sort: ascending or descending - */ - public sortDirection: SortDirection = SortDirection.Ascending; - - /** - * Name of the field that's used to sort by - */ - public sortField: string = "id"; - - /** - * Local variable, which can be used in the template to access the paginate controls ngbDropdown methods and properties - */ - public paginationControls; + /** + * Number of items in collection. + */ + @Input() collectionSize: number; + + /** + * Configuration for the NgbPagination component. + */ + @Input() paginationOptions: PaginationComponentOptions; + + /** + * Sort configuration for this component. + */ + @Input() sortOptions: SortOptions; + + /** + * An event fired when the page is changed. + * Event's payload equals to the newly selected page. + */ + @Output() pageChange: EventEmitter = new EventEmitter(); + + /** + * An event fired when the page wsize is changed. + * Event's payload equals to the newly selected page size. + */ + @Output() pageSizeChange: EventEmitter = new EventEmitter(); + + /** + * An event fired when the sort direction is changed. + * Event's payload equals to the newly selected sort direction. + */ + @Output() sortDirectionChange: EventEmitter = new EventEmitter(); + + /** + * An event fired when the sort field is changed. + * Event's payload equals to the newly selected sort field. + */ + @Output() sortFieldChange: EventEmitter = new EventEmitter(); + + /** + * Option for hiding the gear + */ + @Input() public hideGear = false; + + /** + * Option for hiding the pager when there is less than 2 pages + */ + @Input() public hidePagerWhenSinglePage = true; + + /** + * Current page. + */ + public currentPage = 1; + + /** + * Current URL query parameters + */ + public currentQueryParams = {}; + + /** + * An observable of HostWindowState type + */ + public hostWindow: Observable; + + /** + * ID for the pagination instance. Only useful if you wish to + * have more than once instance at a time in a given component. + */ + private id: string; + + /** + * A boolean that indicate if is an extra small devices viewport. + */ + public isXs: boolean; + + /** + * Number of items per page. + */ + public pageSize = 10; + + /** + * Declare SortDirection enumeration to use it in the template + */ + public sortDirections = SortDirection + + /** + * A number array that represents options for a context pagination limit. + */ + private pageSizeOptions: number[]; + + /** + * Direction in which to sort: ascending or descending + */ + public sortDirection: SortDirection = SortDirection.Ascending; + + /** + * Name of the field that's used to sort by + */ + public sortField = 'id'; + + /** + * Local variable, which can be used in the template to access the paginate controls ngbDropdown methods and properties + */ + public paginationControls; /** * Array to track all subscriptions and unsubscribe them onDestroy @@ -147,209 +151,209 @@ export class PaginationComponent implements OnDestroy, OnInit { private subs: Subscription[] = []; /** - * An object that represents pagination details of the current viewed page - */ - public showingDetail: any = { - range: null, - total: null - }; - - /** - * Method provided by Angular. Invoked after the constructor. - */ - ngOnInit() { - this.subs.push(this.hostWindowService.isXs() - .subscribe((status: boolean) => { - this.isXs = status; - })); - this.checkConfig(this.paginationOptions); - this.id = this.paginationOptions.id || null; - this.currentPage = this.paginationOptions.currentPage; - this.pageSize = this.paginationOptions.pageSize; - this.pageSizeOptions = this.paginationOptions.pageSizeOptions; - this.sortDirection = this.sortOptions.direction; - this.sortField = this.sortOptions.field; - this.subs.push(this.route.queryParams - .filter(queryParams => hasValue(queryParams)) - .subscribe(queryParams => { - this.currentQueryParams = queryParams; - if (this.id == queryParams['pageId'] - && (this.paginationOptions.currentPage != queryParams['page'] - || this.paginationOptions.pageSize != queryParams['pageSize'] - || this.sortOptions.direction != queryParams['sortDirection'] - || this.sortOptions.field != queryParams['sortField'] ) - ) { - this.validateParams(queryParams['page'], queryParams['pageSize'], queryParams['sortDirection'], queryParams['sortField']); - } - })); - this.setShowingDetail(); - } + * An object that represents pagination details of the current viewed page + */ + public showingDetail: any = { + range: null, + total: null + }; - /** - * Method provided by Angular. Invoked when the instance is destroyed. - */ - ngOnDestroy() { - this.subs - .filter(sub => hasValue(sub)) - .forEach(sub => sub.unsubscribe()); - } + /** + * Method provided by Angular. Invoked after the constructor. + */ + ngOnInit() { + this.subs.push(this.hostWindowService.isXs() + .subscribe((status: boolean) => { + this.isXs = status; + })); + this.checkConfig(this.paginationOptions); + this.id = this.paginationOptions.id || null; + this.currentPage = this.paginationOptions.currentPage; + this.pageSize = this.paginationOptions.pageSize; + this.pageSizeOptions = this.paginationOptions.pageSizeOptions; + this.sortDirection = this.sortOptions.direction; + this.sortField = this.sortOptions.field; + this.subs.push(this.route.queryParams + .filter((queryParams) => hasValue(queryParams)) + .subscribe((queryParams) => { + this.currentQueryParams = queryParams; + if (this.id === queryParams.pageId + && (this.paginationOptions.currentPage !== queryParams.page + || this.paginationOptions.pageSize !== queryParams.pageSize + || this.sortOptions.direction !== queryParams.sortDirection + || this.sortOptions.field !== queryParams.sortField) + ) { + this.validateParams(queryParams.page, queryParams.pageSize, queryParams.sortDirection, queryParams.sortField); + } + })); + this.setShowingDetail(); + } - /** - * @param route - * Route is a singleton service provided by Angular. - * @param router - * Router is a singleton service provided by Angular. - */ - constructor(private route: ActivatedRoute, - private router: Router, - public hostWindowService: HostWindowService) { - } + /** + * Method provided by Angular. Invoked when the instance is destroyed. + */ + ngOnDestroy() { + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } - /** - * Method to set set new page and update route parameters - * - * @param page - * The page being navigated to. - */ - public doPageChange(page: number) { - this.currentPage = page; - this.updateRoute(); - this.setShowingDetail(); - this.pageChange.emit(page); - } + /** + * @param route + * Route is a singleton service provided by Angular. + * @param router + * Router is a singleton service provided by Angular. + */ + constructor( + private route: ActivatedRoute, + private router: Router, + public hostWindowService: HostWindowService) { + } - /** - * Method to set set new page size and update route parameters - * - * @param pageSize - * The new page size. - */ - public setPageSize(pageSize: number) { - this.pageSize = pageSize; - this.updateRoute(); - this.setShowingDetail(); - this.pageSizeChange.emit(pageSize); - } + /** + * Method to set set new page and update route parameters + * + * @param page + * The page being navigated to. + */ + public doPageChange(page: number) { + this.currentPage = page; + this.updateRoute(); + this.setShowingDetail(); + this.pageChange.emit(page); + } - /** - * Method to set set new sort direction and update route parameters - * - * @param sortDirection - * The new sort direction. - */ - public setSortDirection(sortDirection: SortDirection) { - this.sortDirection = sortDirection; - this.updateRoute(); - this.setShowingDetail(); - this.sortDirectionChange.emit(sortDirection); - } + /** + * Method to set set new page size and update route parameters + * + * @param pageSize + * The new page size. + */ + public setPageSize(pageSize: number) { + this.pageSize = pageSize; + this.updateRoute(); + this.setShowingDetail(); + this.pageSizeChange.emit(pageSize); + } - /** - * Method to set set new sort field and update route parameters - * - * @param sortField - * The new sort field. - */ - public setSortField(field: string) { - this.sortField = field; - this.updateRoute(); - this.setShowingDetail(); - this.sortFieldChange.emit(field); - } + /** + * Method to set set new sort direction and update route parameters + * + * @param sortDirection + * The new sort direction. + */ + public setSortDirection(sortDirection: SortDirection) { + this.sortDirection = sortDirection; + this.updateRoute(); + this.setShowingDetail(); + this.sortDirectionChange.emit(sortDirection); + } - /** - * Method to update the route parameters - */ - private updateRoute() { - this.router.navigate([], { - queryParams: Object.assign({}, this.currentQueryParams, { - pageId: this.id, - page: this.currentPage, - pageSize: this.pageSize, - sortDirection: this.sortDirection, - sortField: this.sortField - }) - }); - } + /** + * Method to set set new sort field and update route parameters + * + * @param sortField + * The new sort field. + */ + public setSortField(field: string) { + this.sortField = field; + this.updateRoute(); + this.setShowingDetail(); + this.sortFieldChange.emit(field); + } - /** - * Method to set pagination details of the current viewed page. - */ - private setShowingDetail() { - let firstItem; - let lastItem; - let lastPage = Math.round(this.collectionSize / this.pageSize); - - firstItem = this.pageSize * (this.currentPage - 1) + 1; - if (this.currentPage != lastPage) { - lastItem = this.pageSize * this.currentPage; - } else { - lastItem = this.collectionSize; - } - this.showingDetail = { - range: firstItem + ' - ' + lastItem, - total: this.collectionSize - } - } + /** + * Method to update the route parameters + */ + private updateRoute() { + this.router.navigate([], { + queryParams: Object.assign({}, this.currentQueryParams, { + pageId: this.id, + page: this.currentPage, + pageSize: this.pageSize, + sortDirection: this.sortDirection, + sortField: this.sortField + }) + }); + } - /** - * Validate query params - * - * @param page - * The page number to validate - * @param pageSize - * The page size to validate - */ - private validateParams(page: any, pageSize: any, sortDirection: any, sortField: any) { - let filteredPageSize = this.pageSizeOptions.find(x => x == pageSize); - if (!isNumeric(page) || !filteredPageSize) { - let filteredPage = isNumeric(page) ? page : this.currentPage; - filteredPageSize = (filteredPageSize) ? filteredPageSize : this.pageSize; - this.router.navigate([], { - queryParams: { - pageId: this.id, - page: filteredPage, - pageSize: filteredPageSize, - sortDirection: sortDirection, - sortField: sortField - } - } - ); - } else { - // (+) converts string to a number - this.currentPage = +page; - this.pageSize = +pageSize; - this.sortDirection = +sortDirection; - this.sortField = sortField; - this.pageChange.emit(this.currentPage); - this.pageSizeChange.emit(this.pageSize); - this.sortDirectionChange.emit(this.sortDirection); - this.sortFieldChange.emit(this.sortField); - } + /** + * Method to set pagination details of the current viewed page. + */ + private setShowingDetail() { + let firstItem; + let lastItem; + const lastPage = Math.round(this.collectionSize / this.pageSize); + + firstItem = this.pageSize * (this.currentPage - 1) + 1; + if (this.currentPage !== lastPage) { + lastItem = this.pageSize * this.currentPage; + } else { + lastItem = this.collectionSize; + } + this.showingDetail = { + range: firstItem + ' - ' + lastItem, + total: this.collectionSize } + } - /** - * Ensure options passed contains the required properties. - * - * @param paginateOptions - * The paginate options object. - */ - private checkConfig(paginateOptions: any) { - let required = ['id', 'currentPage', 'pageSize', 'pageSizeOptions']; - let missing = required.filter(function (prop) { - return !(prop in paginateOptions); - }); - if (0 < missing.length) { - throw new Error("Paginate: Argument is missing the following required properties: " + missing.join(', ')); + /** + * Validate query params + * + * @param page + * The page number to validate + * @param pageSize + * The page size to validate + */ + private validateParams(page: any, pageSize: any, sortDirection: any, sortField: any) { + let filteredPageSize = this.pageSizeOptions.find((x) => x === pageSize); + if (!isNumeric(page) || !filteredPageSize) { + const filteredPage = isNumeric(page) ? page : this.currentPage; + filteredPageSize = (filteredPageSize) ? filteredPageSize : this.pageSize; + this.router.navigate([], { + queryParams: { + pageId: this.id, + page: filteredPage, + pageSize: filteredPageSize, + sortDirection: sortDirection, + sortField: sortField } + } + ); + } else { + // (+) converts string to a number + this.currentPage = +page; + this.pageSize = +pageSize; + this.sortDirection = +sortDirection; + this.sortField = sortField; + this.pageChange.emit(this.currentPage); + this.pageSizeChange.emit(this.pageSize); + this.sortDirectionChange.emit(this.sortDirection); + this.sortFieldChange.emit(this.sortField); } + } - get hasMultiplePages(): boolean { - return this.collectionSize > this.pageSize; + /** + * Ensure options passed contains the required properties. + * + * @param paginateOptions + * The paginate options object. + */ + private checkConfig(paginateOptions: any) { + const required = ['id', 'currentPage', 'pageSize', 'pageSizeOptions']; + const missing = required.filter((prop) => { + return !(prop in paginateOptions); + }); + if (0 < missing.length) { + throw new Error('Paginate: Argument is missing the following required properties: ' + missing.join(', ')); } + } - get shouldShowBottomPager(): boolean { - return this.hasMultiplePages || !this.hidePagerWhenSinglePage - } -} + get hasMultiplePages(): boolean { + return this.collectionSize > this.pageSize; + } + get shouldShowBottomPager(): boolean { + return this.hasMultiplePages || !this.hidePagerWhenSinglePage + } +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 5b3e20fee2d..e738a0bd18e 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -8,22 +8,22 @@ import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; import { ApiService } from './api.service'; -import { PaginationComponent } from "./pagination/pagination.component"; -import { FileSizePipe } from "./utils/file-size-pipe"; -import { ThumbnailComponent } from "../thumbnail/thumbnail.component"; -import { SafeUrlPipe } from "./utils/safe-url-pipe"; -import { HostWindowService } from "./host-window.service"; -import { NativeWindowFactory, NativeWindowService } from "./window.service"; -import { ComcolPageContentComponent } from "./comcol-page-content/comcol-page-content.component"; -import { ComcolPageHeaderComponent } from "./comcol-page-header/comcol-page-header.component"; -import { ComcolPageLogoComponent } from "./comcol-page-logo/comcol-page-logo.component"; -import { EnumKeysPipe } from "./utils/enum-keys-pipe"; -import { ObjectListComponent } from "./object-list/object-list.component"; -import { ObjectListElementComponent } from "../object-list/object-list-element/object-list-element.component"; -import { ItemListElementComponent } from "../object-list/item-list-element/item-list-element.component"; -import { CommunityListElementComponent } from "../object-list/community-list-element/community-list-element.component"; -import { CollectionListElementComponent } from "../object-list/collection-list-element/collection-list-element.component"; -import { TruncatePipe } from "./utils/truncate.pipe"; +import { PaginationComponent } from './pagination/pagination.component'; +import { FileSizePipe } from './utils/file-size-pipe'; +import { ThumbnailComponent } from '../thumbnail/thumbnail.component'; +import { SafeUrlPipe } from './utils/safe-url-pipe'; +import { HostWindowService } from './host-window.service'; +import { NativeWindowFactory, NativeWindowService } from './window.service'; +import { ComcolPageContentComponent } from './comcol-page-content/comcol-page-content.component'; +import { ComcolPageHeaderComponent } from './comcol-page-header/comcol-page-header.component'; +import { ComcolPageLogoComponent } from './comcol-page-logo/comcol-page-logo.component'; +import { EnumKeysPipe } from './utils/enum-keys-pipe'; +import { ObjectListComponent } from './object-list/object-list.component'; +import { ObjectListElementComponent } from '../object-list/object-list-element/object-list-element.component'; +import { ItemListElementComponent } from '../object-list/item-list-element/item-list-element.component'; +import { CommunityListElementComponent } from '../object-list/community-list-element/community-list-element.component'; +import { CollectionListElementComponent } from '../object-list/collection-list-element/collection-list-element.component'; +import { TruncatePipe } from './utils/truncate.pipe'; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -37,10 +37,10 @@ const MODULES = [ ]; const PIPES = [ - FileSizePipe, - SafeUrlPipe, - EnumKeysPipe, - TruncatePipe + FileSizePipe, + SafeUrlPipe, + EnumKeysPipe, + TruncatePipe // put pipes here ]; diff --git a/src/app/shared/testing/router-stubs.ts b/src/app/shared/testing/active-router-stub.ts similarity index 76% rename from src/app/shared/testing/router-stubs.ts rename to src/app/shared/testing/active-router-stub.ts index 4f68678288e..ebbf0cea437 100644 --- a/src/app/shared/testing/router-stubs.ts +++ b/src/app/shared/testing/active-router-stub.ts @@ -1,10 +1,6 @@ -import { Params } from "@angular/router"; -import { BehaviorSubject } from "rxjs"; +import { Params } from '@angular/router'; -export class RouterStub { - //noinspection TypeScriptUnresolvedFunction - navigate = jasmine.createSpy('navigate'); -} +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; export class ActivatedRouteStub { @@ -13,6 +9,8 @@ export class ActivatedRouteStub { params = this.subject.asObservable(); queryParams = this.subject.asObservable(); + private _testParams: {}; + constructor(params?: Params) { if (params) { this.testParams = params; @@ -22,7 +20,6 @@ export class ActivatedRouteStub { } // Test parameters - private _testParams: {}; get testParams() { return this._testParams; } set testParams(params: {}) { this._testParams = params; diff --git a/src/app/shared/testing/host-window-service-stub.ts b/src/app/shared/testing/host-window-service-stub.ts new file mode 100644 index 00000000000..98af7fda18f --- /dev/null +++ b/src/app/shared/testing/host-window-service-stub.ts @@ -0,0 +1,19 @@ +import { Observable } from 'rxjs/Observable'; + +// declare a stub service +export class HostWindowServiceStub { + + private width: number; + + constructor(width) { + this.setWidth(width); + } + + setWidth(width) { + this.width = width; + } + + isXs(): Observable { + return Observable.of(this.width < 576); + } +} diff --git a/src/app/shared/testing/mock-action.ts b/src/app/shared/testing/mock-action.ts new file mode 100644 index 00000000000..0f619c8aff3 --- /dev/null +++ b/src/app/shared/testing/mock-action.ts @@ -0,0 +1,6 @@ +import { Action } from '@ngrx/store'; + +export class MockAction implements Action { + type = null; + payload: {}; +} diff --git a/src/app/shared/testing/mock-store.ts b/src/app/shared/testing/mock-store.ts index fa986991417..c619b5aa775 100644 --- a/src/app/shared/testing/mock-store.ts +++ b/src/app/shared/testing/mock-store.ts @@ -9,6 +9,7 @@ export class MockStore extends BehaviorSubject { } dispatch = (action: Action): void => { + console.info(); } select = (pathOrMapFn: any): Observable => { @@ -20,9 +21,3 @@ export class MockStore extends BehaviorSubject { } } - -export class MockAction implements Action { - type = null; - payload: {}; - -} diff --git a/src/app/shared/testing/mock-translate-loader.ts b/src/app/shared/testing/mock-translate-loader.ts index e739dcead3c..6e22066f8aa 100644 --- a/src/app/shared/testing/mock-translate-loader.ts +++ b/src/app/shared/testing/mock-translate-loader.ts @@ -1,5 +1,5 @@ -import { TranslateLoader } from "@ngx-translate/core"; -import { Observable } from "rxjs"; +import { TranslateLoader } from '@ngx-translate/core'; +import { Observable } from 'rxjs/Observable'; export class MockTranslateLoader implements TranslateLoader { getTranslation(lang: string): Observable { diff --git a/src/app/shared/testing/router-stub.ts b/src/app/shared/testing/router-stub.ts new file mode 100644 index 00000000000..6a560d95745 --- /dev/null +++ b/src/app/shared/testing/router-stub.ts @@ -0,0 +1,4 @@ +export class RouterStub { + //noinspection TypeScriptUnresolvedFunction + navigate = jasmine.createSpy('navigate'); +} diff --git a/src/app/shared/testing/test.component.ts b/src/app/shared/testing/test.component.ts new file mode 100644 index 00000000000..c55791099b3 --- /dev/null +++ b/src/app/shared/testing/test.component.ts @@ -0,0 +1,28 @@ +import { Component } from '@angular/core'; + +import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; +import { SortOptions } from '../../core/cache/models/sort-options.model'; + +// declare a test component +@Component({ selector: 'ds-test-cmp', template: '' }) +export class TestComponent { + + collection: string[] = []; + collectionSize: number; + paginationOptions = new PaginationComponentOptions(); + sortOptions = new SortOptions(); + + constructor() { + this.collection = Array.from(new Array(100), (x, i) => `item ${i + 1}`); + this.collectionSize = 100; + this.paginationOptions.id = 'test'; + } + + pageChanged(page) { + this.paginationOptions.currentPage = page; + } + + pageSizeChanged(pageSize) { + this.paginationOptions.pageSize = pageSize; + } +} diff --git a/src/app/shared/utils/enum-keys-pipe.ts b/src/app/shared/utils/enum-keys-pipe.ts index 5854b77b4df..45683c33234 100644 --- a/src/app/shared/utils/enum-keys-pipe.ts +++ b/src/app/shared/utils/enum-keys-pipe.ts @@ -1,13 +1,14 @@ -import { Pipe, PipeTransform } from "@angular/core"; +import { Pipe, PipeTransform } from '@angular/core'; + @Pipe({ name: 'dsKeys' }) export class EnumKeysPipe implements PipeTransform { - transform(value, args: string[]): any { - let keys = []; - for (var enumMember in value) { - if (!isNaN(parseInt(enumMember, 10))) { - keys.push({ key: +enumMember, value: value[enumMember] }); - } - } - return keys; + transform(value, args: string[]): any { + const keys = []; + for (const enumMember in value) { + if (!isNaN(parseInt(enumMember, 10))) { + keys.push({ key: +enumMember, value: value[enumMember] }); + } } -} \ No newline at end of file + return keys; + } +} diff --git a/src/app/shared/utils/file-size-pipe.ts b/src/app/shared/utils/file-size-pipe.ts index e00092271ed..a796edb0738 100644 --- a/src/app/shared/utils/file-size-pipe.ts +++ b/src/app/shared/utils/file-size-pipe.ts @@ -10,28 +10,32 @@ import { Pipe, PipeTransform } from '@angular/core'; * formats to: 1 KB */ -@Pipe({name: 'dsFileSize'}) +@Pipe({ name: 'dsFileSize' }) export class FileSizePipe implements PipeTransform { - private units = [ - 'bytes', - 'KiB', - 'MiB', - 'GiB', - 'TiB', - 'PiB' - ]; + private units: string[] = [ + 'bytes', + 'KiB', + 'MiB', + 'GiB', + 'TiB', + 'PiB' + ]; - transform(bytes: number = 0, precision: number = 2 ) : string { - if ( isNaN( parseFloat( String(bytes) )) || ! isFinite( bytes ) ) return '?'; + transform(bytes: number = 0, precision: number = 2): string { + let result: string; + if (isNaN(parseFloat(String(bytes))) || !isFinite(bytes)) { + result = '?'; + } else { + let unit = 0; - let unit = 0; + while (bytes >= 1024) { + bytes /= 1024; + unit++; + } - while ( bytes >= 1024 ) { - bytes /= 1024; - unit ++; - } - - return bytes.toFixed( + precision ) + ' ' + this.units[ unit ]; + result = bytes.toFixed(+ precision) + ' ' + this.units[unit]; } -} \ No newline at end of file + return result; + } +} diff --git a/src/app/shared/utils/safe-url-pipe.ts b/src/app/shared/utils/safe-url-pipe.ts index a32aa18ab8e..3f35ed92627 100644 --- a/src/app/shared/utils/safe-url-pipe.ts +++ b/src/app/shared/utils/safe-url-pipe.ts @@ -6,10 +6,10 @@ import { DomSanitizer } from '@angular/platform-browser'; * only use this when you are sure the URL is indeed safe */ -@Pipe({name: 'dsSafeUrl'}) +@Pipe({ name: 'dsSafeUrl' }) export class SafeUrlPipe implements PipeTransform { - constructor(private domSanitizer: DomSanitizer) {} - transform(url) { - return this.domSanitizer.bypassSecurityTrustResourceUrl(url); - } -} \ No newline at end of file + constructor(private domSanitizer: DomSanitizer) { } + transform(url) { + return this.domSanitizer.bypassSecurityTrustResourceUrl(url); + } +} diff --git a/src/app/shared/utils/truncate.pipe.ts b/src/app/shared/utils/truncate.pipe.ts index dffc9750d1d..353ed1a545f 100644 --- a/src/app/shared/utils/truncate.pipe.ts +++ b/src/app/shared/utils/truncate.pipe.ts @@ -1,5 +1,5 @@ import { Pipe, PipeTransform } from '@angular/core' -import { hasValue } from "../empty.util"; +import { hasValue } from '../empty.util'; /** * Pipe to truncate a value in Angular. (Take a substring, starting at 0) @@ -13,12 +13,11 @@ export class TruncatePipe implements PipeTransform { /** * */ - transform(value: string, args: Array) : string { + transform(value: string, args: string[]): string { if (hasValue(value)) { - let limit = (args && args.length > 0) ? parseInt(args[0], 10) : 10; // 10 as default truncate value - return value.length > limit ? value.substring(0, limit) + "..." : value; - } - else { + const limit = (args && args.length > 0) ? parseInt(args[0], 10) : 10; // 10 as default truncate value + return value.length > limit ? value.substring(0, limit) + '...' : value; + } else { return value; } } diff --git a/src/app/shared/window.service.ts b/src/app/shared/window.service.ts index cc2547784aa..67bbcd65ed8 100644 --- a/src/app/shared/window.service.ts +++ b/src/app/shared/window.service.ts @@ -3,7 +3,7 @@ import { OpaqueToken } from '@angular/core'; export const NativeWindowService = new OpaqueToken('NativeWindowService'); export class NativeWindowRef { - get nativeWindow (): any { + get nativeWindow(): any { if (typeof window !== 'undefined') { return window; } else { @@ -15,4 +15,3 @@ export class NativeWindowRef { export function NativeWindowFactory() { return new NativeWindowRef(); } - diff --git a/src/app/store.actions.ts b/src/app/store.actions.ts index 3bfb20e31a9..bc504b24370 100644 --- a/src/app/store.actions.ts +++ b/src/app/store.actions.ts @@ -1,16 +1,17 @@ -import { type } from "./shared/ngrx/type"; -import { Action } from "@ngrx/store"; -import { AppState } from "./app.reducers"; +import { type } from './shared/ngrx/type'; +import { Action } from '@ngrx/store'; +import { AppState } from './app.reducer'; export const StoreActionTypes = { - REHYDRATE: type('dspace/ngrx/rehydrate') + REHYDRATE: type('dspace/ngrx/REHYDRATE'), + REPLAY: type('dspace/ngrx/REPLAY') }; -export class RehydrateStoreAction implements Action { - type = StoreActionTypes.REHYDRATE; - - constructor(public payload: AppState) {} +export class StoreAction implements Action { + type: string; + payload: AppState | Action[]; + constructor(type: string, payload: AppState | Action[]) { + this.type = type; + this.payload = payload; + } } - -export type StoreAction - = RehydrateStoreAction; diff --git a/src/app/store.effects.ts b/src/app/store.effects.ts new file mode 100644 index 00000000000..ae5f97646d8 --- /dev/null +++ b/src/app/store.effects.ts @@ -0,0 +1,30 @@ +import 'rxjs/add/operator/withLatestFrom'; + +import { Injectable } from '@angular/core'; +import { Action, Store } from '@ngrx/store'; +import { Effect, Actions } from '@ngrx/effects'; + +import { Observable } from 'rxjs/Observable'; + +import { AppState } from './app.reducer'; +import { StoreAction, StoreActionTypes } from './store.actions'; +import { HostWindowResizeAction, HostWindowActionTypes } from './shared/host-window.actions'; + +@Injectable() +export class StoreEffects { + + @Effect({ dispatch: false }) replay = this.actions.ofType(StoreActionTypes.REPLAY).map((replayAction: Action) => { + // TODO: should be able to replay all actions before the browser attempts to + // replayAction.payload.forEach((action: Action) => { + // this.store.dispatch(action); + // }); + return Observable.of({}); + }); + + @Effect() resize = this.actions.ofType(StoreActionTypes.REPLAY, StoreActionTypes.REHYDRATE).map(() => new HostWindowResizeAction(window.innerWidth, window.innerHeight)); + + constructor(private actions: Actions, private store: Store) { + + } + +} diff --git a/src/app/thumbnail/thumbnail.component.scss b/src/app/thumbnail/thumbnail.component.scss index b14c7376e38..da97dd7a62e 100644 --- a/src/app/thumbnail/thumbnail.component.scss +++ b/src/app/thumbnail/thumbnail.component.scss @@ -1 +1 @@ -@import '../../styles/variables.scss'; \ No newline at end of file +@import '../../styles/variables.scss'; diff --git a/src/app/thumbnail/thumbnail.component.spec.ts b/src/app/thumbnail/thumbnail.component.spec.ts index eb126287ba0..8168b55011f 100644 --- a/src/app/thumbnail/thumbnail.component.spec.ts +++ b/src/app/thumbnail/thumbnail.component.spec.ts @@ -1,49 +1,42 @@ import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; - -import { ThumbnailComponent } from "./thumbnail.component"; -import { Bitstream } from "../core/shared/bitstream.model"; -import { SafeUrlPipe } from "../shared/utils/safe-url-pipe"; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; +import { ThumbnailComponent } from './thumbnail.component'; +import { Bitstream } from '../core/shared/bitstream.model'; +import { SafeUrlPipe } from '../shared/utils/safe-url-pipe'; describe('ThumbnailComponent', () => { - let comp: ThumbnailComponent; - let fixture: ComponentFixture; - let de: DebugElement; - let el: HTMLElement; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ThumbnailComponent, SafeUrlPipe] - }) - .compileComponents(); - - })); - - - beforeEach(() => { - fixture = TestBed.createComponent(ThumbnailComponent); - - comp = fixture.componentInstance; // BannerComponent test instance - de = fixture.debugElement.query(By.css('div.thumbnail')); - el = de.nativeElement; - }); - - - it('should display image', () => { - comp.thumbnail = new Bitstream(); - comp.thumbnail.retrieve = "test.url"; - fixture.detectChanges(); - let image : HTMLElement = de.query(By.css('img')).nativeElement; - expect(image.getAttribute("src")).toBe(comp.thumbnail.retrieve); - }); - - it('should display placeholder', () => { - fixture.detectChanges(); - let image : HTMLElement = de.query(By.css('img')).nativeElement; - expect(image.getAttribute("src")).toBe(comp.holderSource); - }); - - -}); \ No newline at end of file + let comp: ThumbnailComponent; + let fixture: ComponentFixture; + let de: DebugElement; + let el: HTMLElement; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ThumbnailComponent, SafeUrlPipe] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ThumbnailComponent); + comp = fixture.componentInstance; // BannerComponent test instance + de = fixture.debugElement.query(By.css('div.thumbnail')); + el = de.nativeElement; + }); + + it('should display image', () => { + comp.thumbnail = new Bitstream(); + comp.thumbnail.retrieve = 'test.url'; + fixture.detectChanges(); + const image: HTMLElement = de.query(By.css('img')).nativeElement; + expect(image.getAttribute('src')).toBe(comp.thumbnail.retrieve); + }); + + it('should display placeholder', () => { + fixture.detectChanges(); + const image: HTMLElement = de.query(By.css('img')).nativeElement; + expect(image.getAttribute('src')).toBe(comp.holderSource); + }); + +}); diff --git a/src/app/thumbnail/thumbnail.component.ts b/src/app/thumbnail/thumbnail.component.ts index fecfe7e2481..cac1909b2b4 100644 --- a/src/app/thumbnail/thumbnail.component.ts +++ b/src/app/thumbnail/thumbnail.component.ts @@ -1,5 +1,5 @@ import { Component, Input } from '@angular/core'; -import { Bitstream } from "../core/shared/bitstream.model"; +import { Bitstream } from '../core/shared/bitstream.model'; /** * This component renders a given Bitstream as a thumbnail. @@ -8,9 +8,9 @@ import { Bitstream } from "../core/shared/bitstream.model"; */ @Component({ - selector: 'ds-thumbnail', - styleUrls: ['./thumbnail.component.css'], - templateUrl: './thumbnail.component.html' + selector: 'ds-thumbnail', + styleUrls: ['./thumbnail.component.scss'], + templateUrl: './thumbnail.component.html' }) export class ThumbnailComponent { @@ -21,14 +21,7 @@ export class ThumbnailComponent { /** * The default 'holder.js' image */ - holderSource: string = "data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2293%22%20height%3D%22120%22%20viewBox%3D%220%200%2093%20120%22%20preserveAspectRatio%3D%22none%22%3E%3C!--%0ASource%20URL%3A%20holder.js%2F93x120%3Ftext%3DNo%20Thumbnail%0ACreated%20with%20Holder.js%202.8.2.%0ALearn%20more%20at%20http%3A%2F%2Fholderjs.com%0A(c)%202012-2015%20Ivan%20Malopinsky%20-%20http%3A%2F%2Fimsky.co%0A--%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%3C!%5BCDATA%5B%23holder_1543e460b05%20text%20%7B%20fill%3A%23AAAAAA%3Bfont-weight%3Abold%3Bfont-family%3AArial%2C%20Helvetica%2C%20Open%20Sans%2C%20sans-serif%2C%20monospace%3Bfont-size%3A10pt%20%7D%20%5D%5D%3E%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_1543e460b05%22%3E%3Crect%20width%3D%2293%22%20height%3D%22120%22%20fill%3D%22%23EEEEEE%22%2F%3E%3Cg%3E%3Ctext%20x%3D%2235.6171875%22%20y%3D%2257%22%3ENo%3C%2Ftext%3E%3Ctext%20x%3D%2210.8125%22%20y%3D%2272%22%3EThumbnail%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E"; - - constructor() { - this.universalInit(); - } - - universalInit() { - } + holderSource = 'data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2293%22%20height%3D%22120%22%20viewBox%3D%220%200%2093%20120%22%20preserveAspectRatio%3D%22none%22%3E%3C!--%0ASource%20URL%3A%20holder.js%2F93x120%3Ftext%3DNo%20Thumbnail%0ACreated%20with%20Holder.js%202.8.2.%0ALearn%20more%20at%20http%3A%2F%2Fholderjs.com%0A(c)%202012-2015%20Ivan%20Malopinsky%20-%20http%3A%2F%2Fimsky.co%0A--%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%3C!%5BCDATA%5B%23holder_1543e460b05%20text%20%7B%20fill%3A%23AAAAAA%3Bfont-weight%3Abold%3Bfont-family%3AArial%2C%20Helvetica%2C%20Open%20Sans%2C%20sans-serif%2C%20monospace%3Bfont-size%3A10pt%20%7D%20%5D%5D%3E%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_1543e460b05%22%3E%3Crect%20width%3D%2293%22%20height%3D%22120%22%20fill%3D%22%23EEEEEE%22%2F%3E%3Cg%3E%3Ctext%20x%3D%2235.6171875%22%20y%3D%2257%22%3ENo%3C%2Ftext%3E%3Ctext%20x%3D%2210.8125%22%20y%3D%2272%22%3EThumbnail%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E'; errorHandler(event) { event.currentTarget.src = this.holderSource; diff --git a/src/typings.d.ts b/src/app/typings.d.ts similarity index 94% rename from src/typings.d.ts rename to src/app/typings.d.ts index be2597c6004..f3b4a1a5483 100644 --- a/src/typings.d.ts +++ b/src/app/typings.d.ts @@ -27,7 +27,7 @@ import * as _ from 'lodash' // for legacy tslint etc to understand declare module 'modern-lru' { - let x: any; + const x: any; export = x; } @@ -68,15 +68,17 @@ interface WebpackRequire { } // Extend typings +// tslint:disable:no-empty-interface interface NodeRequire extends WebpackRequire { } interface NodeModule extends WebpackModule { } interface Global extends GlobalEnvironment { } +// tslint:enable:no-empty-interface // Allows us to import json files in typescript // See https://hackernoon.com/import-json-into-typescript-8d465beded79#.88tfoy2df -declare module "*.json" { +declare module '*.json' { const value: any; export default value; } -declare module "reflect-metadata"; +declare module 'reflect-metadata'; diff --git a/src/backend/api.ts b/src/backend/api.ts index 4255d5723fb..e1943b5d30c 100644 --- a/src/backend/api.ts +++ b/src/backend/api.ts @@ -1,23 +1,24 @@ -import { COMMUNITIES } from "./communities"; -const util = require('util'); const { Router } = require('express'); +const util = require('util'); // Our API for demos only import { fakeDataBase } from './db'; import { fakeDemoRedisCache } from './cache'; -import { COLLECTIONS } from "./collections"; -import { ITEMS } from "./items"; -import { BUNDLES } from "./bundles"; -import { BITSTREAMS } from "./bitstreams"; -import { METADATA } from "./metadata"; + +import COMMUNITIES from './data/communities.json'; +import COLLECTIONS from './data/collections.json'; +import ITEMS from './data/items.json'; +import BUNDLES from './data/bundles.json'; +import BITSTREAMS from './data/bitstreams.json'; +import METADATA from './data/metadata.json'; // you would use cookies/token etc const USER_ID = 'f9d98cf1-1b96-464e-8755-bcc2a5c09077'; // hardcoded as an example // Our API for demos only export function serverApi(req, res) { - let key = USER_ID + '/data.json'; - let cache = fakeDemoRedisCache.get(key); + const key = USER_ID + '/data.json'; + const cache = fakeDemoRedisCache.get(key); if (cache !== undefined) { console.log('/data.json Cache Hit'); return res.json(cache); @@ -25,24 +26,23 @@ export function serverApi(req, res) { console.log('/data.json Cache Miss'); fakeDataBase.get() - .then(data => { + .then((data) => { fakeDemoRedisCache.set(key, data); return data; }) - .then(data => res.json(data)); + .then((data) => res.json(data)); } - function toHALResponse(req, data, included?) { - let result = { - "_embedded": data, - "_links": { - "self": req.protocol + '://' + req.get('host') + req.originalUrl + const result = { + _embedded: data, + _links: { + self: req.protocol + '://' + req.get('host') + req.originalUrl } }; if (included && Array.isArray(included) && included.length > 0) { Object.assign(result, { - "included": included + included: included }); } return result; @@ -50,39 +50,22 @@ function toHALResponse(req, data, included?) { export function createMockApi() { - let router = Router(); - - router.route('/communities') - .get(function(req, res) { - console.log('GET'); - // 70ms latency - setTimeout(function() { - res.json(toHALResponse(req, COMMUNITIES)); - }, 0); + const router = Router(); - // }) - // .post(function(req, res) { - // console.log('POST', util.inspect(req.body, { colors: true })); - // let community = req.body; - // if (community) { - // COMMUNITIES.push({ - // value: community.value, - // created_at: new Date(), - // completed: community.completed, - // id: COMMUNITY_COUNT++ - // }); - // return res.json(community); - // } - // - // return res.end(); - }); + router.route('/communities').get((req, res) => { + console.log('GET'); + // 70ms latency + setTimeout(() => { + res.json(toHALResponse(req, COMMUNITIES)); + }, 0); + }); - router.param('community_id', function(req, res, next, community_id) { + router.param('community_id', (req, res, next, communityId) => { // ensure correct prop type - let id = req.params.community_id; + const id = req.params.community_id; try { req.community_id = id; - req.community = COMMUNITIES["communities"].find((community) => { + req.community = COMMUNITIES.communities.find((community) => { return community.id === id; }); next(); @@ -91,59 +74,24 @@ export function createMockApi() { } }); - router.route('/communities/:community_id') - .get(function(req, res) { - // console.log('GET', util.inspect(req.community.id, { colors: true })); - res.json(toHALResponse(req, req.community)); - // }) - // .put(function(req, res) { - // console.log('PUT', util.inspect(req.body, { colors: true })); - // - // let index = COMMUNITIES.indexOf(req.community); - // let community = COMMUNITIES[index] = req.body; - // - // res.json(community); - // }) - // .delete(function(req, res) { - // console.log('DELETE', req.community_id); - // - // let index = COMMUNITIES.indexOf(req.community); - // COMMUNITIES.splice(index, 1); - // - // res.json(req.community); - }); - - router.route('/collections') - .get(function(req, res) { - console.log('GET'); - // 70ms latency - setTimeout(function() { - res.json(toHALResponse(req, COLLECTIONS)); - }, 0); + router.route('/communities/:community_id').get((req, res) => { + res.json(toHALResponse(req, req.community)); + }); - // }) - // .post(function(req, res) { - // console.log('POST', util.inspect(req.body, { colors: true })); - // let collection = req.body; - // if (collection) { - // COLLECTIONS.push({ - // value: collection.value, - // created_at: new Date(), - // completed: collection.completed, - // id: COLLECTION_COUNT++ - // }); - // return res.json(collection); - // } - // - // return res.end(); - }); + router.route('/collections').get((req, res) => { + console.log('GET'); + // 70ms latency + setTimeout(() => { + res.json(toHALResponse(req, COLLECTIONS)); + }, 0); + }); - router.param('collection_id', function(req, res, next, collection_id) { + router.param('collection_id', (req, res, next, collectionId) => { // ensure correct prop type - let id = req.params.collection_id; + const id = req.params.collection_id; try { req.collection_id = id; - req.collection = COLLECTIONS["collections"].find((collection) => { + req.collection = COLLECTIONS.collections.find((collection) => { return collection.id === id; }); next(); @@ -152,60 +100,24 @@ export function createMockApi() { } }); - router.route('/collections/:collection_id') - .get(function(req, res) { - // console.log('GET', util.inspect(req.collection.id, { colors: true })); - res.json(toHALResponse(req, req.collection)); - // }) - // .put(function(req, res) { - // console.log('PUT', util.inspect(req.body, { colors: true })); - // - // let index = COLLECTIONS.indexOf(req.collection); - // let collection = COLLECTIONS[index] = req.body; - // - // res.json(collection); - // }) - // .delete(function(req, res) { - // console.log('DELETE', req.collection_id); - // - // let index = COLLECTIONS.indexOf(req.collection); - // COLLECTIONS.splice(index, 1); - // - // res.json(req.collection); - }); - - - router.route('/items') - .get(function(req, res) { - console.log('GET'); - // 70ms latency - setTimeout(function() { - res.json(toHALResponse(req, ITEMS)); - }, 0); + router.route('/collections/:collection_id').get((req, res) => { + res.json(toHALResponse(req, req.collection)); + }); - // }) - // .post(function(req, res) { - // console.log('POST', util.inspect(req.body, { colors: true })); - // let item = req.body; - // if (item) { - // ITEMS.push({ - // value: item.value, - // created_at: new Date(), - // completed: item.completed, - // id: ITEM_COUNT++ - // }); - // return res.json(item); - // } - // - // return res.end(); - }); + router.route('/items').get((req, res) => { + console.log('GET'); + // 70ms latency + setTimeout(() => { + res.json(toHALResponse(req, ITEMS)); + }, 0); + }); - router.param('item_id', function(req, res, next, item_id) { + router.param('item_id', (req, res, next, itemId) => { // ensure correct prop type - let id = req.params.item_id; + const id = req.params.item_id; try { req.item_id = id; - req.item = ITEMS["items"].find((item) => { + req.item = ITEMS.items.find((item) => { return item.id === id; }); next(); @@ -214,86 +126,63 @@ export function createMockApi() { } }); - router.route('/items/:item_id') - .get(function(req, res) { - // console.log('GET', util.inspect(req.item, { colors: true })); - res.json(toHALResponse(req, req.item)); - // }) - // .put(function(req, res) { - // console.log('PUT', util.inspect(req.body, { colors: true })); - // - // let index = ITEMS.indexOf(req.item); - // let item = ITEMS[index] = req.body; - // - // res.json(item); - // }) - // .delete(function(req, res) { - // console.log('DELETE', req.item_id); - // - // let index = ITEMS.indexOf(req.item); - // ITEMS.splice(index, 1); - // - // res.json(req.item); - }); - - router.route('/bundles') - .get(function(req, res) { - console.log('GET'); - // 70ms latency - setTimeout(function() { - res.json(toHALResponse(req, BUNDLES)); - }, 0); - }); + router.route('/items/:item_id').get((req, res) => { + res.json(toHALResponse(req, req.item)); + }); - router.param('bundle_id', function(req, res, next, bundle_id) { - // ensure correct prop type - let id = req.params.bundle_id; - try { - req.bundle_id = id; - req.bundle = BUNDLES["bundles"].find((bundle) => { - return bundle.id === id; - }); - next(); - } catch (e) { - next(new Error('failed to load item')); - } - }); + router.route('/bundles').get((req, res) => { + console.log('GET'); + // 70ms latency + setTimeout(() => { + res.json(toHALResponse(req, BUNDLES)); + }, 0); + }); - router.route('/bundles/:bundle_id') - .get(function(req, res) { - // console.log('GET', util.inspect(req.bundle, { colors: true })); - res.json(toHALResponse(req, req.bundle)); - }); + router.param('bundle_id', (req, res, next, bundleId) => { + // ensure correct prop type + const id = req.params.bundle_id; + try { + req.bundle_id = id; + req.bundle = BUNDLES.bundles.find((bundle) => { + return bundle.id === id; + }); + next(); + } catch (e) { + next(new Error('failed to load item')); + } + }); + router.route('/bundles/:bundle_id').get((req, res) => { + // console.log('GET', util.inspect(req.bundle, { colors: true })); + res.json(toHALResponse(req, req.bundle)); + }); - router.route('/bitstreams') - .get(function(req, res) { - console.log('GET'); - // 70ms latency - setTimeout(function() { - res.json(toHALResponse(req, BITSTREAMS)); - }, 0); - }); + router.route('/bitstreams').get((req, res) => { + console.log('GET'); + // 70ms latency + setTimeout(() => { + res.json(toHALResponse(req, BITSTREAMS)); + }, 0); + }); - router.param('bitstream_id', function(req, res, next, bitstream_id) { - // ensure correct prop type - let id = req.params.bitstream_id; - try { - req.bitstream_id = id; - req.bitstream = BITSTREAMS["bitstreams"].find((bitstream) => { - return bitstream.id === id; - }); - next(); - } catch (e) { - next(new Error('failed to load item')); - } - }); + router.param('bitstream_id', (req, res, next, bitstreamId) => { + // ensure correct prop type + const id = req.params.bitstream_id; + try { + req.bitstream_id = id; + req.bitstream = BITSTREAMS.bitstreams.find((bitstream) => { + return bitstream.id === id; + }); + next(); + } catch (e) { + next(new Error('failed to load item')); + } + }); - router.route('/bitstreams/:bitstream_id') - .get(function(req, res) { - // console.log('GET', util.inspect(req.bitstream, { colors: true })); - res.json(toHALResponse(req, req.bitstream)); - }); + router.route('/bitstreams/:bitstream_id').get((req, res) => { + // console.log('GET', util.inspect(req.bitstream, { colors: true })); + res.json(toHALResponse(req, req.bitstream)); + }); return router; } diff --git a/src/backend/bitstreams.ts b/src/backend/bitstreams.ts deleted file mode 100644 index 63eae94a98f..00000000000 --- a/src/backend/bitstreams.ts +++ /dev/null @@ -1,83 +0,0 @@ -export const BITSTREAMS = { - "bitstreams": [ - { - "_links": { - "self": { "href": "/bitstreams/3678" }, - "bundle": { "href": "/bundles/35e0606d-5e18-4f9c-aa61-74fc751cc3f9" }, - "retrieve": { "href": "/bitstreams/43c57c2b-206f-4645-8c8f-5f10c84b09fa/retrieve" } - }, - "id": "3678", - "uuid": "43c57c2b-206f-4645-8c8f-5f10c84b09fa", - "type": "bitstream", - "name": "do_open_access_CRL.pdf", - "size": 636626, - "checksum": { - "value": "063dfbbbac873aa3fca479b878eccff3", - "algorithm": "MD5" - }, - "metadata": [ - { "key": "dc.title", "value": "do_open_access_CRL.pdf", "language": null }, - { "key": "dc.description", "value": "Conference Paper", "language": "en" } - ], - "format": "Adobe PDF", - "mimetype": "application/pdf" - }, - { - "_links": { - "self": { "href": "/bitstreams/8842" }, - "bundle": { "href": "/bundles/a469c57a-abcf-45c3-83e4-b187ebd708fd" }, - "retrieve": { "href": "/rest/bitstreams/1a013ecc-fb25-4689-a44f-f1383ad26632/retrieve" } - }, - "id": "8842", - "uuid": "1a013ecc-fb25-4689-a44f-f1383ad26632", - "type": "bitstream", - "name": "do_open_access_CRL.pdf.jpg", - "size": 41183, - "checksum": { - "value": "a8ad475e86f9645c60e13e06f1427814", - "algorithm": "MD5" - }, - "metadata": [ - { "key": "dc.title", "value": "do_open_access_CRL.pdf.jpg", "language": null }, - { "key": "dc.description", "value": "Generated Thumbnail", "language": "en" } - ], - "format": "JPEG", - "mimetype": "image/jpeg" - }, - { - "_links": { - "self": { "href": "/bitstreams/8934" }, - "bundle": { "href": "/bundles/99f78e5e-3677-43b0-aaef-cddaa1a49092" }, - "retrieve": { "href": "/rest/bitstreams/ba7d24f2-8fc7-4b8e-b7b6-6c32be1c12a6/retrieve" } - }, - "id": "8934", - "uuid": "ba7d24f2-8fc7-4b8e-b7b6-6c32be1c12a6", - "type": "bitstream", - "name": "license.txt", - "size": 41183, - "checksum": { - "value": "8ad416e8a39e645020e13e06f1427814", - "algorithm": "MD5" - }, - "metadata": [ - { "key": "dc.title", "value": "license.txt", "language": null }, - { "key": "dc.description", "value": "License", "language": "en" } - ], - "format": "Text", - "mimetype": "text/plain" - }, - { - "_links": { - "self": { "href": "/bitstreams/4688" }, - }, - "id": "4688", - "uuid": "1bb1be24-c934-41e3-a0fb-ca7a71ab0e71", - "type": "bitstream", - "name": "collection-5179-logo.png", - "size": 299832, - "url": "/bitstreams/1bb1be24-c934-41e3-a0fb-ca7a71ab0e71/retrieve", - "format": "PNG", - "mimetype": "image/png" - }, - ] -}; diff --git a/src/backend/bundles.ts b/src/backend/bundles.ts deleted file mode 100644 index 06a38e6face..00000000000 --- a/src/backend/bundles.ts +++ /dev/null @@ -1,61 +0,0 @@ -export const BUNDLES = { - "bundles": [ - { - "_links": { - "self": { "href": "/bundles/2355" }, - "items": [ - { "href": "/items/8871" } - ], - "bitstreams": [ - { "href": "/bitstreams/3678" }, - ], - "primaryBitstream": { "href": "/bitstreams/3678" } - }, - "id": "2355", - "uuid": "35e0606d-5e18-4f9c-aa61-74fc751cc3f9", - "type": "bundle", - "name": "ORIGINAL", - "metadata": [ - { "key": "dc.title", "value": "ORIGINAL", "language": "en" } - ] - }, - { - "_links": { - "self": { "href": "/bundles/5687" }, - "items": [ - { "href": "/items/8871" } - ], - "bitstreams": [ - { "href": "/bitstreams/8842" }, - ], - "primaryBitstream": { "href": "/bitstreams/8842" } - }, - "id": "5687", - "uuid": "a469c57a-abcf-45c3-83e4-b187ebd708fd", - "type": "bundle", - "name": "THUMBNAIL", - "metadata": [ - { "key": "dc.title", "value": "THUMBNAIL", "language": "en" } - ] - }, - { - "_links": { - "self": { "href": "/bundles/8475" }, - "items": [ - { "href": "/items/8871" } - ], - "bitstreams": [ - { "href": "/bitstreams/8934" }, - ], - "primaryBitstream": { "href": "/bitstreams/8934" } - }, - "id": "8475", - "uuid": "99f78e5e-3677-43b0-aaef-cddaa1a49092", - "type": "bundle", - "name": "LICENSE", - "metadata": [ - { "key": "dc.title", "value": "LICENSE", "language": "en" } - ] - } - ] -}; diff --git a/src/backend/cache.ts b/src/backend/cache.ts index 490a35612d7..8e5570f0a29 100644 --- a/src/backend/cache.ts +++ b/src/backend/cache.ts @@ -1,10 +1,8 @@ - - -var _fakeLRUcount = 0; +let _fakeLRUcount = 0; export const fakeDemoRedisCache = { _cache: {}, get: (key) => { - let cache = fakeDemoRedisCache._cache[key]; + const cache = fakeDemoRedisCache._cache[key]; _fakeLRUcount++; if (_fakeLRUcount >= 10) { fakeDemoRedisCache.clear(); diff --git a/src/backend/data/bitstreams.json b/src/backend/data/bitstreams.json new file mode 100644 index 00000000000..58e99a018b8 --- /dev/null +++ b/src/backend/data/bitstreams.json @@ -0,0 +1,123 @@ +{ + "bitstreams": [{ + "_links": { + "self": { + "href": "/bitstreams/3678" + }, + "bundle": { + "href": "/bundles/35e0606d-5e18-4f9c-aa61-74fc751cc3f9" + }, + "retrieve": { + "href": "/bitstreams/43c57c2b-206f-4645-8c8f-5f10c84b09fa/retrieve" + } + }, + "id": "3678", + "uuid": "43c57c2b-206f-4645-8c8f-5f10c84b09fa", + "type": "bitstream", + "name": "do_open_access_CRL.pdf", + "size": 636626, + "checksum": { + "value": "063dfbbbac873aa3fca479b878eccff3", + "algorithm": "MD5" + }, + "metadata": [{ + "key": "dc.title", + "value": "do_open_access_CRL.pdf", + "language": null + }, + { + "key": "dc.description", + "value": "Conference Paper", + "language": "en" + } + ], + "format": "Adobe PDF", + "mimetype": "application/pdf" + }, + { + "_links": { + "self": { + "href": "/bitstreams/8842" + }, + "bundle": { + "href": "/bundles/a469c57a-abcf-45c3-83e4-b187ebd708fd" + }, + "retrieve": { + "href": "/rest/bitstreams/1a013ecc-fb25-4689-a44f-f1383ad26632/retrieve" + } + }, + "id": "8842", + "uuid": "1a013ecc-fb25-4689-a44f-f1383ad26632", + "type": "bitstream", + "name": "do_open_access_CRL.pdf.jpg", + "size": 41183, + "checksum": { + "value": "a8ad475e86f9645c60e13e06f1427814", + "algorithm": "MD5" + }, + "metadata": [{ + "key": "dc.title", + "value": "do_open_access_CRL.pdf.jpg", + "language": null + }, + { + "key": "dc.description", + "value": "Generated Thumbnail", + "language": "en" + } + ], + "format": "JPEG", + "mimetype": "image/jpeg" + }, + { + "_links": { + "self": { + "href": "/bitstreams/8934" + }, + "bundle": { + "href": "/bundles/99f78e5e-3677-43b0-aaef-cddaa1a49092" + }, + "retrieve": { + "href": "/rest/bitstreams/ba7d24f2-8fc7-4b8e-b7b6-6c32be1c12a6/retrieve" + } + }, + "id": "8934", + "uuid": "ba7d24f2-8fc7-4b8e-b7b6-6c32be1c12a6", + "type": "bitstream", + "name": "license.txt", + "size": 41183, + "checksum": { + "value": "8ad416e8a39e645020e13e06f1427814", + "algorithm": "MD5" + }, + "metadata": [{ + "key": "dc.title", + "value": "license.txt", + "language": null + }, + { + "key": "dc.description", + "value": "License", + "language": "en" + } + ], + "format": "Text", + "mimetype": "text/plain" + }, + { + "_links": { + "self": { + "href": "/bitstreams/4688" + } + }, + "id": "4688", + "uuid": "1bb1be24-c934-41e3-a0fb-ca7a71ab0e71", + "type": "bitstream", + "name": "collection-5179-logo.png", + "size": 299832, + "url": "/bitstreams/1bb1be24-c934-41e3-a0fb-ca7a71ab0e71/retrieve", + "format": "PNG", + "mimetype": "image/png" + } + ] +} diff --git a/src/backend/data/bundles.json b/src/backend/data/bundles.json new file mode 100644 index 00000000000..74f89d15cb7 --- /dev/null +++ b/src/backend/data/bundles.json @@ -0,0 +1,78 @@ +{ + "bundles": [{ + "_links": { + "self": { + "href": "/bundles/2355" + }, + "items": [{ + "href": "/items/8871" + }], + "bitstreams": [{ + "href": "/bitstreams/3678" + }], + "primaryBitstream": { + "href": "/bitstreams/3678" + } + }, + "id": "2355", + "uuid": "35e0606d-5e18-4f9c-aa61-74fc751cc3f9", + "type": "bundle", + "name": "ORIGINAL", + "metadata": [{ + "key": "dc.title", + "value": "ORIGINAL", + "language": "en" + }] + }, + { + "_links": { + "self": { + "href": "/bundles/5687" + }, + "items": [{ + "href": "/items/8871" + }], + "bitstreams": [{ + "href": "/bitstreams/8842" + }], + "primaryBitstream": { + "href": "/bitstreams/8842" + } + }, + "id": "5687", + "uuid": "a469c57a-abcf-45c3-83e4-b187ebd708fd", + "type": "bundle", + "name": "THUMBNAIL", + "metadata": [{ + "key": "dc.title", + "value": "THUMBNAIL", + "language": "en" + }] + }, + { + "_links": { + "self": { + "href": "/bundles/8475" + }, + "items": [{ + "href": "/items/8871" + }], + "bitstreams": [{ + "href": "/bitstreams/8934" + }], + "primaryBitstream": { + "href": "/bitstreams/8934" + } + }, + "id": "8475", + "uuid": "99f78e5e-3677-43b0-aaef-cddaa1a49092", + "type": "bundle", + "name": "LICENSE", + "metadata": [{ + "key": "dc.title", + "value": "LICENSE", + "language": "en" + }] + } + ] +} diff --git a/src/backend/collections.ts b/src/backend/data/collections.json similarity index 86% rename from src/backend/collections.ts rename to src/backend/data/collections.json index 5170f14c46f..86b58103f85 100644 --- a/src/backend/collections.ts +++ b/src/backend/data/collections.json @@ -1,21 +1,26 @@ -export const COLLECTIONS = { - "collections": [ - { +{ + "collections": [{ "_links": { - "self": { "href": "/collections/5179" }, - "items": [ - { "href": "/items/8871" }, - { "href": "/items/9978" } + "self": { + "href": "/collections/5179" + }, + "items": [{ + "href": "/items/8871" + }, + { + "href": "/items/9978" + } ], - "logo": { "href": "/bitstreams/4688" } + "logo": { + "href": "/bitstreams/4688" + } }, "id": "5179", "uuid": "9e32a2e2-6b91-4236-a361-995ccdc14c60", "type": "collection", "name": "A Test Collection", "handle": "123456789/5179", - "metadata": [ - { + "metadata": [{ "key": "dc.rights", "value": "

© 2005-2016 JOHN DOE SOME RIGHTS RESERVED

", "language": null @@ -39,10 +44,15 @@ export const COLLECTIONS = { }, { "_links": { - "self": { "href": "/collections/6547" }, - "items": [ - { "href": "/items/8871" }, - { "href": "/items/9978" } + "self": { + "href": "/collections/6547" + }, + "items": [{ + "href": "/items/8871" + }, + { + "href": "/items/9978" + } ] }, "id": "6547", @@ -50,8 +60,7 @@ export const COLLECTIONS = { "type": "collection", "name": "Another Test Collection", "handle": "123456789/6547", - "metadata": [ - { + "metadata": [{ "key": "dc.rights", "value": "

© 2005-2016 JOHN DOE SOME RIGHTS RESERVED

", "language": null @@ -74,4 +83,4 @@ export const COLLECTIONS = { ] } ] -}; +} diff --git a/src/backend/communities.ts b/src/backend/data/communities.json similarity index 90% rename from src/backend/communities.ts rename to src/backend/data/communities.json index 35a86aeaf94..544a2554d52 100644 --- a/src/backend/communities.ts +++ b/src/backend/data/communities.json @@ -1,13 +1,11 @@ -export const COMMUNITIES = { - "communities": [ - { +{ + "communities": [{ "name": "Community 1", "handle": "10673/1", "id": "6631", "uuid": "83cd3281-f241-48be-9234-d876f8010d14", "type": "community", - "metadata": [ - { + "metadata": [{ "key": "dc.description", "value": "

This is the introductory text for the Sample Community on the DSpace Demonstration Site. It is editable by System or Community Administrators (of this Community).

\r\n

DSpace Communities may contain one or more Sub-Communities or Collections (of Items).

\r\n

This particular Community has its own logo (the DuraSpace logo).

", "language": null @@ -37,10 +35,12 @@ export const COMMUNITIES = { "self": { "href": "/communities/6631" }, - "collections": [ - { "href": "/collections/5179" } - ], - "logo": { "href": "/bitstreams/4688" } + "collections": [{ + "href": "/collections/5179" + }], + "logo": { + "href": "/bitstreams/4688" + } } }, { @@ -49,8 +49,7 @@ export const COMMUNITIES = { "id": "2365", "uuid": "80eec4c6-70bd-4beb-b3d4-5d46c6343157", "type": "community", - "metadata": [ - { + "metadata": [{ "key": "dc.description", "value": "

This is the introductory text for the Sample Community on the DSpace Demonstration Site. It is editable by System or Community Administrators (of this Community).

\r\n

DSpace Communities may contain one or more Sub-Communities or Collections (of Items).

\r\n

This particular Community has its own logo (the DuraSpace logo).

", "language": null @@ -80,10 +79,10 @@ export const COMMUNITIES = { "self": { "href": "/communities/2365" }, - "collections": [ - { "href": "/collections/6547" } - ] + "collections": [{ + "href": "/collections/6547" + }] } } ] -}; +} diff --git a/src/backend/items.ts b/src/backend/data/items.json similarity index 67% rename from src/backend/items.ts rename to src/backend/data/items.json index 45d71fa0929..7c363472797 100644 --- a/src/backend/items.ts +++ b/src/backend/data/items.json @@ -1,26 +1,19 @@ -export const ITEMS = { - "items": [ - { +{ + "items": [{ "_links": { "self": { "href": "/items/8871" }, - "parents": [ - { + "parents": [{ "href": "/collections/5179" }, { "href": "/collections/6547" } ], - "bundles": [ - { - "href": "/bundles/2355" - }, - // { - // "href": "/bundles/5687" - // } - ] + "bundles": [{ + "href": "/bundles/2355" + }] }, "id": "8871", "uuid": "21539b1d-9ef1-4eda-9c77-49565b5bfb78", @@ -30,8 +23,7 @@ export const ITEMS = { "lastModified": "2016-10-14 10:41:12.886", "isArchived": true, "isWithdrawn": false, - "metadata": [ - { + "metadata": [{ "key": "dc.contributor.author", "value": "Antelman, Kristin", "language": "en" @@ -93,91 +85,108 @@ export const ITEMS = { } ], "_embedded": { - "parents": [ - { - "_links": { - "self": { "href": "/collections/6547" }, - "items": [ - { "href": "/items/8871" }, - { "href": "/items/9978" } - ] + "parents": [{ + "_links": { + "self": { + "href": "/collections/6547" }, - "id": "6547", - "uuid": "598ce822-c357-46f3-ab70-63724d02d6ad", - "type": "collection", - "name": "Another Test Collection", - "handle": "123456789/6547", - "metadata": [ - { - "key": "dc.rights", - "value": "

© 2005-2016 JOHN DOE SOME RIGHTS RESERVED

", - "language": null - }, - { - "key": "dc.description", - "value": "

Another introductory text dolor sit amet, consectetur adipiscing elit. Duis laoreet lorem erat, eget auctor est ultrices quis. Nullam ac tincidunt quam. In nec nisl odio. In egestas aliquam tincidunt.

\r\n

Integer vitae diam id dolor pharetra dignissim in sed enim. Vivamus pulvinar tristique sem a iaculis. Aenean ultricies dui vel facilisis laoreet. Integer porta erat eu ultrices rhoncus. Sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum.

", - "language": null - }, - { - "key": "dc.description.abstract", - "value": "Another collection for testing purposes", - "language": null + "items": [{ + "href": "/items/8871" }, { - "key": "dc.description.tableofcontents", - "value": "

Some more news sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum. Donec sed ultricies erat, nec sollicitudin mauris. Duis varius nulla quis quam vulputate, at hendrerit turpis rutrum. Integer nec facilisis sapien. Fusce fringilla malesuada lectus id pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae

", - "language": null + "href": "/items/9978" } ] - } - ], - "bundles": [ - { - "_links": { - "self": { "href": "/bundles/2355" }, - "items": [ - { "href": "/items/8871" } - ], - "bitstreams": [ - { "href": "/bitstreams/3678" }, - ], - "primaryBitstream": { "href": "/bitstreams/3678" } + }, + "id": "6547", + "uuid": "598ce822-c357-46f3-ab70-63724d02d6ad", + "type": "collection", + "name": "Another Test Collection", + "handle": "123456789/6547", + "metadata": [{ + "key": "dc.rights", + "value": "

© 2005-2016 JOHN DOE SOME RIGHTS RESERVED

", + "language": null + }, + { + "key": "dc.description", + "value": "

Another introductory text dolor sit amet, consectetur adipiscing elit. Duis laoreet lorem erat, eget auctor est ultrices quis. Nullam ac tincidunt quam. In nec nisl odio. In egestas aliquam tincidunt.

\r\n

Integer vitae diam id dolor pharetra dignissim in sed enim. Vivamus pulvinar tristique sem a iaculis. Aenean ultricies dui vel facilisis laoreet. Integer porta erat eu ultrices rhoncus. Sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum.

", + "language": null + }, + { + "key": "dc.description.abstract", + "value": "Another collection for testing purposes", + "language": null + }, + { + "key": "dc.description.tableofcontents", + "value": "

Some more news sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum. Donec sed ultricies erat, nec sollicitudin mauris. Duis varius nulla quis quam vulputate, at hendrerit turpis rutrum. Integer nec facilisis sapien. Fusce fringilla malesuada lectus id pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae

", + "language": null + } + ] + }], + "bundles": [{ + "_links": { + "self": { + "href": "/bundles/2355" }, - "id": "2355", - "uuid": "35e0606d-5e18-4f9c-aa61-74fc751cc3f9", - "type": "bundle", - "name": "ORIGINAL", - "metadata": [ - { "key": "dc.title", "value": "ORIGINAL", "language": "en" } - ], - "_embedded": { - "bitstreams": [ + "items": [{ + "href": "/items/8871" + }], + "bitstreams": [{ + "href": "/bitstreams/3678" + }], + "primaryBitstream": { + "href": "/bitstreams/3678" + } + }, + "id": "2355", + "uuid": "35e0606d-5e18-4f9c-aa61-74fc751cc3f9", + "type": "bundle", + "name": "ORIGINAL", + "metadata": [{ + "key": "dc.title", + "value": "ORIGINAL", + "language": "en" + }], + "_embedded": { + "bitstreams": [{ + "_links": { + "self": { + "href": "/bitstreams/3678" + }, + "bundle": { + "href": "/bundles/35e0606d-5e18-4f9c-aa61-74fc751cc3f9" + }, + "retrieve": { + "href": "/bitstreams/43c57c2b-206f-4645-8c8f-5f10c84b09fa/retrieve" + } + }, + "id": "3678", + "uuid": "43c57c2b-206f-4645-8c8f-5f10c84b09fa", + "type": "bitstream", + "name": "do_open_access_CRL.pdf", + "size": 636626, + "checksum": { + "value": "063dfbbbac873aa3fca479b878eccff3", + "algorithm": "MD5" + }, + "metadata": [{ + "key": "dc.title", + "value": "do_open_access_CRL.pdf", + "language": null + }, { - "_links": { - "self": { "href": "/bitstreams/3678" }, - "bundle": { "href": "/bundles/35e0606d-5e18-4f9c-aa61-74fc751cc3f9" }, - "retrieve": { "href": "/bitstreams/43c57c2b-206f-4645-8c8f-5f10c84b09fa/retrieve" } - }, - "id": "3678", - "uuid": "43c57c2b-206f-4645-8c8f-5f10c84b09fa", - "type": "bitstream", - "name": "do_open_access_CRL.pdf", - "size": 636626, - "checksum": { - "value": "063dfbbbac873aa3fca479b878eccff3", - "algorithm": "MD5" - }, - "metadata": [ - { "key": "dc.title", "value": "do_open_access_CRL.pdf", "language": null }, - { "key": "dc.description", "value": "Conference Paper", "language": "en" } - ], - "format": "Adobe PDF", - "mimetype": "application/pdf" + "key": "dc.description", + "value": "Conference Paper", + "language": "en" } - ] - } + ], + "format": "Adobe PDF", + "mimetype": "application/pdf" + }] } - ] + }] } }, { @@ -185,22 +194,16 @@ export const ITEMS = { "self": { "href": "/items/9978" }, - "parents": [ - { + "parents": [{ "href": "/collections/5179" }, { "href": "/collections/6547" } ], - "bundles": [ - { - "href": "/bundles/2355" - }, - // { - // "href": "/bundles/5687" - // } - ] + "bundles": [{ + "href": "/bundles/2355" + }] }, "id": "9978", "uuid": "be8325f7-243b-49f4-8a4b-df2b793ff3b5", @@ -210,8 +213,7 @@ export const ITEMS = { "lastModified": "2016-05-27 03:00:20.063", "isArchived": true, "isWithdrawn": false, - "metadata": [ - { + "metadata": [{ "key": "dc.contributor.author", "value": "John Doe", "language": "en" @@ -253,23 +255,28 @@ export const ITEMS = { } ], "_embedded": { - "parents": [ - { + "parents": [{ "_links": { - "self": { "href": "/collections/5179" }, - "items": [ - { "href": "/items/8871" }, - { "href": "/items/9978" } + "self": { + "href": "/collections/5179" + }, + "items": [{ + "href": "/items/8871" + }, + { + "href": "/items/9978" + } ], - "logo": { "href": "/bitstreams/4688" } + "logo": { + "href": "/bitstreams/4688" + } }, "id": "5179", "uuid": "9e32a2e2-6b91-4236-a361-995ccdc14c60", "type": "collection", "name": "A Test Collection", "handle": "123456789/5179", - "metadata": [ - { + "metadata": [{ "key": "dc.rights", "value": "

© 2005-2016 JOHN DOE SOME RIGHTS RESERVED

", "language": null @@ -293,10 +300,15 @@ export const ITEMS = { }, { "_links": { - "self": { "href": "/collections/6547" }, - "items": [ - { "href": "/items/8871" }, - { "href": "/items/9978" } + "self": { + "href": "/collections/6547" + }, + "items": [{ + "href": "/items/8871" + }, + { + "href": "/items/9978" + } ] }, "id": "6547", @@ -304,8 +316,7 @@ export const ITEMS = { "type": "collection", "name": "Another Test Collection", "handle": "123456789/6547", - "metadata": [ - { + "metadata": [{ "key": "dc.rights", "value": "

© 2005-2016 JOHN DOE SOME RIGHTS RESERVED

", "language": null @@ -331,4 +342,4 @@ export const ITEMS = { } } ] -}; +} diff --git a/src/backend/metadata.ts b/src/backend/data/metadata.json similarity index 99% rename from src/backend/metadata.ts rename to src/backend/data/metadata.json index 0524b4769e6..5f43cb02593 100644 --- a/src/backend/metadata.ts +++ b/src/backend/data/metadata.json @@ -1,6 +1,5 @@ -export const METADATA = { - "metadata": [ - { +{ + "metadata": [{ "type": "metadata", "id": "d58a3098-b390-4cd6-8f52-b088b3daa637", "attributes": { @@ -181,4 +180,4 @@ export const METADATA = { } } ] -}; +} diff --git a/src/backend/db.ts b/src/backend/db.ts index 3ba8ea3d445..ec8557f1b78 100644 --- a/src/backend/db.ts +++ b/src/backend/db.ts @@ -1,7 +1,7 @@ // Our API for demos only export const fakeDataBase = { get() { - let res = { data: 'This fake data came from the db on the server.' }; + const res = { data: 'This fake data came from the db on the server.' }; return Promise.resolve(res); } }; diff --git a/src/client.aot.ts b/src/client.aot.ts deleted file mode 100644 index f6e10de0f22..00000000000 --- a/src/client.aot.ts +++ /dev/null @@ -1,36 +0,0 @@ -// the polyfills must be the first thing imported -import 'angular2-universal-polyfills'; -import 'ts-helpers'; -import './platform/workarounds/__workaround.browser'; // temporary until 2.1.1 things are patched in Core - -// Angular 2 -import { enableProdMode } from '@angular/core'; -import { platformBrowser } from '@angular/platform-browser'; -import { bootloader } from '@angularclass/bootloader'; -// for AoT use platformBrowser -// import { platformUniversalDynamic } from 'angular2-universal/browser'; - -import { load as loadWebFont } from 'webfontloader'; - -// enable prod for faster renders -enableProdMode(); - -import { MainModuleNgFactory } from './platform/modules/browser.module.ngfactory'; - -export const platformRef = platformBrowser(); - -// on document ready bootstrap Angular 2 -export function main() { - // Load fonts async - // https://github.com/typekit/webfontloader#configuration - loadWebFont({ - google: { - families: ['Droid Sans'] - } - }); - - return platformRef.bootstrapModuleFactory(MainModuleNgFactory); -} - -// support async tag or hmr -bootloader(main); diff --git a/src/client.ts b/src/client.ts deleted file mode 100644 index 5f770626601..00000000000 --- a/src/client.ts +++ /dev/null @@ -1,38 +0,0 @@ -// the polyfills must be the first thing imported -import 'angular2-universal-polyfills'; -import 'ts-helpers'; -import './platform/workarounds/__workaround.browser'; // temporary until 2.1.1 things are patched in Core - -// Angular 2 -import { enableProdMode } from '@angular/core'; -import { platformUniversalDynamic } from 'angular2-universal/browser'; -import { bootloader } from '@angularclass/bootloader'; - -import { load as loadWebFont } from 'webfontloader'; - -import { EnvConfig } from './config'; - -if (EnvConfig.production) { - // enable prod for faster renders - enableProdMode(); -} - -import { MainModule } from './platform/modules/browser.module'; - -export const platformRef = platformUniversalDynamic(); - -// on document ready bootstrap Angular 2 -export function main() { - // Load fonts async - // https://github.com/typekit/webfontloader#configuration - loadWebFont({ - google: { - families: ['Droid Sans'] - } - }); - - return platformRef.bootstrapModule(MainModule); -} - -// support async tag or hmr -bootloader(main); diff --git a/src/config.ts b/src/config.ts index 6610ad895c2..23231af3d3d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,78 +1,55 @@ -// Look in ./config folder for config -import { OpaqueToken } from '@angular/core'; +import { InjectionToken } from '@angular/core'; -interface ServerConfig { - "ssl": boolean; - "address": string; - "port": number; - "nameSpace": string; - "baseUrl": string; -} - -interface GlobalConfig { - "production": boolean; - "rest": ServerConfig; - "ui": ServerConfig; - "cache": { - "msToLive": number, - "control": string - }; - "universal": { - "preboot": boolean, - "async": boolean - }; -} +import { ServerConfig } from './config/server-config.interface'; +import { GlobalConfig } from './config/global-config.interface'; -const GLOBAL_CONFIG = new OpaqueToken('config'); +const GLOBAL_CONFIG: InjectionToken = new InjectionToken('config'); -let configContext = require.context("../config", false, /js$/); +let production = false; -let EnvConfig: GlobalConfig; -let EnvConfigFile: string; +let ENV_CONFIG: GlobalConfig; -let production: boolean = false; +try { + ENV_CONFIG = require('../config/environment.default.js') as GlobalConfig; +} catch (e) { + throw new Error('Cannot find file config/environment.default.js'); +} -// check process.env.NODE_ENV to determine which environment config to use -// process.env.NODE_ENV is defined by webpack, else assume development switch (process.env.NODE_ENV) { case 'prod': case 'production': - // webpack.prod.config.ts defines process.env.NODE_ENV = 'production' - EnvConfigFile = './environment.prod.js'; production = true; + try { + ENV_CONFIG = Object.assign(ENV_CONFIG, require('../config/environment.prod.js')) as GlobalConfig; + } catch (e) { + console.warn('Cannot find file config/environment.prod.js', 'Using default environment.'); + } break; case 'test': - // webpack.test.config.ts defines process.env.NODE_ENV = 'test' - EnvConfigFile = './environment.test.js'; + try { + ENV_CONFIG = Object.assign(ENV_CONFIG, require('../config/environment.test.js')) as GlobalConfig; + } catch (e) { + console.warn('Cannot find file config/environment.test.js', 'Using default environment.'); + } break; default: - // if not using webpack.prod.config.ts or webpack.test.config.ts, it must be development - EnvConfigFile = './environment.dev.js'; + try { + ENV_CONFIG = Object.assign(ENV_CONFIG, require('../config/environment.dev.js')) as GlobalConfig; + } catch (e) { + console.warn('Cannot find file config/environment.dev.js', 'Using default environment.'); + } } -try { - EnvConfig = configContext('./environment.default.js'); -} catch (e) { - throw new Error("Cannot find file environment.default.js"); -} - -// if EnvConfigFile set try to get configs -if (EnvConfigFile) { - try { - EnvConfig = Object.assign(EnvConfig, configContext(EnvConfigFile)); - } catch (e) { - console.warn("Cannot find file " + EnvConfigFile.substring(2, EnvConfigFile.length), "Using default environment."); - } -} +ENV_CONFIG.production = production; -// set base url if property is object with ssl, address, and port. i.e. ServerConfig -for (let key in EnvConfig) { - if (EnvConfig[key].ssl !== undefined && EnvConfig[key].address && EnvConfig[key].port) { - EnvConfig[key].baseUrl = [EnvConfig[key].ssl ? 'https://' : 'http://', EnvConfig[key].address, (EnvConfig[key].port !== 80) ? ':' + EnvConfig[key].port : ''].join(''); +for (const key in ENV_CONFIG) { + if (ENV_CONFIG[key].host) { + ENV_CONFIG[key].baseUrl = [ + ENV_CONFIG[key].ssl ? 'https://' : 'http://', + ENV_CONFIG[key].host, + ENV_CONFIG[key].port ? (ENV_CONFIG[key].port !== 80 || ENV_CONFIG[key].port !== 443) ? ':' + ENV_CONFIG[key].port : '' : '' + ].join(''); } } -// set config for whether running in production -EnvConfig.production = production; - -export { GLOBAL_CONFIG, GlobalConfig, EnvConfig } +export { GlobalConfig, GLOBAL_CONFIG, ENV_CONFIG } diff --git a/src/config/cache-config.interface.ts b/src/config/cache-config.interface.ts new file mode 100644 index 00000000000..c26fa416de0 --- /dev/null +++ b/src/config/cache-config.interface.ts @@ -0,0 +1,4 @@ +export interface CacheConfig { + msToLive: number, + control: string +} diff --git a/src/config/global-config.interface.ts b/src/config/global-config.interface.ts new file mode 100644 index 00000000000..45470c1aab2 --- /dev/null +++ b/src/config/global-config.interface.ts @@ -0,0 +1,12 @@ +import { ServerConfig } from './server-config.interface'; +import { CacheConfig } from './cache-config.interface'; + +export interface GlobalConfig { + ui: ServerConfig; + rest: ServerConfig; + prerenderStrategy: string; + production: boolean; + cache: CacheConfig; + logDirectory: string; + debug: boolean; +} diff --git a/src/config/server-config.interface.ts b/src/config/server-config.interface.ts new file mode 100644 index 00000000000..5ea6fcc2554 --- /dev/null +++ b/src/config/server-config.interface.ts @@ -0,0 +1,7 @@ +export interface ServerConfig { + ssl: boolean; + host: string; + port: number; + nameSpace: string; + baseUrl: string; +} diff --git a/src/index.html b/src/index.html index 22c60b4ae9d..d2c67fca6da 100644 --- a/src/index.html +++ b/src/index.html @@ -1,20 +1,16 @@ - + + DSpace - - - - Loading DSpace ... - - + diff --git a/src/main.browser.ts b/src/main.browser.ts new file mode 100644 index 00000000000..3f228b9d132 --- /dev/null +++ b/src/main.browser.ts @@ -0,0 +1,31 @@ +import 'zone.js/dist/zone'; +import 'reflect-metadata'; + +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { bootloader } from '@angularclass/bootloader'; + +import { load as loadWebFont } from 'webfontloader'; + +import { BrowserAppModule } from './app/browser-app.module'; + +import { ENV_CONFIG } from './config'; + +if (ENV_CONFIG.production) { + enableProdMode(); +} + +export function main() { + // Load fonts async + // https://github.com/typekit/webfontloader#configuration + loadWebFont({ + google: { + families: ['Droid Sans'] + } + }); + + return platformBrowserDynamic().bootstrapModule(BrowserAppModule); +} + +// support async tag or hmr +bootloader(main); diff --git a/src/main.server.aot.ts b/src/main.server.aot.ts new file mode 100644 index 00000000000..f7666a16426 --- /dev/null +++ b/src/main.server.aot.ts @@ -0,0 +1,128 @@ +/** + * This file should be temporary + * See https://github.com/angular/angular-cli/pull/5194 + */ +import 'zone.js/dist/zone-node'; +import 'reflect-metadata'; +import 'rxjs/Rx'; + +import * as fs from 'fs'; +import * as pem from 'pem'; +import * as https from 'https'; +import * as morgan from 'morgan'; +import * as express from 'express'; +import * as bodyParser from 'body-parser'; +import * as session from 'express-session'; +import * as compression from 'compression'; +import * as cookieParser from 'cookie-parser'; + +import { enableProdMode } from '@angular/core'; + +import { ServerAppModuleNgFactory } from './aot/app/server-app.module.ngfactory'; +import { ngExpressEngine } from '@nguniversal/express-engine'; + +import { serverApi, createMockApi } from './backend/api'; + +import { ROUTES } from './routes'; +import { ENV_CONFIG } from './config'; + +const app = express(); + +const port = ENV_CONFIG.ui.port ? ENV_CONFIG.ui.port : 80; + +if (ENV_CONFIG.production) { + // TODO: set config for morgan.log location + const accessLogStream = fs.createWriteStream(ENV_CONFIG.logDirectory + '/morgan.log', { flags: 'a' }); + + enableProdMode(); + app.use(compression()); + + app.use(morgan('common', { + skip: (req, res) => res.statusCode < 400, + stream: accessLogStream + })); +} else { + app.use(morgan('dev')); +} + +app.use(cookieParser()); +app.use(bodyParser.json()); + +app.engine('html', ngExpressEngine({ + bootstrap: ServerAppModuleNgFactory +})); + +app.set('view engine', 'html'); +app.set('views', 'src'); + +function cacheControl(req, res, next) { + // instruct browser to revalidate in 60 seconds + res.header('Cache-Control', ENV_CONFIG.cache.control || 'max-age=60'); + next(); +} + +app.use('/', cacheControl, express.static('dist', { index: false })); + +// TODO: either remove or update mock backend +// app.get('/data.json', serverApi); +// app.use('/api', createMockApi()); + +ROUTES.forEach((route: string) => { + app.get(route, (req, res) => { + res.cookie('ui_origin', ENV_CONFIG.ui.baseUrl, { + maxAge: 1000 * 60 * 15, + httpOnly: true, + signed: false + }); + res.render('../dist/index', { + req: req, + res: res + }); + }); +}); + +function createHttpsServer(keys) { + https.createServer({ + key: keys.serviceKey, + cert: keys.certificate + }, app).listen(port, ENV_CONFIG.ui.host, () => { + console.log(`Listening at ${ENV_CONFIG.ui.baseUrl}`); + }); +} + +if (ENV_CONFIG.ui.ssl) { + let serviceKey; + try { + serviceKey = fs.readFileSync('./config/ssl/key.pem'); + } catch (e) { + console.warn('Service key not found at ./config/ssl/key.pem'); + } + + let certificate; + try { + certificate = fs.readFileSync('./config/ssl/cert.pem'); + } catch (e) { + console.warn('Certificate not found at ./config/ssl/key.pem'); + } + + if (serviceKey && certificate) { + createHttpsServer({ + serviceKey: serviceKey, + certificate: certificate + }); + } else { + + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + + pem.createCertificate({ + days: 1, + selfSigned: true + }, (error, keys) => { + createHttpsServer(keys); + }); + } +} else { + app.listen(port, ENV_CONFIG.ui.host, () => { + console.log(`Listening at ${ENV_CONFIG.ui.baseUrl}`); + }); +} diff --git a/src/main.server.ts b/src/main.server.ts new file mode 100644 index 00000000000..2a93d39e7ca --- /dev/null +++ b/src/main.server.ts @@ -0,0 +1,116 @@ +import 'zone.js/dist/zone-node'; +import 'reflect-metadata'; +import 'rxjs/Rx'; + +import * as fs from 'fs'; +import * as pem from 'pem'; +import * as https from 'https'; +import * as morgan from 'morgan'; +import * as express from 'express'; +import * as bodyParser from 'body-parser'; +import * as session from 'express-session'; +import * as compression from 'compression'; +import * as cookieParser from 'cookie-parser'; + +import { enableProdMode } from '@angular/core'; + +import { ServerAppModule } from './app/server-app.module'; +import { ngExpressEngine } from '@nguniversal/express-engine'; + +import { serverApi, createMockApi } from './backend/api'; + +import { ROUTES } from './routes'; +import { ENV_CONFIG } from './config'; + +const app = express(); + +const port = ENV_CONFIG.ui.port ? ENV_CONFIG.ui.port : 80; + +if (ENV_CONFIG.production) { + enableProdMode(); + app.use(compression()); +} + +app.use(morgan('dev')); + +app.use(cookieParser()); +app.use(bodyParser.json()); + +app.engine('html', ngExpressEngine({ + bootstrap: ServerAppModule +})); + +app.set('view engine', 'html'); +app.set('views', 'src'); + +function cacheControl(req, res, next) { + // instruct browser to revalidate in 60 seconds + res.header('Cache-Control', ENV_CONFIG.cache.control || 'max-age=60'); + next(); +} + +app.use('/', cacheControl, express.static('dist', { index: false })); + +// TODO: either remove or update mock backend +// app.get('/data.json', serverApi); +// app.use('/api', createMockApi()); + +ROUTES.forEach((route: string) => { + app.get(route, (req, res) => { + res.cookie('ui_origin', ENV_CONFIG.ui.baseUrl, { + maxAge: 1000 * 60 * 15, + httpOnly: true, + signed: false + }); + res.render('../dist/index', { + req: req, + res: res + }); + }); +}); + +function createHttpsServer(keys) { + https.createServer({ + key: keys.serviceKey, + cert: keys.certificate + }, app).listen(port, ENV_CONFIG.ui.host, () => { + console.log(`Listening at ${ENV_CONFIG.ui.baseUrl}`); + }); +} + +if (ENV_CONFIG.ui.ssl) { + let serviceKey; + try { + serviceKey = fs.readFileSync('./config/ssl/key.pem'); + } catch (e) { + console.warn('Service key not found at ./config/ssl/key.pem'); + } + + let certificate; + try { + certificate = fs.readFileSync('./config/ssl/cert.pem'); + } catch (e) { + console.warn('Certificate not found at ./config/ssl/key.pem'); + } + + if (serviceKey && certificate) { + createHttpsServer({ + serviceKey: serviceKey, + certificate: certificate + }); + } else { + + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + + pem.createCertificate({ + days: 1, + selfSigned: true + }, (error, keys) => { + createHttpsServer(keys); + }); + } +} else { + app.listen(port, ENV_CONFIG.ui.host, () => { + console.log(`Listening at ${ENV_CONFIG.ui.baseUrl}`); + }); +} diff --git a/src/modules/cookies/browser-cookies.module.ts b/src/modules/cookies/browser-cookies.module.ts new file mode 100644 index 00000000000..bd0340a7981 --- /dev/null +++ b/src/modules/cookies/browser-cookies.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; + +import { Cookies } from './cookies'; +import { BrowserCookies } from './browser-cookies'; + +@NgModule({ + providers: [ + { provide: Cookies, useClass: BrowserCookies } + ] +}) +export class BrowserCookiesModule { + +} diff --git a/src/modules/cookies/browser-cookies.ts b/src/modules/cookies/browser-cookies.ts new file mode 100644 index 00000000000..51c1835471b --- /dev/null +++ b/src/modules/cookies/browser-cookies.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@angular/core'; + +import { Cookies } from './cookies'; + +@Injectable() +export class BrowserCookies implements Cookies { + + // TODO: improve - set domain from configuration value or ui baseUrl + set(name: string, value: string, days: number, path?: string): void { + const date: Date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + const expires: string = 'expires=' + date.toUTCString(); + window.document.cookie = [name, '=', value, '; ', expires, path ? '; path=' + path : ''].join(''); + } + + get(name: string): string { + const cookies: string[] = window.document.cookie.split(';'); + let cookie: string; + for (const cc of cookies) { + const c: string = cc.replace(/^\s\+/g, ''); + if (c.indexOf(name + '=') === 0) { + cookie = c.substring(name.length + 1, c.length); + break; + } + } + return cookie; + } + + // TODO: set path from environment configuration + remove(name: string): void { + this.set(name, '', 0, '/'); + } + +} diff --git a/src/modules/cookies/cookies.ts b/src/modules/cookies/cookies.ts new file mode 100644 index 00000000000..924012a4c40 --- /dev/null +++ b/src/modules/cookies/cookies.ts @@ -0,0 +1,9 @@ +export abstract class Cookies { + + abstract set(name: string, value: string, days: number, path?: string): void; + + abstract get(name: string): string; + + abstract remove(name: string): void; + +} diff --git a/src/modules/cookies/server-cookies.module.ts b/src/modules/cookies/server-cookies.module.ts new file mode 100644 index 00000000000..f39daaf62a4 --- /dev/null +++ b/src/modules/cookies/server-cookies.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; + +import { Cookies } from './cookies'; +import { ServerCookies } from './server-cookies'; + +@NgModule({ + providers: [ + { provide: Cookies, useClass: ServerCookies } + ] +}) +export class ServerCookiesModule { + +} diff --git a/src/modules/cookies/server-cookies.ts b/src/modules/cookies/server-cookies.ts new file mode 100644 index 00000000000..5b83ca4d6a0 --- /dev/null +++ b/src/modules/cookies/server-cookies.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; + +import { Cookies } from './cookies'; + +@Injectable() +export class ServerCookies implements Cookies { + + // tslint:disable:no-empty + set(name: string, value: string, days: number, path?: string): void { + + } + // tslint:enable:no-empty + + get(name: string): string { + return undefined; + } + + // tslint:disable:no-empty + remove(name: string): void { + + } + // tslint:enable:no-empty + +} diff --git a/src/modules/data-loader/browser-data-loader.module.ts b/src/modules/data-loader/browser-data-loader.module.ts new file mode 100644 index 00000000000..e702b8358e6 --- /dev/null +++ b/src/modules/data-loader/browser-data-loader.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; + +import { DataLoader } from './data-loader'; +import { BrowserDataLoader } from './browser-data-loader'; + +@NgModule({ + providers: [ + { provide: DataLoader, useClass: BrowserDataLoader } + ] +}) +export class BrowserDataLoaderModule { + +} diff --git a/src/modules/data-loader/browser-data-loader.ts b/src/modules/data-loader/browser-data-loader.ts new file mode 100644 index 00000000000..2f95e5c4759 --- /dev/null +++ b/src/modules/data-loader/browser-data-loader.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; + +import { Http, Response } from '@angular/http'; +import { Observable } from 'rxjs/Observable'; + +import { DataLoader } from './data-loader'; + +@Injectable() +export class BrowserDataLoader extends DataLoader { + + protected prefix: string; + + protected suffix: string; + + constructor(private http: Http) { + super(); + this.prefix = 'assets/data'; + this.suffix = '.json'; + } + + public getData(name: string): Observable { + return this.http.get(`${this.prefix}/${this.language}/${name}${this.suffix}`, {}).map((response: Response) => { + return response.json(); + }); + } + +} diff --git a/src/modules/data-loader/data-loader.ts b/src/modules/data-loader/data-loader.ts new file mode 100644 index 00000000000..1a3eee7a967 --- /dev/null +++ b/src/modules/data-loader/data-loader.ts @@ -0,0 +1,21 @@ +import { Observable } from 'rxjs/Observable'; + +export abstract class DataLoader { + + protected language: string; + + protected abstract prefix: string; + + protected abstract suffix: string; + + constructor() { + this.language = 'en'; + } + + public setLanguage(language: string): void { + this.language = language; + } + + abstract getData(name: string): Observable; + +} diff --git a/src/modules/data-loader/server-data-loader.module.ts b/src/modules/data-loader/server-data-loader.module.ts new file mode 100644 index 00000000000..e2418ef9686 --- /dev/null +++ b/src/modules/data-loader/server-data-loader.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; + +import { DataLoader } from './data-loader'; +import { ServerDataLoader } from './server-data-loader'; + +@NgModule({ + providers: [ + { provide: DataLoader, useClass: ServerDataLoader } + ] +}) +export class ServerDataLoaderModule { + +} diff --git a/src/modules/data-loader/server-data-loader.ts b/src/modules/data-loader/server-data-loader.ts new file mode 100644 index 00000000000..27bb321da7c --- /dev/null +++ b/src/modules/data-loader/server-data-loader.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; + +import { Observable } from 'rxjs/Observable'; +import * as fs from 'fs'; + +import { DataLoader } from './data-loader'; + +@Injectable() +export class ServerDataLoader extends DataLoader { + + protected prefix: string; + + protected suffix: string; + + constructor() { + super(); + this.prefix = 'dist/assets/data'; + this.suffix = '.json'; + } + + public getData(name: string): Observable { + return Observable.create((observer: any) => { + observer.next(JSON.parse(fs.readFileSync(`${this.prefix}/${this.language}/${name}${this.suffix}`, 'utf8'))); + observer.complete(); + }); + } + +} diff --git a/src/modules/transfer-http/transfer-http.module.ts b/src/modules/transfer-http/transfer-http.module.ts new file mode 100644 index 00000000000..37897b40e93 --- /dev/null +++ b/src/modules/transfer-http/transfer-http.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; + +import { TransferHttp } from './transfer-http'; + +@NgModule({ + providers: [ + TransferHttp + ] +}) +export class TransferHttpModule { + +} diff --git a/src/modules/transfer-http/transfer-http.ts b/src/modules/transfer-http/transfer-http.ts new file mode 100644 index 00000000000..e24f1f8906f --- /dev/null +++ b/src/modules/transfer-http/transfer-http.ts @@ -0,0 +1,132 @@ +import { Injectable } from '@angular/core'; +import { ConnectionBackend, Http, Request, RequestOptions, RequestOptionsArgs, Response } from '@angular/http'; + +import { Observable } from 'rxjs/Observable'; + +import { TransferState } from '../transfer-state/transfer-state'; + +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/observable/of'; + +@Injectable() +export class TransferHttp { + + constructor(private http: Http, protected transferState: TransferState) { } + + request(uri: string | Request, options?: RequestOptionsArgs): Observable { + // tslint:disable-next-line:no-shadowed-variable + return this.getData(uri, options, (url: string, options: RequestOptionsArgs) => { + return this.http.request(url, options); + }); + } + + get(url: string, options?: RequestOptionsArgs): Observable { + // tslint:disable-next-line:no-shadowed-variable + return this.getData(url, options, (url: string, options: RequestOptionsArgs) => { + return this.http.get(url, options); + }); + } + + post(url: string, body: any, options?: RequestOptionsArgs): Observable { + // tslint:disable-next-line:no-shadowed-variable + return this.getPostData(url, body, options, (url: string, body: any, options: RequestOptionsArgs) => { + return this.http.post(url, body, options); + }); + } + + put(url: string, body: any, options?: RequestOptionsArgs): Observable { + // tslint:disable-next-line:no-shadowed-variable + return this.getData(url, options, (url: string, options: RequestOptionsArgs) => { + return this.http.put(url, options); + }); + } + + delete(url: string, options?: RequestOptionsArgs): Observable { + // tslint:disable-next-line:no-shadowed-variable + return this.getData(url, options, (url: string, options: RequestOptionsArgs) => { + return this.http.delete(url, options); + }); + } + + patch(url: string, body: any, options?: RequestOptionsArgs): Observable { + // tslint:disable-next-line:no-shadowed-variable + return this.getPostData(url, body, options, (url: string, body: any, options: RequestOptionsArgs) => { + return this.http.patch(url, body, options); + }); + } + + head(url: string, options?: RequestOptionsArgs): Observable { + // tslint:disable-next-line:no-shadowed-variable + return this.getData(url, options, (url: string, options: RequestOptionsArgs) => { + return this.http.head(url, options); + }); + } + + options(url: string, options?: RequestOptionsArgs): Observable { + // tslint:disable-next-line:no-shadowed-variable + return this.getData(url, options, (url: string, options: RequestOptionsArgs) => { + return this.http.options(url, options); + }); + } + + // tslint:disable-next-line:max-line-length + private getData(uri: string | Request, options: RequestOptionsArgs, callback: (uri: string | Request, options?: RequestOptionsArgs) => Observable) { + + let url = uri; + + if (typeof uri !== 'string') { + url = uri.url; + } + + const key = url + JSON.stringify(options); + + try { + return this.resolveData(key); + } catch (e) { + return callback(uri, options) + .map((res: Response) => res.json()) + .do((data: any) => { + this.setCache(key, data); + }); + } + } + + private getPostData(uri: string | Request, body: any, options: RequestOptionsArgs, callback: (uri: string | Request, body: any, options?: RequestOptionsArgs) => Observable) { + + let url = uri; + + if (typeof uri !== 'string') { + url = uri.url; + } + + const key = url + JSON.stringify(body) + JSON.stringify(options); + + try { + return this.resolveData(key); + } catch (e) { + return callback(uri, body, options) + .map((res: Response) => res.json()) + .do((data: any) => { + this.setCache(key, data); + }); + } + } + + private resolveData(key: string) { + const data = this.getFromCache(key); + if (!data) { + throw new Error(); + } + return Observable.of(data); + } + + private setCache(key, data) { + return this.transferState.set(key, data); + } + + private getFromCache(key): any { + return this.transferState.get(key); + } + +} diff --git a/src/modules/transfer-state/browser-transfer-state.module.ts b/src/modules/transfer-state/browser-transfer-state.module.ts new file mode 100644 index 00000000000..9bf3f1bae99 --- /dev/null +++ b/src/modules/transfer-state/browser-transfer-state.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { BrowserTransferState } from './browser-transfer-state'; +import { TransferState } from './transfer-state'; + +@NgModule({ + providers: [ + { provide: TransferState, useClass: BrowserTransferState } + ] +}) +export class BrowserTransferStateModule { + +} diff --git a/src/modules/transfer-state/browser-transfer-state.ts b/src/modules/transfer-state/browser-transfer-state.ts new file mode 100644 index 00000000000..cd30b644164 --- /dev/null +++ b/src/modules/transfer-state/browser-transfer-state.ts @@ -0,0 +1,46 @@ +import { Inject, Injectable } from '@angular/core'; + +import { Action, Store } from '@ngrx/store'; + +import { TransferState } from './transfer-state'; + +import { StoreAction, StoreActionTypes } from '../../app/store.actions'; +import { AppState } from '../../app/app.reducer'; + +import { GLOBAL_CONFIG, GlobalConfig } from '../../config'; + +@Injectable() +export class BrowserTransferState extends TransferState { + + constructor(private store: Store, @Inject(GLOBAL_CONFIG) private config: GlobalConfig) { + super(); + } + + initialize() { + // tslint:disable-next-line:no-string-literal + const cache: any = window['TRANSFER_STATE'] || {}; + Object.keys(cache).forEach((key: string) => { + if (key !== 'actions') { + this.set(key, cache[key]); + } + }); + if (this.config.prerenderStrategy === 'replay') { + if (cache.actions !== undefined) { + if (this.config.debug) { + console.info('Replay:', cache.actions); + } + this.store.dispatch(new StoreAction(StoreActionTypes.REPLAY, cache.actions)); + } else { + console.info('No actions occured during prerender.'); + } + } else if (this.config.prerenderStrategy === 'rehydrate') { + if (this.config.debug) { + console.info('Rehydrate:', cache.state); + } + this.store.dispatch(new StoreAction(StoreActionTypes.REHYDRATE, cache.state)); + } else { + console.warn([this.config.prerenderStrategy, 'is not a valid prerender strategy!'].join(' ')); + } + } + +} diff --git a/src/modules/transfer-state/server-transfer-state.module.ts b/src/modules/transfer-state/server-transfer-state.module.ts new file mode 100644 index 00000000000..1a77f6539a9 --- /dev/null +++ b/src/modules/transfer-state/server-transfer-state.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { ServerTransferState } from './server-transfer-state'; +import { TransferState } from './transfer-state'; + +@NgModule({ + providers: [ + { provide: TransferState, useClass: ServerTransferState } + ] +}) +export class ServerTransferStateModule { + +} diff --git a/src/modules/transfer-state/server-transfer-state.ts b/src/modules/transfer-state/server-transfer-state.ts new file mode 100644 index 00000000000..6daf17f4ac3 --- /dev/null +++ b/src/modules/transfer-state/server-transfer-state.ts @@ -0,0 +1,37 @@ +import { Inject, Injectable, RendererFactory2, ViewEncapsulation } from '@angular/core'; + +import { INITIAL_CONFIG, PlatformState } from '@angular/platform-server'; + +import { TransferState } from './transfer-state'; + +@Injectable() +export class ServerTransferState extends TransferState { + + constructor(private state: PlatformState, private rendererFactory: RendererFactory2) { + super(); + } + + inject() { + try { + const document: any = this.state.getDocument(); + const transferStateString = JSON.stringify(this.toJson()); + const renderer = this.rendererFactory.createRenderer(document, { + id: '-1', + encapsulation: ViewEncapsulation.None, + styles: [], + data: {} + }); + const head = document.children[1].children[0]; + if (head.name !== 'head') { + throw new Error('Please have as the first element in your document'); + } + const script = renderer.createElement('script'); + renderer.setValue(script, `window['TRANSFER_STATE'] = ${transferStateString}`); + renderer.appendChild(head, script); + } catch (e) { + console.error(e); + } + + } + +} diff --git a/src/modules/transfer-state/transfer-state.ts b/src/modules/transfer-state/transfer-state.ts new file mode 100644 index 00000000000..94298a9c1ee --- /dev/null +++ b/src/modules/transfer-state/transfer-state.ts @@ -0,0 +1,40 @@ +import { Injectable } from '@angular/core'; + +import { Action } from '@ngrx/store'; +import { Store } from '@ngrx/store'; + +@Injectable() +export class TransferState { + + protected map = new Map(); + + keys() { + return this.map.keys(); + } + + get(key: string): any { + return this.map.get(key); + } + + set(key: string, value: any): Map { + return this.map.set(key, value); + } + + toJson(): any { + const json: any = {}; + Array.from(this.keys()) + .forEach((key: string) => { + json[key] = this.get(key); + }); + return json; + } + + initialize(): void { + console.log('Initialize does nothing!'); + } + + inject(): void { + console.log('Inject does nothing!'); + } + +} diff --git a/src/modules/transfer-store/browser-transfer-store.effects.ts b/src/modules/transfer-store/browser-transfer-store.effects.ts new file mode 100644 index 00000000000..589db968e39 --- /dev/null +++ b/src/modules/transfer-store/browser-transfer-store.effects.ts @@ -0,0 +1,28 @@ +import { Inject, Injectable } from '@angular/core'; + +import { Action } from '@ngrx/store'; +import { Effect, Actions } from '@ngrx/effects'; + +import { Observable } from 'rxjs/Observable'; + +import { types } from '../../app/shared/ngrx/type'; + +import { TransferStoreEffects } from './transfer-store.effects'; + +import { GLOBAL_CONFIG, GlobalConfig } from '../../config'; + +@Injectable() +export class BrowserTransferStoreEffects extends TransferStoreEffects { + + @Effect({ dispatch: false }) log = this.actions.ofType(...types()).switchMap((action: Action) => { + if (this.config.debug) { + console.info(action); + } + return Observable.of({}); + }); + + constructor(private actions: Actions, @Inject(GLOBAL_CONFIG) public config: GlobalConfig) { + super(); + } + +} diff --git a/src/modules/transfer-store/browser-transfer-store.module.ts b/src/modules/transfer-store/browser-transfer-store.module.ts new file mode 100644 index 00000000000..78a2bd6abc3 --- /dev/null +++ b/src/modules/transfer-store/browser-transfer-store.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { BrowserTransferStoreEffects } from './browser-transfer-store.effects'; +import { TransferStoreEffects } from './transfer-store.effects'; + +@NgModule({ + providers: [ + { provide: TransferStoreEffects, useClass: BrowserTransferStoreEffects } + ] +}) +export class BrowserTransferStoreModule { + +} diff --git a/src/modules/transfer-store/server-transfer-store.effects.ts b/src/modules/transfer-store/server-transfer-store.effects.ts new file mode 100644 index 00000000000..ad1f656acf1 --- /dev/null +++ b/src/modules/transfer-store/server-transfer-store.effects.ts @@ -0,0 +1,36 @@ +import { Inject, Injectable } from '@angular/core'; + +import { Action } from '@ngrx/store'; +import { Effect, Actions } from '@ngrx/effects'; + +import { Observable } from 'rxjs/Observable'; + +import { types } from '../../app/shared/ngrx/type'; + +import { TransferStoreEffects } from './transfer-store.effects'; + +import { TransferState } from '../transfer-state/transfer-state'; + +import { GLOBAL_CONFIG, GlobalConfig } from '../../config'; + +@Injectable() +export class ServerTransferStoreEffects extends TransferStoreEffects { + + @Effect({ dispatch: false }) track = this.actions.ofType(...types()).switchMap((action: Action) => { + this.cacheAction(action); + return Observable.of({}); + }); + + constructor(private actions: Actions, private cache: TransferState, @Inject(GLOBAL_CONFIG) public config: GlobalConfig) { + super(); + this.cache.set('actions', new Array()); + } + + private cacheAction(action: Action): void { + if (this.config.debug) { + console.info('Cache:', action); + } + this.cache.get('actions').push(action); + } + +} diff --git a/src/modules/transfer-store/server-transfer-store.module.ts b/src/modules/transfer-store/server-transfer-store.module.ts new file mode 100644 index 00000000000..25a0703c3a6 --- /dev/null +++ b/src/modules/transfer-store/server-transfer-store.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { ServerTransferStoreEffects } from './server-transfer-store.effects'; +import { TransferStoreEffects } from './transfer-store.effects'; + +@NgModule({ + providers: [ + { provide: TransferStoreEffects, useClass: ServerTransferStoreEffects } + ] +}) +export class ServerTransferStoreModule { + +} diff --git a/src/modules/transfer-store/transfer-store.effects.ts b/src/modules/transfer-store/transfer-store.effects.ts new file mode 100644 index 00000000000..f74bb3c728d --- /dev/null +++ b/src/modules/transfer-store/transfer-store.effects.ts @@ -0,0 +1,3 @@ +export abstract class TransferStoreEffects { + +} diff --git a/src/modules/translate-universal-loader.ts b/src/modules/translate-universal-loader.ts new file mode 100644 index 00000000000..803a7549969 --- /dev/null +++ b/src/modules/translate-universal-loader.ts @@ -0,0 +1,16 @@ +import { TranslateLoader } from '@ngx-translate/core'; +import { Observable } from 'rxjs/Observable'; +import * as fs from 'fs'; + +export class TranslateUniversalLoader implements TranslateLoader { + + constructor(private prefix: string = 'i18n', private suffix: string = '.json') { } + + public getTranslation(lang: string): Observable { + return Observable.create((observer: any) => { + observer.next(JSON.parse(fs.readFileSync(`${this.prefix}/${lang}${this.suffix}`, 'utf8'))); + observer.complete(); + }); + } + +} diff --git a/src/platform/angular2-meta.ts b/src/platform/angular2-meta.ts deleted file mode 100644 index dcce3c2cb51..00000000000 --- a/src/platform/angular2-meta.ts +++ /dev/null @@ -1,194 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import { Injectable } from '@angular/core'; -// es6-modules are used here -import { DomAdapter, getDOM } from '@angular/platform-browser/src/dom/dom_adapter'; - -/** - * Represent meta element. - * - * ### Example - * - * ```ts - * { name: 'application-name', content: 'Name of my application' }, - * { name: 'description', content: 'A description of the page', id: 'desc' } - * // ... - * // Twitter - * { name: 'twitter:title', content: 'Content Title' } - * // ... - * // Google+ - * { itemprop: 'name', content: 'Content Title' }, - * { itemprop: 'description', content: 'Content Title' } - * // ... - * // Facebook / Open Graph - * { property: 'fb:app_id', content: '123456789' }, - * { property: 'og:title', content: 'Content Title' } - * ``` - * - * @experimental - */ -export interface MetaDefinition { - charset?: string; - content?: string; - httpEquiv?: string; - id?: string; - itemprop?: string; - name?: string; - property?: string; - scheme?: string; - url?: string; - [prop: string]: string; -} - -/** - * A service that can be used to get and add meta tags. - * - * @experimental - */ -@Injectable() -export class Meta { - private _dom: DomAdapter = getDOM(); - - /** - * Adds a new meta tag to the dom. - * - * ### Example - * - * ```ts - * const name: MetaDefinition = {name: 'application-name', content: 'Name of my application'}; - * const desc: MetaDefinition = {name: 'description', content: 'A description of the page'}; - * const tags: HTMLMetaElement[] = this.meta.addTags([name, desc]); - * ``` - * - * @param tags - * @returns {HTMLMetaElement[]} - */ - addTags(...tags: Array): HTMLMetaElement[] { - const presentTags = this._flattenArray(tags); - if (presentTags.length === 0) return []; - return presentTags.map((tag: MetaDefinition) => this._addInternal(tag)); - } - - /** - * Gets the meta tag by the given selector. Returns element or null - * if there's no such meta element. - * - * ### Example - * - * ```ts - * const meta: HTMLMetaElement = this.meta.getTag('name=description'); - * const twitterMeta: HTMLMetaElement = this.meta.getTag('name="twitter:title"'); - * const fbMeta: HTMLMetaElement = this.meta.getTag('property="fb:app_id"'); - * ``` - * - * @param selector - * @returns {HTMLMetaElement} - */ - getTag(selector: string): HTMLMetaElement { - if (!selector) return null; - return this._dom.query(`meta[${selector}]`); - } - - /** - * Updates the meta tag with the given selector. - * - * * ### Example - * - * ```ts - * const meta: HTMLMetaElement = this.meta.updateTag('name=description', {name: 'description', - * content: 'New description'}); - * console.log(meta.content); // 'New description' - * ``` - * - * @param selector - * @param tag updated tag definition - * @returns {HTMLMetaElement} - */ - updateTag(selector: string, tag: MetaDefinition): HTMLMetaElement { - const meta: HTMLMetaElement = this.getTag(selector); - if (!meta) { - // create element if it doesn't exist - return this._addInternal(tag); - } - return this._prepareMetaElement(tag, meta); - } - - /** - * Removes meta tag with the given selector from the dom. - * - * ### Example - * - * ```ts - * this.meta.removeTagBySelector('name=description'); - * ``` - * - * @param selector - */ - removeTagBySelector(selector: string): void { - const meta: HTMLMetaElement = this.getTag(selector); - this.removeTagElement(meta); - } - - /** - * Removes given meta element from the dom. - * - * ### Example - * ```ts - * const elem: HTMLMetaElement = this.meta.getTag('name=description'); - * this.meta.removeTagElement(elem); - * ``` - * - * @param meta meta element - */ - removeTagElement(meta: HTMLMetaElement): void { - if (meta) { - this._removeMetaElement(meta); - } - } - - private _addInternal(tag: MetaDefinition): HTMLMetaElement { - const meta: HTMLMetaElement = this._createMetaElement(); - this._prepareMetaElement(tag, meta); - this._appendMetaElement(meta); - return meta; - } - - private _createMetaElement(): HTMLMetaElement { - return this._dom.createElement('meta') as HTMLMetaElement; - } - - private _prepareMetaElement(tag: MetaDefinition, el: HTMLMetaElement): HTMLMetaElement { - Object.keys(tag).forEach((prop: string) => this._dom.setAttribute(el, prop, tag[prop])); - return el; - } - - private _appendMetaElement(meta: HTMLMetaElement): void { - const head = this._dom.getElementsByTagName(this._dom.defaultDoc(), 'head')[0]; - this._dom.appendChild(head, meta); - } - - private _removeMetaElement(meta: HTMLMetaElement): void { - const head = this._dom.parentElement(meta); - this._dom.removeChild(head, meta); - } - - private _flattenArray(input: any[], out: any[] = []): any[] { - if (input) { - for (let i = 0; i < input.length; i++) { - const item: any = input[i]; - if (Array.isArray(item)) { - this._flattenArray(item, out); - } else if (item) { - out.push(item); - } - } - } - return out; - } -} diff --git a/src/platform/modules/browser.module.ts b/src/platform/modules/browser.module.ts deleted file mode 100755 index 7f4081788f5..00000000000 --- a/src/platform/modules/browser.module.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Inject, NgModule } from '@angular/core'; -import { Http } from '@angular/http'; -import { FormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { UniversalModule, isBrowser, isNode } from 'angular2-universal/browser'; // for AoT we need to manually split universal packages -import { IdlePreload, IdlePreloadModule } from '@angularclass/idle-preload'; - -import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { TranslateHttpLoader } from "@ngx-translate/http-loader"; - -import { AppModule, AppComponent } from '../../app/app.module'; -import { SharedModule } from '../../app/shared/shared.module'; -import { CoreModule } from '../../app/core/core.module'; - -import { StoreModule, Store } from "@ngrx/store"; -import { RouterStoreModule } from "@ngrx/router-store"; -import { StoreDevtoolsModule } from "@ngrx/store-devtools"; -import { rootReducer, NGRX_CACHE_KEY, AppState } from '../../app/app.reducers'; -import { effects } from '../../app/app.effects'; - -// Will be merged into @angular/platform-browser in a later release -// see https://github.com/angular/angular/pull/12322 -import { Meta } from '../angular2-meta'; -import { RehydrateStoreAction } from "../../app/store.actions"; - -import { GLOBAL_CONFIG, GlobalConfig, EnvConfig } from '../../config'; - -// import * as LRU from 'modern-lru'; - -// AoT requires an exported function for factories -export function HttpLoaderFactory(http: Http) { - return new TranslateHttpLoader(http); -} - -export function getLRU(lru?: any) { - // use LRU for node - // return lru || new LRU(10); - return lru || new Map(); -} -export function getRequest() { - // the request object only lives on the server - return { cookie: document.cookie }; -} -export function getResponse() { - // the response object is sent as the index.html and lives on the server - return {}; -} - -export const UNIVERSAL_KEY = 'UNIVERSAL_CACHE'; - -@NgModule({ - bootstrap: [AppComponent], - imports: [ - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: HttpLoaderFactory, - deps: [Http] - } - }), - NgbModule.forRoot(), - - UniversalModule, // BrowserModule, HttpModule, and JsonpModule are included - - FormsModule, - RouterModule.forRoot([], { useHash: false, preloadingStrategy: IdlePreload }), - - IdlePreloadModule.forRoot(), - CoreModule.forRoot(), - SharedModule, - AppModule, - StoreModule.provideStore(rootReducer), - RouterStoreModule.connectRouter(), - StoreDevtoolsModule.instrumentOnlyWithExtension(), - effects - ], - providers: [ - { provide: GLOBAL_CONFIG, useValue: EnvConfig }, - - { provide: 'isBrowser', useValue: isBrowser }, - { provide: 'isNode', useValue: isNode }, - - { provide: 'req', useFactory: getRequest }, - { provide: 'res', useFactory: getResponse }, - - { provide: 'LRU', useFactory: getLRU, deps: [] }, - - Meta - - // { provide: AUTO_PREBOOT, useValue: false } // turn off auto preboot complete - ] -}) -export class MainModule { - constructor( @Inject(GLOBAL_CONFIG) private EnvConfig: GlobalConfig, public store: Store) { - // TODO(gdi2290): refactor into a lifecycle hook - this.doRehydrate(); - } - - doRehydrate() { - let defaultValue = {}; - let serverCache = this._getCacheValue(NGRX_CACHE_KEY, defaultValue); - if (this.EnvConfig.universal.preboot) { - this.store.dispatch(new RehydrateStoreAction(serverCache)); - } - } - - _getCacheValue(key: string, defaultValue: any): any { - // browser - const win: any = window; - if (win[UNIVERSAL_KEY] && win[UNIVERSAL_KEY][key]) { - let serverCache = defaultValue; - try { - serverCache = win[UNIVERSAL_KEY][key]; - if (typeof serverCache !== typeof defaultValue) { - console.log('Angular Universal: The type of data from the server is different from the default value type'); - serverCache = defaultValue; - } - } catch (e) { - console.log('Angular Universal: There was a problem parsing the server data during rehydrate'); - serverCache = defaultValue; - } - return serverCache; - } else { - console.log('Angular Universal: UNIVERSAL_CACHE is missing'); - } - return defaultValue; - } -} diff --git a/src/platform/modules/node.module.ts b/src/platform/modules/node.module.ts deleted file mode 100755 index 492e117521e..00000000000 --- a/src/platform/modules/node.module.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { NgModule } from '@angular/core'; -import { Http } from '@angular/http'; -import { FormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { UniversalModule, isBrowser, isNode } from 'angular2-universal/node'; // for AoT we need to manually split universal packages - -import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { TranslateHttpLoader } from "@ngx-translate/http-loader"; - -import { AppModule, AppComponent } from '../../app/app.module'; -import { SharedModule } from '../../app/shared/shared.module'; -import { CoreModule } from "../../app/core/core.module"; - -import { StoreModule, Store } from "@ngrx/store"; -import { RouterStoreModule } from "@ngrx/router-store"; -import { rootReducer, AppState, NGRX_CACHE_KEY } from '../../app/app.reducers'; -import { effects } from '../../app/app.effects'; - -// Will be merged into @angular/platform-browser in a later release -// see https://github.com/angular/angular/pull/12322 -import { Meta } from '../angular2-meta'; - -import { GLOBAL_CONFIG, EnvConfig } from '../../config'; - -// AoT requires an exported function for factories -export function HttpLoaderFactory(http: Http) { - return new TranslateHttpLoader(http); -} - -export function getLRU() { - return new Map(); -} -export function getRequest() { - return Zone.current.get('req') || {}; -} -export function getResponse() { - return Zone.current.get('res') || {}; -} - -export const UNIVERSAL_KEY = 'UNIVERSAL_CACHE'; - -@NgModule({ - bootstrap: [AppComponent], - imports: [ - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: HttpLoaderFactory, - deps: [Http] - } - }), - NgbModule.forRoot(), - - UniversalModule, // BrowserModule, HttpModule, and JsonpModule are included - - FormsModule, - RouterModule.forRoot([], { useHash: false }), - - CoreModule.forRoot(), - SharedModule, - AppModule, - StoreModule.provideStore(rootReducer), - RouterStoreModule.connectRouter(), - effects - ], - providers: [ - { provide: GLOBAL_CONFIG, useValue: EnvConfig }, - - { provide: 'isBrowser', useValue: isBrowser }, - { provide: 'isNode', useValue: isNode }, - - { provide: 'req', useFactory: getRequest }, - { provide: 'res', useFactory: getResponse }, - - { provide: 'LRU', useFactory: getLRU, deps: [] }, - - Meta - - ] -}) -export class MainModule { - constructor(public store: Store) { - - } - - /** - * We need to use the arrow function here to bind the context as this is a gotcha - * in Universal for now until it's fixed - */ - universalDoDehydrate = (universalCache) => { - this.store.take(1).subscribe(state => { - universalCache[NGRX_CACHE_KEY] = state; - }); - }; - - /** - * Clear the cache after it's rendered - */ - universalAfterDehydrate = () => { - // comment out if LRU provided at platform level to be shared between each user - // this.cache.clear(); - //TODO is this necessary in dspace's case? - } -} diff --git a/src/platform/workarounds/__workaround.browser.ts b/src/platform/workarounds/__workaround.browser.ts deleted file mode 100644 index 939d7a58834..00000000000 --- a/src/platform/workarounds/__workaround.browser.ts +++ /dev/null @@ -1,21 +0,0 @@ - -/* - * THIS IS TEMPORARY TO PATCH 2.1.1+ Core bugs - */ - -/* tslint:disable */ -let __compiler__ = require('@angular/compiler'); -import { __platform_browser_private__ } from '@angular/platform-browser'; -import { __core_private__ } from '@angular/core'; -if (!__core_private__['ViewUtils']) { - __core_private__['ViewUtils'] = __core_private__['view_utils']; -} - - - -if (__compiler__ && __compiler__.SelectorMatcher && __compiler__.CssSelector) { - (__compiler__).__compiler_private__ = { - SelectorMatcher: __compiler__.SelectorMatcher, - CssSelector: __compiler__.CssSelector - } -} diff --git a/src/platform/workarounds/__workaround.node.ts b/src/platform/workarounds/__workaround.node.ts deleted file mode 100644 index 61e1f665de5..00000000000 --- a/src/platform/workarounds/__workaround.node.ts +++ /dev/null @@ -1,44 +0,0 @@ - -/* - * THIS IS TEMPORARY TO PATCH 2.1.1+ Core bugs - */ - -/* tslint:disable */ -let __compiler__ = require('@angular/compiler'); -import { __platform_browser_private__ } from '@angular/platform-browser'; -import { __core_private__ } from '@angular/core'; -let patch = false; -if (!__core_private__['ViewUtils']) { - patch = true; - __core_private__['ViewUtils'] = __core_private__['view_utils']; -} - - - -if (__compiler__ && __compiler__.SelectorMatcher && __compiler__.CssSelector) { - patch = true; - (__compiler__).__compiler_private__ = { - SelectorMatcher: __compiler__.SelectorMatcher, - CssSelector: __compiler__.CssSelector - } -} - -if (patch) { - var __universal__ = require('angular2-platform-node/__private_imports__'); - __universal__.ViewUtils = __core_private__['view_utils']; - __universal__.CssSelector = __universal__.CssSelector || __compiler__.CssSelector; - __universal__.SelectorMatcher = __universal__.SelectorMatcher || __compiler__.SelectorMatcher; -} - -// Fix Material Support -function universalMaterialSupports(eventName: string): boolean { return Boolean(this.isCustomEvent(eventName)); } -__platform_browser_private__.HammerGesturesPlugin.prototype.supports = universalMaterialSupports; -// End Fix Material Support - -// Fix Universal Style -import { NodeDomRootRenderer, NodeDomRenderer } from 'angular2-universal/node'; -function renderComponentFix(componentProto: any) { - return new NodeDomRenderer(this, componentProto, this._animationDriver); -} -NodeDomRootRenderer.prototype.renderComponent = renderComponentFix; -// End Fix Universal Style diff --git a/src/routes.ts b/src/routes.ts new file mode 100644 index 00000000000..bbb4b72ec14 --- /dev/null +++ b/src/routes.ts @@ -0,0 +1,7 @@ +export const ROUTES: string[] = [ + 'home', + 'items/:id', + 'collections/:id', + 'communities/:id', + '**' +]; diff --git a/src/server.aot.ts b/src/server.aot.ts deleted file mode 100644 index 4d41fb97386..00000000000 --- a/src/server.aot.ts +++ /dev/null @@ -1,128 +0,0 @@ -// the polyfills must be one of the first things imported in node.js. -// The only modules to be imported higher - node modules with es6-promise 3.x or other Promise polyfill dependency -// (rule of thumb: do it if you have zone.js exception that it has been overwritten) -// if you are including modules that modify Promise, such as NewRelic,, you must include them before polyfills -import 'angular2-universal-polyfills'; -import 'ts-helpers'; -import './platform/workarounds/__workaround.node'; // temporary until 2.1.1 things are patched in Core - -import * as fs from 'fs'; -import * as path from 'path'; -import * as morgan from 'morgan'; -import * as express from 'express'; -import * as bodyParser from 'body-parser'; -import * as compression from 'compression'; -import * as cookieParser from 'cookie-parser'; - -// Angular 2 -import { enableProdMode } from '@angular/core'; -// Angular 2 Universal -import { createEngine } from 'angular2-express-engine'; - -// App -import { MainModuleNgFactory } from './platform/modules/node.module.ngfactory'; - -// Routes -import { routes } from './server.routes'; - -import { EnvConfig } from './config'; - -// enable prod for faster renders -enableProdMode(); - -const app = express(); -const ROOT = path.join(path.resolve(__dirname, '..')); - -// Express View -app.engine('.html', createEngine({ - precompile: false, // this needs to be false when using ngFactory - ngModule: MainModuleNgFactory, - providers: [ - // use only if you have shared state between users - // { provide: 'LRU', useFactory: () => new LRU(10) } - - // stateless providers only since it's shared - ] -})); - -app.set('port', process.env.PORT || EnvConfig.ui.port || 3000); -app.set('address', process.env.ADDRESS || EnvConfig.ui.address || '127.0.0.1'); -app.set('views', __dirname); -app.set('view engine', 'html'); -app.set('json spaces', 2); - -app.use(cookieParser('DSpace Universal')); -app.use(bodyParser.json()); -app.use(compression()); - -const accessLogStream = fs.createWriteStream(ROOT + '/morgan.log', { flags: 'a' }) - -app.use(morgan('common', { - skip: (req, res) => res.statusCode < 400, - stream: accessLogStream -})); - -function cacheControl(req, res, next) { - // instruct browser to revalidate in 60 seconds - res.header('Cache-Control', EnvConfig.cache.control || 'max-age=60'); - next(); -} - -// Serve static files -app.use('/assets', cacheControl, express.static(path.join(__dirname, 'assets'), { maxAge: 30 })); -app.use('/styles', cacheControl, express.static(path.join(__dirname, 'styles'), { maxAge: 30 })); - -app.use(cacheControl, express.static(path.join(ROOT, 'dist/client'), { index: false })); - -///////////////////////// -// ** Example API -// Notice API should be in a separate process -import { serverApi, createMockApi } from './backend/api'; -// Our API for demos only -app.get('/data.json', serverApi); -app.use('/api', createMockApi()); - -function ngApp(req, res) { - - function onHandleError(parentZoneDelegate, currentZone, targetZone, error) { - console.warn('Error in SSR, serving for direct CSR', error); - res.sendFile('index.html', { root: './src' }); - return false; - } - - Zone.current.fork({ name: 'CSR fallback', onHandleError }).run(() => { - res.render('index', { - req, - res, - // use this to determine what part of your app is slow only in development - // time: true, - async: EnvConfig.universal.async, - preboot: EnvConfig.universal.preboot, - baseUrl: EnvConfig.ui.nameSpace, - requestUrl: req.originalUrl, - originUrl: EnvConfig.ui.baseUrl - }); - }); - -} - -/** - * use universal for specific routes - */ -app.get('/', ngApp); -routes.forEach(route => { - app.get(`/${route}`, ngApp); - app.get(`/${route}/*`, ngApp); -}); - -app.get('*', function(req, res) { - res.setHeader('Content-Type', 'application/json'); - var pojo = { status: 404, message: 'No Content' }; - var json = JSON.stringify(pojo, null, 2); - res.status(404).send(json); -}); - -// Server -let server = app.listen(app.get('port'), app.get('address'), () => { - console.log(`[${new Date().toTimeString()}] Listening on ${EnvConfig.ui.ssl ? 'https://' : 'http://'}${server.address().address}:${server.address().port}`); -}); diff --git a/src/server.routes.ts b/src/server.routes.ts deleted file mode 100644 index 834923da305..00000000000 --- a/src/server.routes.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Server-side routes. Only the listed routes support html5pushstate. - * Has to match client side routes. - * - * Index (/) route does not have to be listed here. - * - * @example - * export const routes: string[] = [ - * 'home', 'about' - * ]; - **/ -export const routes: string[] = [ - 'home', 'items/:id' , 'collections/:id', 'communities/:id', '**' -]; diff --git a/src/server.ts b/src/server.ts deleted file mode 100644 index 42f8d9bd5eb..00000000000 --- a/src/server.ts +++ /dev/null @@ -1,125 +0,0 @@ -// the polyfills must be one of the first things imported in node.js. -// The only modules to be imported higher - node modules with es6-promise 3.x or other Promise polyfill dependency -// (rule of thumb: do it if you have zone.js exception that it has been overwritten) -// if you are including modules that modify Promise, such as NewRelic,, you must include them before polyfills -import 'angular2-universal-polyfills'; -import 'ts-helpers'; -import './platform/workarounds/__workaround.node'; // temporary until 2.1.1 things are patched in Core - -import * as path from 'path'; -import * as morgan from 'morgan'; -import * as express from 'express'; -import * as bodyParser from 'body-parser'; -import * as compression from 'compression'; -import * as cookieParser from 'cookie-parser'; - -// Angular 2 -import { enableProdMode } from '@angular/core'; -// Angular 2 Universal -import { createEngine } from 'angular2-express-engine'; - -// App -import { MainModule } from './platform/modules/node.module'; - -// Routes -import { routes } from './server.routes'; - -import { EnvConfig } from './config'; - -if (EnvConfig.production) { - // enable prod for faster renders - enableProdMode(); -} - -const app = express(); -const ROOT = path.join(path.resolve(__dirname, '..')); - -// Express View -app.engine('.html', createEngine({ - ngModule: MainModule, - providers: [ - // use only if you have shared state between users - // { provide: 'LRU', useFactory: () => new LRU(10) } - - // stateless providers only since it's shared - ] -})); - -app.set('port', process.env.PORT || EnvConfig.ui.port || 3000); -app.set('address', process.env.ADDRESS || EnvConfig.ui.address || '127.0.0.1'); -app.set('views', __dirname); -app.set('view engine', 'html'); -app.set('json spaces', 2); - -app.use(cookieParser('Angular 2 Universal')); -app.use(bodyParser.json()); -app.use(compression()); - -app.use(morgan('dev')); - -function cacheControl(req, res, next) { - // instruct browser to revalidate in 60 seconds - res.header('Cache-Control', EnvConfig.cache.control || 'max-age=60'); - next(); -} - -// Serve static files -app.use('/assets', cacheControl, express.static(path.join(__dirname, 'assets'), { maxAge: 30 })); -app.use('/styles', cacheControl, express.static(path.join(__dirname, 'styles'), { maxAge: 30 })); - -app.use(cacheControl, express.static(path.join(ROOT, 'dist/client'), { index: false })); - -///////////////////////// -// ** Example API -// Notice API should be in aseparate process -import { serverApi, createMockApi } from './backend/api'; -// Our API for demos only -app.get('/data.json', serverApi); -app.use('/api', createMockApi()); - -function ngApp(req, res) { - - function onHandleError(parentZoneDelegate, currentZone, targetZone, error) { - console.warn('Error in SSR, serving for direct CSR'); - res.sendFile('index.html', { root: './src' }); - } - - if (EnvConfig.universal.preboot) { - Zone.current.fork({ name: 'CSR fallback', onHandleError }).run(() => { - res.render('index', { - req, - res, - // time: true, // use this to determine what part of your app is slow only in development - async: EnvConfig.universal.async, - preboot: EnvConfig.universal.preboot, - baseUrl: EnvConfig.ui.nameSpace, - requestUrl: req.originalUrl, - originUrl: EnvConfig.ui.baseUrl - }); - }); - } - else { - res.sendFile('index.html', { root: './src' }); - } -} - -/** - * use universal for specific routes - */ -app.get('/', ngApp); -routes.forEach(route => { - app.get(`/${route}`, ngApp); - app.get(`/${route}/*`, ngApp); -}); - -app.get('*', function(req, res) { - res.setHeader('Content-Type', 'application/json'); - var pojo = { status: 404, message: 'No Content' }; - var json = JSON.stringify(pojo, null, 2); - res.status(404).send(json); -}); - -// Server -let server = app.listen(app.get('port'), app.get('address'), () => { - console.log(`[${new Date().toTimeString()}] Listening on ${EnvConfig.ui.ssl ? 'https://' : 'http://'}${server.address().address}:${server.address().port}`); -}); diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss index 39204e1e6ce..a946a48642b 100644 --- a/src/styles/_mixins.scss +++ b/src/styles/_mixins.scss @@ -1,13 +1,12 @@ @import './variables.scss'; @import '../../node_modules/bootstrap/scss/variables'; @import '../../node_modules/bootstrap/scss/mixins'; - @mixin negate-gutters($gutters: $grid-gutter-widths) { - @each $breakpoint in map-keys($gutters) { + @each $breakpoint in map-keys($gutters){ @include media-breakpoint-up($breakpoint) { $gutter: map-get($gutters, $breakpoint); margin-right: ($gutter / -2); - margin-left: ($gutter / -2); + margin-left: ($gutter / -2); } } } diff --git a/src/styles/main.scss b/src/styles/main.scss deleted file mode 100644 index a150af617b1..00000000000 --- a/src/styles/main.scss +++ /dev/null @@ -1,10 +0,0 @@ -@import './variables.scss'; - -@import '../../node_modules/bootstrap/scss/bootstrap.scss'; - -@import "../../node_modules/font-awesome/scss/font-awesome.scss"; - -html { - position: relative; - min-height: 100%; -} diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 64bf45be18c..b733f9231bd 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -1,24 +1,20 @@ -// Colors - -$gray-base: #000 !default; -$gray-darker: lighten($gray-base, 13.5%) !default; // #222 -$gray-dark: lighten($gray-base, 26.6%) !default; // #444 -$gray: lighten($gray-base, 46.6%) !default; // #777 -$gray-light: lighten($gray-base, 73.3%) !default; // #bbb -$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee - -$brand-primary: #2B4E72 !default; -$brand-success: #94BA65 !default; -$brand-info: #2790B0 !default; -$brand-warning: #EBBB54 !default; -$brand-danger: #CF4444 !default; - -$brand-inverse: $brand-primary !default; - -$link-color: $brand-info !default; - -// Fonts - +/* Fonts */ $fa-font-path: "../assets/fonts"; - +/* Images */ $image-path: "../assets/images"; +/* Colors */ +$gray-base: #000 !default; +$gray-darker: lighten($gray-base, 13.5%) !default; // #222 +$gray-dark: lighten($gray-base, 26.6%) !default; // #444 +$gray: lighten($gray-base, 46.6%) !default; // #777 +$gray-light: lighten($gray-base, 73.3%) !default; // #bbb +$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee +/* Reassign color vars to semantic color scheme */ +$brand-primary: #2B4E72 !default; +$brand-success: #94BA65 !default; +$brand-info: #2790B0 !default; +$brand-warning: #EBBB54 !default; +$brand-danger: #CF4444 !default; +$brand-inverse: $brand-primary !default; +/* Fonts */ +$link-color: $brand-info !default; diff --git a/src/tsconfig.browser.json b/src/tsconfig.browser.json new file mode 100644 index 00000000000..d04b9e603d9 --- /dev/null +++ b/src/tsconfig.browser.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "angularCompilerOptions": { + "entryModule": "./app/browser-app.module#BrowserAppModule" + }, + "exclude": [ + "./main.server.aot.ts" + ] +} diff --git a/src/tsconfig.server.aot.json b/src/tsconfig.server.aot.json new file mode 100644 index 00000000000..e3638f4fb1a --- /dev/null +++ b/src/tsconfig.server.aot.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.server.json", + "angularCompilerOptions": { + "genDir": "aot", + "entryModule": "./app/server-app.module#ServerAppModule" + }, + "exclude": [ + "./main.browser.ts", + "./main.server.ts" + ] +} diff --git a/src/tsconfig.server.json b/src/tsconfig.server.json new file mode 100644 index 00000000000..6fecd0553a8 --- /dev/null +++ b/src/tsconfig.server.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "angularCompilerOptions": { + "entryModule": "./app/server-app.module#ServerAppModule" + }, + "exclude": [ + "./main.server.aot.ts" + ] +} diff --git a/src/tsconfig.test.json b/src/tsconfig.test.json new file mode 100644 index 00000000000..98be2bb0f2d --- /dev/null +++ b/src/tsconfig.test.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "sourceMap": true + }, + "angularCompilerOptions": { + "entryModule": "./app/browser-app.module#BrowserAppModule" + }, + "exclude": [ + "./main.server.aot.ts" + ] +} diff --git a/tsconfig.aot.json b/tsconfig.aot.json deleted file mode 100644 index 2d233217a46..00000000000 --- a/tsconfig.aot.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "module": "es2015", - "moduleResolution": "node", - "declaration": false, - "removeComments": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowUnreachableCode": false, - "allowUnusedLabels": false, - "noEmitHelpers": true, - "noImplicitAny": false, - "noImplicitReturns": false, - "noImplicitUseStrict": false, - "noFallthroughCasesInSwitch": true, - "pretty": false, - "outDir": "dist", - "sourceMap": true, - "sourceRoot": "src", - "typeRoots": [ - "node_modules/@types" - ], - "lib": ["es6", "dom"] - }, - "include": [ - "./src/**/*.module.ts", - "./src/*.d.ts" - ], - "angularCompilerOptions": { - "skipMetadataEmit": true, - "debug": false - }, - "compileOnSave": false, - "buildOnSave": false, - "atom": { - "rewriteTsconfig": false - } -} diff --git a/tsconfig.json b/tsconfig.json index 6926f8cfff5..1f78aba4030 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,38 +1,19 @@ { "compilerOptions": { - "target": "es5", - "module": "commonjs", "moduleResolution": "node", - "declaration": false, - "removeComments": false, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "allowUnreachableCode": false, - "allowUnusedLabels": false, - "noEmitHelpers": true, + "module": "es2015", + "target": "es5", "noImplicitAny": false, - "noImplicitReturns": false, - "noImplicitUseStrict": false, - "noFallthroughCasesInSwitch": true, - "pretty": true, - "outDir": "dist", - "sourceMap": true, - "sourceRoot": "src", - "typeRoots": [ - "node_modules/@types" - ], - "lib": ["es6", "dom"] - }, - "exclude": [ - "node_modules" - ], - "angularCompilerOptions": { - "debug": false + "sourceMap": false, + "skipLibCheck": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "lib": [ + "dom", + "es2016" + ] }, - "compileOnSave": false, - "buildOnSave": false, - "atom": { - "rewriteTsconfig": false - } + "include": [ + "src" + ] } diff --git a/tslint.json b/tslint.json index 6b00e6bcf5c..f971919ec67 100644 --- a/tslint.json +++ b/tslint.json @@ -1,39 +1,159 @@ { + "extends": [ + "tslint:recommended" + ], "rulesDirectory": [ "node_modules/codelyzer" ], "rules": { - "directive-selector": [ + "callable-types": true, + "class-name": true, + "comment-format": [ true, - "attribute", - "ds", - "camelCase" + "check-space" ], - "component-selector": [ + "curly": true, + "eofline": true, + "forin": true, + "import-blacklist": [ true, - "element", - "ds", - "kebab-case" + "rxjs" ], - "use-input-property-decorator": true, - "use-output-property-decorator": true, - "use-host-property-decorator": true, + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-name": [ + false, + "always-prefix" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + false + ], + "member-access": false, + "member-ordering": [ + true, + "static-before-instance", + "variables-before-functions" + ], + "no-access-missing-member": false, + "no-arg": true, "no-attribute-parameter-decorator": true, - "no-input-rename": true, - "no-output-rename": true, + "no-bitwise": true, + "no-console": [ + true, + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-variable": true, + "no-empty": true, + "no-empty-interface": true, + "no-eval": true, "no-forward-ref": true, - "use-life-cycle-interface": true, - "use-pipe-transform-interface": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-shadowed-variable": true, + "no-string-literal": true, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unused-expression": true, + "no-use-before-declare": false, + "no-var-keyword": true, + "no-var-requires": false, + "object-literal-shorthand": false, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "ordered-imports": [ + false + ], + "prefer-const": true, "pipe-naming": [ true, "camelCase", "ds" ], + "quotemark": [ + true, + "single", + "avoid-escape" + ], + "radix": true, + "semicolon": [ + "always" + ], + "trailing-comma": [ + false, + { + "multiline": "always", + "singleline": "never" + } + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "typeof-compare": true, + "unified-signatures": true, + "variable-name": [ + true, + "allow-leading-underscore", + "allow-pascal-case", + "ban-keywords", + "check-format" + ], + "whitespace": [ + true, + "check-branch", + "check-operator" + ], + "component-class-suffix": true, + "component-selector": [ + true, + "element", + "ds", + "kebab-case" + ], "directive-class-suffix": true, - "import-destructuring-spacing": true, - "templates-use-public": true, - "no-access-missing-member": true, - "invoke-injectable": true + "directive-selector": [ + true, + "attribute", + "ds", + "camelCase" + ], + "invoke-injectable": true, + "no-input-rename": true, + "no-output-rename": true, + "templates-use-public": false, + "use-host-property-decorator": true, + "use-input-property-decorator": true, + "use-life-cycle-interface": false, + "use-output-property-decorator": true, + "use-pipe-transform-interface": true } } diff --git a/typedoc.json b/typedoc.json index 5c289f3eb2b..6a357ff62a1 100644 --- a/typedoc.json +++ b/typedoc.json @@ -1,19 +1,19 @@ { - "out" : "./doc", - "mode" : "modules", - "module" : "commonjs", - "target" : "ES5", - "theme" : "default", - "name" : "Angular 2 UI for DSpace", - "readme" : "./README.md", - "exclude" : "**/*+(spec.ts|po.ts|index.ts|.json|.js|.config.ts)", - "excludeExternals" : "true", - "ignoreCompilerErrors" : "true", - "experimentalDecorators" : "true", - "emitDecoratorMetadata" : "true", - "moduleResolution" : "node", - "preserveConstEnums" : "true", - "stripInternal" : "true", - "suppressExcessPropertyErrors" : "true", + "out": "./doc", + "mode": "modules", + "module": "commonjs", + "target": "ES5", + "theme": "default", + "name": "Angular 2 UI for DSpace", + "readme": "./README.md", + "exclude": "**/*+(spec.ts|po.ts|index.ts|.json|.js|.config.ts|.aot.ts)", + "excludeExternals": "true", + "ignoreCompilerErrors": "true", + "experimentalDecorators": "true", + "emitDecoratorMetadata": "true", + "moduleResolution": "node", + "preserveConstEnums": "true", + "stripInternal": "true", + "suppressExcessPropertyErrors": "true", "suppressImplicitAnyIndexErrors": "true" -} \ No newline at end of file +} diff --git a/webpack.config.ts b/webpack.config.ts index 4da3f45b15f..0f4278feb77 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -1,157 +1,57 @@ -var webpack = require('webpack'); -var path = require('path'); -var clone = require('js.clone'); -var webpackMerge = require('webpack-merge'); -let CopyWebpackPlugin = require('copy-webpack-plugin'); +const webpackMerge = require('webpack-merge'); +const commonPartial = require('./webpack/webpack.common'); +const clientPartial = require('./webpack/webpack.client'); +const serverPartial = require('./webpack/webpack.server'); +const prodPartial = require('./webpack/webpack.prod'); -export var commonPlugins = [ - new webpack.ContextReplacementPlugin( - // The (\\|\/) piece accounts for path separators in *nix and Windows - /angular(\\|\/)core(\\|\/)src(\\|\/)linker/, - root('./src'), - { - // your Angular Async Route paths relative to this root directory - } - ), +const { + AotPlugin +} = require('@ngtools/webpack'); - // Copy fonts, images and i18n to dist/assets - new CopyWebpackPlugin([ - { - from: path.join(__dirname, 'node_modules', 'font-awesome', 'fonts'), - to: path.join('assets', 'fonts') - }, - { - from: path.join(__dirname, 'resources', 'images'), - to: path.join('assets', 'images') - }, { - from: path.join(__dirname, 'resources', 'i18n'), - to: path.join('assets', 'i18n') - } - ]), +const { + root +} = require('./webpack/helpers'); - // Loader options - new webpack.LoaderOptionsPlugin({ - options: { - tslint: { - emitErrors: false, - failOnHint: false - }, - } - }), +module.exports = function(options, webpackOptions) { + options = options || {}; -]; -export var commonConfig = { - // https://webpack.github.io/docs/configuration.html#devtool - devtool: 'source-map', - resolve: { - extensions: ['.ts', '.js', '.json'], - modules: [root('node_modules')] - }, - context: __dirname, - output: { - publicPath: '', - filename: '[name].bundle.js' - }, - module: { - rules: [ - // TypeScript - { test: /\.ts$/, use: ['awesome-typescript-loader', 'angular2-template-loader'] }, - { test: /\.html$/, use: 'raw-loader' }, - { test: /\.css$/, use: 'raw-loader' }, - { test: /\.json$/, use: 'json-loader' }, - { - enforce: 'pre', - test: /\.ts?$/, - use: 'tslint-loader', - exclude: /(node_modules)/, - } - ], - }, - - plugins: [ - // Use commonPlugins. - ] - -}; - -// Client. -export var clientPlugins = [ - -]; -export var clientConfig = { - target: 'web', - entry: './src/client', - output: { - path: root('dist/client') - }, - node: { - global: true, - crypto: 'empty', - __dirname: true, - __filename: true, - process: true, - Buffer: false + if (options.aot) { + console.log(`Running build for ${options.client ? 'client' : 'server'} with AoT Compilation`) } -}; -// Server. -export var serverPlugins = [ - -]; -export var serverConfig = { - target: 'node', - entry: './src/server', // use the entry file of the node server if everything is ts rather than es5 - output: { - filename: 'index.js', - path: root('dist/server'), - libraryTarget: 'commonjs2' - }, - module: { - rules: [ - { test: /@angular(\\|\/)material/, use: "imports-loader?window=>global" } - ], - }, - externals: includeClientPackages( - /@angularclass|@angular|angular2-|ng2-|ng-|@ng-|angular-|@ngrx|ngrx-|@ngx-|@angular2|ionic|@ionic|-angular2|-ng2|-ng/ - ), - node: { - global: true, - crypto: true, - __dirname: true, - __filename: true, - process: true, - Buffer: true + let serverConfig = webpackMerge({}, commonPartial, serverPartial, { + entry: options.aot ? './src/main.server.aot.ts' : serverPartial.entry, // Temporary + plugins: [ + new AotPlugin({ + tsConfigPath: root(options.aot ? './src/tsconfig.server.aot.json' : './src/tsconfig.server.json'), + skipCodeGeneration: !options.aot + }) + ] + }); + + let clientConfig = webpackMerge({}, commonPartial, clientPartial, { + plugins: [ + new AotPlugin({ + tsConfigPath: root('./src/tsconfig.browser.json'), + skipCodeGeneration: !options.aot + }) + ] + }); + + if (webpackOptions.p) { + serverConfig = webpackMerge({}, serverConfig, prodPartial); + clientConfig = webpackMerge({}, clientConfig, prodPartial); } -}; - -export default [ - // Client - webpackMerge(clone(commonConfig), clientConfig, { plugins: clientPlugins.concat(commonPlugins) }), - // Server - webpackMerge(clone(commonConfig), serverConfig, { plugins: serverPlugins.concat(commonPlugins) }) -]; + const configs = []; -// Helpers -export function includeClientPackages(packages, localModule?: string[]) { - return function(context, request, cb) { - if (localModule instanceof RegExp && localModule.test(request)) { - return cb(); - } - if (packages instanceof RegExp && packages.test(request)) { - return cb(); - } - if (Array.isArray(packages) && packages.indexOf(request) !== -1) { - return cb(); - } - if (!path.isAbsolute(request) && request.charAt(0) !== '.') { - return cb(null, 'commonjs ' + request); - } - return cb(); - }; -} + if (!options.aot) { + configs.push(clientConfig, serverConfig); + } else if (options.client) { + configs.push(clientConfig); + } else if (options.server) { + configs.push(serverConfig); + } -export function root(args) { - args = Array.prototype.slice.call(arguments, 0); - return path.join.apply(path, [__dirname].concat(args)); + return configs; } diff --git a/webpack.prod.config.ts b/webpack.prod.config.ts deleted file mode 100644 index 1a5fb02c30f..00000000000 --- a/webpack.prod.config.ts +++ /dev/null @@ -1,176 +0,0 @@ -const webpack = require('webpack'); -const path = require('path'); -const clone = require('js.clone'); -const webpackMerge = require('webpack-merge'); -const V8LazyParseWebpackPlugin = require('v8-lazy-parse-webpack-plugin'); -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; -import webpackConfig, { root, includeClientPackages } from './webpack.config'; -// const CompressionPlugin = require('compression-webpack-plugin'); - - -export const commonPlugins = [ - new V8LazyParseWebpackPlugin(), - - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('production'), - 'process.env.AOT': true - }), - - // Loader options - new webpack.LoaderOptionsPlugin({ - minimize: true, - debug: false - }), - - new webpack.NormalModuleReplacementPlugin( - /facade(\\|\/)async/, - root('node_modules/@angular/core/src/facade/async.js') - ), - new webpack.NormalModuleReplacementPlugin( - /facade(\\|\/)collection/, - root('node_modules/@angular/core/src/facade/collection.js') - ), - new webpack.NormalModuleReplacementPlugin( - /facade(\\|\/)errors/, - root('node_modules/@angular/core/src/facade/errors.js') - ), - new webpack.NormalModuleReplacementPlugin( - /facade(\\|\/)lang/, - root('node_modules/@angular/core/src/facade/lang.js') - ), - new webpack.NormalModuleReplacementPlugin( - /facade(\\|\/)math/, - root('node_modules/@angular/core/src/facade/math.js') - ), - -]; -export const commonConfig = { - output: { - filename: '[name].bundle.js', - chunkFilename: '[chunkhash].js' - }, -}; - -// Client. -export const clientPlugins = [ - new BundleAnalyzerPlugin({ - analyzerMode: 'disabled', // change it to `server` to view bundle stats - reportFilename: 'report.html', - generateStatsFile: true, - statsFilename: 'stats.json', - }), - // To use gzip, you can run 'npm install compression-webpack-plugin --save-dev' - // add 'var CompressionPlugin = require("compression-webpack-plugin");' on the top - // and comment out below codes - // - // new CompressionPlugin({ - // asset: "[path].gz[query]", - // algorithm: "gzip", - // test: /\.js$|\.css$|\.html$/, - // threshold: 10240, - // minRatio: 0.8 - // }), - - new webpack.optimize.UglifyJsPlugin({ - // beautify: true, - // mangle: false, - output: { - comments: false - }, - compress: { - warnings: false, - conditionals: true, - unused: true, - comparisons: true, - sequences: true, - dead_code: true, - evaluate: true, - if_return: true, - join_vars: true, - negate_iife: false // we need this for lazy v8 - }, - sourceMap: true - }), - - new webpack.NormalModuleReplacementPlugin( - /@angular(\\|\/)upgrade/, - root('empty.js') - ), - // problem with platformUniversalDynamic on the server/client - new webpack.NormalModuleReplacementPlugin( - /@angular(\\|\/)compiler/, - root('empty.js') - ), - new webpack.NormalModuleReplacementPlugin( - /@angular(\\|\/)platform-browser-dynamic/, - root('empty.js') - ), - new webpack.NormalModuleReplacementPlugin( - /dom(\\|\/)debug(\\|\/)ng_probe/, - root('empty.js') - ), - new webpack.NormalModuleReplacementPlugin( - /dom(\\|\/)debug(\\|\/)by/, - root('empty.js') - ), - new webpack.NormalModuleReplacementPlugin( - /src(\\|\/)debug(\\|\/)debug_node/, - root('empty.js') - ), - new webpack.NormalModuleReplacementPlugin( - /src(\\|\/)debug(\\|\/)debug_renderer/, - root('empty.js') - ), - - // Waiting for https://github.com/ampedandwired/html-webpack-plugin/issues/446 - // new webpack.optimize.AggressiveSplittingPlugin({ - // minSize: 30000, - // maxSize: 250000 - // }), - -]; -export const clientConfig = { - entry: './src/client.aot', - recordsOutputPath: root('webpack.records.json') -}; - -// Server. - -export const serverPlugins = [ - new webpack.optimize.UglifyJsPlugin({ - // beautify: true, - mangle: false, // to ensure process.env still works - output: { - comments: false - }, - compress: { - warnings: false, - conditionals: true, - unused: true, - comparisons: true, - sequences: true, - dead_code: true, - evaluate: true, - if_return: true, - join_vars: true, - negate_iife: false // we need this for lazy v8 - }, - sourceMap: true - }), -]; -export const serverConfig = { - entry: './src/server.aot', - output: { - filename: 'index.js', - chunkFilename: '[id].bundle.js', - crossOriginLoading: false - }, -}; - -export default [ - // Client - webpackMerge(webpackConfig[0], clone(commonConfig), clientConfig, { plugins: webpackConfig[0].plugins.concat(commonPlugins, clientPlugins) }), - - // Server - webpackMerge(webpackConfig[1], clone(commonConfig), serverConfig, { plugins: webpackConfig[1].plugins.concat(commonPlugins, serverPlugins) }) -]; diff --git a/webpack/helpers.js b/webpack/helpers.js new file mode 100644 index 00000000000..fdc005f1896 --- /dev/null +++ b/webpack/helpers.js @@ -0,0 +1,13 @@ +const { + join, + resolve +} = require('path'); + +function root(path) { + return resolve(__dirname, '..', path); +} + +module.exports = { + root: root, + join: join +}; diff --git a/webpack/webpack.client.js b/webpack/webpack.client.js new file mode 100644 index 00000000000..20dcbddb208 --- /dev/null +++ b/webpack/webpack.client.js @@ -0,0 +1,24 @@ +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const ScriptExtPlugin = require('script-ext-html-webpack-plugin'); + +const { + root +} = require('./helpers'); + +module.exports = { + entry: root('./src/main.browser.ts'), + output: { + filename: 'client.js' + }, + target: 'web', + plugins: [ + new HtmlWebpackPlugin({ + template: root('./src/index.html'), + output: root('dist'), + inject: 'head' + }), + new ScriptExtPlugin({ + defaultAttribute: 'defer' + }) + ] +}; diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js new file mode 100644 index 00000000000..b56e037e6b1 --- /dev/null +++ b/webpack/webpack.common.js @@ -0,0 +1,102 @@ +const CopyWebpackPlugin = require('copy-webpack-plugin'); + +const { + root, + join +} = require('./helpers'); + +module.exports = { + devtool: 'source-map', + resolve: { + extensions: ['.ts', '.js', '.json'] + }, + output: { + path: root('dist') + }, + module: { + rules: [{ + test: /\.ts$/, + enforce: 'pre', + loader: 'tslint-loader' + }, { + test: /\.ts$/, + loader: '@ngtools/webpack' + }, { + test: /\.css$/, + use: [{ + loader: 'to-string-loader', + options: { + sourceMap: true + } + }, + { + loader: 'css-loader', + options: { + sourceMap: true + } + }, + { + loader: 'postcss-loader', + options: { + sourceMap: true + } + } + ] + }, { + test: /\.scss$/, + exclude: /node_modules/, + use: [{ + loader: 'to-string-loader', + options: { + sourceMap: true + } + }, { + loader: 'raw-loader', + options: { + sourceMap: true + } + }, + { + loader: 'postcss-loader', + options: { + sourceMap: true + } + }, + { + loader: 'resolve-url-loader', + options: { + sourceMap: true + } + }, + { + loader: 'sass-loader', + options: { + sourceMap: true + } + } + ] + }, { + test: /\.html$/, + loader: 'raw-loader' + }, { + test: /\.json$/, + loader: 'json-loader' + }] + }, + plugins: [ + new CopyWebpackPlugin([{ + from: join(__dirname, '..', 'node_modules', 'font-awesome', 'fonts'), + to: join('assets', 'fonts') + }, { + from: join(__dirname, '..', 'resources', 'images'), + to: join('assets', 'images') + }, { + from: join(__dirname, '..', 'resources', 'data'), + to: join('assets', 'data') + }, { + from: join(__dirname, '..', 'resources', 'i18n'), + to: join('assets', 'i18n') + }]) + ] + +}; diff --git a/webpack/webpack.prod.js b/webpack/webpack.prod.js new file mode 100644 index 00000000000..434296ff093 --- /dev/null +++ b/webpack/webpack.prod.js @@ -0,0 +1,60 @@ +const webpack = require('webpack'); +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; +const CompressionPlugin = require("compression-webpack-plugin"); + +const { + root +} = require('./helpers'); + +module.exports = { + recordsOutputPath: root('webpack.records.json'), + plugins: [ + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production'), + 'process.env.AOT': true + }), + + // Loader options + new webpack.LoaderOptionsPlugin({ + minimize: true, + debug: false + }), + + new BundleAnalyzerPlugin({ + analyzerMode: 'disabled', // change it to `server` to view bundle stats + reportFilename: 'report.html', + generateStatsFile: true, + statsFilename: 'stats.json', + }), + + new webpack.optimize.UglifyJsPlugin({ + beautify: false, + mangle: false, + output: { + comments: false + }, + compress: { + warnings: false, + conditionals: false, + unused: true, + comparisons: true, + sequences: true, + dead_code: true, + evaluate: true, + if_return: true, + join_vars: true, + negate_iife: true + }, + sourceMap: true + }), + + new CompressionPlugin({ + asset: "[path].gz[query]", + algorithm: "gzip", + test: /\.js$|\.css$|\.html$/, + threshold: 10240, + minRatio: 0.8 + }) + + ] +}; diff --git a/webpack/webpack.server.js b/webpack/webpack.server.js new file mode 100644 index 00000000000..0671278dd07 --- /dev/null +++ b/webpack/webpack.server.js @@ -0,0 +1,11 @@ +const { + root +} = require('./helpers'); + +module.exports = { + entry: root('./src/main.server.ts'), + output: { + filename: 'server.js' + }, + target: 'node' +}; diff --git a/webpack.test.config.js b/webpack/webpack.test.js similarity index 69% rename from webpack.test.config.js rename to webpack/webpack.test.js index cd288ce894c..a12b0f8946b 100644 --- a/webpack.test.config.js +++ b/webpack/webpack.test.js @@ -1,10 +1,9 @@ -/** - * @author: @AngularClass - */ - -const helpers = require('./helpers'); const path = require('path'); +const { + root +} = require('./helpers'); + /** * Webpack Plugins */ @@ -46,12 +45,12 @@ module.exports = function (options) { * * See: http://webpack.github.io/docs/configuration.html#resolve-extensions */ - extensions: ['.ts', '.js'], + extensions: ['.ts', '.js', '.json'], /** * Make sure root is src */ - modules: [ path.resolve(__dirname, 'src'), 'node_modules' ] + modules: [path.resolve(__dirname, 'src'), 'node_modules'] }, @@ -79,8 +78,8 @@ module.exports = function (options) { loader: 'source-map-loader', exclude: [ // these packages have problems with their sourcemaps - helpers.root('node_modules/rxjs'), - helpers.root('node_modules/@angular') + root('node_modules/rxjs'), + root('node_modules/@angular') ] }, @@ -91,19 +90,10 @@ module.exports = function (options) { */ { test: /\.ts$/, - loaders: [ - { + loaders: [{ loader: 'awesome-typescript-loader', - query: { - // use inline sourcemaps for "karma-remap-coverage" reporter - sourceMap: false, - inlineSourceMap: true, - sourceRoot: false, - compilerOptions: { - // Remove TypeScript helpers to be injected - // below by DefinePlugin - removeComments: true - } + options: { + configFileName: './src/tsconfig.test.json' } }, 'angular2-template-loader' @@ -112,26 +102,73 @@ module.exports = function (options) { }, /** - * Json loader support for *.json files. + * CSS loader support for *.css files + * Returns file content as string * - * See: https://github.com/webpack/json-loader + * See: https://github.com/webpack/css-loader */ { - test: /\.json$/, - loader: 'json-loader', - exclude: [helpers.root('src/index.html')] + test: /\.css$/, + use: [{ + loader: 'to-string-loader', + options: { + sourceMap: 'inline' + } + }, + { + loader: 'css-loader', + options: { + sourceMap: 'inline' + } + }, + { + loader: 'postcss-loader', + options: { + sourceMap: 'inline' + } + } + ], + exclude: [root('src/index.html')] }, /** - * Raw loader support for *.css files + * SASS loader support for *.css files * Returns file content as string * - * See: https://github.com/webpack/raw-loader */ { - test: /\.css$/, - loader: ['to-string-loader', 'css-loader'], - exclude: [helpers.root('src/index.html')] + test: /\.scss$/, + use: [{ + loader: 'to-string-loader', + options: { + sourceMap: 'inline' + } + }, { + loader: 'raw-loader', + options: { + sourceMap: 'inline' + } + }, + { + loader: 'postcss-loader', + options: { + sourceMap: 'inline' + } + }, + { + loader: 'resolve-url-loader', + options: { + sourceMap: 'inline' + } + }, + { + loader: 'sass-loader', + options: { + sourceMap: 'inline' + } + } + ], + exclude: [root('src/index.html')] }, /** @@ -143,7 +180,18 @@ module.exports = function (options) { { test: /\.html$/, loader: 'raw-loader', - exclude: [helpers.root('src/index.html')] + exclude: [root('src/index.html')] + }, + + /** + * Json loader support for *.json files. + * + * See: https://github.com/webpack/json-loader + */ + { + test: /\.json$/, + loader: 'json-loader', + exclude: [root('src/index.html')] }, /** @@ -156,7 +204,10 @@ module.exports = function (options) { enforce: 'post', test: /\.(js|ts)$/, loader: 'istanbul-instrumenter-loader', - include: helpers.root('src'), + query: { + esModules: true + }, + include: root('src'), exclude: [ /\.(e2e|spec)\.ts$/, /node_modules/ @@ -202,20 +253,20 @@ module.exports = function (options) { */ new ContextReplacementPlugin( // The (\\|\/) piece accounts for path separators in *nix and Windows - /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/, - helpers.root('src'), // location of your src + /angular(\\|\/)core(\\|\/)@angular/, + root('src'), // location of your src { // your Angular Async Route paths relative to this root directory } ), - /** + /** * Plugin LoaderOptionsPlugin (experimental) * * See: https://gist.github.com/sokra/27b24881210b56bbaff7 */ new LoaderOptionsPlugin({ - debug: true, + debug: false, options: { } @@ -223,6 +274,15 @@ module.exports = function (options) { ], + /** + * Disable performance hints + * + * See: https://github.com/a-tarasyuk/rr-boilerplate/blob/master/webpack/dev.config.babel.js#L41 + */ + performance: { + hints: false + }, + /** * Include polyfills or mocks for various node stuff * Description: Node configuration diff --git a/yarn.lock b/yarn.lock index c1e67e85720..4d6f6ead3f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,76 +2,81 @@ # yarn lockfile v1 -"@angular-cli/ast-tools@^1.0.0": - version "1.0.16" - resolved "https://registry.yarnpkg.com/@angular-cli/ast-tools/-/ast-tools-1.0.16.tgz#6319942c1a25fb84e3294203e9f7a326632fce50" +"@angular/animations@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-4.2.6.tgz#9d9c80a119b0c03693cbd23bbaf728b1531fffc7" dependencies: - "@angular/tsc-wrapped" "^0.5.0" - denodeify "^1.2.1" - rxjs "^5.0.1" - typescript "~2.0.3" + tslib "^1.7.1" -"@angular/common@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-2.2.3.tgz#0d26bdfdea362ed32e436ced4f31bb69a9d7b9e4" +"@angular/common@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.2.6.tgz#210ace4bd24e375f8b41ba52feb34b18a887d5da" + dependencies: + tslib "^1.7.1" -"@angular/compiler-cli@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-2.2.3.tgz#d632bbf856802a20fc5589cb472f98fef5f011c4" +"@angular/compiler-cli@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.2.6.tgz#8a21352299f3ebd1e3f17581054164566ca306be" dependencies: - "@angular/tsc-wrapped" "^0.3.0" + "@angular/tsc-wrapped" "4.2.6" minimist "^1.2.0" reflect-metadata "^0.1.2" -"@angular/compiler@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-2.2.3.tgz#5a96b8b6c620ffe0c3b87b2f254e588abeb77a12" - -"@angular/core@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-2.2.3.tgz#18b09740bf51bdeb906153704e771bce53fecdf6" - -"@angular/forms@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-2.2.3.tgz#361489605b5df4fa20f26e184a0b0d775b11fe1e" +"@angular/compiler@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.2.6.tgz#667756d495ca0d45d2061268a10d52af839faff4" + dependencies: + tslib "^1.7.1" -"@angular/http@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/http/-/http-2.2.3.tgz#84941d638c961ebae248091d6d51ac6f241be882" +"@angular/core@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.2.6.tgz#0c1c8ff0157f076f4a7c0b721ca1423f1bbe164e" + dependencies: + tslib "^1.7.1" -"@angular/platform-browser-dynamic@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-2.2.3.tgz#80f68c13c0b51bac890beed05548bc7597b9ff6d" +"@angular/forms@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-4.2.6.tgz#9d32399608e4603bbf197417aa5b94e80a467eb0" + dependencies: + tslib "^1.7.1" -"@angular/platform-browser@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-2.2.3.tgz#f48d2452a6dfebc0d41274f0e3a02ba89c01b2b6" +"@angular/http@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.2.6.tgz#499e2ba0bbc1f3d71b76debec034c958caf1134e" + dependencies: + tslib "^1.7.1" -"@angular/platform-server@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-2.2.3.tgz#9959f65c14194faac82052edae226fd7ea75be76" +"@angular/platform-browser-dynamic@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.2.6.tgz#4e6c8ad2cd5cfc17880417f77f2a3413cf791c26" dependencies: - parse5 "^2.2.1" + tslib "^1.7.1" -"@angular/router@3.2.3": - version "3.2.3" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-3.2.3.tgz#07cd0e978abc53abb71be9d17353d7ff93f05083" +"@angular/platform-browser@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.2.6.tgz#a131ff592225fe6496bca2c9aff612a4dbddf437" + dependencies: + tslib "^1.7.1" -"@angular/tsc-wrapped@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-0.3.0.tgz#98cdeb5c38d145b187c0ad0397a8d98b217f33f2" +"@angular/platform-server@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-4.2.6.tgz#66e03fd855486fe058e23d3786061d91462998db" dependencies: - tsickle "^0.1.7" + parse5 "^3.0.1" + tslib "^1.7.1" + xhr2 "^0.1.4" -"@angular/tsc-wrapped@^0.5.0": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-0.5.2.tgz#2eddf472c467fcb334ea94deddaaa71990c5a482" +"@angular/router@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-4.2.6.tgz#a6919d9b61c45ffc15fbee593398e3fd532dab46" dependencies: - tsickle "^0.2" + tslib "^1.7.1" -"@angular/upgrade@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-2.2.3.tgz#fb3137886b9349e6245bec4428bd6f9addf7994f" +"@angular/tsc-wrapped@4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.2.6.tgz#60e44b5b38f3340ee14c54a58a7a07133c64e898" + dependencies: + tsickle "^0.21.0" "@angularclass/bootloader@1.0.1": version "1.0.1" @@ -81,57 +86,50 @@ version "1.0.4" resolved "https://registry.yarnpkg.com/@angularclass/idle-preload/-/idle-preload-1.0.4.tgz#41eeea532cc4998167c825f6dca62cb98f4b7028" -"@ng-bootstrap/ng-bootstrap@1.0.0-alpha.18": - version "1.0.0-alpha.18" - resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-1.0.0-alpha.18.tgz#e2be574f75dfafab27fe32769bfbc0a923736f1d" +"@ng-bootstrap/ng-bootstrap@1.0.0-alpha.28": + version "1.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-1.0.0-alpha.28.tgz#30a6503bf7f94f9d3187591fb3267b59cc0cdaad" -"@ngrx/core@^1.2.0": +"@ngrx/core@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ngrx/core/-/core-1.2.0.tgz#882b46abafa2e0e6d887cb71a1b2c2fa3e6d0dc6" -"@ngrx/effects@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-2.0.2.tgz#8255e29cc0276f108784c90481e3b96e6713154b" +"@ngrx/effects@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-2.0.4.tgz#418eee5e1032fa66de5bbf1855653bb1951f12a4" -"@ngrx/router-store@^1.2.5": +"@ngrx/router-store@1.2.6": version "1.2.6" resolved "https://registry.yarnpkg.com/@ngrx/router-store/-/router-store-1.2.6.tgz#a2eb0ca515e9b367781f1030250dd64bb73c086b" -"@ngrx/store-devtools@^3.2.2": +"@ngrx/store-devtools@3.2.4": version "3.2.4" resolved "https://registry.yarnpkg.com/@ngrx/store-devtools/-/store-devtools-3.2.4.tgz#2ce4d13bf34848a9e51ec87e3b125ed67b51e550" -"@ngrx/store@^2.2.1": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-2.2.2.tgz#a00305a6452032a3385886a11ce529dce2dae65b" +"@ngrx/store@2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-2.2.3.tgz#e7bd1149f1c44208f1cc4744353f0f98a0f1f57b" -"@ngtools/webpack@1.1.9": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.1.9.tgz#ec40fb5e0082d517ae332b76de3fb46341fb8c7f" +"@ngtools/webpack@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.5.0.tgz#b6be58d857d41f8999751d6bbc3d21e84bc977ca" dependencies: - "@angular-cli/ast-tools" "^1.0.0" - magic-string "^0.16.0" + enhanced-resolve "^3.1.0" + loader-utils "^1.0.2" + magic-string "^0.19.0" source-map "^0.5.6" -"@ngx-translate/core@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-6.0.1.tgz#7c7a80077feb994fc815b67a72065af04d394efe" - -"@ngx-translate/http-loader@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@ngx-translate/http-loader/-/http-loader-0.0.3.tgz#8346c8d2d6f630254601029668f17abe2afe8a9b" +"@nguniversal/express-engine@1.0.0-beta.2": + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/@nguniversal/express-engine/-/express-engine-1.0.0-beta.2.tgz#868f32ef7fbb1a168063f2b312fff8f7bfb60ed0" -"@types/body-parser@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-0.0.33.tgz#33ca1498fc37e51c5df0c81cae34569e7041e025" - dependencies: - "@types/express" "*" +"@ngx-translate/core@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-7.0.0.tgz#5b6f63bd4042164d44cd85f68703af96e9392e7d" -"@types/compression@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/compression/-/compression-0.0.33.tgz#95dc733a2339aa846381d7f1377792d2553dc27d" - dependencies: - "@types/express" "*" +"@ngx-translate/http-loader@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ngx-translate/http-loader/-/http-loader-0.1.0.tgz#6029325561d7868fe325a419de2770e98ff1502e" "@types/cookie-parser@1.3.30": version "1.3.30" @@ -139,32 +137,32 @@ dependencies: "@types/express" "*" -"@types/deep-freeze@0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/deep-freeze/-/deep-freeze-0.0.29.tgz#c2d4c0bb10fb247a2b2c9da1970bb0902859190a" +"@types/deep-freeze@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@types/deep-freeze/-/deep-freeze-0.1.1.tgz#0e1ee6ceee06f51baeb663deec0bb7780bd72827" -"@types/express-serve-static-core@*", "@types/express-serve-static-core@4.0.39": - version "4.0.39" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.39.tgz#45157f96480d46f254648f45b2c6d70bd9fc9f54" +"@types/express-serve-static-core@*", "@types/express-serve-static-core@4.0.49": + version "4.0.49" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.49.tgz#3438d68d26e39db934ba941f18e3862a1beeb722" dependencies: "@types/node" "*" -"@types/express@*", "@types/express@4.0.34": - version "4.0.34" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.34.tgz#cdc0afd69d70d2295b81b3aa47f26f672afcde1c" +"@types/express@*", "@types/express@4.0.36": + version "4.0.36" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.36.tgz#14eb47de7ecb10319f0a2fb1cf971aa8680758c2" dependencies: "@types/express-serve-static-core" "*" "@types/serve-static" "*" -"@types/fs-extra@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-0.0.33.tgz#a8719c417b080c012d3497b28e228ac09745fdf2" +"@types/fs-extra@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-3.0.3.tgz#1d66eb670ebf657e57c0fda014df340c19d8aa0c" dependencies: "@types/node" "*" -"@types/hammerjs@2.0.33": - version "2.0.33" - resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.33.tgz#45f57352474181425bb4b65f7313a60426d54bab" +"@types/hammerjs@2.0.34": + version "2.0.34" + resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.34.tgz#9cbac4f41cb039436141785e1be50b3ab10a04a9" "@types/handlebars@^4.0.31": version "4.0.32" @@ -174,13 +172,9 @@ version "9.1.9" resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.1.9.tgz#ed6336955eaf233b75eb7923b9b1f373d045ef01" -"@types/jasmine@2.5.41", "@types/jasmine@^2.5.36": - version "2.5.41" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.41.tgz#d5e86161a0af80d52062b310a33ed65b051a0713" - -"@types/jsonschema@0.0.5": - version "0.0.5" - resolved "https://registry.yarnpkg.com/@types/jsonschema/-/jsonschema-0.0.5.tgz#70ca97b9d00caaa56d6cd9b181e6b916aa360b58" +"@types/jasmine@2.5.53": + version "2.5.53" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.53.tgz#4e0cefad09df5ec48c8dd40433512f84b1568d61" "@types/lodash@^4.14.37", "@types/lodash@ts2.0": version "4.14.50" @@ -194,21 +188,19 @@ version "0.0.29" resolved "https://registry.yarnpkg.com/@types/memory-cache/-/memory-cache-0.0.29.tgz#ae3f2e02d9c5595229155f924985e09d233988f9" -"@types/mime@*", "@types/mime@0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b" +"@types/mime@*", "@types/mime@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.1.tgz#2cf42972d0931c1060c7d5fa6627fce6bd876f2f" "@types/minimatch@^2.0.29": version "2.0.29" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-2.0.29.tgz#5002e14f75e2d71e564281df0431c8c1b4a2a36a" -"@types/morgan@1.7.32": - version "1.7.32" - resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.7.32.tgz#fab1ece4dae172e1a377d563d33e3634fa04927d" - dependencies: - "@types/express" "*" +"@types/node@*", "@types/node@8.0.10": + version "8.0.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.10.tgz#12efec9183b072d5f951cf86395a4c780f868a17" -"@types/node@*", "@types/node@6.0.52", "@types/node@^6.0.46": +"@types/node@^6.0.46": version "6.0.52" resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.52.tgz#1ac3a99b42320f9e463482f25af4c2359473aaa6" @@ -216,9 +208,9 @@ version "0.0.32" resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" -"@types/selenium-webdriver@2.53.37": - version "2.53.37" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-2.53.37.tgz#34f743c20e53ae7100ede90870fde554df2447f8" +"@types/selenium-webdriver@^2.53.35", "@types/selenium-webdriver@~2.53.39": + version "2.53.42" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz#74cb77fb6052edaff2a8984ddafd88d419f25cac" "@types/serve-static@*", "@types/serve-static@1.7.31": version "1.7.31" @@ -227,15 +219,19 @@ "@types/express-serve-static-core" "*" "@types/mime" "*" -"@types/shelljs@^0.3.32": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.3.33.tgz#df613bddb88225ed09ce5c835f620dcaaf155e6b" +"@types/shelljs@^0.7.0": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.7.2.tgz#c2bdb3fe80cd7a3da08750ca898ae44c589671f3" dependencies: "@types/node" "*" -"@types/webfontloader@1.6.27": - version "1.6.27" - resolved "https://registry.yarnpkg.com/@types/webfontloader/-/webfontloader-1.6.27.tgz#4416d9684646ed94d55a244380deaba46dde810f" +"@types/source-map@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@types/source-map/-/source-map-0.5.0.tgz#dd34bbd8e32fe4e74f2e3d8ac07f8aa5b45a47ac" + +"@types/webfontloader@1.6.28": + version "1.6.28" + resolved "https://registry.yarnpkg.com/@types/webfontloader/-/webfontloader-1.6.28.tgz#48471eafa6ba3da26aeaf79be61c272058a13d27" abbrev@1, abbrev@1.0.x: version "1.0.9" @@ -248,15 +244,37 @@ accepts@1.3.3, accepts@~1.3.3: mime-types "~2.1.11" negotiator "0.6.1" +acorn-dynamic-import@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + dependencies: + acorn "^4.0.3" + acorn@^4.0.1, acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" +acorn@^5.0.0, acorn@^5.0.3: + version "5.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" + +adjust-sourcemap-loader@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.1.0.tgz#412d92404eb61e4113635012cba53a33d008e0e2" + dependencies: + assert "^1.3.0" + camelcase "^1.2.1" + loader-utils "^1.0.2" + lodash.assign "^4.0.1" + lodash.defaults "^3.1.2" + object-path "^0.9.2" + regex-parser "^2.2.1" + adm-zip@0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736" -adm-zip@0.4.7, adm-zip@^0.4.7: +adm-zip@^0.4.7: version "0.4.7" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" @@ -271,15 +289,21 @@ agent-base@2: extend "~3.0.0" semver "~5.0.1" -ajv-keywords@1.1.1, ajv-keywords@^1.1.1: +ajv-keywords@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" + +ajv-keywords@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" -ajv@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.2.0.tgz#5605296096b376f7f8f64e25234d163dbd634d17" +ajv@5.2.2, ajv@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" dependencies: co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" json-stable-stringify "^1.0.1" ajv@^4.7.0, ajv@^4.9.1: @@ -301,67 +325,41 @@ alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" -amdefine@1.0.0, amdefine@>=0.0.4: +amdefine@>=0.0.4, amdefine@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" -angular2-express-engine@2.1.0-rc.1: - version "2.1.0-rc.1" - resolved "https://registry.yarnpkg.com/angular2-express-engine/-/angular2-express-engine-2.1.0-rc.1.tgz#79c8e481cde7ff1253b373cbf98de7c9fab4f215" - dependencies: - graceful-fs "^4.1.4" - -angular2-platform-node@2.1.0-rc.1, angular2-platform-node@~2.1.0-rc.1: - version "2.1.0-rc.1" - resolved "https://registry.yarnpkg.com/angular2-platform-node/-/angular2-platform-node-2.1.0-rc.1.tgz#ab92d093951ffeede4f1570aec8de1a454b91645" - dependencies: - css "^2.2.1" - parse5 "^2.2.1" - preboot "4.5.2" - -angular2-template-loader@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/angular2-template-loader/-/angular2-template-loader-0.6.0.tgz#8a7fae4cf5a2494968da512aa43152a82a0c99b6" +angular2-template-loader@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/angular2-template-loader/-/angular2-template-loader-0.6.2.tgz#c0d44e90fff0fac95e8b23f043acda7fd1c51d7c" dependencies: loader-utils "^0.2.15" -angular2-universal-polyfills@2.1.0-rc.1: - version "2.1.0-rc.1" - resolved "https://registry.yarnpkg.com/angular2-universal-polyfills/-/angular2-universal-polyfills-2.1.0-rc.1.tgz#d14a2bdec567cd94baba6161c7c5e7d5edc1210e" - dependencies: - es6-promise "~3.0.2" - es6-shim "~0.35.0" - ie-shim "^0.1.0" - reflect-metadata "0.1.2" - -angular2-universal@2.1.0-rc.1: - version "2.1.0-rc.1" - resolved "https://registry.yarnpkg.com/angular2-universal/-/angular2-universal-2.1.0-rc.1.tgz#8cd5f5288014b15d86eb18829c2f6ef3f841c80b" - dependencies: - angular2-platform-node "~2.1.0-rc.1" - css "^2.2.1" - js-beautify "^1.6.4" - parse5 "^2.2.1" - preboot "4.5.2" - xhr2 "^0.1.3" - -ansi-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" - dependencies: - string-width "^1.0.1" +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -any-promise@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" +ansi-styles@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.1.0.tgz#09c202d5c917ec23188caa5c9cb9179cd9547750" + dependencies: + color-convert "^1.0.0" + +any-promise@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-0.1.0.tgz#830b680aa7e56f33451d4b049f3bd8044498ee27" anymatch@^1.3.0: version "1.3.0" @@ -422,10 +420,18 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" -arr-flatten@^1.0.1: +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" @@ -442,6 +448,10 @@ array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" @@ -468,6 +478,10 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" @@ -496,7 +510,7 @@ assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -assert@^1.1.1: +assert@^1.1.1, assert@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" dependencies: @@ -510,9 +524,9 @@ async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" -async@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7" +async@0.2.x: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" async@1.x, async@^1.4.0, async@^1.5.2: version "1.5.2" @@ -528,45 +542,58 @@ async@^0.9.0, async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" -async@^2.0.0, async@^2.1.2: +async@^2.0.0, async@^2.1.2, async@^2.1.5: version "2.4.1" resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" dependencies: lodash "^4.14.0" -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + atob@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" -autoprefixer@6.5.4, autoprefixer@^6.3.1: - version "6.5.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.5.4.tgz#1386eb6708ccff36aefff70adc694ecfd60af1b0" +autoprefixer@7.1.2, autoprefixer@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.2.tgz#fbeaf07d48fd878e0682bf7cbeeade728adb2b18" dependencies: - browserslist "~1.4.0" - caniuse-db "^1.0.30000597" + browserslist "^2.1.5" + caniuse-lite "^1.0.30000697" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^5.2.6" + postcss "^6.0.6" postcss-value-parser "^3.2.3" -awesome-typescript-loader@2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/awesome-typescript-loader/-/awesome-typescript-loader-2.2.4.tgz#4185d60c035c25515f9c2a747fa5f69b2a001e9e" +autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + +awesome-typescript-loader@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/awesome-typescript-loader/-/awesome-typescript-loader-3.2.1.tgz#600f5d552da3e5501e3e5c19aa3e8986059f8947" dependencies: colors "^1.1.2" - enhanced-resolve "^2.2.2" - loader-utils "^0.2.6" - lodash "^4.13.1" - object-assign "^4.1.0" - source-map-support "^0.4.0" + enhanced-resolve "^3.1.0" + loader-utils "^1.1.0" + lodash "^4.17.4" + micromatch "^3.0.3" + mkdirp "^0.5.1" + object-assign "^4.1.1" + source-map-support "^0.4.15" aws-sign2@~0.6.0: version "0.6.0" @@ -576,7 +603,7 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.11.0: +babel-code-frame@^6.11.0, babel-code-frame@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" dependencies: @@ -584,14 +611,85 @@ babel-code-frame@^6.11.0: esutils "^2.0.2" js-tokens "^3.0.0" +babel-generator@^6.18.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-runtime@^6.22.0, babel-runtime@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.16.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + lodash "^4.2.0" + +babel-traverse@^6.18.0, babel-traverse@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + babylon "^6.17.2" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.18.0, babel-types@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.17.2, babylon@^6.17.4: + version "6.17.4" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" + backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" +balanced-match@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.1.0.tgz#b504bd05869b39259dd0c5efc35d843176dccc4a" + balanced-match@^0.4.1, balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" @@ -604,9 +702,23 @@ base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" -basic-auth@~1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290" +base@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.1.tgz#b36a7f11113853a342a15691d98e2dcc8a6cc270" + dependencies: + arr-union "^3.1.0" + cache-base "^0.8.4" + class-utils "^0.3.4" + component-emitter "^1.2.1" + define-property "^0.2.5" + isobject "^2.1.0" + lazy-cache "^2.0.1" + mixin-deep "^1.1.3" + pascalcase "^0.1.1" + +basic-auth@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" batch@0.6.1: version "0.6.1" @@ -652,11 +764,17 @@ block-stream@*: dependencies: inherits "~2.0.0" +blocking-proxy@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b" + dependencies: + minimist "^1.2.0" + bluebird@^2.10.2: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" -bluebird@^3.0.5, bluebird@^3.3.0, bluebird@^3.4.7: +bluebird@^3.3.0, bluebird@^3.4.7: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" @@ -664,22 +782,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" -body-parser@1.15.2: - version "1.15.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.15.2.tgz#d7578cf4f1d11d5f6ea804cef35dc7a7ff6dae67" - dependencies: - bytes "2.4.0" - content-type "~1.0.2" - debug "~2.2.0" - depd "~1.1.0" - http-errors "~1.5.0" - iconv-lite "0.4.13" - on-finished "~2.3.0" - qs "6.2.0" - raw-body "~2.1.7" - type-is "~1.6.13" - -body-parser@^1.16.1: +body-parser@1.17.2, body-parser@^1.16.1: version "1.17.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" dependencies: @@ -694,6 +797,17 @@ body-parser@^1.16.1: raw-body "~2.2.0" type-is "~1.6.15" +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -711,21 +825,7 @@ bootstrap@4.0.0-alpha.6: jquery ">=1.9.1" tether "^1.4.0" -boxen@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6" - dependencies: - ansi-align "^1.1.0" - camelcase "^2.1.0" - chalk "^1.1.1" - cli-boxes "^1.0.0" - filled-array "^1.0.0" - object-assign "^4.0.1" - repeating "^2.0.0" - string-width "^1.0.1" - widest-line "^1.0.0" - -brace-expansion@^1.0.0, brace-expansion@^1.1.7: +brace-expansion@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" dependencies: @@ -746,6 +846,22 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.2.2.tgz#241f868c2b2690d9febeee5a7c83fbbf25d00b1b" + dependencies: + arr-flatten "^1.0.3" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.0" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^2.1.0" + to-regex "^3.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -807,18 +923,19 @@ browserify-zlib@^0.1.4: dependencies: pako "~0.2.0" -browserslist@^1.3.6, browserslist@^1.5.2: +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: version "1.7.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" dependencies: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -browserslist@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.4.0.tgz#9cfdcf5384d9158f5b70da2aa00b30e8ff019049" +browserslist@^2.0.0, browserslist@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.5.tgz#e882550df3d1cd6d481c1a3e0038f2baf13a4711" dependencies: - caniuse-db "^1.0.30000539" + caniuse-lite "^1.0.30000684" + electron-to-chromium "^1.3.14" buffer-crc32@^0.2.1: version "0.2.13" @@ -828,6 +945,10 @@ buffer-es6@^4.9.1: version "4.9.3" resolved "https://registry.yarnpkg.com/buffer-es6/-/buffer-es6-4.9.3.tgz#f26347b82df76fd37e18bcb5288c4970cfd5c404" +buffer-indexof@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.0.tgz#f54f647c4f4e25228baa656a2e57e43d5f270982" + buffer-shims@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -852,14 +973,29 @@ builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" -bytes@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" - bytes@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" +bytes@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" + +cache-base@^0.8.4: + version "0.8.5" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-0.8.5.tgz#60ceb3504021eceec7011fd3384b7f4e95729bfa" + dependencies: + collection-visit "^0.2.1" + component-emitter "^1.2.1" + get-value "^2.0.5" + has-value "^0.3.1" + isobject "^3.0.0" + lazy-cache "^2.0.1" + set-value "^0.4.2" + to-object-path "^0.3.0" + union-value "^0.2.3" + unset-value "^0.1.1" + callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" @@ -878,11 +1014,11 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: +camelcase@^1.0.2, camelcase@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -camelcase@^2.0.0, camelcase@^2.1.0: +camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -890,6 +1026,10 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" @@ -899,13 +1039,22 @@ caniuse-api@^1.5.2: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000539, caniuse-db@^1.0.30000597, caniuse-db@^1.0.30000639: - version "1.0.30000672" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000672.tgz#f40f4bf126cb7e063f6a2e1df1c955c803d12265" +caniuse-api@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-2.0.0.tgz#b1ddb5a5966b16f48dc4998444d4bbc6c7d9d834" + dependencies: + browserslist "^2.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" -capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000699" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000699.tgz#5af491ab1c777561a32b43fe253d6a7071ccf979" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000684, caniuse-lite@^1.0.30000697: + version "1.0.30000699" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000699.tgz#2a187b737edaa9ebedbbb56edcb53e994eceda0c" caseless@~0.11.0: version "0.11.0" @@ -922,7 +1071,7 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -cerialize@^0.1.13: +cerialize@0.1.15: version "0.1.15" resolved "https://registry.yarnpkg.com/cerialize/-/cerialize-0.1.15.tgz#5510b574b182a527069f43bb06ce34d61c446db1" dependencies: @@ -938,7 +1087,15 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chokidar@^1.4.1, chokidar@^1.4.3, chokidar@^1.5.1, chokidar@^1.6.0: +chalk@^2.0.0, chalk@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.0.1.tgz#dbec49436d2ae15f536114e76d14656cdbc0f44d" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chokidar@^1.4.1, chokidar@^1.4.3, chokidar@^1.6.0, chokidar@^1.6.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: @@ -960,20 +1117,36 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" clap@^1.0.9: - version "1.1.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.3.tgz#b3bd36e93dd4cbfb395a3c26896352445265c05b" + version "1.2.0" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.0.tgz#59c90fe3e137104746ff19469a27a634ff68c857" dependencies: chalk "^1.1.3" +class-utils@^0.3.4: + version "0.3.5" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.5.tgz#17e793103750f9627b2176ea34cfd1b565903c80" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + lazy-cache "^2.0.2" + static-extend "^0.1.1" + clean-css@4.1.x: - version "4.1.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce" + version "4.1.6" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.6.tgz#5a47beb526994cb4f7bf36188a55ed3b45528f0b" dependencies: source-map "0.5.x" -cli-boxes@^1.0.0: +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.0.0.tgz#ef987ed3d48391ac3dab9180b406a742180d6e6a" cliui@^2.1.0: version "2.1.0" @@ -991,6 +1164,15 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +clone-deep@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.1" + kind-of "^3.2.2" + shallow-clone "^0.1.2" + clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" @@ -1004,8 +1186,8 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" coa@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.2.tgz#2ba9fec3b4aa43d7a49d7e6c3561e92061b6bcec" + version "1.0.4" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" dependencies: q "^1.1.2" @@ -1013,17 +1195,26 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" -codelyzer@2.0.0-beta.3: - version "2.0.0-beta.3" - resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-2.0.0-beta.3.tgz#be17e73a4ccd659d6f2a863da1711b3f742762ed" +codelyzer@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-3.1.2.tgz#9ff1f041fb9b5ee5dbeb45ba866dfaf04983af04" dependencies: 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" sprintf-js "^1.0.3" -color-convert@^1.3.0: +collection-visit@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-0.2.3.tgz#2f62483caecc95f083b9a454a3ee9e6139ad7957" + dependencies: + lazy-cache "^2.0.1" + map-visit "^0.1.5" + object-visit "^0.3.4" + +color-convert@^1.0.0, color-convert@^1.3.0, color-convert@^1.8.2: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" dependencies: @@ -1039,6 +1230,13 @@ color-string@^0.3.0: dependencies: color-name "^1.0.0" +color-string@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.2.tgz#26e45814bc3c9a7cbd6751648a41434514a773a9" + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + color@^0.11.0: version "0.11.4" resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" @@ -1047,6 +1245,13 @@ color@^0.11.0: color-convert "^1.3.0" color-string "^0.3.0" +color@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/color/-/color-1.0.3.tgz#e48e832d85f14ef694fb468811c2d5cfe729b55d" + dependencies: + color-convert "^1.8.2" + color-string "^1.4.0" + colormin@^1.0.5: version "1.1.2" resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" @@ -1075,12 +1280,16 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.9.x, commander@^2.9.0, commander@~2.9.0: +commander@2.9.x, commander@^2.8.1, commander@^2.9.0, commander@~2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" +complex.js@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.0.4.tgz#d8e7cfb9652d1e853e723386421c1a0ca7a48373" + component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" @@ -1089,7 +1298,7 @@ component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" -component-emitter@1.2.1: +component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -1097,7 +1306,7 @@ component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" -compress-commons@^1.1.0: +compress-commons@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.0.tgz#58587092ef20d37cb58baf000112c9278ff73b9f" dependencies: @@ -1106,22 +1315,32 @@ compress-commons@^1.1.0: normalize-path "^2.0.0" readable-stream "^2.0.0" -compressible@~2.0.8: +compressible@~2.0.10: version "2.0.10" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd" dependencies: mime-db ">= 1.27.0 < 2" -compression@1.6.2, compression@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" +compression-webpack-plugin@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-0.4.0.tgz#811de04215f811ea6a12d4d8aed8457d758f13ac" + dependencies: + async "0.2.x" + webpack-sources "^0.1.0" + optionalDependencies: + node-zopfli "^2.0.0" + +compression@1.7.0, compression@^1.5.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.0.tgz#030c9f198f1643a057d776a738e922da4373012d" dependencies: accepts "~1.3.3" - bytes "2.3.0" - compressible "~2.0.8" - debug "~2.2.0" + bytes "2.5.0" + compressible "~2.0.10" + debug "2.6.8" on-headers "~1.0.1" - vary "~1.1.0" + safe-buffer "5.1.1" + vary "~1.1.1" concat-map@0.0.1: version "0.0.1" @@ -1135,13 +1354,6 @@ concat-stream@1.5.0: readable-stream "~2.0.0" typedarray "~0.0.5" -config-chain@~1.1.5: - version "1.1.11" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - configstore@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" @@ -1155,20 +1367,6 @@ configstore@^1.0.0: write-file-atomic "^1.1.2" xdg-basedir "^2.0.0" -configstore@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" - dependencies: - dot-prop "^3.0.0" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - object-assign "^4.0.1" - os-tmpdir "^1.0.0" - osenv "^0.1.0" - uuid "^2.0.1" - write-file-atomic "^1.1.2" - xdg-basedir "^2.0.0" - connect-history-api-fallback@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" @@ -1196,14 +1394,22 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" -content-disposition@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" content-type@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + +convert-source-map@^1.1.1, convert-source-map@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + cookie-parser@1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.3.tgz#0fe31fa19d000b95f4aadf1f53fdc2b8a203baa5" @@ -1219,6 +1425,10 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + copy-webpack-plugin@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz#9728e383b94316050d0c7463958f2b85c0aa8200" @@ -1232,7 +1442,7 @@ copy-webpack-plugin@4.0.1: minimatch "^3.0.0" node-dir "^0.1.10" -core-js@^2.2.0: +core-js@2.4.1, core-js@^2.2.0, core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" @@ -1244,6 +1454,18 @@ corser@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" +cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.1.3.tgz#952771eb0dddc1cb3fa2f6fbe51a522e93b3ee0a" + dependencies: + 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" + crc32-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" @@ -1251,7 +1473,7 @@ crc32-stream@^2.0.0: crc "^3.4.4" readable-stream "^2.0.0" -crc@^3.4.4: +crc@3.4.4, crc@^3.4.4: version "3.4.4" resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b" @@ -1262,12 +1484,6 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-error-class@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" @@ -1295,6 +1511,13 @@ cross-spawn@^3.0.0: lru-cache "^4.0.1" which "^1.2.9" +cross-spawn@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -1324,17 +1547,27 @@ crypto-browserify@^3.11.0: public-encrypt "^4.0.0" randombytes "^2.0.0" +css-color-function@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/css-color-function/-/css-color-function-1.3.0.tgz#72c767baf978f01b8a8a94f42f17ba5d22a776fc" + dependencies: + balanced-match "0.1.0" + color "^0.11.0" + debug "~0.7.4" + rgb "~0.1.0" + css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" -css-loader@^0.26.0: - version "0.26.4" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.26.4.tgz#b61e9e30db94303e6ffc892f10ecd09ad025a1fd" +css-loader@0.28.4: + version "0.28.4" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.4.tgz#6cf3579192ce355e8b38d5f42dd7a1f2ec898d0f" dependencies: 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" @@ -1343,6 +1576,7 @@ css-loader@^0.26.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 "^0.1.7" css-select@^1.1.0: @@ -1362,11 +1596,15 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" -css@^2.2.1: +css@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" dependencies: @@ -1456,17 +1694,17 @@ dateformat@^1.0.11, dateformat@^1.0.6: get-stdin "^4.0.1" meow "^3.3.0" -debug@0.7.4: +debug@0.7.4, debug@~0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" -debug@2, debug@2.6.8, debug@^2.6.8: +debug@2, debug@2.6.8, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: ms "2.0.0" -debug@2.2.0, debug@^2.2.0, debug@~2.2.0: +debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1488,6 +1726,14 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decimal.js@7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-7.2.3.tgz#6434c3b8a8c375780062fc633d0d2bbdb264cc78" + +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" @@ -1504,6 +1750,12 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" +defaults@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + define-properties@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" @@ -1511,6 +1763,18 @@ define-properties@^1.1.2: foreach "^2.0.5" object-keys "^1.0.8" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" @@ -1527,6 +1791,17 @@ del@^2.2.0: pinkie-promise "^2.0.0" rimraf "^2.2.8" +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1535,14 +1810,14 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -denodeify@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - depd@1.1.0, depd@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +dependency-graph@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.5.0.tgz#71edf7945dbba86c1b19ac982b6afb6476b56dd5" + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -1554,6 +1829,12 @@ destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + detect-node@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" @@ -1562,9 +1843,9 @@ di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" -diff@^3.0.1, diff@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" +diff@^3.1.0, diff@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.0.tgz#056695150d7aa93237ca7e378ac3b1682b7963b9" diffie-hellman@^5.0.0: version "5.0.2" @@ -1574,6 +1855,23 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.1.1.tgz#2369d45038af045f3898e6fa56862aed3f40296c" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + dom-converter@~0.1: version "0.1.4" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" @@ -1627,25 +1925,13 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - dependencies: - is-obj "^1.0.0" - duplexer2@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" dependencies: readable-stream "~1.1.9" -duplexer2@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - dependencies: - readable-stream "^2.0.2" - -duplexer@~0.1.1: +duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -1664,35 +1950,26 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" -ecstatic@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-1.4.1.tgz#32cb7b6fa2e290d58668674d115e8f0c3d567d6a" +ecstatic@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-2.2.1.tgz#b5087fad439dd9dd49d31e18131454817fe87769" dependencies: - he "^0.5.0" + he "^1.1.1" mime "^1.2.11" minimist "^1.1.0" - url-join "^1.0.0" - -editorconfig@^0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.2.tgz#8e57926d9ee69ab6cb999f027c2171467acceb35" - dependencies: - bluebird "^3.0.5" - commander "^2.9.0" - lru-cache "^3.2.0" - sigmund "^1.0.1" + url-join "^2.0.2" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -ejs@^2.5.2: +ejs@^2.5.6: version "2.5.6" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.6.tgz#479636bfa3fe3b1debd52087f0acb204b4f19c88" -electron-to-chromium@^1.2.7: - version "1.3.12" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.12.tgz#62f33e4a59b4855f0de4bb8972bf1b841b98b6d2" +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.14: + version "1.3.15" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369" elliptic@^6.0.0: version "6.4.0" @@ -1714,18 +1991,12 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" -end-of-stream@1.0.0: +end-of-stream@1.0.0, end-of-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" dependencies: once "~1.3.0" -end-of-stream@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" - dependencies: - once "^1.4.0" - engine.io-client@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" @@ -1765,14 +2036,14 @@ engine.io@1.8.3: engine.io-parser "1.3.2" ws "1.1.2" -enhanced-resolve@^2.2.0, enhanced-resolve@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-2.3.0.tgz#a115c32504b6302e85a76269d7a57ccdd962e359" +enhanced-resolve@^3.0.0, enhanced-resolve@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz#950964ecc7f0332a42321b673b38dc8ff15535b3" dependencies: graceful-fs "^4.1.2" - memory-fs "^0.3.0" + memory-fs "^0.4.0" object-assign "^4.0.1" - tapable "^0.2.3" + tapable "^0.2.5" ent@~2.2.0: version "2.2.0" @@ -1811,7 +2082,7 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" -es6-promise@^3.0.2, es6-promise@~3.0.2: +es6-promise@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" @@ -1819,15 +2090,11 @@ es6-promise@~4.0.3: version "4.0.5" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" -es6-shim@~0.35.0: - version "0.35.3" - resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.3.tgz#9bfb7363feffff87a6cdb6cd93e405ec3c4b6f26" - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@^1.0.2: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1846,10 +2113,6 @@ esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" @@ -1866,9 +2129,9 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" event-stream@~3.3.0: version "3.3.4" @@ -1890,7 +2153,7 @@ events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" -eventsource@~0.1.6: +eventsource@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" dependencies: @@ -1902,6 +2165,18 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" +execa@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36" + dependencies: + cross-spawn "^4.0.0" + get-stream "^2.2.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -1920,6 +2195,18 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.0.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + 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" + expand-range@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" @@ -1933,36 +2220,65 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -express@4.14.0, express@^4.13.3, express@^4.14.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66" +exports-loader@0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886" + dependencies: + loader-utils "^1.0.2" + source-map "0.5.x" + +express-session@1.15.3: + version "1.15.3" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.15.3.tgz#db545f0435a7b1b228ae02da8197f65141735c67" + dependencies: + cookie "0.3.1" + cookie-signature "1.0.6" + crc "3.4.4" + debug "2.6.7" + depd "~1.1.0" + on-headers "~1.0.1" + parseurl "~1.3.1" + uid-safe "~2.1.4" + utils-merge "1.0.0" + +express@4.15.3, express@^4.13.3, express@^4.15.2: + version "4.15.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" dependencies: accepts "~1.3.3" array-flatten "1.1.1" - content-disposition "0.5.1" + content-disposition "0.5.2" content-type "~1.0.2" cookie "0.3.1" cookie-signature "1.0.6" - debug "~2.2.0" + debug "2.6.7" depd "~1.1.0" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.7.0" - finalhandler "0.5.0" - fresh "0.3.0" + etag "~1.8.0" + finalhandler "~1.0.3" + fresh "0.5.0" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" parseurl "~1.3.1" path-to-regexp "0.1.7" - proxy-addr "~1.1.2" - qs "6.2.0" + proxy-addr "~1.1.4" + qs "6.4.0" range-parser "~1.2.0" - send "0.14.1" - serve-static "~1.11.1" - type-is "~1.6.13" + send "0.15.3" + serve-static "1.12.3" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" utils-merge "1.0.0" - vary "~1.1.0" + vary "~1.1.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" extend@3, extend@^3.0.0, extend@~3.0.0: version "3.0.1" @@ -1974,6 +2290,19 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extglob@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-1.1.0.tgz#0678b4e2ce45c0e4e50f5e5eafb1b0dab5b4e424" + dependencies: + array-unique "^0.3.2" + define-property "^0.2.5" + expand-brackets "^2.0.1" + extend-shallow "^2.0.1" + fragment-cache "^0.2.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^2.1.0" + extract-zip@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4" @@ -1994,6 +2323,10 @@ fancy-log@^1.1.0: chalk "^1.1.1" time-stamp "^1.0.0" +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -2024,14 +2357,7 @@ filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" -fileset@0.2.x: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" - dependencies: - glob "5.x" - minimatch "2.x" - -filesize@^3.3.0: +filesize@^3.5.9: version "3.5.10" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f" @@ -2045,21 +2371,16 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" -filled-array@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" - -finalhandler@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" dependencies: - debug "~2.2.0" - escape-html "~1.0.3" - on-finished "~2.3.0" - statuses "~1.3.0" - unpipe "~1.0.0" + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" -finalhandler@1.0.3: +finalhandler@1.0.3, finalhandler@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" dependencies: @@ -2078,6 +2399,12 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + findup-sync@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" @@ -2092,7 +2419,11 @@ font-awesome@4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" -for-in@^1.0.1: +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2102,6 +2433,12 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" @@ -2122,9 +2459,19 @@ forwarded@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" -fresh@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" +fraction.js@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.0.2.tgz#0eae896626f334b1bde763371347a83b5575d7f0" + +fragment-cache@^0.2.0, fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" from@~0: version "0.1.7" @@ -2154,12 +2501,13 @@ fs-extra@^0.26.4: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" +fs-extra@^3.0.0, fs-extra@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" dependencies: graceful-fs "^4.1.2" - jsonfile "^2.1.0" + jsonfile "^3.0.0" + universalify "^0.1.0" fs-extra@~1.0.0: version "1.0.0" @@ -2201,10 +2549,6 @@ function-bind@^1.0.2, function-bind@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" -gather-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gather-stream/-/gather-stream-1.0.0.tgz#b33994af457a8115700d410f317733cbe7a0904b" - gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2242,6 +2586,21 @@ get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +get-value@^2.0.3, get-value@^2.0.5, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -2261,7 +2620,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@5.x, glob@^5.0.15, glob@~5.0.0: +glob@^5.0.15, glob@~5.0.0: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: @@ -2271,14 +2630,7 @@ glob@5.x, glob@^5.0.15, glob@~5.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^3.2.11: - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - dependencies: - inherits "2" - minimatch "0.3" - -glob@^6.0.1, glob@^6.0.4: +glob@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" dependencies: @@ -2288,7 +2640,7 @@ glob@^6.0.1, glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -2299,23 +2651,26 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -globby@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" +globals@^9.0.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" dependencies: array-union "^1.0.1" arrify "^1.0.0" - glob "^6.0.1" + glob "^7.0.3" object-assign "^4.0.1" pify "^2.0.0" pinkie-promise "^2.0.0" -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" dependencies: array-union "^1.0.1" - arrify "^1.0.0" glob "^7.0.3" object-assign "^4.0.1" pify "^2.0.0" @@ -2335,6 +2690,12 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" +gonzales-pe@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.0.3.tgz#36148e18e267184fbfdc929af28f29ad9fbf9746" + dependencies: + minimist "1.1.x" + got@^3.2.0: version "3.3.1" resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" @@ -2350,27 +2711,7 @@ got@^3.2.0: read-all-stream "^3.0.0" timed-out "^2.0.0" -got@^5.0.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" - dependencies: - create-error-class "^3.0.1" - duplexer2 "^0.1.4" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - node-status-codes "^1.0.0" - object-assign "^4.0.1" - parse-json "^2.1.0" - pinkie-promise "^2.0.0" - read-all-stream "^3.0.0" - readable-stream "^2.0.5" - timed-out "^3.0.0" - unzip-response "^1.0.2" - url-parse-lax "^1.0.0" - -graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -2407,13 +2748,19 @@ gulplog@^1.0.0: dependencies: glogg "^1.0.0" +gzip-size@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + dependencies: + duplexer "^0.1.1" + handle-thing@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" -handlebars@4.0.5, handlebars@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.5.tgz#92c6ed6bb164110c50d4d8d0fbddc70806c6f8e7" +handlebars@^4.0.1, handlebars@^4.0.6: + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" dependencies: async "^1.4.0" optimist "^0.6.1" @@ -2461,6 +2808,10 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + has-gulplog@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" @@ -2471,6 +2822,18 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + has@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" @@ -2505,14 +2868,10 @@ hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" -he@1.1.x: +he@1.1.x, he@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" -he@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" - highlight.js@^9.0.0: version "9.11.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.11.0.tgz#47f98c7399918700db2caf230ded12cec41a84ae" @@ -2546,6 +2905,10 @@ html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + html-minifier@^3.2.3: version "3.5.2" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.2.tgz#d73bc3ff448942408818ce609bf3fb0ea7ef4eb7" @@ -2559,9 +2922,9 @@ html-minifier@^3.2.3: relateurl "0.2.x" uglify-js "3.0.x" -html-webpack-plugin@^2.21.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.28.0.tgz#2e7863b57e5fd48fe263303e2ffc934c3064d009" +html-webpack-plugin@2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz#e987f421853d3b6938c8c4c8171842e5fd17af23" dependencies: bluebird "^3.4.7" html-minifier "^3.2.3" @@ -2583,14 +2946,6 @@ http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" -http-errors@~1.5.0, http-errors@~1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" - dependencies: - inherits "2.0.3" - setprototypeof "1.0.2" - statuses ">= 1.3.1 < 2" - http-errors@~1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" @@ -2600,7 +2955,7 @@ http-errors@~1.6.1: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-proxy-middleware@~0.17.1: +http-proxy-middleware@~0.17.4: version "0.17.4" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" dependencies: @@ -2616,17 +2971,17 @@ http-proxy@^1.13.0, http-proxy@^1.16.2, http-proxy@^1.8.1: eventemitter3 "1.x.x" requires-port "1.x.x" -http-server@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.9.0.tgz#8f1b06bdc733618d4dc42831c7ba1aff4e06001a" +http-server@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.10.0.tgz#b2a446b16a9db87ed3c622ba9beb1b085b1234a7" dependencies: colors "1.0.3" corser "~2.0.0" - ecstatic "^1.4.0" + ecstatic "^2.0.0" http-proxy "^1.8.1" opener "~1.4.0" optimist "0.6.x" - portfinder "0.4.x" + portfinder "^1.0.13" union "~0.4.3" http-signature@~1.1.0: @@ -2649,9 +3004,9 @@ https-proxy-agent@^1.0.0: debug "2" extend "3" -iconv-lite@0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" +https@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" iconv-lite@0.4.15: version "0.4.15" @@ -2661,9 +3016,11 @@ icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" -ie-shim@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ie-shim/-/ie-shim-0.1.0.tgz#d329de228e7dfe656feaea3e20748ef095363c5d" +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + dependencies: + postcss "^6.0.1" ieee754@^1.1.4: version "1.1.8" @@ -2673,11 +3030,11 @@ ignore-by-default@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" -imports-loader@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.7.0.tgz#468c04de8075941cfab28146c755c24cc1f36ccd" +imports-loader@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.7.1.tgz#f204b5f34702a32c1db7d48d89d5e867a0441253" dependencies: - loader-utils "^0.2.16" + loader-utils "^1.0.2" source-map "^0.5.6" imurmurhash@^0.1.4: @@ -2725,14 +3082,30 @@ ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" +internal-ip@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" + dependencies: + meow "^3.3.0" + interpret@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +ip@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + ipaddr.js@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" @@ -2741,17 +3114,27 @@ is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" +is-arrayish@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.1.tgz#c2dfc386abaa0c3e33c48db3fe87059e69065efd" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.5: +is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" @@ -2765,10 +3148,38 @@ is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" +is-descriptor@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.5.tgz#e3fb8b4ab65f3a37373388e18b401d78c58cbea7" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^3.0.2" + lazy-cache "^2.0.2" + +is-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.0.tgz#d6ec686f238f6b02f23757abe12cf6b2ea2790f9" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^3.0.2" + lazy-cache "^2.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + is-dotfile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" @@ -2779,7 +3190,7 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -2787,7 +3198,7 @@ is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" -is-extglob@^2.1.0: +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2803,6 +3214,10 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -2815,6 +3230,10 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + is-my-json-valid@^2.12.4: version "2.16.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" @@ -2838,9 +3257,17 @@ is-number@^2.0.2, is-number@^2.1.0: dependencies: kind-of "^3.0.2" -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-odd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + dependencies: + is-number "^3.0.0" is-path-cwd@^1.0.0: version "1.0.0" @@ -2862,6 +3289,12 @@ is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" +is-plain-object@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.3.tgz#c15bf3e4b66b62d72efaf2925848663ecbc619b6" + dependencies: + isobject "^3.0.0" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -2884,11 +3317,7 @@ is-regex@^1.0.3: dependencies: has "^1.0.1" -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.0.1: +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -2926,44 +3355,50 @@ isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" -isobject@^2.0.0: +isnumeric@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/isnumeric/-/isnumeric-0.2.0.tgz#a2347ba360de19e33d0ffd590fddf7755cbf2e64" + +isobject@^2.0.0, isobject@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" dependencies: isarray "1.0.0" +isobject@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-instrumenter-loader@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-0.2.0.tgz#643e4e5e4e8f9466863a29a977d283ab372c019c" +istanbul-instrumenter-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz#e5492900ab0bba835efa8024cb00be9b3eea2700" dependencies: - istanbul "0.x.x" - loader-utils "0.x.x" - object-assign "4.x.x" + convert-source-map "^1.3.0" + istanbul-lib-instrument "^1.1.3" + loader-utils "^0.2.16" + object-assign "^4.1.0" -istanbul@0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.3.tgz#5b714ee0ae493ac5ef204b99f3872bceef73d53a" - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - fileset "0.2.x" - 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" +istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" + +istanbul-lib-instrument@^1.1.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.3.tgz#925b239163eabdd68cc4048f52c2fa4f899ecfa7" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.17.4" + istanbul-lib-coverage "^1.1.1" + semver "^5.3.0" -istanbul@0.x.x, istanbul@^0.4.0, istanbul@^0.4.3: +istanbul@0.4.5, istanbul@^0.4.0, istanbul@^0.4.3: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" dependencies: @@ -2982,31 +3417,31 @@ istanbul@0.x.x, istanbul@^0.4.0, istanbul@^0.4.3: which "^1.1.1" wordwrap "^1.0.0" -jasmine-core@~2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.4.1.tgz#6f83ab3a0f16951722ce07d206c773d57cc838be" - -jasmine-core@~2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297" +jasmine-core@2.6.4, jasmine-core@~2.6.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.6.4.tgz#dec926cd0a9fa287fb6db5c755fa487e74cecac5" -jasmine-spec-reporter@~2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-2.7.0.tgz#42907ff889952a129c0afc2929e195f4e74c98ff" +jasmine-spec-reporter@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz#5a6d58ab5d61bea7309fbc279239511756b1b588" dependencies: colors "1.1.2" -jasmine@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.4.1.tgz#9016dda453213d27ac6d43dc4ea97315a189085e" +jasmine@^2.5.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.6.0.tgz#6b22e70883e8e589d456346153b4d206ddbe217f" dependencies: exit "^0.1.2" - glob "^3.2.11" - jasmine-core "~2.4.0" + glob "^7.0.6" + jasmine-core "~2.6.0" + +jasminewd2@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.1.0.tgz#da595275d1ae631de736ac0a7c7d85c9f73ef652" -jasminewd2@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-0.0.10.tgz#94f48ae2bc946cad643035467b4bb7ea9c1075ef" +javascript-natural-sort@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" jodid25519@^1.0.0: version "1.0.2" @@ -3022,27 +3457,11 @@ js-base64@^2.1.8, js-base64@^2.1.9: version "2.1.9" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" -js-beautify@^1.6.4: - version "1.6.14" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.6.14.tgz#d3b8f7322d02b9277d58bd238264c327e58044cd" - dependencies: - config-chain "~1.1.5" - editorconfig "^0.13.2" - mkdirp "~0.5.0" - nopt "~3.0.1" - js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" -js-yaml@3.x: - version "3.8.4" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" - dependencies: - argparse "^1.0.7" - esprima "^3.1.1" - -js-yaml@~3.7.0: +js-yaml@3.x, js-yaml@^3.4.3, js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" dependencies: @@ -3057,14 +3476,22 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsesc@~0.5.0: +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" -json-loader@0.5.4: +json-loader@0.5.4, json-loader@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -3083,7 +3510,7 @@ json3@3.3.2, json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0: +json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -3093,6 +3520,12 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -3101,7 +3534,7 @@ jsonpointer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" -jsonschema@^1.1.1: +jsonschema@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.1.1.tgz#3cede8e3e411d377872eefbc9fdf26383cbc3ed9" @@ -3114,20 +3547,20 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.3.6" -karma-chrome-launcher@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz#216879c68ac04d8d5140e99619ba04b59afd46cf" +karma-chrome-launcher@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" dependencies: fs-access "^1.0.0" which "^1.2.1" -karma-cli@^1.0.1: +karma-cli@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/karma-cli/-/karma-cli-1.0.1.tgz#ae6c3c58a313a1d00b45164c455b9b86ce17f960" dependencies: resolve "^1.1.6" -karma-coverage@^1.1.1: +karma-coverage@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.1.tgz#5aff8b39cf6994dc22de4c84362c76001b637cf6" dependencies: @@ -3137,45 +3570,45 @@ karma-coverage@^1.1.1: minimatch "^3.0.0" source-map "^0.5.1" -karma-jasmine@^1.0.2: +karma-jasmine@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" -karma-mocha-reporter@^2.0.0: +karma-mocha-reporter@2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.3.tgz#04fdda45a1d9697a73871c7472223c581701ab20" dependencies: chalk "1.1.3" -karma-phantomjs-launcher@^1.0.2: +karma-phantomjs-launcher@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2" dependencies: lodash "^4.0.1" phantomjs-prebuilt "^2.1.7" -karma-remap-istanbul@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/karma-remap-istanbul/-/karma-remap-istanbul-0.2.2.tgz#1cdf6c85a55c6b20e9c7149c0a8c55533038d9d9" +karma-remap-istanbul@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/karma-remap-istanbul/-/karma-remap-istanbul-0.6.0.tgz#97f3b770065254f9b4724f2d9be4a3a2e1baf6fc" dependencies: istanbul "^0.4.3" - remap-istanbul "^0.6.4" + remap-istanbul "^0.9.0" -karma-sourcemap-loader@^0.3.7: +karma-sourcemap-loader@0.3.7: version "0.3.7" resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8" dependencies: graceful-fs "^4.1.2" -karma-webdriver-launcher@^1.0.4: +karma-webdriver-launcher@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/karma-webdriver-launcher/-/karma-webdriver-launcher-1.0.5.tgz#b1c3cb347f26e786039c15abf7f19a7791e8ddd7" dependencies: wd "^1.0.0" -karma-webpack@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-1.8.0.tgz#340c7999eb3745b47becab47d0d304dac2c55257" +karma-webpack@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.4.tgz#3e2d4f48ba94a878e1c66bb8e1ae6128987a175b" dependencies: async "~0.9.0" loader-utils "^0.2.5" @@ -3183,7 +3616,7 @@ karma-webpack@1.8.0: source-map "^0.1.41" webpack-dev-middleware "^1.0.11" -karma@^1.2.0: +karma@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/karma/-/karma-1.7.0.tgz#6f7a1a406446fa2e187ec95398698f4cee476269" dependencies: @@ -3219,12 +3652,24 @@ kew@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" -kind-of@^3.0.2: +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0, kind-of@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: is-buffer "^1.1.5" +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -3237,19 +3682,19 @@ latest-version@^1.0.0: dependencies: package-json "^1.0.0" -latest-version@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" - dependencies: - package-json "^2.0.0" +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -lazy-req@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" +lazy-cache@^2.0.1, lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + dependencies: + set-getter "^0.1.0" lazystream@^1.0.0: version "1.0.0" @@ -3289,11 +3734,11 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" -loader-runner@^2.2.0: +loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" -loader-utils@0.x.x, loader-utils@^0.2.11, loader-utils@^0.2.15, loader-utils@^0.2.16, loader-utils@^0.2.5, loader-utils@^0.2.6, loader-utils@^0.2.7, loader-utils@~0.2.2: +loader-utils@^0.2.15, loader-utils@^0.2.16, loader-utils@^0.2.5, loader-utils@~0.2.2: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" dependencies: @@ -3302,7 +3747,7 @@ loader-utils@0.x.x, loader-utils@^0.2.11, loader-utils@^0.2.15, loader-utils@^0. json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.2: +loader-utils@^1.0.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: @@ -3310,6 +3755,13 @@ loader-utils@^1.0.2: emojis-list "^2.0.0" json5 "^0.5.0" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" @@ -3357,7 +3809,7 @@ lodash._reevaluate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" -lodash._reinterpolate@^3.0.0: +lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -3373,7 +3825,7 @@ lodash.assign@^3.0.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" -lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.2.0: +lodash.assign@^4.0.1, lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -3381,7 +3833,7 @@ lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" -lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: +lodash.clonedeep@^4.3.2: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -3392,9 +3844,9 @@ lodash.defaults@^3.1.2: lodash.assign "^3.0.0" lodash.restparam "^3.0.0" -lodash.differencewith@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz#bafafbc918b55154e179176a00bb0aefaac854b7" +lodash.defaults@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" lodash.escape@^3.0.0: version "3.2.0" @@ -3410,22 +3862,6 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" -lodash.isarray@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-4.0.0.tgz#2aca496b28c4ca6d726715313590c02e6ea34403" - -lodash.isequal@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - -lodash.isfunction@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.8.tgz#4db709fc81bc4a8fd7127a458a5346c5cdce2c6b" - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -3446,6 +3882,10 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" +lodash.tail@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + lodash.template@^3.0.0: version "3.6.2" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" @@ -3460,6 +3900,13 @@ lodash.template@^3.0.0: lodash.restparam "^3.0.0" lodash.templatesettings "^3.0.0" +lodash.template@^4.2.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + lodash.templatesettings@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" @@ -3467,9 +3914,11 @@ lodash.templatesettings@^3.0.0: lodash._reinterpolate "^3.0.0" lodash.escape "^3.0.0" -lodash.unionwith@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.unionwith/-/lodash.unionwith-4.6.0.tgz#74d140b5ca8146e6c643c3724f5152538d9ac1f0" +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + dependencies: + lodash._reinterpolate "~3.0.0" lodash.uniq@^4.5.0: version "4.5.0" @@ -3479,11 +3928,11 @@ lodash@4.16.2: version "4.16.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.2.tgz#3e626db827048a699281a8a125226326cfc0e652" -lodash@^3.10.1, lodash@^3.8.0: +lodash@^3.8.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.16.4, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.8.0: +lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.8.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -3491,6 +3940,12 @@ lodash@~4.16.4: version "4.16.6" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + log4js@^0.6.31: version "0.6.38" resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" @@ -3502,6 +3957,12 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -3517,16 +3978,10 @@ lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" -lru-cache@2, lru-cache@2.2.x: +lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" -lru-cache@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" - dependencies: - pseudomap "^1.0.1" - lru-cache@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" @@ -3554,6 +4009,10 @@ make-error@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -3562,6 +4021,13 @@ map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" +map-visit@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-0.1.5.tgz#dbe43927ce5525b80dfc1573a44d68c51f26816b" + dependencies: + lazy-cache "^2.0.1" + object-visit "^0.3.4" + marked@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" @@ -3570,18 +4036,29 @@ math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" +mathjs@^3.11.5: + version "3.14.2" + resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-3.14.2.tgz#bb79b7dc878b7f586ce408ab067a9a42db2e7a2d" + dependencies: + complex.js "2.0.4" + decimal.js "7.2.3" + fraction.js "4.0.2" + javascript-natural-sort "0.7.1" + seed-random "2.2.0" + tiny-emitter "2.0.0" + typed-function "0.10.5" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" -memory-fs@^0.3.0, memory-fs@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" + mimic-fn "^1.0.0" -memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" dependencies: @@ -3633,6 +4110,24 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.0.4.tgz#1543f1d04813447ac852001c5f5a933401786d1d" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.2.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + extglob "^1.1.0" + fragment-cache "^0.2.1" + kind-of "^4.0.0" + nanomatch "^1.2.0" + object.pick "^1.2.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + miller-rabin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" @@ -3640,11 +4135,7 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.27.0 < 2": - version "1.28.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.28.0.tgz#fedd349be06d2865b7fc57d837c6de4f17d7ac3c" - -mime-db@~1.27.0: +"mime-db@>= 1.27.0 < 2", mime-db@~1.27.0: version "1.27.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" @@ -3662,6 +4153,10 @@ mime@^1.2.11, mime@^1.3.4: version "1.3.6" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" @@ -3670,36 +4165,37 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" -minimatch@0.3: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: brace-expansion "^1.1.7" -minimatch@2.x: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - -minimist@0.0.8: +minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" +minimist@1.1.x: + version "1.1.3" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" + minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" +mixin-deep@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.2.0.tgz#d02b8c6f8b6d4b8f5982d3fd009c4919851c3fe2" + dependencies: + for-in "^1.0.2" + is-extendable "^0.1.1" + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" mkdirp@0.5.0: version "0.5.0" @@ -3713,12 +4209,12 @@ mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd dependencies: minimist "0.0.8" -morgan@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.7.0.tgz#eb10ca8e50d1abe0f8d3dad5c0201d052d981c62" +morgan@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.2.tgz#784ac7734e4a453a9c6e6e8680a9329275c8b687" dependencies: - basic-auth "~1.0.3" - debug "~2.2.0" + basic-auth "~1.1.0" + debug "2.6.8" depd "~1.1.0" on-finished "~2.3.0" on-headers "~1.0.1" @@ -3735,16 +4231,44 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde" + dependencies: + dns-packet "^1.0.1" + thunky "^0.1.0" + multipipe@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" dependencies: duplexer2 "0.0.2" -nan@^2.3.0, nan@^2.3.2: +nan@^2.0.0, nan@^2.3.0, nan@^2.3.2: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" +nanomatch@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.0.tgz#76fdb3d4ae7617e37719e7a4047b840857c0cb1c" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + is-extglob "^2.1.1" + is-odd "^1.0.0" + kind-of "^4.0.0" + object.pick "^1.2.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + ncname@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" @@ -3755,21 +4279,17 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -neo-async@^1.0.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-1.8.2.tgz#31795888b79dd04357a7c52113a65183e93b6735" - nested-error-stacks@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" dependencies: inherits "~2.0.1" -ng2-pagination@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ng2-pagination/-/ng2-pagination-2.0.1.tgz#eb329c0020e19a5e7bd1a6e064792fad1d8ec80e" +ng2-pagination@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ng2-pagination/-/ng2-pagination-2.0.2.tgz#532dc9154de1f15e19e94edf554b96884b5f83d6" -ngrx-store-freeze@^0.1.9: +ngrx-store-freeze@0.1.9: version "0.1.9" resolved "https://registry.yarnpkg.com/ngrx-store-freeze/-/ngrx-store-freeze-0.1.9.tgz#b20f18f21fd5efc4e1b1e05f6f279674d0f70c81" dependencies: @@ -3787,6 +4307,10 @@ node-dir@^0.1.10: dependencies: minimatch "^3.0.2" +node-forge@0.6.33: + version "0.6.33" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" + node-gyp@^3.3.1: version "3.6.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.1.tgz#19561067ff185464aded478212681f47fd578cbc" @@ -3805,9 +4329,9 @@ node-gyp@^3.3.1: tar "^2.0.0" which "1" -node-libs-browser@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-1.1.1.tgz#2a38243abedd7dffcd07a97c9aca5668975a6fea" +node-libs-browser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" dependencies: assert "^1.1.1" browserify-zlib "^0.1.4" @@ -3827,13 +4351,13 @@ node-libs-browser@^1.0.0: stream-browserify "^2.0.1" stream-http "^2.3.1" string_decoder "^0.10.25" - timers-browserify "^1.4.2" + timers-browserify "^2.0.2" tty-browserify "0.0.0" url "^0.11.0" util "^0.10.3" vm-browserify "0.0.4" -node-pre-gyp@^0.6.29: +node-pre-gyp@^0.6.29, node-pre-gyp@^0.6.4: version "0.6.34" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" dependencies: @@ -3847,9 +4371,9 @@ node-pre-gyp@^0.6.29: tar "^2.2.1" tar-pack "^3.4.0" -node-sass@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.0.0.tgz#3208301ad5a6096de227f3fc4c3ce682b9816afc" +node-sass@4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.5.3.tgz#d09c9d1179641239d1b97ffc6231fdcec53e1568" dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -3860,19 +4384,24 @@ node-sass@4.0.0: in-publish "^2.0.0" lodash.assign "^4.2.0" lodash.clonedeep "^4.3.2" - lodash.isarray "^4.0.0" lodash.mergewith "^4.6.0" meow "^3.7.0" mkdirp "^0.5.1" nan "^2.3.2" node-gyp "^3.3.1" npmlog "^4.0.0" - request "^2.61.0" + request "^2.79.0" sass-graph "^2.1.1" + stdout-stream "^1.4.0" -node-status-codes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" +node-zopfli@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-zopfli/-/node-zopfli-2.0.2.tgz#a7a473ae92aaea85d4c68d45bbf2c944c46116b8" + dependencies: + commander "^2.8.1" + defaults "^1.0.2" + nan "^2.0.0" + node-pre-gyp "^0.6.4" nodemon@1.11.0: version "1.11.0" @@ -3889,7 +4418,7 @@ nodemon@1.11.0: undefsafe "0.0.3" update-notifier "0.5.0" -"nopt@2 || 3", nopt@3.x, nopt@~3.0.1: +"nopt@2 || 3", nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -3948,6 +4477,12 @@ npm-run-all@4.0.2: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" @@ -3983,22 +4518,40 @@ object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" -object-assign@4.x.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-keys@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object-path@^0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" + +object-visit@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-0.3.4.tgz#ae15cf86f0b2fdd551771636448452c54c3da829" + dependencies: + isobject "^2.0.0" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -4006,6 +4559,12 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +object.pick@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.2.0.tgz#b5392bee9782da6d9fb7d6afaf539779f1234c2b" + dependencies: + isobject "^2.1.0" + obuf@^1.0.0, obuf@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" @@ -4020,7 +4579,7 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@1.x, once@^1.3.0, once@^1.3.3, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -4032,7 +4591,17 @@ once@~1.3.0: dependencies: wrappy "1" -opener@^1.4.2, opener@~1.4.0: +onecolor@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/onecolor/-/onecolor-3.0.4.tgz#75a46f80da6c7aaa5b4daae17a47198bd9652494" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +opener@^1.4.3, opener@~1.4.0: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" @@ -4065,6 +4634,15 @@ options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" +ora@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-1.3.0.tgz#80078dd2b92a934af66a3ad72a5b910694ede51a" + dependencies: + chalk "^1.1.1" + cli-cursor "^2.1.0" + cli-spinners "^1.0.0" + log-symbols "^1.0.2" + original@>=0.0.5: version "1.0.0" resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" @@ -4075,7 +4653,7 @@ os-browserify@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" -os-homedir@^1.0.0: +os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -4085,7 +4663,15 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: +os-locale@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.0.0.tgz#15918ded510522b81ee7ae5a309d54f639fc39a4" + dependencies: + execa "^0.5.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4096,6 +4682,24 @@ osenv@0, osenv@^0.1.0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-map@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" + package-json@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" @@ -4103,15 +4707,6 @@ package-json@^1.0.0: got "^3.2.0" registry-url "^3.0.0" -package-json@^2.0.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" - dependencies: - got "^5.0.0" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -4141,15 +4736,17 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" -parse-json@^2.1.0, parse-json@^2.2.0: +parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" dependencies: error-ex "^1.2.0" -parse5@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-2.2.3.tgz#0c4fc41c1000c5e6b93d48b03f8083837834e9f6" +parse5@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510" + dependencies: + "@types/node" "^6.0.46" parsejson@0.0.3: version "0.0.3" @@ -4173,6 +4770,10 @@ parseurl@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" @@ -4183,6 +4784,10 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -4191,6 +4796,10 @@ path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -4229,6 +4838,13 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pem@1.9.7: + version "1.9.7" + resolved "https://registry.yarnpkg.com/pem/-/pem-1.9.7.tgz#d387f996f292c7c9dea639a535805e74cb503161" + dependencies: + os-tmpdir "^1.0.1" + which "^1.2.4" + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -4251,28 +4867,40 @@ phantomjs-prebuilt@^2.1.7: request-progress "~2.0.1" which "~1.2.10" -pify@^2.0.0: +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" dependencies: pinkie "^2.0.0" -pinkie@^2.0.0, pinkie@^2.0.4: +pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -portfinder@0.4.x: - version "0.4.0" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-0.4.0.tgz#a3ffadffafe4fb98e0601a85eda27c27ce84ca1e" +pixrem@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pixrem/-/pixrem-4.0.1.tgz#2da4a1de6ec4423c5fc3794e930b81d4490ec686" dependencies: - async "0.9.0" - mkdirp "0.5.x" + browserslist "^2.0.0" + postcss "^6.0.0" + reduce-css-calc "^1.2.7" + +pleeease-filters@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pleeease-filters/-/pleeease-filters-4.0.0.tgz#6632b2fb05648d2758d865384fbced79e1ccaec7" + dependencies: + onecolor "^3.0.4" + postcss "^6.0.1" -portfinder@^1.0.9: +portfinder@^1.0.13, portfinder@^1.0.9: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" dependencies: @@ -4280,6 +4908,25 @@ portfinder@^1.0.9: debug "^2.2.0" mkdirp "0.5.x" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +postcss-apply@0.8.0, postcss-apply@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/postcss-apply/-/postcss-apply-0.8.0.tgz#14e544bbb5cb6f1c1e048857965d79ae066b1343" + dependencies: + babel-runtime "^6.23.0" + balanced-match "^0.4.2" + postcss "^6.0.0" + +postcss-attribute-case-insensitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-2.0.0.tgz#94dc422c8f90997f16bd33a3654bbbec084963b4" + dependencies: + postcss "^6.0.0" + postcss-selector-parser "^2.2.3" + postcss-calc@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" @@ -4288,19 +4935,96 @@ postcss-calc@^5.2.0: postcss-message-helpers "^2.0.0" reduce-css-calc "^1.2.6" -postcss-cli@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/postcss-cli/-/postcss-cli-2.6.0.tgz#f0de393caa026fcfc1b1479822989af508ed515d" +postcss-calc@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-6.0.0.tgz#b681b279c6d24fbe0e33ed9045803705445d613b" dependencies: - globby "^4.1.0" - mkdirp "^0.5.1" - neo-async "^1.0.0" - postcss "^5.0.0" - read-file-stdin "^0.2.0" - resolve "^1.1.6" - yargs "^4.7.1" - optionalDependencies: - chokidar "^1.5.1" + css-unit-converter "^1.1.1" + postcss "^6.0.0" + postcss-selector-parser "^2.2.2" + reduce-css-calc "^2.0.0" + +postcss-cli@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-cli/-/postcss-cli-4.1.0.tgz#8f6803678acd7a4f21483f1a4039136f6e1c214f" + dependencies: + chalk "^1.1.3" + chokidar "^1.6.1" + dependency-graph "^0.5.0" + fs-extra "^3.0.1" + get-stdin "^5.0.1" + globby "^6.1.0" + ora "^1.1.0" + postcss "^6.0.1" + postcss-load-config "^1.1.0" + postcss-reporter "^4.0.0" + read-cache "^1.0.0" + yargs "^8.0.1" + +postcss-color-function@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-function/-/postcss-color-function-4.0.0.tgz#7e0106f4f6a1ecb1ad5b3a8553ace5e828aae187" + dependencies: + css-color-function "^1.3.0" + postcss "^6.0.1" + postcss-message-helpers "^2.0.0" + postcss-value-parser "^3.3.0" + +postcss-color-gray@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-4.0.0.tgz#681bf305097dd66bfef0e1e6282d5d99b5acc95d" + dependencies: + color "^1.0.3" + postcss "^6.0.1" + postcss-message-helpers "^2.0.0" + reduce-function-call "^1.0.2" + +postcss-color-hex-alpha@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-3.0.0.tgz#1e53e6c8acb237955e8fd08b7ecdb1b8b8309f95" + dependencies: + color "^1.0.3" + postcss "^6.0.1" + postcss-message-helpers "^2.0.0" + +postcss-color-hsl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hsl/-/postcss-color-hsl-2.0.0.tgz#12703666fa310430e3f30a454dac1386317d5844" + dependencies: + postcss "^6.0.1" + postcss-value-parser "^3.3.0" + units-css "^0.4.0" + +postcss-color-hwb@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hwb/-/postcss-color-hwb-3.0.0.tgz#3402b19ef4d8497540c1fb5072be9863ca95571e" + dependencies: + color "^1.0.3" + postcss "^6.0.1" + postcss-message-helpers "^2.0.0" + reduce-function-call "^1.0.2" + +postcss-color-rebeccapurple@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-3.0.0.tgz#eebaf03d363b4300b96792bd3081c19ed66513d3" + dependencies: + postcss "^6.0.1" + postcss-value-parser "^3.3.0" + +postcss-color-rgb@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rgb/-/postcss-color-rgb-2.0.0.tgz#14539c8a7131494b482e0dd1cc265ff6514b5263" + dependencies: + postcss "^6.0.1" + postcss-value-parser "^3.3.0" + +postcss-color-rgba-fallback@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rgba-fallback/-/postcss-color-rgba-fallback-3.0.0.tgz#37d5c9353a07a09270912a82606bb42a0d702c04" + dependencies: + postcss "^6.0.6" + postcss-value-parser "^3.3.0" + rgb-hex "^2.1.0" postcss-colormin@^2.1.8: version "2.2.2" @@ -4317,6 +5041,62 @@ postcss-convert-values@^2.3.4: postcss "^5.0.11" postcss-value-parser "^3.1.2" +postcss-cssnext@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-cssnext/-/postcss-cssnext-3.0.2.tgz#63b77adb0b8a4c1d5ec32cd345539535a3417d48" + dependencies: + autoprefixer "^7.1.1" + caniuse-api "^2.0.0" + chalk "^2.0.1" + pixrem "^4.0.0" + pleeease-filters "^4.0.0" + postcss "^6.0.5" + postcss-apply "^0.8.0" + postcss-attribute-case-insensitive "^2.0.0" + postcss-calc "^6.0.0" + postcss-color-function "^4.0.0" + postcss-color-gray "^4.0.0" + postcss-color-hex-alpha "^3.0.0" + postcss-color-hsl "^2.0.0" + postcss-color-hwb "^3.0.0" + postcss-color-rebeccapurple "^3.0.0" + postcss-color-rgb "^2.0.0" + postcss-color-rgba-fallback "^3.0.0" + postcss-custom-media "^6.0.0" + postcss-custom-properties "^6.1.0" + postcss-custom-selectors "^4.0.1" + postcss-font-family-system-ui "^2.0.1" + postcss-font-variant "^3.0.0" + postcss-image-set-polyfill "^0.3.5" + postcss-initial "^2.0.0" + postcss-media-minmax "^3.0.0" + postcss-nesting "^4.0.1" + postcss-pseudo-class-any-link "^4.0.0" + postcss-pseudoelements "^5.0.0" + postcss-replace-overflow-wrap "^2.0.0" + postcss-selector-matches "^3.0.1" + postcss-selector-not "^3.0.1" + +postcss-custom-media@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-6.0.0.tgz#be532784110ecb295044fb5395a18006eb21a737" + dependencies: + postcss "^6.0.1" + +postcss-custom-properties@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-6.1.0.tgz#9caf1151ac41b1e9e64d3a2ff9ece996ca18977d" + dependencies: + balanced-match "^1.0.0" + postcss "^6.0.3" + +postcss-custom-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-4.0.1.tgz#781382f94c52e727ef5ca4776ea2adf49a611382" + dependencies: + postcss "^6.0.1" + postcss-selector-matches "^3.0.0" + postcss-discard-comments@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" @@ -4355,13 +5135,83 @@ postcss-filter-plugins@^2.0.0: postcss "^5.0.4" uniqid "^4.0.0" -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" +postcss-font-family-system-ui@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-family-system-ui/-/postcss-font-family-system-ui-2.0.1.tgz#318a075fdcb84b864aa823a51935ef0a5872e911" dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" + lodash "^4.17.4" + postcss "^6.0.1" + postcss-value-parser "^3.3.0" + +postcss-font-variant@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-3.0.0.tgz#08ccc88f6050ba82ed8ef2cc76c0c6a6b41f183e" + dependencies: + postcss "^6.0.1" + +postcss-image-set-polyfill@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/postcss-image-set-polyfill/-/postcss-image-set-polyfill-0.3.5.tgz#0f193413700cf1f82bd39066ef016d65a4a18181" + dependencies: + postcss "^6.0.1" + postcss-media-query-parser "^0.2.3" + +postcss-initial@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-2.0.0.tgz#72715f7336e0bb79351d99ee65c4a253a8441ba4" + dependencies: + lodash.template "^4.2.4" + postcss "^6.0.1" + +postcss-load-config@^1.1.0, postcss-load-config@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + postcss-load-options "^1.2.0" + postcss-load-plugins "^2.3.0" + +postcss-load-options@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + +postcss-load-plugins@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" + dependencies: + cosmiconfig "^2.1.1" + object-assign "^4.1.0" + +postcss-loader@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.0.6.tgz#8c7e0055a3df1889abc6bad52dd45b2f41bbc6fc" + dependencies: + loader-utils "^1.1.0" + postcss "^6.0.2" + postcss-load-config "^1.2.0" + schema-utils "^0.3.0" + +postcss-media-minmax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-3.0.0.tgz#675256037a43ef40bc4f0760bfd06d4dc69d48d2" + dependencies: + postcss "^6.0.1" + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" postcss-merge-longhand@^2.0.1: version "2.0.2" @@ -4443,6 +5293,12 @@ postcss-modules-values@^1.1.0: icss-replace-symbols "^1.1.0" postcss "^6.0.1" +postcss-nesting@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-4.0.1.tgz#8fc2ce40cbfcfab7ee24e7b68fb6ebe84b641469" + dependencies: + postcss "^6.0.1" + postcss-normalize-charset@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" @@ -4465,6 +5321,19 @@ postcss-ordered-values@^2.1.0: postcss "^5.0.4" postcss-value-parser "^3.0.1" +postcss-pseudo-class-any-link@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-4.0.0.tgz#9152a0613d3450720513e8892854bae42d0ee68e" + dependencies: + postcss "^6.0.1" + postcss-selector-parser "^2.2.3" + +postcss-pseudoelements@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudoelements/-/postcss-pseudoelements-5.0.0.tgz#eef194e8d524645ca520a949e95e518e812402cb" + dependencies: + postcss "^6.0.0" + postcss-reduce-idents@^2.2.2: version "2.4.0" resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" @@ -4486,7 +5355,55 @@ postcss-reduce-transforms@^1.0.3: postcss "^5.0.8" postcss-value-parser "^3.0.1" -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: +postcss-replace-overflow-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-2.0.0.tgz#794db6faa54f8db100854392a93af45768b4e25b" + dependencies: + postcss "^6.0.1" + +postcss-reporter@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-4.0.0.tgz#13356c365c36783adde88e28e09dbba6ec6c6501" + dependencies: + chalk "^1.0.0" + lodash "^4.1.0" + log-symbols "^1.0.2" + +postcss-responsive-type@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/postcss-responsive-type/-/postcss-responsive-type-0.5.1.tgz#274133bc046359e542a58bbc621847d040fd10e6" + dependencies: + postcss "^5.0.0" + +postcss-sass@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.1.0.tgz#0d2a655b5d241ec8f419bb3da38de5ca11746ddb" + dependencies: + gonzales-pe "^4.0.3" + mathjs "^3.11.5" + postcss "^5.2.6" + +postcss-scss@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-1.0.2.tgz#ff45cf3354b879ee89a4eb68680f46ac9bb14f94" + dependencies: + postcss "^6.0.3" + +postcss-selector-matches@^3.0.0, postcss-selector-matches@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-3.0.1.tgz#e5634011e13950881861bbdd58c2d0111ffc96ab" + dependencies: + balanced-match "^0.4.2" + postcss "^6.0.1" + +postcss-selector-not@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-3.0.1.tgz#2e4db2f0965336c01e7cec7db6c60dff767335d9" + dependencies: + balanced-match "^0.4.2" + postcss "^6.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2, postcss-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" dependencies: @@ -4494,6 +5411,22 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: indexes-of "^1.0.1" uniq "^1.0.1" +postcss-smart-import@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/postcss-smart-import/-/postcss-smart-import-0.7.5.tgz#df9a9c6dd60d916e5e0670d1c57d03af5d3dcc31" + dependencies: + babel-runtime "^6.23.0" + lodash "^4.17.4" + object-assign "^4.1.1" + postcss "^6.0.6" + postcss-sass "^0.1.0" + postcss-scss "^1.0.2" + postcss-value-parser "^3.3.0" + promise-each "^2.2.0" + read-cache "^1.0.0" + resolve "^1.3.3" + sugarss "^1.0.0" + postcss-svgo@^2.1.1: version "2.1.6" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" @@ -4523,32 +5456,28 @@ postcss-zindex@^2.0.1: postcss "^5.0.4" uniqs "^2.0.0" -postcss@^5.0.0, postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.6: - version "5.2.17" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" +postcss@6.0.6, postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.2, postcss@^6.0.3, postcss@^6.0.5, postcss@^6.0.6: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.6.tgz#bba4d58e884fc78c840d1539e10eddaabb8f73bd" dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" + chalk "^2.0.1" source-map "^0.5.6" - supports-color "^3.2.3" + supports-color "^4.1.0" -postcss@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" +postcss@^5.0.0, postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.6: + version "5.2.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" dependencies: chalk "^1.1.3" + js-base64 "^2.1.9" source-map "^0.5.6" supports-color "^3.2.3" -preboot@4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/preboot/-/preboot-4.5.2.tgz#cb349209958c2b48d7f74137b3499bbbe5472a5e" - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prepend-http@^1.0.0, prepend-http@^1.0.1: +prepend-http@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -4557,8 +5486,8 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" pretty-error@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.0.tgz#87f4e9d706a24c87d6cbee9fabec001fcf8c75d8" + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" dependencies: renderkid "^2.0.1" utila "~0.4" @@ -4571,19 +5500,25 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -process@^0.11.0, process@~0.11.0: +process@^0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" -progress@^1.1.8, progress@~1.1.8: +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +progress@~1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" +promise-each@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/promise-each/-/promise-each-2.2.0.tgz#3353174eff2694481037e04e01f77aa0fb6d1b60" + dependencies: + any-promise "^0.1.0" -protractor-istanbul-plugin@~2.0.0: +protractor-istanbul-plugin@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/protractor-istanbul-plugin/-/protractor-istanbul-plugin-2.0.0.tgz#f6271d2a5d6382488e86ff9fb7770f46a8b2c5e2" dependencies: @@ -4592,27 +5527,27 @@ protractor-istanbul-plugin@~2.0.0: q "^1.4.1" uuid "^2.0.1" -protractor@~4.0.14: - version "4.0.14" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-4.0.14.tgz#efc4a877fac3a182a9dded26cd5869f4762fd172" +protractor@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.1.2.tgz#9b221741709a4c62d5cd53c6aadd54a71137e95f" dependencies: - "@types/jasmine" "^2.5.36" "@types/node" "^6.0.46" "@types/q" "^0.0.32" - "@types/selenium-webdriver" "2.53.37" - adm-zip "0.4.7" + "@types/selenium-webdriver" "~2.53.39" + blocking-proxy "0.0.5" chalk "^1.1.3" glob "^7.0.3" - jasmine "2.4.1" - jasminewd2 "0.0.10" + jasmine "^2.5.3" + jasminewd2 "^2.1.0" optimist "~0.6.0" q "1.4.1" saucelabs "~1.3.0" - selenium-webdriver "2.53.3" + selenium-webdriver "3.0.1" source-map-support "~0.4.0" - webdriver-manager "^10.3.0" + webdriver-js-extender "^1.0.0" + webdriver-manager "^12.0.6" -proxy-addr@~1.1.2: +proxy-addr@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" dependencies: @@ -4659,10 +5594,6 @@ qjobs@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" -qs@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" - qs@6.4.0, qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -4698,6 +5629,10 @@ querystringify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + randomatic@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" @@ -4713,14 +5648,6 @@ range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" -raw-body@~2.1.7: - version "2.1.7" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" - dependencies: - bytes "2.4.0" - iconv-lite "0.4.13" - unpipe "1.0.0" - raw-body@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" @@ -4733,7 +5660,7 @@ raw-loader@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" -rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: +rc@^1.0.1, rc@^1.1.7: version "1.2.1" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" dependencies: @@ -4749,11 +5676,11 @@ read-all-stream@^3.0.0: pinkie-promise "^2.0.0" readable-stream "^2.0.0" -read-file-stdin@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/read-file-stdin/-/read-file-stdin-0.2.1.tgz#25eccff3a153b6809afacb23ee15387db9e0ee61" +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" dependencies: - gather-stream "^1.0.0" + pify "^2.3.0" read-pkg-up@^1.0.1: version "1.0.1" @@ -4762,6 +5689,13 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -4841,7 +5775,7 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -reduce-css-calc@^1.2.6: +reduce-css-calc@^1.2.6, reduce-css-calc@^1.2.7: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" dependencies: @@ -4849,17 +5783,20 @@ reduce-css-calc@^1.2.6: math-expression-evaluator "^1.2.14" reduce-function-call "^1.0.1" -reduce-function-call@^1.0.1: +reduce-css-calc@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.0.5.tgz#33c97838c5d4c711a5c14ef85ce4fde41483f7bd" + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + +reduce-function-call@^1.0.1, reduce-function-call@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" dependencies: balanced-match "^0.4.2" -reflect-metadata@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.2.tgz#ea23e5823dc830f292822bd3da9b89fd57bffb03" - -reflect-metadata@^0.1.10, reflect-metadata@^0.1.2: +reflect-metadata@0.1.10, reflect-metadata@^0.1.2: version "0.1.10" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a" @@ -4867,6 +5804,10 @@ regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + regex-cache@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" @@ -4874,6 +5815,20 @@ regex-cache@^0.4.2: is-equal-shallow "^0.1.3" is-primitive "^2.0.0" +regex-not@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-0.1.2.tgz#bc7f1c4944b1188353d07deeb912b94e0ade25db" + +regex-not@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + dependencies: + extend-shallow "^2.0.1" + +regex-parser@^2.2.1: + version "2.2.7" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.7.tgz#bd090e09181849acc45457e765f7be2a63f50ef1" + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -4882,14 +5837,7 @@ regexpu-core@^1.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -registry-auth-token@^3.0.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.0, registry-url@^3.0.3: +registry-url@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" dependencies: @@ -4909,13 +5857,14 @@ relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" -remap-istanbul@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/remap-istanbul/-/remap-istanbul-0.6.4.tgz#ac551eff1aa641504b4f318d0303dda61e3bb695" +remap-istanbul@^0.9.0: + version "0.9.5" + resolved "https://registry.yarnpkg.com/remap-istanbul/-/remap-istanbul-0.9.5.tgz#a18617b1f31eec5a7dbee77538298b775606aaa8" dependencies: - amdefine "1.0.0" + amdefine "^1.0.0" gulp-util "3.0.7" - istanbul "0.4.3" + istanbul "0.4.5" + minimatch "^3.0.3" source-map ">=0.5.6" through2 "2.0.1" @@ -4941,7 +5890,7 @@ repeat-string@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -4967,7 +5916,7 @@ request-progress@~2.0.1: dependencies: throttleit "^1.0.0" -request@2, request@^2.61.0, request@^2.78.0, request@^2.81.0: +request@2, request@^2.78.0, request@^2.79.0, request@^2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -5023,6 +5972,10 @@ require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -5031,7 +5984,21 @@ requires-port@1.0.x, requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" -resolve-url@~0.2.1: +resolve-url-loader@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-2.1.0.tgz#27c95cc16a4353923fdbdc2dbaf5eef22232c477" + dependencies: + adjust-sourcemap-loader "^1.1.0" + camelcase "^4.0.0" + convert-source-map "^1.1.1" + loader-utils "^1.0.0" + lodash.defaults "^4.0.0" + rework "^1.0.1" + rework-visit "^1.0.0" + source-map "^0.5.6" + urix "^0.1.0" + +resolve-url@^0.2.1, resolve-url@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -5039,30 +6006,50 @@ resolve@1.1.7, resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@^1.1.6, resolve@^1.1.7: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2, resolve@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" dependencies: path-parse "^1.0.5" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rework-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + +rework@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rgb-hex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/rgb-hex/-/rgb-hex-2.1.0.tgz#c773c5fe2268a25578d92539a82a7a5ce53beda6" + +rgb@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/rgb/-/rgb-0.1.0.tgz#be27b291e8feffeac1bd99729721bfa40fc037b5" + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.0, rimraf@^2.6.1: +rimraf@2, rimraf@2.6.1, rimraf@^2.2.8, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: glob "^7.0.5" -rimraf@2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" - dependencies: - glob "^7.0.5" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" @@ -5070,15 +6057,15 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^2.0.0" inherits "^2.0.1" -rollup-plugin-commonjs@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-6.0.0.tgz#af61d38ec6bc81c6a2c3b5199f520eed9a2368db" +rollup-plugin-commonjs@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.0.2.tgz#98b1589bfe32a6c0f67790b60c0b499972afed89" dependencies: acorn "^4.0.1" estree-walker "^0.3.0" magic-string "^0.19.0" resolve "^1.1.7" - rollup-pluginutils "^1.5.1" + rollup-pluginutils "^2.0.1" rollup-plugin-node-globals@1.1.0: version "1.1.0" @@ -5091,46 +6078,52 @@ rollup-plugin-node-globals@1.1.0: process-es6 "^0.11.3" rollup-pluginutils "^1.5.2" -rollup-plugin-node-resolve@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.0.0.tgz#07e0ae94ac002a3ea36e8f33ca121d9f836b1309" +rollup-plugin-node-resolve@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz#8b897c4c3030d5001277b0514b25d2ca09683ee0" dependencies: browser-resolve "^1.11.0" builtin-modules "^1.1.0" + is-module "^1.0.0" resolve "^1.1.6" -rollup-plugin-uglify@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-1.0.1.tgz#11d0b0c8bcd2d07e6908f74fd16b0152390b922a" +rollup-plugin-uglify@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-2.0.1.tgz#67b37ad1efdafbd83af4c36b40c189ee4866c969" dependencies: - uglify-js "^2.6.1" + uglify-js "^3.0.9" -rollup-pluginutils@^1.5.1, rollup-pluginutils@^1.5.2: +rollup-pluginutils@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" dependencies: estree-walker "^0.2.1" minimatch "^3.0.2" -rollup@0.37.0: - version "0.37.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.37.0.tgz#759a51708ac08b027597babff171a026cf712d8d" +rollup-pluginutils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" dependencies: - source-map-support "^0.4.0" + estree-walker "^0.3.0" + micromatch "^2.3.11" -rxjs@5.0.0-beta.12: - version "5.0.0-beta.12" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.0.0-beta.12.tgz#cdfde2d8c4639d20ae7794bff8fddf32da7ad337" +rollup@0.45.1: + version "0.45.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.45.1.tgz#af67ded79974079095b5fede8817b4ec26d610e1" dependencies: - symbol-observable "^1.0.1" + source-map-support "^0.4.0" -rxjs@^5.0.1: - version "5.4.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.0.tgz#a7db14ab157f9d7aac6a56e655e7a3860d39bf26" +rxjs@5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.2.tgz#2a3236fcbf03df57bae06fd6972fd99e5c08fcf7" dependencies: symbol-observable "^1.0.1" -safe-buffer@^5.0.1: +safe-buffer@5.1.1, safe-buffer@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" @@ -5143,19 +6136,41 @@ sass-graph@^2.1.1: scss-tokenizer "^0.2.3" yargs "^7.0.0" +sass-loader@6.0.6: + version "6.0.6" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.6.tgz#e9d5e6c1f155faa32a4b26d7a9b7107c225e40f9" + dependencies: + async "^2.1.5" + clone-deep "^0.3.0" + loader-utils "^1.0.1" + lodash.tail "^4.1.1" + pify "^3.0.0" + saucelabs@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.3.0.tgz#d240e8009df7fa87306ec4578a69ba3b5c424fee" dependencies: https-proxy-agent "^1.0.0" -sax@0.6.x: +sax@0.6.x, sax@>=0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/sax/-/sax-0.6.1.tgz#563b19c7c1de892e09bfc4f2fc30e3c27f0952b9" sax@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + dependencies: + ajv "^5.0.0" + +script-ext-html-webpack-plugin@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/script-ext-html-webpack-plugin/-/script-ext-html-webpack-plugin-1.8.3.tgz#04c77e68eb45eb6358bf36554a1a358ca60ca2ed" + dependencies: + debug "^2.6.8" scss-tokenizer@^0.2.3: version "0.2.3" @@ -5164,11 +6179,24 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" +seed-random@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" -selenium-webdriver@2.53.3: +selenium-webdriver@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz#a2dea5da4a97f6672e89e7ca7276cefa365147a7" + dependencies: + adm-zip "^0.4.7" + rimraf "^2.5.4" + tmp "0.0.30" + xml2js "^0.4.17" + +selenium-webdriver@^2.53.2: version "2.53.3" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz#d29ff5a957dff1a1b49dc457756e4e4bfbdce085" dependencies: @@ -5178,13 +6206,25 @@ selenium-webdriver@2.53.3: ws "^1.0.1" xml2js "0.4.4" +selfsigned@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.9.1.tgz#cdda4492d70d486570f87c65546023558e1dfa5a" + dependencies: + node-forge "0.6.33" + semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: +semver-dsl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" + dependencies: + semver "^5.3.0" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.3.0, semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -5196,38 +6236,20 @@ semver@~5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" -send@0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" - dependencies: - debug "~2.2.0" - depd "~1.1.0" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.5.0" - mime "1.3.4" - ms "0.7.1" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.0" - -send@0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.14.2.tgz#39b0438b3f510be5dc6f667a11f71689368cdeef" +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" dependencies: - debug "~2.2.0" + debug "2.6.7" depd "~1.1.0" destroy "~1.0.4" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.5.1" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" mime "1.3.4" - ms "0.7.2" + ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" statuses "~1.3.1" @@ -5244,26 +6266,41 @@ serve-index@^1.7.2: mime-types "~2.1.15" parseurl "~1.3.1" -serve-static@~1.11.1: - version "1.11.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.2.tgz#2cf9889bd4435a320cc36895c9aa57bd662e6ac7" +serve-static@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" parseurl "~1.3.1" - send "0.14.2" + send "0.15.3" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + dependencies: + to-object-path "^0.3.0" + set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" -setprototypeof@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" +set-value@^0.4.2, set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" setprototypeof@1.0.3: version "1.0.3" @@ -5275,6 +6312,15 @@ sha.js@^2.4.0, sha.js@^2.4.8: dependencies: inherits "^2.0.1" +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -5302,18 +6348,47 @@ shelljs@^0.7.0: interpret "^1.0.0" rechoir "^0.6.2" -sigmund@^1.0.1, sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - -signal-exit@^3.0.0: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + dependencies: + is-arrayish "^0.3.1" + slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + dependencies: + 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 "^2.0.0" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -5364,12 +6439,12 @@ socket.io@1.7.3: socket.io-client "1.7.3" socket.io-parser "2.3.1" -sockjs-client@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.1.tgz#284843e9a9784d7c474b1571b3240fca9dda4bb0" +sockjs-client@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.2.tgz#f0212a8550e4c9468c8cceaeefd2e3493c033ad5" dependencies: debug "^2.2.0" - eventsource "~0.1.6" + eventsource "0.1.6" faye-websocket "~0.11.0" inherits "^2.0.1" json3 "^3.3.2" @@ -5392,9 +6467,13 @@ source-list-map@^0.1.7, source-list-map@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" -source-map-loader@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.1.6.tgz#c09903da6d73b9e53b7ed8ee5245597051e98e91" +source-list-map@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1" + +source-map-loader@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.1.tgz#48126be9230bd47fad05e46a8c3c2e3d2dabe507" dependencies: async "^0.9.0" loader-utils "~0.2.2" @@ -5409,29 +6488,30 @@ source-map-resolve@^0.3.0: source-map-url "~0.3.0" urix "~0.1.0" -source-map-support@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.3.3.tgz#34900977d5ba3f07c7757ee72e73bb1a9b53754f" +source-map-resolve@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.0.tgz#fcad0b64b70afb27699e425950cb5ebcd410bc20" dependencies: - source-map "0.1.32" + atob "^2.0.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" -source-map-support@^0.4.0, source-map-support@^0.4.2, source-map-support@~0.4.0: +source-map-support@^0.4.0, source-map-support@^0.4.15, source-map-support@^0.4.2, source-map-support@~0.4.0: version "0.4.15" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" dependencies: source-map "^0.5.6" +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + source-map-url@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" -source-map@0.1.32: - version "0.1.32" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" - dependencies: - amdefine ">=0.0.4" - -source-map@0.5.x, source-map@>=0.5.6, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: +source-map@0.5.x, source-map@>=0.5.6, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -5494,17 +6574,19 @@ spdy@^3.4.1: select-hose "^2.0.0" spdy-transport "^2.0.18" +split-string@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-2.1.1.tgz#af4b06d821560426446c3cd931cda618940d37d0" + dependencies: + extend-shallow "^2.0.1" + split@0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" dependencies: through "2" -sprintf-js@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.0.tgz#cffcaf702daf65ea39bb4e0fa2b299cec1a1be46" - -sprintf-js@~1.0.2: +sprintf-js@^1.0.3, sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -5523,10 +6605,23 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -"statuses@>= 1.3.1 < 2", statuses@~1.3.0, statuses@~1.3.1: +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" + stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -5564,12 +6659,12 @@ string-length@^1.0.0: dependencies: strip-ansi "^3.0.0" -string-replace-loader@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-1.0.5.tgz#e2b0d4fcd611f0d41ca433bbf50e029450e37a3d" +string-replace-loader@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-1.3.0.tgz#1d404a7bf5e2ec21b08ffc76d89445fbe49bc01d" dependencies: - loader-utils "^0.2.11" - lodash "^3.10.1" + loader-utils "^1.1.0" + lodash "^4" string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" @@ -5579,6 +6674,13 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +string-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.0.tgz#030664561fc146c9423ec7d978fe2457437fe6d0" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string.prototype.padend@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" @@ -5607,6 +6709,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -5617,6 +6725,10 @@ strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -5627,6 +6739,12 @@ strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +sugarss@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-1.0.0.tgz#65e51b3958432fb70d5451a68bb33e32d0cf1ef7" + dependencies: + postcss "^6.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -5637,6 +6755,12 @@ supports-color@^3.1.0, supports-color@^3.1.1, supports-color@^3.2.3: dependencies: has-flag "^1.0.0" +supports-color@^4.0.0, supports-color@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.0.tgz#ad986dc7eb2315d009b4d77c8169c2231a684037" + dependencies: + has-flag "^2.0.0" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -5653,7 +6777,7 @@ symbol-observable@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" -tapable@^0.2.3, tapable@~0.2.3: +tapable@^0.2.5, tapable@~0.2.5: version "0.2.6" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" @@ -5706,6 +6830,10 @@ through@2, through@X.X.X, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" +thunky@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e" + time-stamp@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" @@ -5714,20 +6842,26 @@ timed-out@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" -timed-out@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" - -timers-browserify@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" +timers-browserify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" dependencies: - process "~0.11.0" + setimmediate "^1.0.4" + +tiny-emitter@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.0.tgz#bad327adb1804b42a231afa741532bd884cd09ad" tmp@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.24.tgz#d6a5e198d14a9835cc6f2d7c3d9e302428c8cf12" +tmp@0.0.30: + version "0.0.30" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" + dependencies: + os-tmpdir "~1.0.1" + tmp@0.0.31, tmp@0.0.x: version "0.0.31" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" @@ -5742,7 +6876,40 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" -to-string-loader@^1.1.4: +to-fast-properties@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-2.1.0.tgz#e3ad3a40cfe119559a05aea43e4caefacc5e901d" + dependencies: + define-property "^0.2.5" + extend-shallow "^2.0.1" + regex-not "^0.1.1" + +to-regex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + dependencies: + define-property "^0.2.5" + extend-shallow "^2.0.1" + regex-not "^1.0.0" + +to-string-loader@1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/to-string-loader/-/to-string-loader-1.1.5.tgz#7b7aa17891b7bb4947a7a11bfb03b5fde9c6e695" dependencies: @@ -5768,79 +6935,80 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + ts-helpers@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/ts-helpers/-/ts-helpers-1.1.2.tgz#fc69be9f1f3baed01fb1a0ef8d4cfe748814d835" -ts-md5@^1.2.0: +ts-md5@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ts-md5/-/ts-md5-1.2.0.tgz#c30b385261bd27962f754509675f0e9578810569" -ts-node@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-1.7.2.tgz#d67bbc5c48fde16c244debbfe81b020587369a02" +ts-node@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-3.2.0.tgz#9814f0c0141784900cf12fef1197ad4b7f4d23d1" dependencies: arrify "^1.0.0" - chalk "^1.1.1" + chalk "^2.0.0" diff "^3.1.0" make-error "^1.1.1" minimist "^1.2.0" mkdirp "^0.5.1" - pinkie "^2.0.4" source-map-support "^0.4.0" - tsconfig "^5.0.2" + tsconfig "^6.0.0" v8flags "^2.0.11" - xtend "^4.0.0" - yn "^1.2.0" + yn "^2.0.0" -tsconfig@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-5.0.3.tgz#5f4278e701800967a8fc383fd19648878f2a6e3a" +tsconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-6.0.0.tgz#6b0e8376003d7af1864f8df8f89dd0059ffcd032" dependencies: - any-promise "^1.3.0" - parse-json "^2.2.0" - strip-bom "^2.0.0" + strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tsickle@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.1.7.tgz#bfe8f4cdcdaf9a40b84a729a38480c2f824f18ab" - dependencies: - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map "^0.4.2" - source-map-support "^0.3.1" - -tsickle@^0.2: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.2.6.tgz#ad4abf92e74ebdf3fb5aa187ca85b02066fe1a1b" +tsickle@^0.21.0: + version "0.21.6" + resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.21.6.tgz#53b01b979c5c13fdb13afb3fb958177e5991588d" dependencies: minimist "^1.2.0" mkdirp "^0.5.1" source-map "^0.5.6" source-map-support "^0.4.2" -tslint-loader@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.3.0.tgz#6e6a50fc82e85ff3d1cb53e23dd24ae9e47d91ea" +tslib@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec" + +tslint-loader@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.5.3.tgz#343f74122d94f356b689457d3f59f64a69ab606f" dependencies: - loader-utils "^0.2.7" + loader-utils "^1.0.2" mkdirp "^0.5.1" - object-assign "^4.0.1" + object-assign "^4.1.1" rimraf "^2.4.4" + semver "^5.3.0" -tslint@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.0.2.tgz#d43f24c0c1f826de7f3a097bb7808a8b4325feac" +tslint@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.1.0.tgz#51a47baeeb58956fcd617bd2cf00e2ef0eea2ed9" dependencies: + babel-code-frame "^6.22.0" colors "^1.1.2" - diff "^3.0.1" + diff "^3.2.0" findup-sync "~0.3.0" glob "^7.1.1" optimist "~0.6.0" - resolve "^1.1.7" - underscore.string "^3.3.4" - update-notifier "^1.0.2" + resolve "^1.3.2" + semver "^5.3.0" + tsutils "^1.4.0" + +tsutils@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" tty-browserify@0.0.0: version "0.0.0" @@ -5866,63 +7034,63 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@~1.6.13, type-is@~1.6.15: +type-is@~1.6.15: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" dependencies: media-typer "0.3.0" mime-types "~2.1.15" +typed-function@0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-0.10.5.tgz#2e0f18abd065219fab694a446a65c6d1981832c0" + typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typedoc-default-themes@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.4.4.tgz#abe997dcf17462b627438bc63b65c50d363c252f" +typedoc-default-themes@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.5.0.tgz#6dc2433e78ed8bea8e887a3acde2f31785bd6227" -typedoc@0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.5.7.tgz#f2998dbb5909cb3f02db5fecb85e2a4377189e2a" +typedoc@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.7.1.tgz#b441bffe246bb3e0e598d9ae474e743594bda769" dependencies: - "@types/fs-extra" "0.0.33" + "@types/fs-extra" "^3.0.0" "@types/handlebars" "^4.0.31" "@types/highlight.js" "^9.1.8" "@types/lodash" "^4.14.37" "@types/marked" "0.0.28" "@types/minimatch" "^2.0.29" - "@types/shelljs" "^0.3.32" - fs-extra "^2.0.0" - handlebars "4.0.5" + "@types/shelljs" "^0.7.0" + fs-extra "^3.0.0" + handlebars "^4.0.6" highlight.js "^9.0.0" lodash "^4.13.1" marked "^0.3.5" minimatch "^3.0.0" - progress "^1.1.8" + progress "^2.0.0" shelljs "^0.7.0" - typedoc-default-themes "^0.4.2" - typescript "2.1.6" + typedoc-default-themes "^0.5.0" + typescript "2.3.2" -typescript@2.0.10, typescript@~2.0.3: - version "2.0.10" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.0.10.tgz#ccdd4ed86fd5550a407101a0814012e1b3fac3dd" - -typescript@2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.1.6.tgz#40c7e6e9e5da7961b7718b55505f9cac9487a607" +typescript@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.2.tgz#f0f045e196f69a72f06b25fd3bd39d01c3ce9984" -typescript@^2.1.6: - version "2.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.3.tgz#9639f3c3b40148e8ca97fe08a51dd1891bb6be22" +typescript@2.4.1, typescript@^2.1.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.1.tgz#c3ccb16ddaa0b2314de031e7e6fee89e5ba346bc" -uglify-js@3.0.x: - version "3.0.11" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.11.tgz#81f594b9a24dad76e39da92f8f06e5b3bc8c2e11" +uglify-js@3.0.x, uglify-js@^3.0.9: + version "3.0.24" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.24.tgz#ee93400ad9857fb7a1671778db83f6a23f033121" dependencies: commander "~2.9.0" source-map "~0.5.1" -uglify-js@^2.6, uglify-js@^2.6.1: +uglify-js@^2.6, uglify-js@^2.8.27: version "2.8.27" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c" dependencies: @@ -5931,15 +7099,6 @@ uglify-js@^2.6, uglify-js@^2.6.1: optionalDependencies: uglify-to-browserify "~1.0.0" -uglify-js@~2.7.3: - version "2.7.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" @@ -5948,21 +7107,40 @@ uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" +uid-safe@~2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.4.tgz#3ad6f38368c6d4c8c75ec17623fb79aa1d071d81" + dependencies: + random-bytes "~1.0.0" + ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +ultron@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864" + undefsafe@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" -underscore.string@3.3.4, underscore.string@^3.3.4: +underscore.string@3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" dependencies: sprintf-js "^1.0.3" util-deprecate "^1.0.2" +union-value@^0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-0.2.4.tgz#7375152786679057e7b37aa676e83468fc0274f0" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + union@~0.4.3: version "0.4.6" resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0" @@ -5983,13 +7161,27 @@ uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" +units-css@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/units-css/-/units-css-0.4.0.tgz#d6228653a51983d7c16ff28f8b9dc3b1ffed3a07" + dependencies: + isnumeric "^0.2.0" + viewport-dimensions "^0.2.0" + +universalify@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.0.tgz#9eb1c4651debcc670cc94f1a75762332bb967778" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" -unzip-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" +unset-value@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-0.1.2.tgz#506810b867f27c2a5a6e9b04833631f6de58d310" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" update-notifier@0.5.0: version "0.5.0" @@ -6003,19 +7195,6 @@ update-notifier@0.5.0: semver-diff "^2.0.0" string-length "^1.0.0" -update-notifier@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a" - dependencies: - boxen "^0.6.0" - chalk "^1.0.0" - configstore "^2.0.0" - is-npm "^1.0.0" - latest-version "^2.0.0" - lazy-req "^1.1.0" - semver-diff "^2.0.0" - xdg-basedir "^2.0.0" - upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" @@ -6024,15 +7203,9 @@ urix@^0.1.0, urix@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" -url-join@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" +url-join@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.2.tgz#c072756967ad24b8b59e5741551caac78f50b8b7" url-parse@1.0.x: version "1.0.5" @@ -6055,13 +7228,21 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + dependencies: + define-property "^0.2.5" + isobject "^3.0.0" + lazy-cache "^2.0.2" + user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" useragent@^2.1.12: - version "2.1.13" - resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c10" + version "2.2.0" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.0.tgz#ef85f41903cfd05e2ba8c11ae61249c7a6bbf663" dependencies: lru-cache "2.2.x" tmp "0.0.x" @@ -6096,10 +7277,6 @@ uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" -v8-lazy-parse-webpack-plugin@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/v8-lazy-parse-webpack-plugin/-/v8-lazy-parse-webpack-plugin-0.3.0.tgz#0f93cf1efbc48cbde3d6e027932e40c7a9d180d7" - v8flags@^2.0.11: version "2.1.1" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" @@ -6117,7 +7294,7 @@ vargs@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff" -vary@~1.1.0: +vary@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" @@ -6131,6 +7308,10 @@ verror@1.3.6: dependencies: extsprintf "1.0.2" +viewport-dimensions@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/viewport-dimensions/-/viewport-dimensions-0.2.0.tgz#de740747db5387fd1725f5175e91bac76afdf36c" + vinyl@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" @@ -6157,7 +7338,7 @@ walkdir@^0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" -watchpack@^1.0.0: +watchpack@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" dependencies: @@ -6172,8 +7353,8 @@ wbuf@^1.1.0, wbuf@^1.7.2: minimalistic-assert "^1.0.0" wd@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/wd/-/wd-1.2.0.tgz#4112c4657eca5af593ebc060d54b80caeea04807" + version "1.3.0" + resolved "https://registry.yarnpkg.com/wd/-/wd-1.3.0.tgz#fdbdfbe192805b1cbd7943375642f06d990bccef" dependencies: archiver "1.3.0" async "2.0.1" @@ -6184,9 +7365,16 @@ wd@^1.0.0: underscore.string "3.3.4" vargs "0.1.0" -webdriver-manager@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-10.3.0.tgz#99314588a0b1dbe688c441d74288c6cb1875fa8b" +webdriver-js-extender@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz#81c533a9e33d5bfb597b4e63e2cdb25b54777515" + dependencies: + "@types/selenium-webdriver" "^2.53.35" + selenium-webdriver "^2.53.2" + +webdriver-manager@^12.0.6: + version "12.0.6" + resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.0.6.tgz#3df1a481977010b4cbf8c9d85c7a577828c0e70b" dependencies: adm-zip "^0.4.7" chalk "^1.1.1" @@ -6198,65 +7386,68 @@ webdriver-manager@^10.3.0: request "^2.78.0" rimraf "^2.5.2" semver "^5.3.0" + xml2js "^0.4.17" -webfontloader@1.6.27: - version "1.6.27" - resolved "https://registry.yarnpkg.com/webfontloader/-/webfontloader-1.6.27.tgz#c3899649b0653aa57d0a23388f82409e0df224ba" +webfontloader@1.6.28: + version "1.6.28" + resolved "https://registry.yarnpkg.com/webfontloader/-/webfontloader-1.6.28.tgz#db786129253cb6e8eae54c2fb05f870af6675bae" -webpack-bundle-analyzer@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-1.4.1.tgz#9653994070993181c1e29d013218ecb5e35a27bb" +webpack-bundle-analyzer@2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.8.2.tgz#8b6240c29a9d63bc72f09d920fb050adbcce9fe8" dependencies: - acorn "^4.0.3" + acorn "^5.0.3" chalk "^1.1.3" commander "^2.9.0" - ejs "^2.5.2" - express "^4.14.0" - filesize "^3.3.0" - lodash "^4.16.4" + ejs "^2.5.6" + express "^4.15.2" + filesize "^3.5.9" + gzip-size "^3.0.0" + lodash "^4.17.4" mkdirp "^0.5.1" - opener "^1.4.2" + opener "^1.4.3" + ws "^2.3.1" -webpack-dev-middleware@1.9.0, webpack-dev-middleware@^1.0.11, webpack-dev-middleware@^1.4.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.9.0.tgz#a1c67a3dfd8a5c5d62740aa0babe61758b4c84aa" +webpack-dev-middleware@1.11.0, webpack-dev-middleware@^1.0.11, webpack-dev-middleware@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.11.0.tgz#09691d0973a30ad1f82ac73a12e2087f0a4754f9" dependencies: memory-fs "~0.4.1" mime "^1.3.4" path-is-absolute "^1.0.0" range-parser "^1.0.3" -webpack-dev-server@2.1.0-beta.11: - version "2.1.0-beta.11" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.1.0-beta.11.tgz#5a1e11590bf9e520ea8a559ee436779125647c28" +webpack-dev-server@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.5.1.tgz#a02e726a87bb603db5d71abb7d6d2649bf10c769" dependencies: + 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" - http-proxy-middleware "~0.17.1" + 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.1" + sockjs-client "1.1.2" spdy "^3.4.1" strip-ansi "^3.0.0" supports-color "^3.1.1" - webpack-dev-middleware "^1.4.0" + webpack-dev-middleware "^1.11.0" yargs "^6.0.0" -webpack-merge@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-1.1.1.tgz#2816dce279f38fe05d62b6411144b7638553e61c" +webpack-merge@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.0.tgz#6ad72223b3e0b837e531e4597c199f909361511e" dependencies: - lodash.clonedeep "^4.5.0" - lodash.differencewith "^4.5.0" - lodash.isequal "^4.4.0" - lodash.isfunction "^3.0.8" - lodash.isplainobject "^4.0.6" - lodash.mergewith "^4.6.0" - lodash.unionwith "^4.6.0" + lodash "^4.17.4" webpack-sources@^0.1.0: version "0.1.5" @@ -6265,28 +7456,37 @@ webpack-sources@^0.1.0: source-list-map "~0.1.7" source-map "~0.5.3" -webpack@2.1.0-beta.27: - version "2.1.0-beta.27" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.1.0-beta.27.tgz#06cb802e44118159e46b7533ae76b0d84c8c89d8" +webpack-sources@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" dependencies: - acorn "^4.0.3" + source-list-map "^1.1.1" + source-map "~0.5.3" + +webpack@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.6.1.tgz#2e0457f0abb1ac5df3ab106c69c672f236785f07" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" ajv "^4.7.0" ajv-keywords "^1.1.1" async "^2.1.2" - enhanced-resolve "^2.2.0" + enhanced-resolve "^3.0.0" interpret "^1.0.0" - loader-runner "^2.2.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" loader-utils "^0.2.16" - memory-fs "~0.3.0" + memory-fs "~0.4.1" mkdirp "~0.5.0" - node-libs-browser "^1.0.0" - object-assign "^4.0.1" + node-libs-browser "^2.0.0" source-map "^0.5.3" supports-color "^3.1.0" - tapable "~0.2.3" - uglify-js "~2.7.3" - watchpack "^1.0.0" - webpack-sources "^0.1.0" + tapable "~0.2.5" + uglify-js "^2.8.27" + watchpack "^1.3.1" + webpack-sources "^0.2.3" yargs "^6.0.0" websocket-driver@>=0.5.1: @@ -6307,7 +7507,11 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@1, which@^1.1.1, which@^1.2.1, which@^1.2.9, which@~1.2.10: +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.1.1, which@^1.2.1, which@^1.2.4, which@^1.2.9, which@~1.2.10: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" dependencies: @@ -6319,20 +7523,10 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" -widest-line@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" - dependencies: - string-width "^1.0.1" - window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -6364,19 +7558,19 @@ write-file-atomic@^1.1.2: imurmurhash "^0.1.4" slide "^1.1.5" -ws@1.1.2: +ws@1.1.2, ws@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" dependencies: options ">=0.0.5" ultron "1.0.x" -ws@^1.0.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.4.tgz#57f40d036832e5f5055662a397c4de76ed66bf61" +ws@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-2.3.1.tgz#6b94b3e447cb6a363f785eaf94af6359e8e81c80" dependencies: - options ">=0.0.5" - ultron "1.0.x" + safe-buffer "~5.0.1" + ultron "~1.1.0" wtf-8@1.0.0: version "1.0.0" @@ -6388,7 +7582,7 @@ xdg-basedir@^2.0.0: dependencies: os-homedir "^1.0.0" -xhr2@^0.1.3: +xhr2@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" @@ -6403,9 +7597,18 @@ xml2js@0.4.4: sax "0.6.x" xmlbuilder ">=1.0.0" -xmlbuilder@>=1.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.0.tgz#a9311b3f8509345700c49a8f79be06bcc5988d18" +xml2js@^0.4.17: + version "0.4.17" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.17.tgz#17be93eaae3f3b779359c795b419705a8817e868" + dependencies: + sax ">=0.6.0" + xmlbuilder "^4.1.0" + +xmlbuilder@>=1.0.0, xmlbuilder@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5" + dependencies: + lodash "^4.0.0" xmlhttprequest-ssl@1.5.3: version "1.5.3" @@ -6423,13 +7626,6 @@ yallist@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" @@ -6442,24 +7638,11 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - 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.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" + camelcase "^4.1.0" yargs@^6.0.0: version "6.6.0" @@ -6497,6 +7680,24 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" +yargs@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.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" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" @@ -6516,21 +7717,19 @@ yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" -yn@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-1.3.0.tgz#1b0812abb8d805d48966f8df385dc9dacc9a19d8" - dependencies: - object-assign "^4.1.1" +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" zip-stream@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.1.1.tgz#5216b48bbb4d2651f64d5c6e6f09eb4a7399d557" + version "1.2.0" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" dependencies: archiver-utils "^1.3.0" - compress-commons "^1.1.0" + compress-commons "^1.2.0" lodash "^4.8.0" readable-stream "^2.0.0" -zone.js@0.6.26: - version "0.6.26" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.6.26.tgz#067c13b8b80223a89b62e9dc82680f09762c4636" +zone.js@0.8.12: + version "0.8.12" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.12.tgz#86ff5053c98aec291a0bf4bbac501d694a05cfbb" From d131e1cab5350d591dc8213f9ded3eef939210e6 Mon Sep 17 00:00:00 2001 From: William Welling Date: Wed, 12 Jul 2017 14:51:04 -0500 Subject: [PATCH 02/29] fixed pagination component spec, linting wip --- .../pagination/pagination.component.spec.ts | 206 ++++++++++-------- src/app/shared/testing/active-router-stub.ts | 7 +- src/app/shared/testing/test.component.ts | 28 --- 3 files changed, 120 insertions(+), 121 deletions(-) delete mode 100644 src/app/shared/testing/test.component.ts diff --git a/src/app/shared/pagination/pagination.component.spec.ts b/src/app/shared/pagination/pagination.component.spec.ts index 8f1b5836a78..d922e44cb01 100644 --- a/src/app/shared/pagination/pagination.component.spec.ts +++ b/src/app/shared/pagination/pagination.component.spec.ts @@ -1,7 +1,12 @@ -// ... test imports // Load the implementations that should be tested import { CommonModule } from '@angular/common'; +import { + Component, + CUSTOM_ELEMENTS_SCHEMA, + DebugElement +} from '@angular/core'; + import { async, ComponentFixture, @@ -9,61 +14,54 @@ import { TestBed, fakeAsync, tick } from '@angular/core/testing'; -import { - Component, - CUSTOM_ELEMENTS_SCHEMA, - DebugElement -} from '@angular/core'; +import { RouterTestingModule } from '@angular/router/testing'; import { ActivatedRoute, Router } from '@angular/router'; import { By } from '@angular/platform-browser'; -import { RouterTestingModule } from '@angular/router/testing'; - import { Observable } from 'rxjs/Observable'; -import Spy = jasmine.Spy; - import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import { StoreModule } from '@ngrx/store'; import { Ng2PaginationModule } from 'ng2-pagination'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import Spy = jasmine.Spy; + import { PaginationComponent } from './pagination.component'; import { PaginationComponentOptions } from './pagination-component-options.model'; -import { MockTranslateLoader } from '../testing/mock-translate-loader'; - -import { GLOBAL_CONFIG, ENV_CONFIG } from '../../../config'; +import { MockTranslateLoader } from '../testing/mock-translate-loader'; +import { HostWindowServiceStub } from '../testing/host-window-service-stub'; import { ActivatedRouteStub } from '../testing/active-router-stub'; import { RouterStub } from '../testing/router-stub'; + import { HostWindowService } from '../host-window.service'; import { EnumKeysPipe } from '../utils/enum-keys-pipe'; import { SortOptions } from '../../core/cache/models/sort-options.model'; -import { TestComponent } from '../testing/test.component'; -import { HostWindowServiceStub } from '../testing/host-window-service-stub'; +import { GLOBAL_CONFIG, ENV_CONFIG } from '../../../config'; function createTestComponent(html: string, type: { new (...args: any[]): T }): ComponentFixture { TestBed.overrideComponent(type, { set: { template: html } }); - const fixture = TestBed.createComponent(type); + let fixture = TestBed.createComponent(type); fixture.detectChanges(); return fixture as ComponentFixture; } function expectPages(fixture: ComponentFixture, pagesDef: string[]): void { - const de = fixture.debugElement.query(By.css('.pagination')); - const pages = de.nativeElement.querySelectorAll('li'); + let de = fixture.debugElement.query(By.css('.pagination')); + let pages = de.nativeElement.querySelectorAll('li'); expect(pages.length).toEqual(pagesDef.length); for (let i = 0; i < pagesDef.length; i++) { - const pageDef = pagesDef[i]; - const classIndicator = pageDef.charAt(0); + let pageDef = pagesDef[i]; + let classIndicator = pageDef.charAt(0); if (classIndicator === '+') { expect(pages[i].classList.contains('active')).toBeTruthy(); @@ -88,16 +86,18 @@ function expectPages(fixture: ComponentFixture, pagesDef: string[]): void { } function changePageSize(fixture: ComponentFixture, pageSize: string): void { - const buttonEl = fixture.nativeElement.querySelector('#paginationControls'); + let buttonEl = fixture.nativeElement.querySelector('#paginationControls'); + let activatedRouteStub: ActivatedRouteStub; + let routerStub: RouterStub; buttonEl.click(); - const dropdownMenu = fixture.debugElement.query(By.css('#paginationControlsDropdownMenu')); - const buttons = dropdownMenu.nativeElement.querySelectorAll('button'); + let dropdownMenu = fixture.debugElement.query(By.css('#paginationControlsDropdownMenu')); + let buttons = dropdownMenu.nativeElement.querySelectorAll('button'); - for (const button of buttons) { - if (button.textContent.trim() === pageSize) { - button.click(); + for (let i = 0; i < buttons.length; i++) { + if (buttons[i].textContent.trim() == pageSize) { + buttons[i].click(); fixture.detectChanges(); break; } @@ -105,8 +105,8 @@ function changePageSize(fixture: ComponentFixture, pageSize: string): void } function changePage(fixture: ComponentFixture, idx: number): void { - const de = fixture.debugElement.query(By.css('.pagination')); - const buttons = de.nativeElement.querySelectorAll('li'); + let de = fixture.debugElement.query(By.css('.pagination')); + let buttons = de.nativeElement.querySelectorAll('li'); buttons[idx].querySelector('a').click(); fixture.detectChanges(); @@ -119,16 +119,19 @@ function normalizeText(txt: string): string { describe('Pagination component', () => { + let fixture: ComponentFixture; + let comp: PaginationComponent; let testComp: TestComponent; let testFixture: ComponentFixture; + let de: DebugElement; let html; let hostWindowServiceStub: HostWindowServiceStub; let activatedRouteStub: ActivatedRouteStub; let routerStub: RouterStub; - // Define initial state and test state - const _initialState = { width: 1600, height: 770 }; + //Define initial state and test state + let _initialState = { width: 1600, height: 770 }; // async beforeEach beforeEach(async(() => { @@ -247,64 +250,87 @@ describe('Pagination component', () => { expect(testComp.pageSizeChanged).toHaveBeenCalledWith(5); })); - // it('should set correct route parameters', fakeAsync(() => { - // let paginationComponent: PaginationComponent = testFixture.debugElement.query(By.css('ds-pagination')).references['p']; - // routerStub = testFixture.debugElement.injector.get(Router); - // - // testComp.collectionSize = 60; - // - // changePage(testFixture, 3); - // tick(); - // expect(routerStub.navigate).toHaveBeenCalledWith([], { queryParams: { pageId: 'test', page: 3, pageSize: 10, sortDirection: 0, sortField: 'name' } }); - // expect(paginationComponent.currentPage).toEqual(3); - // - // changePageSize(testFixture, '20'); - // tick(); - // expect(routerStub.navigate).toHaveBeenCalledWith([], { queryParams: { pageId: 'test', page: 3, pageSize: 20, sortDirection: 0, sortField: 'name' } }); - // expect(paginationComponent.pageSize).toEqual(20); - // })); - - // it('should get parameters from route', () => { - // - // activatedRouteStub = testFixture.debugElement.injector.get(ActivatedRoute); - // activatedRouteStub.testParams = { - // pageId: 'test', - // page: 2, - // pageSize: 20 - // }; - // - // testFixture.detectChanges(); - // - // expectPages(testFixture, ['« Previous', '1', '+2', '3', '4', '5', '» Next']); - // expect(testComp.paginationOptions.currentPage).toEqual(2); - // expect(testComp.paginationOptions.pageSize).toEqual(20); - // - // activatedRouteStub.testParams = { - // pageId: 'test', - // page: 3, - // pageSize: 40 - // }; - // - // testFixture.detectChanges(); - // - // expectPages(testFixture, ['« Previous', '1', '2', '+3', '-» Next']); - // expect(testComp.paginationOptions.currentPage).toEqual(3); - // expect(testComp.paginationOptions.pageSize).toEqual(40); - // }); - - // it('should respond to windows resize', () => { - // let paginationComponent: PaginationComponent = testFixture - // .debugElement.query(By.css('ds-pagination')).references['p']; - // hostWindowServiceStub = testFixture.debugElement.injector.get(HostWindowService); - // - // hostWindowServiceStub.setWidth(400); - // - // hostWindowServiceStub.isXs().subscribe((status) => { - // paginationComponent.isXs = status; - // testFixture.detectChanges(); - // expectPages(testFixture, ['-« Previous', '+1', '2', '3', '4', '5', '-...', '10', '» Next']); - // de = testFixture.debugElement.query(By.css('ul.pagination')); - // expect(de.nativeElement.classList.contains('pagination-sm')).toBeTruthy(); - // }); - // }); + it('should set correct route parameters', fakeAsync(() => { + let paginationComponent: PaginationComponent = testFixture.debugElement.query(By.css('ds-pagination')).references['p']; + routerStub = testFixture.debugElement.injector.get(Router); + + testComp.collectionSize = 60; + + changePage(testFixture, 3); + tick(); + expect(routerStub.navigate).toHaveBeenCalledWith([], { queryParams: { pageId: 'test', page: 3, pageSize: 10, sortDirection: 0, sortField: 'name' } }); + expect(paginationComponent.currentPage).toEqual(3); + + changePageSize(testFixture, '20'); + tick(); + expect(routerStub.navigate).toHaveBeenCalledWith([], { queryParams: { pageId: 'test', page: 3, pageSize: 20, sortDirection: 0, sortField: 'name' } }); + expect(paginationComponent.pageSize).toEqual(20); + })); + + it('should get parameters from route', () => { + + activatedRouteStub = testFixture.debugElement.injector.get(ActivatedRoute); + activatedRouteStub.testParams = { + pageId: 'test', + page: 2, + pageSize: 20 + }; + + testFixture.detectChanges(); + + expectPages(testFixture, ['« Previous', '1', '+2', '3', '4', '5', '» Next']); + expect(testComp.paginationOptions.currentPage).toEqual(2); + expect(testComp.paginationOptions.pageSize).toEqual(20); + + activatedRouteStub.testParams = { + pageId: 'test', + page: 3, + pageSize: 40 + }; + + testFixture.detectChanges(); + + expectPages(testFixture, ['« Previous', '1', '2', '+3', '-» Next']); + expect(testComp.paginationOptions.currentPage).toEqual(3); + expect(testComp.paginationOptions.pageSize).toEqual(40); + }); + + it('should respond to windows resize', () => { + let paginationComponent: PaginationComponent = testFixture.debugElement.query(By.css('ds-pagination')).references['p']; + hostWindowServiceStub = testFixture.debugElement.injector.get(HostWindowService); + + hostWindowServiceStub.setWidth(400); + + hostWindowServiceStub.isXs().subscribe((status) => { + paginationComponent.isXs = status; + testFixture.detectChanges(); + expectPages(testFixture, ['-« Previous', '+1', '2', '3', '4', '5', '-...', '10', '» Next']); + de = testFixture.debugElement.query(By.css('ul.pagination')); + expect(de.nativeElement.classList.contains('pagination-sm')).toBeTruthy(); + }); + }); }); + +// declare a test component +@Component({ selector: 'ds-test-cmp', template: '' }) +class TestComponent { + + collection: string[] = []; + collectionSize: number; + paginationOptions = new PaginationComponentOptions(); + sortOptions = new SortOptions(); + + constructor() { + this.collection = Array.from(new Array(100), (x, i) => `item ${i + 1}`); + this.collectionSize = 100; + this.paginationOptions.id = 'test'; + } + + pageChanged(page) { + this.paginationOptions.currentPage = page; + } + + pageSizeChanged(pageSize) { + this.paginationOptions.pageSize = pageSize; + } +} diff --git a/src/app/shared/testing/active-router-stub.ts b/src/app/shared/testing/active-router-stub.ts index ebbf0cea437..9959f382923 100644 --- a/src/app/shared/testing/active-router-stub.ts +++ b/src/app/shared/testing/active-router-stub.ts @@ -4,13 +4,14 @@ import { BehaviorSubject } from 'rxjs/BehaviorSubject'; export class ActivatedRouteStub { + private _testParams?: any; + // ActivatedRoute.params is Observable - private subject = new BehaviorSubject(this.testParams); + private subject?: BehaviorSubject = new BehaviorSubject(this.testParams); + params = this.subject.asObservable(); queryParams = this.subject.asObservable(); - private _testParams: {}; - constructor(params?: Params) { if (params) { this.testParams = params; diff --git a/src/app/shared/testing/test.component.ts b/src/app/shared/testing/test.component.ts deleted file mode 100644 index c55791099b3..00000000000 --- a/src/app/shared/testing/test.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component } from '@angular/core'; - -import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; -import { SortOptions } from '../../core/cache/models/sort-options.model'; - -// declare a test component -@Component({ selector: 'ds-test-cmp', template: '' }) -export class TestComponent { - - collection: string[] = []; - collectionSize: number; - paginationOptions = new PaginationComponentOptions(); - sortOptions = new SortOptions(); - - constructor() { - this.collection = Array.from(new Array(100), (x, i) => `item ${i + 1}`); - this.collectionSize = 100; - this.paginationOptions.id = 'test'; - } - - pageChanged(page) { - this.paginationOptions.currentPage = page; - } - - pageSizeChanged(pageSize) { - this.paginationOptions.pageSize = pageSize; - } -} From 8ba69590c8cac9744a595aeda90cb740c5576f4e Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 13 Jul 2017 07:32:42 -0500 Subject: [PATCH 03/29] updated environment config comments --- config/environment.default.js | 4 ++-- config/environment.test.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/environment.default.js b/config/environment.default.js index 3db04aafa9e..eb29f82d77c 100644 --- a/config/environment.default.js +++ b/config/environment.default.js @@ -1,5 +1,5 @@ module.exports = { - // Angular2 UI server settings. + // Angular Universal server settings. ui: { ssl: false, host: 'localhost', @@ -16,7 +16,7 @@ module.exports = { nameSpace: '/dspace-spring-rest/api' }, cache: { - // how long should objects be cached for by default + // NOTE: how long should objects be cached for by default msToLive: 15 * 60 * 1000, // 15 minute control: 'max-age=60' // revalidate browser }, diff --git a/config/environment.test.js b/config/environment.test.js index 02f8004fdef..dc8e20e4a83 100644 --- a/config/environment.test.js +++ b/config/environment.test.js @@ -1,5 +1,5 @@ module.exports = { - // Angular2 UI server settings. + // Angular Universal server settings. ui: { ssl: false, host: 'localhost', @@ -16,7 +16,7 @@ module.exports = { nameSpace: '/dspace-spring-rest/api' }, cache: { - // how long should objects be cached for by default + // NOTE: how long should objects be cached for by default msToLive: 15 * 60 * 1000, // 15 minute control: 'max-age=60' // revalidate browser }, From 8a0eb1a88b44146d8fbdc854041934088f067948 Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 13 Jul 2017 07:33:02 -0500 Subject: [PATCH 04/29] fixed linting in pagination component spec --- .../pagination/pagination.component.spec.ts | 44 +++++++++---------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/app/shared/pagination/pagination.component.spec.ts b/src/app/shared/pagination/pagination.component.spec.ts index d922e44cb01..ec298548f1d 100644 --- a/src/app/shared/pagination/pagination.component.spec.ts +++ b/src/app/shared/pagination/pagination.component.spec.ts @@ -47,21 +47,21 @@ function createTestComponent(html: string, type: { new (...args: any[]): T }) TestBed.overrideComponent(type, { set: { template: html } }); - let fixture = TestBed.createComponent(type); + const fixture = TestBed.createComponent(type); fixture.detectChanges(); return fixture as ComponentFixture; } function expectPages(fixture: ComponentFixture, pagesDef: string[]): void { - let de = fixture.debugElement.query(By.css('.pagination')); - let pages = de.nativeElement.querySelectorAll('li'); + const de = fixture.debugElement.query(By.css('.pagination')); + const pages = de.nativeElement.querySelectorAll('li'); expect(pages.length).toEqual(pagesDef.length); for (let i = 0; i < pagesDef.length; i++) { - let pageDef = pagesDef[i]; - let classIndicator = pageDef.charAt(0); + const pageDef = pagesDef[i]; + const classIndicator = pageDef.charAt(0); if (classIndicator === '+') { expect(pages[i].classList.contains('active')).toBeTruthy(); @@ -86,18 +86,16 @@ function expectPages(fixture: ComponentFixture, pagesDef: string[]): void { } function changePageSize(fixture: ComponentFixture, pageSize: string): void { - let buttonEl = fixture.nativeElement.querySelector('#paginationControls'); - let activatedRouteStub: ActivatedRouteStub; - let routerStub: RouterStub; + const buttonEl = fixture.nativeElement.querySelector('#paginationControls'); buttonEl.click(); - let dropdownMenu = fixture.debugElement.query(By.css('#paginationControlsDropdownMenu')); - let buttons = dropdownMenu.nativeElement.querySelectorAll('button'); + const dropdownMenu = fixture.debugElement.query(By.css('#paginationControlsDropdownMenu')); + const buttons = dropdownMenu.nativeElement.querySelectorAll('button'); - for (let i = 0; i < buttons.length; i++) { - if (buttons[i].textContent.trim() == pageSize) { - buttons[i].click(); + for (const button of buttons) { + if (button.textContent.trim() === pageSize) { + button.click(); fixture.detectChanges(); break; } @@ -105,8 +103,8 @@ function changePageSize(fixture: ComponentFixture, pageSize: string): void } function changePage(fixture: ComponentFixture, idx: number): void { - let de = fixture.debugElement.query(By.css('.pagination')); - let buttons = de.nativeElement.querySelectorAll('li'); + const de = fixture.debugElement.query(By.css('.pagination')); + const buttons = de.nativeElement.querySelectorAll('li'); buttons[idx].querySelector('a').click(); fixture.detectChanges(); @@ -119,8 +117,6 @@ function normalizeText(txt: string): string { describe('Pagination component', () => { - let fixture: ComponentFixture; - let comp: PaginationComponent; let testComp: TestComponent; let testFixture: ComponentFixture; let de: DebugElement; @@ -130,8 +126,8 @@ describe('Pagination component', () => { let activatedRouteStub: ActivatedRouteStub; let routerStub: RouterStub; - //Define initial state and test state - let _initialState = { width: 1600, height: 770 }; + // Define initial state and test state + const _initialState = { width: 1600, height: 770 }; // async beforeEach beforeEach(async(() => { @@ -251,8 +247,8 @@ describe('Pagination component', () => { })); it('should set correct route parameters', fakeAsync(() => { - let paginationComponent: PaginationComponent = testFixture.debugElement.query(By.css('ds-pagination')).references['p']; - routerStub = testFixture.debugElement.injector.get(Router); + const paginationComponent: PaginationComponent = testFixture.debugElement.query(By.css('ds-pagination')).references.p; + routerStub = testFixture.debugElement.injector.get(Router) as any; testComp.collectionSize = 60; @@ -269,7 +265,7 @@ describe('Pagination component', () => { it('should get parameters from route', () => { - activatedRouteStub = testFixture.debugElement.injector.get(ActivatedRoute); + activatedRouteStub = testFixture.debugElement.injector.get(ActivatedRoute) as any;; activatedRouteStub.testParams = { pageId: 'test', page: 2, @@ -296,8 +292,8 @@ describe('Pagination component', () => { }); it('should respond to windows resize', () => { - let paginationComponent: PaginationComponent = testFixture.debugElement.query(By.css('ds-pagination')).references['p']; - hostWindowServiceStub = testFixture.debugElement.injector.get(HostWindowService); + const paginationComponent: PaginationComponent = testFixture.debugElement.query(By.css('ds-pagination')).references.p; + hostWindowServiceStub = testFixture.debugElement.injector.get(HostWindowService) as any; hostWindowServiceStub.setWidth(400); From ff934d048b6df64172b969ce82c1c83c85df0c1d Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 13 Jul 2017 07:47:22 -0500 Subject: [PATCH 05/29] upgraded to ngx-pagination --- package.json | 10 +++--- src/app/app.component.ts | 7 ++-- .../pagination/pagination.component.spec.ts | 26 +++++++++----- .../shared/pagination/pagination.component.ts | 3 -- src/app/shared/shared.module.ts | 4 +-- yarn.lock | 36 +++++++++---------- 6 files changed, 48 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index fc5366e8d50..a5db0b77a2d 100644 --- a/package.json +++ b/package.json @@ -102,19 +102,19 @@ "jsonschema": "1.1.1", "methods": "1.1.2", "morgan": "1.8.2", - "ng2-pagination": "2.0.2", + "ngx-pagination": "3.0.1", "pem": "1.9.7", "reflect-metadata": "0.1.10", "rxjs": "5.4.2", "ts-md5": "1.2.0", "webfontloader": "1.6.28", - "zone.js": "0.8.12" + "zone.js": "0.8.13" }, "devDependencies": { "@angular/compiler": "4.2.6", "@angular/compiler-cli": "4.2.6", "@ngrx/store-devtools": "3.2.4", - "@ngtools/webpack": "1.5.0", + "@ngtools/webpack": "1.5.1", "@types/cookie-parser": "1.3.30", "@types/deep-freeze": "0.1.1", "@types/express": "4.0.36", @@ -172,7 +172,7 @@ "raw-loader": "0.5.1", "resolve-url-loader": "2.1.0", "rimraf": "2.6.1", - "rollup": "0.45.1", + "rollup": "0.45.2", "rollup-plugin-commonjs": "8.0.2", "rollup-plugin-node-globals": "1.1.0", "rollup-plugin-node-resolve": "3.0.0", @@ -189,7 +189,7 @@ "typedoc": "0.7.1", "typescript": "2.4.1", "webpack": "2.6.1", - "webpack-bundle-analyzer": "2.8.2", + "webpack-bundle-analyzer": "2.8.3", "webpack-dev-middleware": "1.11.0", "webpack-dev-server": "2.5.1", "webpack-merge": "4.1.0" diff --git a/src/app/app.component.ts b/src/app/app.component.ts index cde9e977e69..e1fdbf6edb9 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,10 +1,12 @@ import { + ChangeDetectionStrategy, Component, Inject, ViewEncapsulation, OnInit, HostListener } from "@angular/core"; + import { TranslateService } from "@ngx-translate/core"; import { Store } from "@ngrx/store"; @@ -21,9 +23,10 @@ import { GLOBAL_CONFIG, GlobalConfig } from '../config'; @Component({ selector: 'ds-app', - encapsulation: ViewEncapsulation.None, templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] + styleUrls: ['./app.component.scss'], + changeDetection: ChangeDetectionStrategy.Default, + encapsulation: ViewEncapsulation.None }) export class AppComponent implements OnInit { diff --git a/src/app/shared/pagination/pagination.component.spec.ts b/src/app/shared/pagination/pagination.component.spec.ts index ec298548f1d..4f9aa17e473 100644 --- a/src/app/shared/pagination/pagination.component.spec.ts +++ b/src/app/shared/pagination/pagination.component.spec.ts @@ -24,7 +24,8 @@ import { Observable } from 'rxjs/Observable'; import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import { StoreModule } from '@ngrx/store'; -import { Ng2PaginationModule } from 'ng2-pagination'; +import { NgxPaginationModule } from 'ngx-pagination'; + import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import Spy = jasmine.Spy; @@ -136,16 +137,25 @@ describe('Pagination component', () => { hostWindowServiceStub = new HostWindowServiceStub(_initialState.width); TestBed.configureTestingModule({ - imports: [CommonModule, StoreModule.provideStore({}), TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useClass: MockTranslateLoader - } - }), Ng2PaginationModule, NgbModule.forRoot(), + imports: [ + CommonModule, + StoreModule.provideStore({}), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: MockTranslateLoader + } + }), + NgxPaginationModule, + NgbModule.forRoot(), RouterTestingModule.withRoutes([ { path: 'home', component: TestComponent } ])], - declarations: [PaginationComponent, TestComponent, EnumKeysPipe], // declare the test component + declarations: [ + PaginationComponent, + TestComponent, + EnumKeysPipe + ], // declare the test component providers: [ { provide: ActivatedRoute, useValue: activatedRouteStub }, { provide: GLOBAL_CONFIG, useValue: ENV_CONFIG }, diff --git a/src/app/shared/pagination/pagination.component.ts b/src/app/shared/pagination/pagination.component.ts index 19d01f62a0d..2192ae33676 100644 --- a/src/app/shared/pagination/pagination.component.ts +++ b/src/app/shared/pagination/pagination.component.ts @@ -18,9 +18,6 @@ import { isNumeric } from 'rxjs/util/isNumeric'; import { Observable } from 'rxjs/Observable'; -// It is necessary to use ng2-pagination -import { DEFAULT_TEMPLATE, DEFAULT_STYLES } from 'ng2-pagination/dist/template'; - import { HostWindowService } from '../host-window.service'; import { HostWindowState } from '../host-window.reducer'; import { PaginationComponentOptions } from './pagination-component-options.model'; diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index e738a0bd18e..d1699537b68 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -3,7 +3,7 @@ import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { Ng2PaginationModule } from 'ng2-pagination'; +import { NgxPaginationModule } from 'ngx-pagination'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateModule } from '@ngx-translate/core'; @@ -32,7 +32,7 @@ const MODULES = [ TranslateModule, FormsModule, ReactiveFormsModule, - Ng2PaginationModule, + NgxPaginationModule, NgbModule ]; diff --git a/yarn.lock b/yarn.lock index 4d6f6ead3f8..b13b5f09b74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -110,9 +110,9 @@ version "2.2.3" resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-2.2.3.tgz#e7bd1149f1c44208f1cc4744353f0f98a0f1f57b" -"@ngtools/webpack@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.5.0.tgz#b6be58d857d41f8999751d6bbc3d21e84bc977ca" +"@ngtools/webpack@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-1.5.1.tgz#6b00ed8bfb6706ab0672b93d294e9e15f69e19be" dependencies: enhanced-resolve "^3.1.0" loader-utils "^1.0.2" @@ -254,7 +254,7 @@ acorn@^4.0.1, acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.0, acorn@^5.0.3: +acorn@^5.0.0, acorn@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" @@ -4285,16 +4285,16 @@ nested-error-stacks@^1.0.0: dependencies: inherits "~2.0.1" -ng2-pagination@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ng2-pagination/-/ng2-pagination-2.0.2.tgz#532dc9154de1f15e19e94edf554b96884b5f83d6" - ngrx-store-freeze@0.1.9: version "0.1.9" resolved "https://registry.yarnpkg.com/ngrx-store-freeze/-/ngrx-store-freeze-0.1.9.tgz#b20f18f21fd5efc4e1b1e05f6f279674d0f70c81" dependencies: deep-freeze-strict "^1.1.1" +ngx-pagination@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ngx-pagination/-/ngx-pagination-3.0.1.tgz#5a8000e40c0424d9c41c9d6d592562e1547abf24" + no-case@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" @@ -6107,9 +6107,9 @@ rollup-pluginutils@^2.0.1: estree-walker "^0.3.0" micromatch "^2.3.11" -rollup@0.45.1: - version "0.45.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.45.1.tgz#af67ded79974079095b5fede8817b4ec26d610e1" +rollup@0.45.2: + version "0.45.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.45.2.tgz#63a284c2b31234656f24e9e9717fabb6a7f0fa43" dependencies: source-map-support "^0.4.0" @@ -7392,11 +7392,11 @@ webfontloader@1.6.28: version "1.6.28" resolved "https://registry.yarnpkg.com/webfontloader/-/webfontloader-1.6.28.tgz#db786129253cb6e8eae54c2fb05f870af6675bae" -webpack-bundle-analyzer@2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.8.2.tgz#8b6240c29a9d63bc72f09d920fb050adbcce9fe8" +webpack-bundle-analyzer@2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.8.3.tgz#8e7b3deb3832698c24b09c84dfe5b43902a83991" dependencies: - acorn "^5.0.3" + acorn "^5.1.1" chalk "^1.1.3" commander "^2.9.0" ejs "^2.5.6" @@ -7730,6 +7730,6 @@ zip-stream@^1.1.0: lodash "^4.8.0" readable-stream "^2.0.0" -zone.js@0.8.12: - version "0.8.12" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.12.tgz#86ff5053c98aec291a0bf4bbac501d694a05cfbb" +zone.js@0.8.13: + version "0.8.13" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.13.tgz#f0822525fad941582a03bbfe71eb21740315ddd0" From d864b30643f201b830e7013683a4cf559ef2766a Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 13 Jul 2017 07:59:51 -0500 Subject: [PATCH 06/29] downgraded zone.js, breaks ci --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index a5db0b77a2d..8959ec80b8c 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "rxjs": "5.4.2", "ts-md5": "1.2.0", "webfontloader": "1.6.28", - "zone.js": "0.8.13" + "zone.js": "0.8.12" }, "devDependencies": { "@angular/compiler": "4.2.6", diff --git a/yarn.lock b/yarn.lock index b13b5f09b74..0ae95e0e759 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7730,6 +7730,6 @@ zip-stream@^1.1.0: lodash "^4.8.0" readable-stream "^2.0.0" -zone.js@0.8.13: - version "0.8.13" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.13.tgz#f0822525fad941582a03bbfe71eb21740315ddd0" +zone.js@0.8.12: + version "0.8.12" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.12.tgz#86ff5053c98aec291a0bf4bbac501d694a05cfbb" From 929fc90ba39fbd17ac39c14535796f34aaa72122 Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 13 Jul 2017 08:07:01 -0500 Subject: [PATCH 07/29] updated dspace logo and favicon --- .../{dspace_logo.png => dspace-logo-old.png} | Bin resources/images/dspace-logo.png | Bin 0 -> 7709 bytes resources/images/favicon.ico | Bin 0 -> 3262 bytes src/index.html | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) rename resources/images/{dspace_logo.png => dspace-logo-old.png} (100%) create mode 100644 resources/images/dspace-logo.png create mode 100644 resources/images/favicon.ico diff --git a/resources/images/dspace_logo.png b/resources/images/dspace-logo-old.png similarity index 100% rename from resources/images/dspace_logo.png rename to resources/images/dspace-logo-old.png diff --git a/resources/images/dspace-logo.png b/resources/images/dspace-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb0b36addcc7bb68c8419881fa1f72e0e297d3e GIT binary patch literal 7709 zcmcI}WmJ@3^zP6lUD6Fo3?LmcfP^CgGlX;tNFyN)0wN#{0wUcxLrKHXozmS61JVuu z`K@*D*ZbwJ|A#lu`|cBKuV+8c-sglv)RYPFY4HI703rCTf(Gi@_uqw!jk?2h;TZq` z!zNfkPRldxFdffRQ~UObe7*qOSfJ9#;b1e)nN2|Pf{)@wm6oifO(JX2Js_RNij=|H zd6Gu?K|&}<@=Q4(SLg=;EA9{02z$jB==pR>j>3FPS9xPU3simsuL6J=XQn=`do2=r z@0Lf;HUpP^Mtzojj&CwtmwiSWW>T1Oi2#7f_Z2l50MpU0vVgDHB)EVv06H3gR+bqc zi-C&?_yh< z4ql*d0CKR|<4D?Ar+tx{zs0Y0YWxE!6kHVOB_axh$dM>`cpY7^bz3iZY%@8%mKXy` zM@q%`P;wbaneuTKUaPD5NbXn6!LYH=J(5jtD2~GpgNN^iD>t@w_EVeXPw5Q(m$1`? zMom~F!&8t?x~HeHHOBtU?c4iD@sG>dEQ?-CcH-}!Ref6ON*1Rg>2=6^H>y3Lz?7JO zxY1$Ml`v|+aJhUCx-AOxl|1!uTn17#abBSlv5`#r>3!Oh{)s0;z?+Vvbbo}h+h&qc zkq(8cR>0CLb?D`pivYM#u{R(0d<{cJ$W(R$>G(nZ>)Tg_)bCqCW9yWCo?R@M9hJ*o z=7f(hte9hp^XoyuUZL6-0Zw)%hlI+cxX#q|hS8d*`2Dq@qx74a7hjLf>;ew4NO1p= zcV#=;q^_iXd8Tm6B+K0P!Z!%Bf3z8dw48PpPeT*z(7ZP zPnLdIXX$ObYG`n0rXtJy6mkeh91qvy zOo*$c08zIGBlNneR6X8CuCu2ezSd6My@PbDXI)4m$TQ;nfF2z`OqBife@?+W1YrTv zXhyt|o?)JAwL`6iuBJuT_CAjYhy7#|19v%NZ^VO0(CV}GieV2|qVxoy7ey%S1QQn% zg`hex5Kew*9;G@XV)2Ay@Z<6RsGJ}N1tkAAGgrq(H*zAW4LlNDC6pt>4%cVrW2B0? z56kWcbE&DdDEDPVXOf!2#Q0F4mLzKJAz&sM%0fJK)?S*iV?1;QKY7EQ*~t0}x95Ln z&|YI=C-)E%v5@4N;i`aqdAst%#5`|LD?s2^)VXHA&K{iz0=_pINNmrh{M@XI@AU{X zcO?%M*HrZ@&u(?9=%Mv$z)$O<87+M@k81uEq#qyXXD~QJN*{DVK<|mp1y)G&;8klq zqzNU#1*<}LUfOL@3N0K{mndYuu-oeWcDfinus@i-^4sD~$@!mB@xgfUNZIK7rdxNS zP=Ny&n?=ar8vd)=qRV=(hJUa)CQY@YGQZBWbB%muR-nltLn!H6ix9-;W4bM#xVMt9 zxJ>m})A^p(Ze(Te%Z>fTXjauX#0SumHi5e5X^*o)L}&9%WbE;c<7YFMo;M9HEe}TB zYCv+{Mztj_NY?LHqXF0hXHsuQvy58mhleA2!_&C++qq$N5rZc&c2Cg@Ts~bu>>7JT z*#tQr75{WCrE*!v$5c8Mo%G>or}8s8N{p@8F_q`U z_xj*~9!B?u?Z@MtobH$IC#01<(bC@#d?SR*bB&Z)vZy4>(42^pMaP5ZjUQzD=lJRB zjIV3=O5q1ex%s~IJPZ81W3CN`9-=mNu+aowTF}r1$)SK1>j}{M754WgzA9Z#Ou@8(9OQ*jdEx_2p&mPl2sZ#<)P_NkndppS zP-9p4JCT+yV_9RF)W^#A^^16T5y8e8$t*_ZmC}HBsHl-`FFDDj{vjl(e+Sfim03@5 zqOUTKqlAIpj(PJC<+m^}cTNF3BJTq`mv9N=1$#Gw8EX>WsQFAe^i2Lm%GPH!+MIqc06m979mX$uS4 zHENFceVjg_a9^d9Vve)jBjFEv<1zxYB)HfgHJdr;o~S&=6OY+zwHPr&cR>x+N0~`g z#1IU0!GwB>r<7JtsmGiqv6!j(qslR-=eA2%N?!V^Q0tc;Ixz#M7F%$AgQ7U9`i)QX z)%%U()i1mv2R9|jzE#2ySMM(@mu`CS{jlc8)f`3KJ(UeI5l|TaUW1^(*LGx_=kK`7 zi~uewJltzt3q}XyKOAX2fb(sq**FduGJ@GQpSbbM=O4PYFLE(D}<5&wJ z@88yw5eB~WiS@JXaQxaDxome>bJwNNmjZ@h!| zq_<)BUd-za0rkqhLe+jA`C2`m){?l}`;8IKw-%!)V$sON z4G8QsqmruV9+R4_IGECCy8rlU&UpuVf9B9Yj`URNpIoPV=cuZNe$B zTu;#Q@*UXQwB9FPLUf?2+;Zczclk4J;9E*Yd0_H^Syc16q{ZAGKP{0i8-D@jH@pWX zPwtK~;+3p39$TkFyWXvYmJJg0HQf{GYGTpj-DA3{CKg*%tXWK~Y!IJdj+DuGIH#^x z&+~u25oUCz2-J-_O|!G|lba^Xq7wEzyPK#&DWR1+EOs9Uid8|7Y_fqC>OEv)|?w2 z#m{y>A*FPkI(VGb%66)#VX6gSqK}P#m`Qhcu|_`4p(Gp)CE?>v&&Q9vYYr;|AJ=@UEa_2- z^_9$p@E!r%+KZyRwL+;lO4$J%yZNJKENY}x&K?BI@Up`e@teB+Lh*01jZ#rbo|Z(E*gRXoiM5SK znoKQ_`)?>|pF(w@BO(pn6@Ga5p3&~DvLkeaP<>0%iN$4L;^$-G&m9&_`=5|0KDtM! zz2U;`aNb(4*+?3~pnLnAa37v4Wz3s#F~?(BKD%*C>C?{AsLQVWX!M|C8NZU7rlW=$--W7Y-GSqP5rMyY_0TcGur(`&UraR(iv>4$?< zWMcW+pKt>9AO7h*&S+RGcV{tmM{j1bJEvu$xagIb*^8!meO>(=hngeDOp4-tlf%)k zxkc@!pxJD#6WPVwlUs%Z_ICnzrh|9{^@DAhsl+(X=z)Ldil)WlGQqM>RAL|8wx$x7 zU+gwI9@gat004`*;_qXL0QUdux%dB1s^9K4eHyDwQ?R%H>AmLz*Vihn8|~Gf{+(&~BLX24WxV2E(~#egmEUk<=uwBjQO=OhPQB_1Csom9 zXP~90A7lOD-bfVTXY_&nG!7dlbV#(O_00@)c7D99R_jqqTuMqRa!Om%>c6C5Zo->nYl|bHkZUd3f5__S%N!Sw1 zk*rpWlsQxEByzAgb~jXmuI=z&rVIHTeF#@*Br@7<@=s4@4qM(XC@9A#;CCo3Ep0JZ zTV`R2@3+~DF|5I8Pj4j0y74lY+UKzzJ_-3Tc}Lxv4=KtJsxis^>wC6^c)eGD zmXEH@c~reK^ng(U$yhz{9B*QXfe%A;bY|9=Ml!sL;qacaJB9d4?_n19zR;l>SGqzD zIyPgo)Y&;pdD)_I*R?d|yw+1~{x{hLqZjEtl! zV~}JUVOqVLS7ch6>beyI7jL+@xcD`D>zf)vOd2#U174^{_z}_Gw5JHN*=#&SB>P9; z?`lW}9AO%z;`t&}+*$S#JyWLZ&BNXRxV z9o-del`HNX`RZjH->+ad_|?6L*@9Rr2>JCztkWg<-J4ExGBUC+%vitq#N9T6tVZ5F znz$lY0X1*`4kp3w)5_e36^peT=?6dm6|6iM9*IPEa&r27+gYl{wgw98WUQ)on>+o3 zF(M8m!hVmBc|mwV(JJVkDW7Oe{QA-5+;}qHdHA#A$l^~i=x|5jyqJK%*!<$+xwehX z3C@eLh2p7CYOGJf1@_q+Qqle%*Lbe?GFxFH?PBYvzw52*=afq^GMZOEj+BcvG@hj8CVR2ouBeql3{COQ?W5mUMLv?_>V0T;kLjOA)%3s&Jzv>BH zQhZM4y_?kCewhFq-@QA%n` zM$6Pzjch}eFRDt8Tm($o-9e3dbhLE)nP#ag>9IR?ZhOI*IkLVv#TLS}!`W#O)W!~< zik?1i%CH0f4&~_?e2hEYfrM?pa%p|fctii=wb0xULLk?xmV)i zeR5*C|7QPowo3TjP7WL$9g(>-eJGU(0-m#o`d4fv@$1C$t7iwfMD9PY)RiWu6rP6h z;@>7~I?UMqVS+di6A+kKsrh@5k+P_to}3sdv?M<-D=qao9&5*-(OPHTn{?lOB^1*N z(KkH3OXWMkbz_*Rj>J$ZC1#84DtnF@o_~{WLRnS@9B)ynSxG$JOm1{scbc13T91V~ z%sQoL zRu)N0U$2_sX;NbA^&^?rx;d*N6 zh+HrHqorT#Yq6bm+Y!FFtfQH5a<1s%`IftCEFB&m7w2nRA}gFdrA~pJ7HfR5x~VVL zP-Kh>>C@2gV2D?nBD6F%OW%WKziE^%0*}JunPvLTWBHPIOE>mj4|<6r52Srhv~nRc zN_EmmUtL?4ZvOzWcQk#at*wK6l^Ct+?-A5R6W9fwdr&-CZ3R+pBF)VCK_Kg=m=KVo zI^--|x00LIp2IfsYba44OLs8@f%bHiagi#Nf zcyjYS#61+nG>$KIb_N$a*mWvr1t@jn*O^L-%0+7oZn_NAE5SYls685Fe>moRF+a2# z8!PPLLF`oEwG7tPoqY$?R*qu!9?cxQC8tZJ9?5*DsM1Kci#ACDEad*lsYWW!7~Gxu z1!Ll|T@}as?od39WpsBLJE$U0B&s#N9dYJCfrFp%@#69lKw7xi7q@UGXd1L=%62rD z_FQ1EnlrC8av88IlhA zr+ph*2{}5cY$S1S^YZ4G=cg|*3{sPninSgHAD-vSB_45jk{X3X_5DojH-M|Bx1a`dK}LuW+1~4iF-eh z8$_C=QEZ&pzZt_MbFS*GqM{;52YSD-^S!I92U<(yf#F^*Nr3P2GV}4TAe-P`@{1Md zS=#Mg6eS_y1*o{a|1(oMd?PF-W>g(h5#OpOG7m&AUJ-!dI_i`mw)LRkRa0GQJ-TX4 zY;OAw_W~r0sNrCRnx=MH5!GP>#j+n8lfaTP zCT$Vn;kmvaeH;FbuM{&{?rd!}E4nu;aC;4{m<-u2Q=A4&KBow;uC6Y|A>E)VLyzN@ zejioxo3cLp2&!(ieF8#W|1*hq-5G(Gl$S1qIFjXdgfwCyii;yag1yA_S&nmUTOCXR z{(BnB#sxN%_*?i|cQM?Pm~y+2A;lZrD_hI%hUMku@xMOxK>Ymptx39|s{DT^CxjN( zqyFvl-SMg?j3Um8ImHL?4l^dad^$>ac^{Jm>wB3LS&)m|h&_r!wVCq*o_|HZNg*Yz z%KQD>wv<>lTmC&fO;SHL^U79LRhxy5PEfG&Cpr1S!9nXG5-BL*hmeOYQ-a+0r{fk9 z@u$A0Ma(Vqp-FLO!L>xlI*ZUoR##W^s;c6HBO~>~@9!6tOG-^Xgtm#e= z^J2ONvuff}88ux>(4ktEj0fJ$n}B6sR&queC?x~=om-c}TtWercF6aT(M}GMN!s(z zc<}zVNpVy9Nn4SqA|7`{RgSrdii)PtLUVI-%Y&i}f}rTq-ObQRR!(fIhHLNWuV(G) z#}L-Iw}n$vQ^w}&1V0>rY=M#9lTw26(dOyo`~sDheCOURXg3bF71QjqnDLFk`#M8z zA51|*?V`bsL}G?rrR3a|f-u~h-r_5MnZQQv-0i>yajDStff$O=;{G4?(3f1W_20iP zQLgyYn#IJ^6c-0AO~KD=DBk-cpM5*rhlInM!BFVH9XHRE^{?B&bsp-H8~0jlm1nQ) zyqpI%DFnCTM{651s!>H9XKgKcf|WyLbhz1{Z)EOfr=_Lk{t7jtot>`dZ5!fk8V3>| zPy2fNJNnsG-QA}?Q($NSD>H<|w){{`sWhYe!fm76&)&#U|CY@Mk}Qz~)>pBpmEE>{ zn_T8^>>k$1@Y*tk{b2CBgS`U|R)_)zJG)~hC}2&DfSS)g!_ZiA`p?J+@aMz@^l1*L z?7bKJ{d+e-i2N7TE+gh%VbrDo#{2Q-B$Sj}KQW^E)D`u;d+K(Vm)u`V;*ljN>)&>U zev_Az-shD0jmj2JOCm*Za&ok&Buok_$Z#7-xFzSDrYDY7?|2=m*I(@0L#TRc=QG&m za15SfDLoB$c87#Ef-_y6)I`=KOSMYG`t&&^B}LPH7s1J2#`9)BrtqE$miQTY`;pQG z*yBaxeRs>64nOhi>pmoKB6{`=(xYW;%t(-2uA2h#a`Ba1>S!AqtC&3x)k&ug_kEOd z$e_>tFOv;C@{@BpUF=P{4WT1nCcj_tleVY}7hZ>i>}XM7-i^_SUJ{A~oSTy(g-H|C zvLhN@w%C}wyuBYk&g0+u+}>jmT;*Cdx1h=;XIGUoi55gDZ4G`4I-(7{xj_z$h~>vi z`c|fRLejm+mDAc-^5X)X!$4NeO#y|}nwV9RO<_t-i#LvjBfD}+TFlAUcM-u5k_E{R zZP1Q3VF(vvG0) z`IrU1R$(#AQLlh_rF}7OEX;LEr~K#UBoK|dq*Z-d@bG~b{9M*5#>OMRcC_MDe5rYL zua|aT8(LEsmdm5hjdaxw;9r1?+1)1cc0UbZ>9eC}3vh~x0>6hFx!8DY_me*b>lc}E z?(NDZ+Tq^{s)arb|Mu_i%m~J5;CvX`(=016Um(ku z2OAxbrnS${|HgQ4Kc%IUE*}!(;t(nQ%0-0WN_-_C;IuP7e!Z|irQd!$=KC(lmGi7J zDXD-~`f>;(RTgq(S@A-p`T=&~b$a-Q&kDvieQ?o;;_+LEzwwc#ePQw<9$9bA#7e*u za|z4AaE+yEGt`7#oc$x#lnktvF9Dn!)@8aYlrs?Og2^-m2ak_cfbH*xB+nk2xYQX9 z?72BwSm94M zxioO^JENAUZ}dp*!pfQOXY=>@_IAPRyUU|!9v&Wv?r9vA)y1qM$)VNjzznrqMDFld ziNh|;7KXg3ysbKV)sQo$LA3AISUWVdk;-q}{7*SV;{sx8I_7(x%1QDsQ7a_WFd-`F zk_pA-F(@}5_x{zQi|V1%hgnU!%Zp9tECB*O%T|Q@hH`Tc=&9~8_l7~t7Q@%;p`W8< znFZ|fS!n95Go&ATT|sFNbod=RN`0F=7+vcU=z#(*n@z)gI-NNg^8O)>_s%GaqOPZE zKvD8&r`e9EVUVp6CjcN8ILh?De17@=+C#a2LY?$JJ*|XhLlQ;5WT6@Wu%em*T;4S3 Fe*l0irBwg` literal 0 HcmV?d00001 diff --git a/resources/images/favicon.ico b/resources/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c73ad96b2699f44ca88a0e333bc6567c639a8610 GIT binary patch literal 3262 zcmeH}p>GsH6vnrK1k;2nf+80XAmKkiRGc_bfk0G1Qc+QHBo!wr7PycV6)P%6RE(%t zQL&<8Ma7a-jA+6L#E6O^sTff)qGAQf@|&C9wOP#NXaLda?sVtvo9}(|y?HyABuo7D zdI|mGq*zXpM@f>r;Kr1^<_`AIQr>mj&!)M%{-FYeRePpBw5pjV;=9&|MNyTd_a0&w z&MBp442>~yi2rd_#aZXpmPK(?mN?_dM5af}K;;Kk?U-^~7ZC*Tle!i{?BzKY!j02( z7X8eat<6n2d5awf=iJU{R8>_WB_XijvppOF0+S6TBkY@6ocRzPe?shL+01z~91=_9 zd0bJJrl93n27ml<+ZQ5&#NJvDc(+#P7flc(9gPm8)LKV0qji?0Ji|5u z)^$yET6BPCTp;409tiLU|5PbJ)|Eh+O0#3|S9K!SF5F;VxnbMgR(eC>HM*&iQ-gq}Dj8zVU-P$I@5%hL(I)76xbHP!|!uZ^Y50Iw-)^I`12aJ@iKI znQGw>*ZBGhpFMx-t@8HRX-YCg(Jaj_79uy*0DUHex29je8PsLdyj5agWTqEi0@<|Q zAr2`ZgfO) DSpace - + From 75cb60e70f443b318d618949048e9effe0dccb31 Mon Sep 17 00:00:00 2001 From: William Welling Date: Thu, 13 Jul 2017 08:28:52 -0500 Subject: [PATCH 08/29] added new dspace logo to home page news section --- src/app/header/header.component.html | 3 +- .../home/home-news/home-news.component.html | 30 +++++++++++-------- .../home/home-news/home-news.component.scss | 10 ++++++- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index 5dac95d9464..0d8362698a6 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -4,8 +4,7 @@