From e5243204572e2dcba735335f4861f36d72fd98a5 Mon Sep 17 00:00:00 2001 From: seraph Date: Sun, 19 Apr 2020 14:22:10 +0200 Subject: [PATCH] refacto : create entities, enums, services --- README.md | 12 +- package.json | 9 +- src/app/app-routing.module.ts | 1 + src/app/app.module.ts | 3 +- src/app/config/DateUtilities.ts | 4 +- src/app/config/PollConfig.ts | 4 +- src/app/config/Routes.ts | 42 -- src/app/config/graph-canevas-options.ts | 24 - src/app/{config => }/mocks/choice.ts | 0 .../mocks/comment-same-text-error.json | 0 .../mocks/comment-too-fast-error.json | 0 .../mocks/config-poll-dessins-animes.json | 0 .../{config => }/mocks/created-comment.json | 0 src/app/{config => }/mocks/mock-comments.ts | 0 src/app/{config => }/mocks/mock-graph.ts | 0 src/app/{config => }/mocks/mock-poll3.ts | 0 .../{config => }/mocks/mock-success-vote.ts | 0 src/app/{config => }/mocks/mockmypolls.ts | 0 .../{config => }/mocks/votestack-success.json | 0 .../poll-display/poll-display.component.ts | 4 +- .../visibility/visibility.component.html | 2 +- .../pages/visibility/visibility.component.ts | 2 +- .../voting-choice.component.spec.ts | 4 +- .../voting-comment.component.ts | 2 +- .../voting-summary.component.html | 6 +- .../voting-summary.component.ts | 13 +- .../poll-administration.module.ts | 8 + .../poll-graphic/poll-graphic.component.ts | 43 +- .../poll-participation.module.ts | 8 + src/app/services/config.service.ts | 73 +- src/app/services/poll-service.service.spec.ts | 12 - src/app/services/poll.service.ts | 11 - src/app/services/progression.service.spec.ts | 12 - .../shared/enums/answer-granularity.enum.ts | 4 + src/app/shared/enums/answer-type.enum.ts | 5 + src/app/shared/enums/poll-type.enum.ts | 4 + src/app/shared/enums/theme.enum.ts | 5 + .../interfaces/date-options.interface.ts | 5 + src/app/shared/models/answer.model.ts | 6 + src/app/shared/models/poll-config.model.ts | 13 + src/app/shared/models/poll-options.model.ts | 9 + src/app/shared/models/poll.model.ts | 19 + src/app/shared/models/ui-config.model.ts | 5 + src/app/shared/models/user.model.ts | 10 + src/app/shared/services/api.service.spec.ts | 16 + src/app/shared/services/api.service.ts | 195 +++++ .../shared/services/comment.service.spec.ts | 16 + src/app/shared/services/comment.service.ts | 15 + .../services/date-utils.service.spec.ts | 16 + src/app/shared/services/date-utils.service.ts | 50 ++ .../services/poll-utils.service.spec.ts | 16 + src/app/shared/services/poll-utils.service.ts | 47 ++ src/app/shared/services/poll.service.spec.ts | 16 + src/app/shared/services/poll.service.ts | 42 ++ src/app/shared/services/theme.service.spec.ts | 16 + src/app/shared/services/theme.service.ts | 8 + src/app/shared/services/user.service.spec.ts | 16 + src/app/shared/services/user.service.ts | 19 + src/app/shared/services/vote.service.spec.ts | 16 + src/app/shared/services/vote.service.ts | 17 + src/app/shared/shared.module.ts | 8 + src/environments/environment.prod.ts | 17 +- src/environments/environment.ts | 51 +- tsconfig.spec.json | 2 +- yarn.lock | 711 ++++++------------ 65 files changed, 1034 insertions(+), 660 deletions(-) delete mode 100644 src/app/config/Routes.ts delete mode 100644 src/app/config/graph-canevas-options.ts rename src/app/{config => }/mocks/choice.ts (100%) rename src/app/{config => }/mocks/comment-same-text-error.json (100%) rename src/app/{config => }/mocks/comment-too-fast-error.json (100%) rename src/app/{config => }/mocks/config-poll-dessins-animes.json (100%) rename src/app/{config => }/mocks/created-comment.json (100%) rename src/app/{config => }/mocks/mock-comments.ts (100%) rename src/app/{config => }/mocks/mock-graph.ts (100%) rename src/app/{config => }/mocks/mock-poll3.ts (100%) rename src/app/{config => }/mocks/mock-success-vote.ts (100%) rename src/app/{config => }/mocks/mockmypolls.ts (100%) rename src/app/{config => }/mocks/votestack-success.json (100%) create mode 100644 src/app/poll-administration/poll-administration.module.ts create mode 100644 src/app/poll-participation/poll-participation.module.ts delete mode 100644 src/app/services/poll-service.service.spec.ts delete mode 100644 src/app/services/poll.service.ts delete mode 100644 src/app/services/progression.service.spec.ts create mode 100644 src/app/shared/enums/answer-granularity.enum.ts create mode 100644 src/app/shared/enums/answer-type.enum.ts create mode 100644 src/app/shared/enums/poll-type.enum.ts create mode 100644 src/app/shared/enums/theme.enum.ts create mode 100644 src/app/shared/interfaces/date-options.interface.ts create mode 100644 src/app/shared/models/answer.model.ts create mode 100644 src/app/shared/models/poll-config.model.ts create mode 100644 src/app/shared/models/poll-options.model.ts create mode 100644 src/app/shared/models/poll.model.ts create mode 100644 src/app/shared/models/ui-config.model.ts create mode 100644 src/app/shared/models/user.model.ts create mode 100644 src/app/shared/services/api.service.spec.ts create mode 100644 src/app/shared/services/api.service.ts create mode 100644 src/app/shared/services/comment.service.spec.ts create mode 100644 src/app/shared/services/comment.service.ts create mode 100644 src/app/shared/services/date-utils.service.spec.ts create mode 100644 src/app/shared/services/date-utils.service.ts create mode 100644 src/app/shared/services/poll-utils.service.spec.ts create mode 100644 src/app/shared/services/poll-utils.service.ts create mode 100644 src/app/shared/services/poll.service.spec.ts create mode 100644 src/app/shared/services/poll.service.ts create mode 100644 src/app/shared/services/theme.service.spec.ts create mode 100644 src/app/shared/services/theme.service.ts create mode 100644 src/app/shared/services/user.service.spec.ts create mode 100644 src/app/shared/services/user.service.ts create mode 100644 src/app/shared/services/vote.service.spec.ts create mode 100644 src/app/shared/services/vote.service.ts create mode 100644 src/app/shared/shared.module.ts diff --git a/README.md b/README.md index d2ef16be..407de863 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ +## LIBRARIES USED + +| lib name | usage | +| -------------------------------------------------------- | -------------------------------------- | +| [axios](https://github.com/axios/axios) | http client | +| [date-fns](https://date-fns.org) | manipulate dates | +| [locale-enum](https://www.npmjs.com/package/locale-enum) | enum of all locales | +| [uuid](https://www.npmjs.com/package/uuid) | handle client-side generation of uuids | + +--- + # Framadate This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.1. @@ -27,4 +38,3 @@ Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protrac Before using ng for the first time in this project, use `npm i` to install needed npm modules. To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). - diff --git a/package.json b/package.json index da5c6f07..d2147d13 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ "package": "cat dist/framadate/*.js > dist/framadate/framadate-scripts-bundled.js && ls -l dist/framadate", "bld:pkg": "npm run build && npm run package", "build:demo": "ng build --crossOrigin=anonymous --extractCss=true --progress=true --prod && npm run package", - "build:demobliss": "ng build --crossOrigin=anonymous --extractCss=true --baseHref=https://framadate-api.cipherbliss.com --progress=true --prod && npm run package", "test": "ng test --code-coverage --watch=false", "lint": "ng lint", "e2e": "ng e2e", @@ -18,8 +17,7 @@ "format:all": "prettier --write \"src/**/*.{js,jsx,ts,tsx,md,html,css,scss}\"", "trans": "ng xi18n --output-path=src/locale --i18n-locale=fr", "storybook": "start-storybook -p 6006", - "build-storybook": "build-storybook", - "postinstall": "ngcc" + "build-storybook": "build-storybook" }, "private": false, "dependencies": { @@ -37,12 +35,15 @@ "@ngx-translate/core": "^12.1.2", "@ngx-translate/http-loader": "^4.0.0", "angular-date-value-accessor": "^1.0.2", + "axios": "^0.19.2", "bulma": "^0.8.2", "chart.js": "^2.8.0", + "date-fns": "^2.12.0", "font-awesome": "^4.7.0", "karma-coverage": "^2.0.1", "karma-firefox-launcher": "^1.3.0", "karma-phantomjs-launcher": "^1.0.4", + "locale-enum": "^1.1.0", "ngx-clipboard": "^13.0.0", "ngx-markdown": "^9.0.0", "ngx-toaster": "^1.0.1", @@ -52,6 +53,7 @@ "rxjs": "^6.5.5", "rxjs-compat": "^6.5.5", "tslib": "^1.11.1", + "uuid": "^7.0.3", "zone.js": "^0.10.3" }, "devDependencies": { @@ -68,6 +70,7 @@ "@types/jasmine": "^3.5.10", "@types/jasminewd2": "~2.0.8", "@types/node": "^13.11.1", + "@types/uuid": "^7.0.2", "@typescript-eslint/eslint-plugin": "^2.27.0", "@typescript-eslint/parser": "^2.27.0", "babel-loader": "^8.1.0", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 4ec1729b..e0e76c86 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -20,6 +20,7 @@ import { PollGraphicComponent } from './poll-graphic/poll-graphic.component'; const routes: Routes = [ { path: '', redirectTo: 'step/creation', pathMatch: 'full' }, + { path: 'admin/:token', component: AdminComponent }, // http://localhost:4200/#/admin/srfdgedsTGETHRYJtujTUjTUkTIUKTK { path: 'home', component: HomeComponent }, { path: 'base', component: BaseComponent }, { path: 'step/base', component: BaseComponent }, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index cedd678b..2f817526 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -49,7 +49,6 @@ import { VotingSummaryComponent } from './pages/voting/voting-summary/voting-sum import { VotingComponent } from './pages/voting/voting.component'; import { PollGraphicComponent } from './poll-graphic/poll-graphic.component'; import { ConfigService } from './services/config.service'; -import { PollService } from './services/poll.service'; import { CopyTextComponent } from './ui/copy-text/copy-text.component'; import { ResettableInputDirective } from './ui/directives/resettable-input.directive'; import { ErasableInputComponent } from './ui/erasable-input/erasable-input.component'; @@ -135,7 +134,7 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader { HttpClientModule, FormsModule, ], - providers: [TranslateService, ConfigService, PollService, MessageService, ConfirmationService], + providers: [TranslateService, ConfigService, MessageService, ConfirmationService], bootstrap: [AppComponent], }) export class AppModule {} diff --git a/src/app/config/DateUtilities.ts b/src/app/config/DateUtilities.ts index 6e3d8607..a50ca93b 100644 --- a/src/app/config/DateUtilities.ts +++ b/src/app/config/DateUtilities.ts @@ -32,7 +32,7 @@ export class DateUtilities { }); d1.setDate(d1.getDate() + interval); } - return dates.slice(0); + return [...dates]; } /** @@ -40,7 +40,7 @@ export class DateUtilities { * @param d1 * @param d2 */ - dayDiff(d1: Date, d2: Date): Number { + dayDiff(d1: Date, d2: Date): number { return Number(d2.getTime() - d1.getTime() / 31536000000); } diff --git a/src/app/config/PollConfig.ts b/src/app/config/PollConfig.ts index 096332d1..f968af4e 100644 --- a/src/app/config/PollConfig.ts +++ b/src/app/config/PollConfig.ts @@ -57,8 +57,8 @@ export class PollConfig { customUrl = ''; // custom slug in the url, must be unique customUrlIsUnique = null; // given by the backend urlSlugPublic = null; - urlPublic = environment.production ? '' : environment.baseHref + '/#/poll/id/4'; - urlAdmin = environment.baseHref + '/#/admin/d65es45fd45sdf45sd345f312sdf31sgfd345'; + urlPublic = environment.production ? '' : window.location.origin + '/#/poll/id/4'; + urlAdmin = window.location.origin + '/#/admin/d65es45fd45sdf45sd345f312sdf31sgfd345'; adminKey = ''; // key to change config of the poll owner_modifier_token = ''; // key to change a vote stack canModifyAnswers = true; // bool for the frontend selector diff --git a/src/app/config/Routes.ts b/src/app/config/Routes.ts deleted file mode 100644 index 78455a40..00000000 --- a/src/app/config/Routes.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { AdminComponent } from '../pages/admin/admin.component'; -import { AnswersComponent } from '../pages/answers/answers.component'; -import { BaseComponent } from '../pages/base-page/base.component'; -import { CreateOrRetrieveComponent } from '../pages/create-or-retrieve/create-or-retrieve.component'; -import { DatesComponent } from '../pages/dates/dates.component'; -import { EndConfirmationComponent } from '../pages/end-confirmation/end-confirmation.component'; -import { HomeComponent } from '../pages/home/home.component'; -import { KindComponent } from '../pages/kind/kind.component'; -import { PasswordComponent } from '../pages/password/password.component'; -import { PicturesComponent } from '../pages/pictures/pictures.component'; -import { PollDisplayComponent } from '../pages/poll-display/poll-display.component'; -import { ResumeComponent } from '../pages/resume/resume.component'; -import { VisibilityComponent } from '../pages/visibility/visibility.component'; -import { VotingChoiceComponent } from '../pages/voting/voting-choice/voting-choice.component'; -import { VotingComponent } from '../pages/voting/voting.component'; -import { PollGraphicComponent } from '../poll-graphic/poll-graphic.component'; - -/** - * each step in the form is a component - */ -export const Routes = [ - { path: '', redirectTo: 'step/creation', pathMatch: 'full' }, - { path: 'home', component: HomeComponent }, - { path: 'base', component: BaseComponent }, - { path: 'step/base', component: BaseComponent }, - { path: 'step/creation', component: CreateOrRetrieveComponent }, - { path: 'step/date', component: DatesComponent }, - { path: 'step/kind', component: KindComponent }, - { path: 'step/answers', component: AnswersComponent }, - { path: 'step/admin', component: AdminComponent }, - { path: 'step/pictures', component: PicturesComponent }, - { path: 'step/visibility', component: VisibilityComponent }, - { path: 'step/resume', component: ResumeComponent }, - { path: 'step/end', component: EndConfirmationComponent }, - { path: 'graphic/:poll', component: PollGraphicComponent }, - { path: 'vote/poll/id/:poll', component: PollDisplayComponent }, - { path: 'vote/poll/slug/:pollSlug', component: PollDisplayComponent }, - { path: 'votingchoice', component: VotingChoiceComponent }, - { path: 'voting', component: VotingComponent }, - { path: 'step/password', component: PasswordComponent }, - { path: '**', redirectTo: '/home', pathMatch: 'full' }, -]; diff --git a/src/app/config/graph-canevas-options.ts b/src/app/config/graph-canevas-options.ts deleted file mode 100644 index e620ec56..00000000 --- a/src/app/config/graph-canevas-options.ts +++ /dev/null @@ -1,24 +0,0 @@ -export var graphOptions = { - legend: { display: false }, - scales: { - xAxes: [ - { - gridLines: { drawBorder: false, display: false }, - display: false, - stacked: true, - ticks: { - beginAtZero: true, - maxRotation: 0, - minRotation: 0, - }, - }, - ], - yAxes: [ - { - gridLines: { drawBorder: true, display: false }, - display: true, - stacked: true, - }, - ], - }, -}; diff --git a/src/app/config/mocks/choice.ts b/src/app/mocks/choice.ts similarity index 100% rename from src/app/config/mocks/choice.ts rename to src/app/mocks/choice.ts diff --git a/src/app/config/mocks/comment-same-text-error.json b/src/app/mocks/comment-same-text-error.json similarity index 100% rename from src/app/config/mocks/comment-same-text-error.json rename to src/app/mocks/comment-same-text-error.json diff --git a/src/app/config/mocks/comment-too-fast-error.json b/src/app/mocks/comment-too-fast-error.json similarity index 100% rename from src/app/config/mocks/comment-too-fast-error.json rename to src/app/mocks/comment-too-fast-error.json diff --git a/src/app/config/mocks/config-poll-dessins-animes.json b/src/app/mocks/config-poll-dessins-animes.json similarity index 100% rename from src/app/config/mocks/config-poll-dessins-animes.json rename to src/app/mocks/config-poll-dessins-animes.json diff --git a/src/app/config/mocks/created-comment.json b/src/app/mocks/created-comment.json similarity index 100% rename from src/app/config/mocks/created-comment.json rename to src/app/mocks/created-comment.json diff --git a/src/app/config/mocks/mock-comments.ts b/src/app/mocks/mock-comments.ts similarity index 100% rename from src/app/config/mocks/mock-comments.ts rename to src/app/mocks/mock-comments.ts diff --git a/src/app/config/mocks/mock-graph.ts b/src/app/mocks/mock-graph.ts similarity index 100% rename from src/app/config/mocks/mock-graph.ts rename to src/app/mocks/mock-graph.ts diff --git a/src/app/config/mocks/mock-poll3.ts b/src/app/mocks/mock-poll3.ts similarity index 100% rename from src/app/config/mocks/mock-poll3.ts rename to src/app/mocks/mock-poll3.ts diff --git a/src/app/config/mocks/mock-success-vote.ts b/src/app/mocks/mock-success-vote.ts similarity index 100% rename from src/app/config/mocks/mock-success-vote.ts rename to src/app/mocks/mock-success-vote.ts diff --git a/src/app/config/mocks/mockmypolls.ts b/src/app/mocks/mockmypolls.ts similarity index 100% rename from src/app/config/mocks/mockmypolls.ts rename to src/app/mocks/mockmypolls.ts diff --git a/src/app/config/mocks/votestack-success.json b/src/app/mocks/votestack-success.json similarity index 100% rename from src/app/config/mocks/votestack-success.json rename to src/app/mocks/votestack-success.json diff --git a/src/app/pages/poll-display/poll-display.component.ts b/src/app/pages/poll-display/poll-display.component.ts index 68a05dac..1fec9a67 100644 --- a/src/app/pages/poll-display/poll-display.component.ts +++ b/src/app/pages/poll-display/poll-display.component.ts @@ -1,10 +1,10 @@ import { Component, OnInit } from '@angular/core'; import { BaseComponent } from '../base-page/base.component'; import { ConfigService } from '../../services/config.service'; -import { mockComments } from '../../config/mocks/mock-comments'; +import { mockComments } from '../../mocks/mock-comments'; import { ActivatedRoute, Router } from '@angular/router'; import { environment } from '../../../environments/environment'; -import { mockPoll3 } from '../../config/mocks/mock-poll3'; +import { mockPoll3 } from '../../mocks/mock-poll3'; @Component({ selector: 'framadate-poll-display', diff --git a/src/app/pages/visibility/visibility.component.html b/src/app/pages/visibility/visibility.component.html index 5a168568..14951634 100644 --- a/src/app/pages/visibility/visibility.component.html +++ b/src/app/pages/visibility/visibility.component.html @@ -103,7 +103,7 @@
- {{ environment.baseHref + '#/vote/poll/slug/' + config.customUrl }} + {{ window.location.origin + '#/vote/poll/slug/' + config.customUrl }}
diff --git a/src/app/pages/visibility/visibility.component.ts b/src/app/pages/visibility/visibility.component.ts index 2c30308a..b3b21c3f 100644 --- a/src/app/pages/visibility/visibility.component.ts +++ b/src/app/pages/visibility/visibility.component.ts @@ -11,7 +11,7 @@ import { PollUtilities } from '../../config/PollUtilities'; }) export class VisibilityComponent extends BaseComponent implements OnInit { showCustomPassword = false; - baseUrl = environment.baseApiHref; + baseUrl = environment.api.baseHref; environment = environment; constructor(public config: ConfigService, public utils: PollUtilities) { diff --git a/src/app/pages/voting/voting-choice/voting-choice.component.spec.ts b/src/app/pages/voting/voting-choice/voting-choice.component.spec.ts index 9d416f5a..bb33374b 100644 --- a/src/app/pages/voting/voting-choice/voting-choice.component.spec.ts +++ b/src/app/pages/voting/voting-choice/voting-choice.component.spec.ts @@ -7,8 +7,8 @@ import { ConfirmationService, MessageService } from 'primeng'; import { Router } from '@angular/router'; import { ConfigService } from '../../../services/config.service'; import { VotingChoiceComponent } from './voting-choice.component'; -import { mockChoice } from '../../../config/mocks/choice'; -import { mockPoll3 } from '../../../config/mocks/mock-poll3'; +import { mockChoice } from '../../../mocks/choice'; +import { mockPoll3 } from '../../../mocks/mock-poll3'; const routerSpy = jasmine.createSpyObj('Router', ['navigateByUrl']); diff --git a/src/app/pages/voting/voting-comment/voting-comment.component.ts b/src/app/pages/voting/voting-comment/voting-comment.component.ts index bf66f443..15d52f04 100644 --- a/src/app/pages/voting/voting-comment/voting-comment.component.ts +++ b/src/app/pages/voting/voting-comment/voting-comment.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnInit } from '@angular/core'; -import { mockComments } from '../../../config/mocks/mock-comments'; +import { mockComments } from '../../../mocks/mock-comments'; @Component({ selector: 'framadate-voting-comment', diff --git a/src/app/pages/voting/voting-summary/voting-summary.component.html b/src/app/pages/voting/voting-summary/voting-summary.component.html index df5569fc..49d1989b 100644 --- a/src/app/pages/voting/voting-summary/voting-summary.component.html +++ b/src/app/pages/voting/voting-summary/voting-summary.component.html @@ -110,7 +110,7 @@ diff --git a/src/app/pages/voting/voting-summary/voting-summary.component.ts b/src/app/pages/voting/voting-summary/voting-summary.component.ts index 137fb41f..3368898a 100644 --- a/src/app/pages/voting/voting-summary/voting-summary.component.ts +++ b/src/app/pages/voting/voting-summary/voting-summary.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; import { ConfigService } from '../../../services/config.service'; -import { mockPoll3 } from '../../../config/mocks/mock-poll3'; +import { mockPoll3 } from '../../../mocks/mock-poll3'; @Component({ selector: 'framadate-voting-summary', @@ -8,14 +8,15 @@ import { mockPoll3 } from '../../../config/mocks/mock-poll3'; styleUrls: ['./voting-summary.component.scss'], }) export class VotingSummaryComponent implements OnInit { - preferred: string = 'rien'; - severalPreferred: boolean = false; + public displayConfirmVoteModalAdmin = false; + public preferred = 'rien'; + public severalPreferred = false; @Input() pollconfig = mockPoll3; constructor(public config: ConfigService) {} - ngOnInit() { + ngOnInit(): void { this.computePreferred(); } @@ -44,7 +45,7 @@ export class VotingSummaryComponent implements OnInit { }); } - showModalDialog() { - this.config.displayConfirmVoteModalAdmin = true; + toggleModalDialogVisibility(): void { + this.displayConfirmVoteModalAdmin = !this.displayConfirmVoteModalAdmin; } } diff --git a/src/app/poll-administration/poll-administration.module.ts b/src/app/poll-administration/poll-administration.module.ts new file mode 100644 index 00000000..7dff711e --- /dev/null +++ b/src/app/poll-administration/poll-administration.module.ts @@ -0,0 +1,8 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +@NgModule({ + declarations: [], + imports: [CommonModule], +}) +export class PollAdministrationModule {} diff --git a/src/app/poll-graphic/poll-graphic.component.ts b/src/app/poll-graphic/poll-graphic.component.ts index 37283a66..f2c86d47 100644 --- a/src/app/poll-graphic/poll-graphic.component.ts +++ b/src/app/poll-graphic/poll-graphic.component.ts @@ -1,10 +1,9 @@ import { Component, Inject, OnInit } from '@angular/core'; import { Chart } from 'chart.js'; import { DOCUMENT } from '@angular/common'; -import { mockGraphConfig } from '../config/mocks/mock-graph'; -import { graphOptions } from '../config/graph-canevas-options'; +import { mockGraphConfig } from '../mocks/mock-graph'; import { ConfigService } from '../services/config.service'; -import { mockPoll3 } from '../config/mocks/mock-poll3'; +import { mockPoll3 } from '../mocks/mock-poll3'; @Component({ selector: 'framadate-poll-graphic', @@ -12,19 +11,19 @@ import { mockPoll3 } from '../config/mocks/mock-poll3'; styleUrls: ['./poll-graphic.component.scss'], }) export class PollGraphicComponent implements OnInit { - isColorblind: boolean = false; + isColorblind = false; pollConfigRetrieved: any = mockPoll3; graphicConfig: any = mockGraphConfig; preferred: any = 'rien'; yesList: number[] = []; maybeList: number[] = []; noList: number[] = []; - nbPoll: number = 0; + nbPoll = 0; dateList: string[] = []; constructor(@Inject(DOCUMENT) private document: any, private config: ConfigService) {} - ngOnInit() { + ngOnInit(): void { this.formatDataAnswers(this.graphicConfig); this.isColorblind = false; this.pollConfigRetrieved = new Chart(this.document.getElementById('graph'), { @@ -52,15 +51,15 @@ export class PollGraphicComponent implements OnInit { }, ], }, - options: graphOptions, + options: this.getSettedGraphOptions(), }); } - toggleColorblind() { + public toggleColorblind(): void { this.isColorblind = !this.isColorblind; } - formatDataAnswers(poll) { + public formatDataAnswers(poll): void { // if (poll && poll.pollType === "date") { this.initPollCounter(); poll.answers.forEach((response) => { @@ -79,11 +78,35 @@ export class PollGraphicComponent implements OnInit { // } } - initPollCounter() { + public initPollCounter(): void { this.nbPoll++; this.dateList[this.nbPoll - 1] = 'jeudi'; this.maybeList[this.nbPoll - 1] = 0; this.yesList[this.nbPoll - 1] = 0; this.noList[this.nbPoll - 1] = 0; } + + private getSettedGraphOptions(): any { + // TODO: create interfaces, or find another way to work. "any" return type should be removed. + return { + legend: { display: false }, + scales: { + xAxes: [ + { + gridLines: { drawBorder: false, display: false }, + display: false, + stacked: true, + ticks: { beginAtZero: true, maxRotation: 0, minRotation: 0 }, + }, + ], + yAxes: [ + { + gridLines: { drawBorder: true, display: false }, + display: true, + stacked: true, + }, + ], + }, + }; + } } diff --git a/src/app/poll-participation/poll-participation.module.ts b/src/app/poll-participation/poll-participation.module.ts new file mode 100644 index 00000000..c120c6bb --- /dev/null +++ b/src/app/poll-participation/poll-participation.module.ts @@ -0,0 +1,8 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +@NgModule({ + declarations: [], + imports: [CommonModule], +}) +export class PollParticipationModule {} diff --git a/src/app/services/config.service.ts b/src/app/services/config.service.ts index 838117da..e6917e00 100644 --- a/src/app/services/config.service.ts +++ b/src/app/services/config.service.ts @@ -4,9 +4,9 @@ import { HttpClient } from '@angular/common/http'; import { environment } from '../../environments/environment'; import { ConfirmationService, MessageService } from 'primeng/api'; import { Router } from '@angular/router'; -import { mockMyPolls } from '../config/mocks/mockmypolls'; -import { mockPoll3 } from '../config/mocks/mock-poll3'; -import { mockSuccessVote } from '../config/mocks/mock-success-vote'; +import { mockMyPolls } from '../mocks/mockmypolls'; +import { mockPoll3 } from '../mocks/mock-poll3'; +import { mockSuccessVote } from '../mocks/mock-success-vote'; import { PollUtilities } from '../config/PollUtilities'; const LocalstoragePreferences = { @@ -25,7 +25,7 @@ const LocalstoragePreferences = { export class ConfigService extends PollConfig { preferences: any = LocalstoragePreferences; // user specific preferences, stored in localstorage, used for theme. loading = false; - baseHref: any = environment.baseApiHref; + apiBaseHref: any = environment.api.baseHref; constructor( private http: HttpClient, @@ -138,7 +138,7 @@ export class ConfigService extends PollConfig { return jsonConfig; } - checkIfSlugIsUniqueInDatabase(slug: string = '') { + checkIfSlugIsUniqueInDatabase(slug = '') { this.customUrlIsUnique = null; if (!slug) { slug = this.utils.makeSlug(this); @@ -148,7 +148,7 @@ export class ConfigService extends PollConfig { // TODO this.todo('check slug is unique'); this.http - .get(`${this.baseHref}/check-slug-is-uniq/${slug}`, this.utils.makeHeaders({ slug: this.customUrl })) + .get(`${this.apiBaseHref}/check-slug-is-uniq/${slug}`, this.utils.makeHeaders({ slug: this.customUrl })) .subscribe( (res: any) => { this.customUrlIsUnique = res.poll.isUnique; @@ -170,7 +170,7 @@ export class ConfigService extends PollConfig { this.todo('send email for real : TODO'); this.loading = true; - this.http.get(`${this.baseHref}/send-polls-to-user/${this.myEmail}`, this.utils.makeHeaders()).subscribe( + this.http.get(`${this.apiBaseHref}/send-polls-to-user/${this.myEmail}`, this.utils.makeHeaders()).subscribe( (res) => { // message: 'Trouvé! Allez voir votre boite email', this.myPolls = res; @@ -211,7 +211,7 @@ export class ConfigService extends PollConfig { */ getPollByURL(url: string) { this.todo(); - return this.http.get(`${this.baseHref}/poll/slug/${url}`, this.utils.makeHeaders()); + return this.http.get(`${this.apiBaseHref}/poll/slug/${url}`, this.utils.makeHeaders()); } /** @@ -220,7 +220,7 @@ export class ConfigService extends PollConfig { * @param id */ getPollById(id: string, password?: string) { - return this.http.get(`${this.baseHref}/poll/${id}`, this.utils.makeHeaders({ body: password })); + return this.http.get(`${this.apiBaseHref}/poll/${id}`, this.utils.makeHeaders({ body: password })); } fetchPollFromRoute(event) { @@ -233,7 +233,7 @@ export class ConfigService extends PollConfig { * @param ownerEmail */ getMyPolls(ownerEmail: string) { - this.http.get(`${this.baseHref}/my-polls`, this.utils.makeHeaders({ ownerEmail })).subscribe( + this.http.get(`${this.apiBaseHref}/my-polls`, this.utils.makeHeaders({ ownerEmail })).subscribe( (res: any) => { // this.myPolls = res.poll; }, @@ -256,16 +256,16 @@ export class ConfigService extends PollConfig { this.currentPoll = res; this.pollId = res.poll.id; this.owner_modifier_token = res.owner_modifier_token; - this.urlPublic = this.baseHref + '#/vote/poll/id/' + res.poll.id; - this.urlSlugPublic = this.baseHref + '#/vote/poll/slug/' + res.poll.id; + this.urlPublic = this.apiBaseHref + '#/vote/poll/id/' + res.poll.id; + this.urlSlugPublic = this.apiBaseHref + '#/vote/poll/slug/' + res.poll.id; if (res.poll.customUrl) { - this.urlSlugPublic = this.baseHref + '#/vote/poll/id/' + res.poll.customUrl; + this.urlSlugPublic = this.apiBaseHref + '#/vote/poll/id/' + res.poll.customUrl; } if (res.vote_stack) { this.loadVoteStack(res.vote_stack); } this.adminKey = res.admin_key; - this.urlAdmin = this.baseHref + '#/admin/' + res.admin_key; + this.urlAdmin = this.apiBaseHref + '#/admin/' + res.admin_key; } resetCurrentChoicesAnswers() { @@ -312,7 +312,7 @@ export class ConfigService extends PollConfig { createPollFromConfig(config: any) { this.loading = true; console.log('config', config); - return this.http.post(`${this.baseHref}/poll`, config, this.utils.makeHeaders()).subscribe( + return this.http.post(`${this.apiBaseHref}/poll`, config, this.utils.makeHeaders()).subscribe( (res: any) => { // redirect to the page to administrate the new poll this.messageService.add({ severity: 'success', summary: 'Sondage Créé' }); @@ -372,7 +372,7 @@ export class ConfigService extends PollConfig { this.handleVoteAdded(mockSuccessVote); return; } - this.http.post(`${this.baseHref}/poll/${this.pollId}/vote`, voteStack, this.utils.makeHeaders()).subscribe( + this.http.post(`${this.apiBaseHref}/poll/${this.pollId}/vote`, voteStack, this.utils.makeHeaders()).subscribe( (res: any) => { this.handleVoteAdded(res); }, @@ -384,7 +384,8 @@ export class ConfigService extends PollConfig { handleVoteAdded(res) { if (this.isAdmin) { - this.displayConfirmVoteModalAdmin = true; + // TODO : REFACTO, displayConfirmVoteModalAdmin exists only in voting-summary.component + // this.displayConfirmVoteModalAdmin = true; } // save modifier token this.myVoteStack.modifier_token = res.modifier_token; @@ -405,7 +406,7 @@ export class ConfigService extends PollConfig { } this.http .patch( - `${this.baseHref}/vote-stack/${voteStack.id}/token/${this.owner_modifier_token}`, + `${this.apiBaseHref}/vote-stack/${voteStack.id}/token/${this.owner_modifier_token}`, voteStack, this.utils.makeHeaders() ) @@ -436,7 +437,7 @@ export class ConfigService extends PollConfig { }; } console.log('comment', comment); - this.http.post(`${this.baseHref}/poll/${this.pollId}/comment`, comment, this.utils.makeHeaders()).subscribe( + this.http.post(`${this.apiBaseHref}/poll/${this.pollId}/comment`, comment, this.utils.makeHeaders()).subscribe( (res: any) => { this.messageService.add({ severity: 'success', @@ -468,18 +469,20 @@ export class ConfigService extends PollConfig { this.title + ') permanentely?', accept: () => { - this.http.delete(`${this.baseHref}/poll/${this.pollId}/comments`, this.utils.makeHeaders()).subscribe( - (res: any) => { - this.messageService.add({ - severity: 'success', - summary: 'Commentaires bien supprimés', - detail: 'Commentaires du sondage "' + this.title + '" supprimé', - }); - }, - (e) => { - this.handleError(e); - } - ); + this.http + .delete(`${this.apiBaseHref}/poll/${this.pollId}/comments`, this.utils.makeHeaders()) + .subscribe( + (res: any) => { + this.messageService.add({ + severity: 'success', + summary: 'Commentaires bien supprimés', + detail: 'Commentaires du sondage "' + this.title + '" supprimé', + }); + }, + (e) => { + this.handleError(e); + } + ); }, }); } @@ -492,7 +495,7 @@ export class ConfigService extends PollConfig { this.title + ') permanentely?', accept: () => { - this.http.delete(`${this.baseHref}/poll/${this.pollId}/votes`, this.utils.makeHeaders()).subscribe( + this.http.delete(`${this.apiBaseHref}/poll/${this.pollId}/votes`, this.utils.makeHeaders()).subscribe( (res: any) => { this.messageService.add({ severity: 'success', @@ -524,7 +527,7 @@ export class ConfigService extends PollConfig { self.title + ') and all is data permanentely?', accept: () => { - this.http.delete(`${this.baseHref}/poll/${this.pollId}`, this.utils.makeHeaders()).subscribe( + this.http.delete(`${this.apiBaseHref}/poll/${this.pollId}`, this.utils.makeHeaders()).subscribe( (res: any) => { this.messageService.add({ severity: 'success', @@ -549,7 +552,7 @@ export class ConfigService extends PollConfig { * TODO */ updatePoll(voteStack: any) { - this.http.put(`${this.baseHref}/poll/${this.pollId}`, voteStack, this.utils.makeHeaders()).subscribe( + this.http.put(`${this.apiBaseHref}/poll/${this.pollId}`, voteStack, this.utils.makeHeaders()).subscribe( (res: any) => { this.messageService.add({ severity: 'success', @@ -645,7 +648,7 @@ export class ConfigService extends PollConfig { } download(filename, text) { - var element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); diff --git a/src/app/services/poll-service.service.spec.ts b/src/app/services/poll-service.service.spec.ts deleted file mode 100644 index e2a84713..00000000 --- a/src/app/services/poll-service.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { PollService } from './poll.service'; - -describe('PollServiceService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: PollService = TestBed.get(PollService); - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/services/poll.service.ts b/src/app/services/poll.service.ts deleted file mode 100644 index 21d42e22..00000000 --- a/src/app/services/poll.service.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Injectable } from '@angular/core'; -import { environment } from '../../environments/environment'; - -@Injectable({ - providedIn: 'root', -}) -export class PollService { - private baseHref: string = environment.baseApiHref; - - constructor() {} -} diff --git a/src/app/services/progression.service.spec.ts b/src/app/services/progression.service.spec.ts deleted file mode 100644 index 5833109e..00000000 --- a/src/app/services/progression.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ConfigService } from './config.service'; - -describe('ConfigService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: ConfigService = TestBed.get(ConfigService); - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/shared/enums/answer-granularity.enum.ts b/src/app/shared/enums/answer-granularity.enum.ts new file mode 100644 index 00000000..41db4d07 --- /dev/null +++ b/src/app/shared/enums/answer-granularity.enum.ts @@ -0,0 +1,4 @@ +export enum AnswerGranularity { + BASIC = 'BASIC', + COMPLEX = 'COMPLEX', +} diff --git a/src/app/shared/enums/answer-type.enum.ts b/src/app/shared/enums/answer-type.enum.ts new file mode 100644 index 00000000..bb70f154 --- /dev/null +++ b/src/app/shared/enums/answer-type.enum.ts @@ -0,0 +1,5 @@ +export enum AnswerType { + YES = 'YES', + NO = 'NO', + MAYBE = 'MAYBE', +} diff --git a/src/app/shared/enums/poll-type.enum.ts b/src/app/shared/enums/poll-type.enum.ts new file mode 100644 index 00000000..ac9b2432 --- /dev/null +++ b/src/app/shared/enums/poll-type.enum.ts @@ -0,0 +1,4 @@ +export enum PollType { + CLASSIC = 'CLASSIC', + DATES = 'DATES', +} diff --git a/src/app/shared/enums/theme.enum.ts b/src/app/shared/enums/theme.enum.ts new file mode 100644 index 00000000..fd0d9f6a --- /dev/null +++ b/src/app/shared/enums/theme.enum.ts @@ -0,0 +1,5 @@ +export enum Theme { + LIGHT = 'LIGHT', + DARK = 'DARK', + RED = 'RED', +} diff --git a/src/app/shared/interfaces/date-options.interface.ts b/src/app/shared/interfaces/date-options.interface.ts new file mode 100644 index 00000000..63bd34a6 --- /dev/null +++ b/src/app/shared/interfaces/date-options.interface.ts @@ -0,0 +1,5 @@ +export interface DateOption { + timeList: any; + literal: string; + date_object?: object; +} diff --git a/src/app/shared/models/answer.model.ts b/src/app/shared/models/answer.model.ts new file mode 100644 index 00000000..03e14b92 --- /dev/null +++ b/src/app/shared/models/answer.model.ts @@ -0,0 +1,6 @@ +import { AnswerType } from '../enums/answer-type.enum'; +import { PollOption } from './poll-options.model'; + +export class Answer { + constructor(public pollOption: PollOption, public type: AnswerType, public userPseudo: string) {} +} diff --git a/src/app/shared/models/poll-config.model.ts b/src/app/shared/models/poll-config.model.ts new file mode 100644 index 00000000..b3cadaeb --- /dev/null +++ b/src/app/shared/models/poll-config.model.ts @@ -0,0 +1,13 @@ +import { AnswerGranularity } from '../enums/answer-granularity.enum'; + +export class PollConfig { + constructor( + public allowSeveralHours = true, + public isVisibleToAnyoneWithTheLink: boolean = true, + public answerType: AnswerGranularity = AnswerGranularity.BASIC, + public creationDate: Date = new Date(), + public expirationDate?: Date, + public canVotersModifyTheirAnswers = true, + public isProtectedByPassword: boolean = false + ) {} +} diff --git a/src/app/shared/models/poll-options.model.ts b/src/app/shared/models/poll-options.model.ts new file mode 100644 index 00000000..da14d52e --- /dev/null +++ b/src/app/shared/models/poll-options.model.ts @@ -0,0 +1,9 @@ +import { isValid } from 'date-fns'; + +export class PollOption { + constructor(public label: string, public url?: string, public subOptions?: PollOption[]) {} + + public isDatePoll(): boolean { + return isValid(this.label); + } +} diff --git a/src/app/shared/models/poll.model.ts b/src/app/shared/models/poll.model.ts new file mode 100644 index 00000000..600aafa4 --- /dev/null +++ b/src/app/shared/models/poll.model.ts @@ -0,0 +1,19 @@ +import { PollType } from '../enums/poll-type.enum'; +import { Answer } from './answer.model'; +import { PollConfig } from './poll-config.model'; +import { PollOption } from './poll-options.model'; +import { User } from './user.model'; + +export class Poll { + constructor( + public id: string, + public slug: string, + public type: PollType, + public title: string, + public description: string, + public owner: User, + public config: PollConfig, + public options: PollOption[] = [], + public answers: Answer[] = [] + ) {} +} diff --git a/src/app/shared/models/ui-config.model.ts b/src/app/shared/models/ui-config.model.ts new file mode 100644 index 00000000..d748cfea --- /dev/null +++ b/src/app/shared/models/ui-config.model.ts @@ -0,0 +1,5 @@ +import { Theme } from '../enums/theme.enum'; + +export class UIConfig { + constructor(public isMenuVisible = true, public theme: Theme.LIGHT) {} +} diff --git a/src/app/shared/models/user.model.ts b/src/app/shared/models/user.model.ts new file mode 100644 index 00000000..9d381d7e --- /dev/null +++ b/src/app/shared/models/user.model.ts @@ -0,0 +1,10 @@ +import { Poll } from './poll.model'; + +export class User { + constructor( + public isOwner: boolean = false, + public pseudo?: string, + public email?: string, + public polls?: Poll[] + ) {} +} diff --git a/src/app/shared/services/api.service.spec.ts b/src/app/shared/services/api.service.spec.ts new file mode 100644 index 00000000..76f8ad98 --- /dev/null +++ b/src/app/shared/services/api.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ApiService } from './api.service'; + +describe('ApiService', () => { + let service: ApiService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ApiService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/api.service.ts b/src/app/shared/services/api.service.ts new file mode 100644 index 00000000..17e0f0fe --- /dev/null +++ b/src/app/shared/services/api.service.ts @@ -0,0 +1,195 @@ +import { Injectable } from '@angular/core'; +import axios, { AxiosResponse } from 'axios'; +import { environment } from 'src/environments/environment'; + +import { Poll } from '../models/poll.model'; +import { User } from '../models/user.model'; + +@Injectable({ + providedIn: 'root', +}) +export class ApiService { + //////////// + // CREATE // + //////////// + public async savePoll(poll: Poll): Promise { + try { + await axios.post(`${environment.api.baseHref}${environment.api.endpoints.poll.root}`, { + params: { config: poll.config }, + }); + } catch (error) { + this.handleError(error); + } + } + + public async saveVote(poll: Poll): Promise { + try { + // TODO: add the votestack in the params + await axios.post( + `${environment.api.baseHref}${environment.api.endpoints.poll.root}/${poll.id}${environment.api.endpoints.vote}`, + { params: { voteStack: {} } } + ); + } catch (error) { + this.handleError(error); + } + } + + public async saveComment(poll: Poll, comment: string): Promise { + try { + // TODO: add the comment in the params + await axios.post( + `${environment.api.baseHref}${environment.api.endpoints.poll.root}/${poll.id}${environment.api.endpoints.comment}`, + { params: { comment } } + ); + } catch (error) { + this.handleError(error); + } + } + + ////////// + // READ // + ////////// + public async isSlugAvailable(slug: string): Promise { + try { + // TODO: what is the return of the API ? could it be changed to an object { isAvailable: true } ? + const response: AxiosResponse = await axios.get( + `${environment.api.baseHref}${environment.api.endpoints.slug.isAvailable}/${slug}` + ); + if (response) { + const { isAvailable } = response.data; + return isAvailable; + } + } catch (error) { + this.handleError(error); + } + } + + public async sendUserPollsByEmail(email: string): Promise { + // If user is not authenticated: the list of polls is send to user's email by the backend. + try { + const response: AxiosResponse = await axios.get( + `${environment.api.baseHref}${environment.api.endpoints.poll.byEmail.sendEmail}/${email}` + ); + return response ? response.data : []; + } catch (error) { + this.handleError(error); + } + } + + public async getUserPollsByEmail(user: User): Promise { + // If user is authenticated : retrieve polls & display directly in frontend. + // TODO: Backend should handle this case. Actually the endpoint doesn't exist in backend. + try { + const response: AxiosResponse = await axios.get( + `${environment.api.baseHref}${environment.api.endpoints.poll.byEmail.retrieve}/${user.email}` + ); + return response ? response.data : []; + } catch (error) { + this.handleError(error); + } + } + + public async getPollsByUrl(url: string): Promise { + try { + const response: AxiosResponse = await axios.get( + `${environment.api.baseHref}${environment.api.endpoints.poll.byUrl}/${url}` + ); + return response ? response.data : []; + } catch (error) { + this.handleError(error); + } + } + + public async getPollById(id: string, password?: string): Promise { + try { + const response: AxiosResponse = await axios.get( + `${environment.api.baseHref}${environment.api.endpoints.poll.root}/${id}`, + password ? { params: { password } } : {} + ); + return response ? response.data : []; + } catch (error) { + this.handleError(error); + } + } + + //////////// + // UPDATE // + //////////// + public async updatePoll(poll: Poll): Promise { + try { + // TODO: implement the params when entities are finalized. + await axios.put(`${environment.api.baseHref}${environment.api.endpoints.poll.root}/${poll.id}`, { + params: { voteStack: {}, token: '' }, + }); + } catch (error) { + this.handleError(error); + } + } + + public async updateVote(voteStack: any): Promise { + try { + // TODO: implement the params when entities are finalized. + await axios.patch(`${environment.api.baseHref}${environment.api.endpoints.vote.root}/${voteStack.id}`, { + params: { voteStack: {}, token: '' }, + }); + } catch (error) { + this.handleError(error); + } + } + + //////////// + // DELETE // + //////////// + + public async deletePoll(poll: Poll): Promise { + try { + await axios.delete(`${environment.api.baseHref}${environment.api.endpoints.poll.root}${poll.id}`, {}); + } catch (error) { + this.handleError(error); + } + } + + public async deletePollVotes(poll: Poll): Promise { + try { + // TODO: update endpoint in Backend + await axios.delete( + `${environment.api.baseHref}${environment.api.endpoints.poll.root}${poll.id}${environment.api.endpoints.vote.root}` + ); + } catch (error) { + this.handleError(error); + } + } + + public async deletePollComments(poll: Poll): Promise { + try { + // TODO: modify endpoint in Backend + await axios.delete( + `${environment.api.baseHref}${environment.api.endpoints.poll.root}${poll.id}${environment.api.endpoints.comment.root}` + ); + } catch (error) { + this.handleError(error); + } + } + + ///////////////////// + // PRIVATE METHODS // + ///////////////////// + private handleError(error): void { + if (error.response) { + // The request was made and the server responded with a status code + // that falls out of the range of 2xx + console.log(error.response.data); + console.log(error.response.status); + console.log(error.response.headers); + } else if (error.request) { + // The request was made but no response was received + // `error.request` is an instance of XMLHttpRequest in the browser and an instance of + // http.ClientRequest in node.js + console.log(error.request); + } else { + // Something happened in setting up the request that triggered an Error + console.log('Error', error.message); + } + console.log(error.config); + } +} diff --git a/src/app/shared/services/comment.service.spec.ts b/src/app/shared/services/comment.service.spec.ts new file mode 100644 index 00000000..1b037bdc --- /dev/null +++ b/src/app/shared/services/comment.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { CommentService } from './comment.service'; + +describe('CommentService', () => { + let service: CommentService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(CommentService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/comment.service.ts b/src/app/shared/services/comment.service.ts new file mode 100644 index 00000000..58313418 --- /dev/null +++ b/src/app/shared/services/comment.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; + +import { Poll } from '../models/poll.model'; +import { ApiService } from './api.service'; + +@Injectable({ + providedIn: 'root', +}) +export class CommentService { + constructor(private apiService: ApiService) {} + + public saveComment(poll: Poll, comment: string): void { + this.apiService.saveComment(poll, comment); + } +} diff --git a/src/app/shared/services/date-utils.service.spec.ts b/src/app/shared/services/date-utils.service.spec.ts new file mode 100644 index 00000000..64eb56af --- /dev/null +++ b/src/app/shared/services/date-utils.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DateUtilsService } from './date-utils.service'; + +describe('DateUtilsService', () => { + let service: DateUtilsService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DateUtilsService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/date-utils.service.ts b/src/app/shared/services/date-utils.service.ts new file mode 100644 index 00000000..5e02c515 --- /dev/null +++ b/src/app/shared/services/date-utils.service.ts @@ -0,0 +1,50 @@ +import { Injectable } from '@angular/core'; +import { addDays, differenceInDays, format } from 'date-fns'; + +@Injectable({ + providedIn: 'root', +}) +export class DateUtilsService { + public static addDaysToDate(days: number, date: Date): Date { + return addDays(date, days); + } + + public static diffInDays(dateLeft: Date, dateRight: Date): number { + return differenceInDays(dateLeft, dateRight); + } + + public static formatDate(date): string { + return format(date, 'yyyy-MM-dd'); + } + + public static orderDates(): Date[] { + // TODO: to implement + const datesOrdered: Date[] = []; + return datesOrdered; + } + + public static getDatesInRange(d1: Date, d2: Date, interval: number): Date[] { + // TODO: refacto this + d1 = new Date(d1); + d2 = new Date(d2); + const dates = []; + while (+d1 < +d2) { + dates.push({ + literal: this.formateDate(d1), + date_object: d1, + }); + d1.setDate(d1.getDate() + interval); + } + return [...dates]; + } + + public static getDoubleDigits(str: string): string { + // TODO: ça sert à quoi ça ? + // Parce que ajouter 2 caractère à une string et ensuite slicer à partir du 2ème caractère, euh… + return ('00' + str).slice(-2); + } + + private isInChronologicalOrder(date1: Date, date2: Date): boolean { + return date1 < date2; + } +} diff --git a/src/app/shared/services/poll-utils.service.spec.ts b/src/app/shared/services/poll-utils.service.spec.ts new file mode 100644 index 00000000..b4d15e67 --- /dev/null +++ b/src/app/shared/services/poll-utils.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { PollUtilsService } from './poll-utils.service'; + +describe('PollUtilsService', () => { + let service: PollUtilsService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(PollUtilsService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/poll-utils.service.ts b/src/app/shared/services/poll-utils.service.ts new file mode 100644 index 00000000..cbe39664 --- /dev/null +++ b/src/app/shared/services/poll-utils.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { v4 as uuidv4 } from 'uuid'; + +@Injectable({ + providedIn: 'root', +}) +export class PollUtilsService { + public makeUuid(): string { + // TODO: how to be sure the uuid generated in front is available in backend ? + // It could be a better way to generate uuids in backend. + return uuidv4(); + } + + /** + * make a uniq slug for the current poll creation + * @param str + */ + public makeSlug(config: PollConfig): string { + let str = ''; + str = + config.creationDate.getFullYear() + + '_' + + (config.creationDate.getMonth() + 1) + + '_' + + config.creationDate.getDate() + + '_' + + config.myName + + '_' + + config.title; + str = str.replace(/^\s+|\s+$/g, ''); // trim + str = str.toLowerCase(); + + // remove accents, swap ñ for n, etc + const from = 'àáäâèéëêìíïîòóöôùúüûñç·/_,:;'; + const to = 'aaaaeeeeiiiioooouuuunc------'; + for (let i = 0, l = from.length; i < l; i++) { + str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i)); + } + + str = str + .replace(/[^a-z0-9 -]/g, '') // remove invalid chars + .replace(/\s+/g, '-') // collapse whitespace and replace by - + .replace(/-+/g, '-'); // collapse dashes + + return str; + } +} diff --git a/src/app/shared/services/poll.service.spec.ts b/src/app/shared/services/poll.service.spec.ts new file mode 100644 index 00000000..73ce53fe --- /dev/null +++ b/src/app/shared/services/poll.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { PollService } from './poll.service'; + +describe('PollService', () => { + let service: PollService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(PollService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/poll.service.ts b/src/app/shared/services/poll.service.ts new file mode 100644 index 00000000..58731446 --- /dev/null +++ b/src/app/shared/services/poll.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject, Observable } from 'rxjs'; + +import { Poll } from '../models/poll.model'; +import { ApiService } from './api.service'; + +@Injectable({ + providedIn: 'root', +}) +export class PollService { + private _poll: BehaviorSubject = new BehaviorSubject(undefined); + + constructor(private apiService: ApiService) {} + + public get poll(): Observable { + return this._poll.asObservable(); + } + + public updateCurrentPoll(poll: Poll): void { + this._poll.next(poll); + } + + public savePoll(poll: Poll): void { + this.apiService.savePoll(poll); + } + + public saveVote(poll: Poll): void { + this.apiService.saveVote(poll); + } + + public saveComment(poll: Poll, comment: string): void { + this.apiService.saveComment(poll, comment); + } + + public deletePollVotes(poll: Poll): void { + this.apiService.deletePollVotes(poll); + } + + public deletePollComments(poll: Poll): void { + this.apiService.deletePollComments(poll); + } +} diff --git a/src/app/shared/services/theme.service.spec.ts b/src/app/shared/services/theme.service.spec.ts new file mode 100644 index 00000000..102938f6 --- /dev/null +++ b/src/app/shared/services/theme.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ThemeService } from './theme.service'; + +describe('ThemeService', () => { + let service: ThemeService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ThemeService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/theme.service.ts b/src/app/shared/services/theme.service.ts new file mode 100644 index 00000000..93f19666 --- /dev/null +++ b/src/app/shared/services/theme.service.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', +}) +export class ThemeService { + constructor() {} +} diff --git a/src/app/shared/services/user.service.spec.ts b/src/app/shared/services/user.service.spec.ts new file mode 100644 index 00000000..3e8525df --- /dev/null +++ b/src/app/shared/services/user.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { UserService } from './user.service'; + +describe('UserService', () => { + let service: UserService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(UserService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/user.service.ts b/src/app/shared/services/user.service.ts new file mode 100644 index 00000000..125019c8 --- /dev/null +++ b/src/app/shared/services/user.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject, Observable } from 'rxjs'; + +import { User } from '../models/user.model'; + +@Injectable({ + providedIn: 'root', +}) +export class UserService { + private _user: BehaviorSubject = new BehaviorSubject(undefined); + + public get user(): Observable { + return this._user.asObservable(); + } + + public updateUser(user: User): void { + this._user.next(user); + } +} diff --git a/src/app/shared/services/vote.service.spec.ts b/src/app/shared/services/vote.service.spec.ts new file mode 100644 index 00000000..c0d73363 --- /dev/null +++ b/src/app/shared/services/vote.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { VoteService } from './vote.service'; + +describe('VoteService', () => { + let service: VoteService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(VoteService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/shared/services/vote.service.ts b/src/app/shared/services/vote.service.ts new file mode 100644 index 00000000..c84b7863 --- /dev/null +++ b/src/app/shared/services/vote.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@angular/core'; +import { ApiService } from './api.service'; + +@Injectable({ + providedIn: 'root', +}) +export class VoteService { + constructor(private apiService: ApiService) {} + + public saveVote(vote: any): void { + this.apiService.saveVote(vote); + } + + public updateVote(vote: any): void { + this.apiService.updateVote(vote); + } +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts new file mode 100644 index 00000000..4104f864 --- /dev/null +++ b/src/app/shared/shared.module.ts @@ -0,0 +1,8 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@NgModule({ + declarations: [], + imports: [CommonModule], +}) +export class SharedModule {} diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 46200b00..ffb48d86 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,5 +1,18 @@ export const environment = { production: true, - baseHref: 'https://framadate-api.cipherbliss.com/', - baseApiHref: 'https://framadate-api.cipherbliss.com/api/v1', + api: { + baseHref: 'https://framadate-api.cipherbliss.com/api/v1', + endpoints: { + isSlugAvailable: '/check-slug-is-uniq', + }, + }, + poll: { + defaultConfig: { + expiracyInDays: 60, + expiracyAfterLastModificationInDays: 180, + }, + }, + localStorage: { + key: 'framadate-storage', + }, }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 7e5e9188..c7fcb8b6 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -1,18 +1,47 @@ // This file can be replaced during build by using the `fileReplacements` array. // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. // The list of file replacements can be found in `angular.json`. -let baseURL = 'http://localhost:8000/'; -const baseURLProd = 'https://framadate.org/'; -const baseURLDemo = 'https://framadate-api.cipherbliss.com/'; -const apiVersion = 1; -const testOnDemo = 0; -if (testOnDemo) { - baseURL = baseURLDemo; -} + +const backendApiUrlsInDev = { + local: 'http://localhost:8000/', + remote: 'https://framadate-api.cipherbliss.com/', +}; + export const environment = { production: false, - baseHref: baseURL, - baseApiHref: baseURL + 'api/v' + apiVersion, + api: { + baseHref: backendApiUrlsInDev.local + 'api/v1', + endpoints: { + slug: { + root: '/slug', + isAvailable: '/check-slug-is-uniq', + }, + poll: { + root: '/poll', + byEmail: { + sendEmail: '/send-polls-to-user', + retrieve: '/my-polls', + }, + byUrl: '/poll/slug', + byId: '/poll/slug', + }, + vote: { + root: '/vote', + }, + comment: { + root: '/comment', + }, + }, + }, + poll: { + defaultConfig: { + expiracyInDays: 60, + expiracyAfterLastModificationInDays: 180, + }, + }, + localStorage: { + key: 'framadate-storage', + }, }; /* @@ -22,4 +51,4 @@ export const environment = { * This import should be commented out in production mode because it will have a negative impact * on performance if an error is thrown. */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. +import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/tsconfig.spec.json b/tsconfig.spec.json index 244b4bf8..a1659053 100644 --- a/tsconfig.spec.json +++ b/tsconfig.spec.json @@ -6,4 +6,4 @@ }, "files": ["src/test.ts", "src/polyfills.ts"], "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index d8b85827..92a826cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -118,14 +118,14 @@ rxjs "6.5.4" "@angular/animations@^9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-9.1.1.tgz#983e54d96e7a854cee801dbac214f31c03c1cfa8" - integrity sha512-IvKv8sV0ymbzDEX2ZLW+F6nOTQqDYallHexuzRVT9txvNE8TNHyySvLcyC5dTmX9fj9LA72NZ6nFyhxq0LFvtQ== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-9.1.2.tgz#01bb52d5a8813701bfacbba99338d88cfc0da9b4" + integrity sha512-5UJ8SzCtFj4vZChVsni4K9oa4qE9tQ67bwnP6DKxkLEJKQWWyasYp+2siAi/7zD2ro2XA0qRMYhgQz5Vj6eBoQ== "@angular/cdk@^9.2.0": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-9.2.0.tgz#587e4a9d5046fa89a68d8eddaee6b185e2915842" - integrity sha512-jeeznvNDpR9POuxzz8Y0zFvMynG9HCJo3ZPTqOjlOq8Lj8876+rLsHDvKEMeLdwlkdi1EweYJW1CLQzI+TwqDA== + version "9.2.1" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-9.2.1.tgz#9a590b8d4671fe2fa47648297b5ea372267d238f" + integrity sha512-aSG1UNPszkSnpNuDCNd7ZgT29oQ8vqHPmoqjvJI0JkEv3i6uEs5tRuhWl3TK39wDNuwdlq0AY47XTa/0Ppb5RQ== optionalDependencies: parse5 "^5.0.0" @@ -156,14 +156,14 @@ uuid "7.0.2" "@angular/common@^9.0.7": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-9.1.1.tgz#29828cbb5e1f3f81cd6aa9468e9e1d4f02c1c7e8" - integrity sha512-bS13veMs7//YqYjYJ+JI78ylaCyVcdFKZKikd5SZa6+r6fajcyvLnSKqrKypG3O1BeJ8vOG/Pq54P5gWhbR6eA== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-9.1.2.tgz#cec9fbfc572bbcf715e994523b04ac48700c1b2c" + integrity sha512-MAQW0DGq2NhvJSETLTwuImdzwI+wboG+5Uzgc0L8C/hX7SrEE65Hmz4nIjmGi2CPGLpodfWEcCPlV0R0dHun4A== "@angular/compiler-cli@^9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-9.1.1.tgz#c827190576e20e276c92fc2b140ece662b082ac5" - integrity sha512-2jGp0ck2kkLNMzXUo/3iJkrQqJ7oGXE8h2tksxBsH2ptnhexRYTHZ626t7Np128tduY5JeC7J1Jxz7MUuYsJ2Q== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-9.1.2.tgz#2b8de148aadcd58fcd31d0f1ad3b984f412f4c82" + integrity sha512-zC/oIuT68vtuiYrgXqWsDNi/0DQ1Ti6J6gMTrXVvZXlEDikEExTAJKrrBV5jo6B0bpUofe/dDcJaKR3Ys3cM3Q== dependencies: canonical-path "1.0.0" chokidar "^3.0.0" @@ -179,48 +179,48 @@ yargs "15.3.0" "@angular/compiler@^9.0.7": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.1.1.tgz#c2964849cc42d483ef2a5dd06d8e91d69a8ebe12" - integrity sha512-u1IP6IzUgK6lIzrG1cxp96umXgtThyhuFn/KPoyVt7wPxZ6vVR0ZxjM7zycEcrMGzk0nf0nyOKaksJk9sTXTbg== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.1.2.tgz#52b22120ca3c7d27dccf4239c849158ad64fb435" + integrity sha512-82DitvlZA5DoE++qiiJdgx6HE71h96sfLHCjjvYJHApoOcnX+zBZFBrflpbXK9W4YdvydU4Lc1Ql1eleQPeT/g== "@angular/core@^9.0.7": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.1.1.tgz#0a4bb3f81e4103d141556dd5c7272f05bc78cfaa" - integrity sha512-6lDlUlePafr/392hOvvTZZl6xPHT50U6658sHUAVIr0Un4mJ2MHNHKZtO45bpn3hM4gjFcYRQ7Rpd0umW74iTA== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.1.2.tgz#30970d49dc3b53c0dc68cd75dbc2c96afc7fee62" + integrity sha512-nAqRl+5drAnZlBT7AgSo2JJubmPNrGCvhZ83dosPEUqJoLr69/lYipnF/iqKzYn5xo4MM1O27WIhSNDtDjBmzQ== "@angular/forms@^9.0.7": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-9.1.1.tgz#3090829dd2989207fd9a4dbc5b44b3ff9b2fe948" - integrity sha512-NX+LuK8JFisiq3uHCOK6YoN/yIb2R9Ye5mwiOPkuZA3lZLKCnUXqCHZbM8VHy/WdjIxxeUaFMJc38yV8RVoabg== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-9.1.2.tgz#84b7c429fad81c781108fc71d694ae76eab4c808" + integrity sha512-/f2WhMiKDo1/RoisTI71Dy4Z4+sAsAuzgIxJEXvgDGSYvzLl9G8erFx4N6be8Cy/xXwErmp3JOwXIAXjzxF8tA== "@angular/language-service@^9.0.7": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-9.1.1.tgz#c3aa6afdc4b5c14423086527e6f0783c3c00d600" - integrity sha512-T+/0X2VnmgW/vzynqYTVv29qtebNvrCB/yJqtNIlqXvBjcB8XRRwZPDZvRyl5BiwEPSsJnjdRFNH9krQHxYp+g== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-9.1.2.tgz#01b6e289c43148378a54a616681f24d9e8b87183" + integrity sha512-0BnDIFbIAtFKS/2HDI0efcnW3DSkAAFhUWluBnssvwGzuMHikOKGeamuWM27ki3IzPQKGJ7fGS2fz8A7sMeIYQ== "@angular/localize@^9.1.1": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-9.1.1.tgz#267d7cecb288b3019482744330da0ef9e049c85d" - integrity sha512-5mYdSL7IwqFXWRgBXj9c5vHT15AQy2kjD40fJJsmUx4WUFr+uf0Ss9ADCfL2FjCHpATrjYKpiyJs1mAF60USPQ== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-9.1.2.tgz#c4846e2beaaf18ca7923b1d96541195e293ebef8" + integrity sha512-Oee/SmFB5wrvmw2evzNnNdQUUqeVg1w1B4YdqLdI7cuPv5Y+YXvo6Mz6yUh1IFELgpK9elYARLYTx6HVobbaWw== dependencies: "@babel/core" "7.8.3" glob "7.1.2" yargs "15.3.0" "@angular/platform-browser-dynamic@^9.0.7": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.1.tgz#aaaa31a8ddf6e810755644180703118c792b8ca0" - integrity sha512-kEox5UOwkRLjGKXLh5o5SYopoAylpKgrXtRrKRKTCMmZTpYSe1bLlXMjpwMAMZ9ZFSTvWp9iX94aT5bJDpLrRQ== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.2.tgz#5587d536184e1c92498d9000475dd8998df1b110" + integrity sha512-BWHxy8S71z+NmUQmtR+/Dkohlj3LQIXltOqeVdCSpjV9cultBNN3bE1w0Rjp3BmCRGCIDH7qFlr4U5woHa7ldw== "@angular/platform-browser@^9.0.7": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-9.1.1.tgz#bb5a98a3a33a307436684c4c7e2c448c786ae466" - integrity sha512-tjALKhdAWPErj0euIIdvx/31AHEZ7is7ADsMu+nYn2NY2gcPUuiqq3RCUJVxBYJ2Cclq1nlF0i2rEDKh7TrBKg== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-9.1.2.tgz#ae52a0a9087e682e62c33722d7d7f81813cf499a" + integrity sha512-/3L4DdvnebvaJUurusaq8RJBFfr/SHWG6DMmV1VVpADxe8kjREyN0LdNDSkZgVf/QcUSwNEA6153iwcF92Otew== "@angular/router@^9.0.7": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-9.1.1.tgz#a296207900b623d991cd1e6371ae2341ffa40e8c" - integrity sha512-OQ5Ctd+swF7ZNlgUxrkGKk2B4yBFqJm0QCxkM86kFDCKQV/4OButZ+4HPy1HxeozBIAmm2pbQA+YjsAUs0VZcQ== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-9.1.2.tgz#f23ba191c4407c4bce0b7ea7f7ca5edd47ada010" + integrity sha512-csxE4HkuhVR1X932Q3kSDqBoF7Awuq5dsjv0nFk78raiHgG3CNnfMLHt8xD9XtOmR7ZT+D4yh/YmIK6W7J5hbQ== "@babel/code-frame@7.5.5": version "7.5.5" @@ -1054,7 +1054,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.0", "@babel/runtime@^7.9.2": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== @@ -1215,11 +1215,6 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@fortawesome/angular-fontawesome@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.6.1.tgz#1ebe5db16bfdd4be44bdde61f78c760eb4e219fa" - integrity sha512-ARQjtRuT+ZskzJDJKPwuiGO3+7nS0iyNLU/uHVJHfG4LwGJxwVIGldwg1SU957sra0Z0OtWEajHMhiS4vB9LwQ== - "@fullcalendar/core@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@fullcalendar/core/-/core-4.4.0.tgz#79dbc0cca836ce628a07e739a456da11ff141373" @@ -1748,9 +1743,9 @@ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/marked@^0.7.2": - version "0.7.3" - resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.7.3.tgz#3859f6fea52a2b73f42283018bd34b03f3c4fb3f" - integrity sha512-WXdEKuT3azHxLTThd5dwnpLt2Q9QiC8iKj09KZRtVqro3pX8hhY+GbD8FZOae6SBBEJ22yKJn3c7ejL0aucAcA== + version "0.7.4" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.7.4.tgz#607685669bb1bbde2300bc58ba43486cbbee1f0a" + integrity sha512-fdg0NO4qpuHWtZk6dASgsrBggY+8N4dWthl1bAQG9ceKUNKFjqpHaDKCAhRUI6y8vavG7hLSJ4YBwJtZyZEXqw== "@types/minimatch@*": version "3.0.3" @@ -1758,9 +1753,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*", "@types/node@^13.11.1": - version "13.11.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.1.tgz#49a2a83df9d26daacead30d0ccc8762b128d53c7" - integrity sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g== + version "13.13.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.0.tgz#30d2d09f623fe32cde9cb582c7a6eda2788ce4a8" + integrity sha512-WE4IOAC6r/yBZss1oQGM5zs2D7RuKR6Q+w+X2SouPofnWn+LbCqClRyhO3ZE7Ix8nmFgo/oVuuE01cJT2XB13A== "@types/npmlog@^4.1.2": version "4.1.2" @@ -1809,7 +1804,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.9.11": +"@types/react@*": version "16.9.34" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.34.tgz#f7d5e331c468f53affed17a8a4d488cd44ea9349" integrity sha512-8AJlYMOfPe1KGLKyHpflCg5z46n0b5DbRfqDksxBLBTUpB75ypDBAO9eCUcjNwE6LCUslwTz00yyG/X9gaVtow== @@ -1833,12 +1828,17 @@ integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ== "@types/uglify-js@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.5.tgz#2c70d5c68f6e002e3b2e4f849adc5f162546f633" - integrity sha512-L7EbSkhSaWBpkl+PZAEAqZTqtTeIsq7s/oX/q0LNnxxJoRVKQE0T81XDVyaxjiiKQwiV2vhVeYRqxdRNqGOGJw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.0.tgz#4490a140ca82aa855ad68093829e7fd6ae94ea87" + integrity sha512-3ZcoyPYHVOCcLpnfZwD47KFLr8W/mpUcgjpf1M4Q78TMJIw7KMAHSjiCLJp1z3ZrBR9pTLbe191O0TldFK5zcw== dependencies: source-map "^0.6.1" +"@types/uuid@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.2.tgz#d680a9c596ef84abf5c4c07a32ffd66d582526f8" + integrity sha512-8Ly3zIPTnT0/8RCU6Kg/G3uTICf9sRwYOpUzSIM3503tLIKcnJPRuinHhXngJUy2MntrEf6dlpOHXJju90Qh5w== + "@types/webpack-env@^1.15.0": version "1.15.1" resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.1.tgz#c8e84705e08eed430b5e15b39c65b0944e4d1422" @@ -1866,39 +1866,39 @@ source-map "^0.6.0" "@typescript-eslint/eslint-plugin@^2.27.0": - version "2.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.27.0.tgz#e479cdc4c9cf46f96b4c287755733311b0d0ba4b" - integrity sha512-/my+vVHRN7zYgcp0n4z5A6HAK7bvKGBiswaM5zIlOQczsxj/aiD7RcgD+dvVFuwFaGh5+kM7XA6Q6PN0bvb1tw== + version "2.28.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.28.0.tgz#4431bc6d3af41903e5255770703d4e55a0ccbdec" + integrity sha512-w0Ugcq2iatloEabQP56BRWJowliXUP5Wv6f9fKzjJmDW81hOTBxRoJ4LoEOxRpz9gcY51Libytd2ba3yLmSOfg== dependencies: - "@typescript-eslint/experimental-utils" "2.27.0" + "@typescript-eslint/experimental-utils" "2.28.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.27.0": - version "2.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.27.0.tgz#801a952c10b58e486c9a0b36cf21e2aab1e9e01a" - integrity sha512-vOsYzjwJlY6E0NJRXPTeCGqjv5OHgRU1kzxHKWJVPjDYGbPgLudBXjIlc+OD1hDBZ4l1DLbOc5VjofKahsu9Jw== +"@typescript-eslint/experimental-utils@2.28.0": + version "2.28.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.28.0.tgz#1fd0961cd8ef6522687b4c562647da6e71f8833d" + integrity sha512-4SL9OWjvFbHumM/Zh/ZeEjUFxrYKtdCi7At4GyKTbQlrj1HcphIDXlje4Uu4cY+qzszR5NdVin4CCm6AXCjd6w== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.27.0" + "@typescript-eslint/typescript-estree" "2.28.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" "@typescript-eslint/parser@^2.27.0": - version "2.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.27.0.tgz#d91664335b2c46584294e42eb4ff35838c427287" - integrity sha512-HFUXZY+EdwrJXZo31DW4IS1ujQW3krzlRjBrFRrJcMDh0zCu107/nRfhk/uBasO8m0NVDbBF5WZKcIUMRO7vPg== + version "2.28.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.28.0.tgz#bb761286efd2b0714761cab9d0ee5847cf080385" + integrity sha512-RqPybRDquui9d+K86lL7iPqH6Dfp9461oyqvlXMNtap+PyqYbkY5dB7LawQjDzot99fqzvS0ZLZdfe+1Bt3Jgw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.27.0" - "@typescript-eslint/typescript-estree" "2.27.0" + "@typescript-eslint/experimental-utils" "2.28.0" + "@typescript-eslint/typescript-estree" "2.28.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.27.0": - version "2.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.27.0.tgz#a288e54605412da8b81f1660b56c8b2e42966ce8" - integrity sha512-t2miCCJIb/FU8yArjAvxllxbTiyNqaXJag7UOpB5DVoM3+xnjeOngtqlJkLRnMtzaRcJhe3CIR9RmL40omubhg== +"@typescript-eslint/typescript-estree@2.28.0": + version "2.28.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.28.0.tgz#d34949099ff81092c36dc275b6a1ea580729ba00" + integrity sha512-HDr8MP9wfwkiuqzRVkuM3BeDrOC4cKbO5a6BymZBHUt5y/2pL0BXD6I/C/ceq2IZoHWhcASk+5/zo+dwgu9V8Q== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" @@ -2222,16 +2222,6 @@ JSONStream@^1.3.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -2347,11 +2337,6 @@ alphanum-sort@^1.0.0: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - angular-date-value-accessor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/angular-date-value-accessor/-/angular-date-value-accessor-1.0.2.tgz#96277a794fe0ab5760ceba3e7aeb3a05a63388a1" @@ -2547,11 +2532,6 @@ array-differ@^1.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -2679,11 +2659,6 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@1.x: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - async@^2.5.0, async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -2737,6 +2712,13 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== +axios@^0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -3478,19 +3460,6 @@ camel-case@^4.1.1: pascal-case "^3.1.1" tslib "^1.10.0" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3512,9 +3481,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001038, caniuse-lite@^1.0.30001039: - version "1.0.30001041" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001041.tgz#c2ea138dafc6fe03877921ddcddd4a02a14daf76" - integrity sha512-fqDtRCApddNrQuBxBS7kEiSGdBsgO4wiVw4G/IClfqzfhW45MbTumfN4cuUJGTM0YGFNn97DCXPJ683PS6zwvA== + version "1.0.30001042" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001042.tgz#c91ec21ec2d270bd76dbc2ce261260c292b8c93c" + integrity sha512-igMQ4dlqnf4tWv0xjaaE02op9AJ2oQzXKjWf4EuAHFN694Uo9/EfPVIPJcmn2WkU9RqozCxx5e2KPcVClHDbDw== canonical-path@1.0.0: version "1.0.0" @@ -3766,9 +3735,9 @@ cli-truncate@^0.2.1: string-width "^1.0.1" cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== clipboard@^2.0.0: version "2.0.6" @@ -4435,13 +4404,6 @@ csstype@^2.2.0, csstype@^2.5.7: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b" integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" @@ -4464,19 +4426,16 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== +date-fns@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.12.0.tgz#01754c8a2f3368fc1119cf4625c3dad8c1845ee6" + integrity sha512-qJgn99xxKnFgB1qL4jpxU7Q2t0LOn1p8KMIveef3UZD7kqjT3tpFNNdXJelEHhE+rUgffriXriw/sOSU+cS1Hw== + date-format@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== -dateformat@^1.0.6: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" @@ -4489,7 +4448,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@3.1.0, debug@~3.1.0: +debug@3.1.0, debug@=3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -4515,7 +4474,7 @@ debuglog@^1.0.1: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -4928,9 +4887,9 @@ ejs@^2.7.4: integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.390: - version "1.3.403" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.403.tgz#c8bab4e2e72bf78bc28bad1cc355c061f9cc1918" - integrity sha512-JaoxV4RzdBAZOnsF4dAlZ2ijJW72MbqO5lNfOBHUWiBQl3Rwe+mk2RCUMrRI3rSClLJ8HSNQNqcry12H+0ZjFw== + version "1.3.413" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.413.tgz#9c457a4165c7b42e59d66dff841063eb9bfe5614" + integrity sha512-Jm1Rrd3siqYHO3jftZwDljL2LYQafj3Kki5r+udqE58d0i91SkjItVJ5RwlJn9yko8i7MOcoidVKjQlgSdd1hg== elegant-spinner@^1.0.1: version "1.0.1" @@ -5081,7 +5040,7 @@ errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -5164,18 +5123,6 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - eslint-config-prettier@^6.10.1: version "6.10.1" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz#129ef9ec575d5ddc0e269667bf09defcd898642a" @@ -5277,22 +5224,17 @@ espree@^6.1.2: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" -esprima@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" - integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^5.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -5301,20 +5243,15 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= - estraverse@^4.1.0, estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" - integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== esutils@^2.0.2: version "2.0.3" @@ -5732,14 +5669,6 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -5784,10 +5713,17 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -focus-lock@^0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.6.tgz#98119a755a38cfdbeda0280eaa77e307eee850c7" - integrity sha512-Dx69IXGCq1qsUExWuG+5wkiMqVM/zGx/reXSJSLogECwp3x6KeNQZ+NAetgxEFpnC41rD8U3+jRCW68+LNzdtw== +focus-lock@^0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.7.tgz#65e298f2ba2a3372ab57a4e4c4bdc19e1e32a4e5" + integrity sha512-KRo93U/afEqt7w5tBm4t0FHf/Li8tEYav3n4GUiZdeRlRfrtMbL8yQg0xRVnY/kmBRmQ4xkqIlbaMvuqlu53kg== + +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" follow-redirects@^1.0.0: version "1.11.0" @@ -6057,11 +5993,6 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" @@ -6152,17 +6083,6 @@ glob@7.1.6, glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glo once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-modules@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -6322,7 +6242,7 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -handlebars@^4.0.1, handlebars@^4.0.6: +handlebars@^4.0.6: version "4.7.6" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== @@ -6366,11 +6286,6 @@ has-cors@1.1.0: resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6831,13 +6746,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" @@ -7153,11 +7061,6 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -7373,11 +7276,6 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - is-window@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" @@ -7521,6 +7419,15 @@ istanbul-lib-report@^2.0.8: make-dir "^2.1.0" supports-color "^6.1.0" +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + istanbul-lib-source-maps@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" @@ -7532,6 +7439,15 @@ istanbul-lib-source-maps@^3.0.6: rimraf "^2.6.3" source-map "^0.6.1" +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + istanbul-reports@^2.2.4: version "2.2.7" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" @@ -7539,25 +7455,13 @@ istanbul-reports@^2.2.4: dependencies: html-escaper "^2.0.0" -istanbul@^0.4.0: - version "0.4.5" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= +istanbul-reports@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" iterate-iterator@^1.0.1: version "1.0.1" @@ -7629,7 +7533,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.x, js-yaml@^3.13.1: +js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -7751,20 +7655,16 @@ karma-coverage-istanbul-reporter@~2.1.1: minimatch "^3.0.4" karma-coverage@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-2.0.1.tgz#f024f191f0f135dee2403763ac36cc52aac279ac" - integrity sha512-SnFkHsnLsaXfxkey51rRN9JDLAEKYW2Lb0qOEvcruukk0NkSNDkjobNDZPt9Ni3kIhLZkLtpGOz661hN7OaZvQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-2.0.2.tgz#75d5ce983033d8f738d57df82948dc3534392519" + integrity sha512-zge5qiGEIKDdzWciQwP4p0LSac4k/L6VfrBsERMUn5mpDvxhv1sPVOrSlpzpi70T7NhuEy4bgnpAKIYuumIMCw== dependencies: - dateformat "^1.0.6" - istanbul "^0.4.0" - istanbul-lib-coverage "^2.0.5" - istanbul-lib-instrument "^3.3.0" - istanbul-lib-report "^2.0.8" - istanbul-lib-source-maps "^3.0.6" - istanbul-reports "^2.2.4" - lodash "^4.17.11" - minimatch "^3.0.0" - source-map "^0.5.1" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.1" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.0" + minimatch "^3.0.4" karma-firefox-launcher@^1.3.0: version "1.3.0" @@ -7801,9 +7701,9 @@ karma-source-map-support@1.4.0: source-map-support "^0.5.5" karma@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/karma/-/karma-5.0.1.tgz#cd516f56d99ecd83e925a405b8003abebb72a074" - integrity sha512-xrDGtZ0mykEQjx1BUHOP1ITi39MDsCGocmSvLJWHxUQpxuKwxk3ZUrC6HI2VWh1plLC6+7cA3B19m12yzO/FRw== + version "5.0.2" + resolved "https://registry.yarnpkg.com/karma/-/karma-5.0.2.tgz#e404373dac6e3fa08409ae4d9eda7d83adb43ee5" + integrity sha512-RpUuCuGJfN3WnjYPGIH+VBF8023Lfm3TQH6D1kcNL+FxtEPc2UUz/nVjbVAGXH4Pm+Q7FVOAQjdAeFUpXpQ3IA== dependencies: body-parser "^1.16.1" braces "^3.0.2" @@ -7963,9 +7863,9 @@ lines-and-columns@^1.1.6: integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= lint-staged@^10.1.3: - version "10.1.3" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.1.3.tgz#da27713d3ac519da305381b4de87d5f866b1d2f1" - integrity sha512-o2OkLxgVns5RwSC5QF7waeAjJA5nz5gnUfqL311LkZcFipKV7TztrSlhNUK5nQX9H0E5NELAdduMQ+M/JPT7RQ== + version "10.1.5" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.1.5.tgz#de21ee7c4a91d75e5135b100b963f65e61645230" + integrity sha512-Etn83be+CiG674kIkE4pOyjtpssXfdmuAPhOehy5w4bOVMnQJ5DsiWq5CShpZj38NA+UdJSsMMkqhb3hB72kOg== dependencies: chalk "^3.0.0" commander "^4.0.1" @@ -8044,17 +7944,6 @@ live-server@^1.2.0: send latest serve-index "^1.9.1" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -8087,6 +7976,13 @@ loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4 emojis-list "^3.0.0" json5 "^1.0.1" +locale-enum@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/locale-enum/-/locale-enum-1.1.0.tgz#c08bd7c2a748ef65ac8ff791d4652240cc9432ac" + integrity sha512-WXnW+u8PgfjyaiC4h5Tt/4ic7XB+tICqaH+Yz38OyI4SLxUfQbOjlUODV8GGqwx4kUKwDMcgG1y3ItWQoI9piw== + dependencies: + typescript latest + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -8334,9 +8230,9 @@ log4js@^4.0.0: streamroller "^1.0.6" loglevel@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -8345,14 +8241,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.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" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lower-case@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" @@ -8395,7 +8283,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.2: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== @@ -8441,11 +8329,6 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -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" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - map-or-similar@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" @@ -8537,22 +8420,6 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -8679,23 +8546,18 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -8771,7 +8633,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1, mkdirp@~0.5.x: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4, mkdirp@~0.5.1, mkdirp@~0.5.x: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -8986,14 +8848,7 @@ node-releases@^1.1.29, node-releases@^1.1.53: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== -nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0: +normalize-package-data@^2.0.0, normalize-package-data@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -9189,9 +9044,12 @@ object-inspect@^1.7.0: integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== object-is@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -9277,7 +9135,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -9332,15 +9190,7 @@ opn@latest: dependencies: is-wsl "^1.1.0" -optimist@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -optionator@^0.8.1, optionator@^0.8.3: +optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -9583,13 +9433,6 @@ parse-entities@^1.1.2: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -9665,13 +9508,6 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - 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" @@ -9712,15 +9548,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -10369,9 +10196,9 @@ protoduck@^5.0.1: genfun "^5.0.0" protractor@~5.4.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.3.tgz#35f050741e404a45868618ea648745d89af31683" - integrity sha512-7pMAolv8Ah1yJIqaorDTzACtn3gk7BamVKPTeO5lqIGOrfosjPgXFx/z1dqSI+m5EeZc2GMJHPr5DYlodujDNA== + version "5.4.4" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.4.tgz#b241466aaf83b76bc2c58df67deb9a5cdfc61529" + integrity sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw== dependencies: "@types/q" "^0.0.32" "@types/selenium-webdriver" "^3.0.0" @@ -10381,13 +10208,13 @@ protractor@~5.4.3: glob "^7.0.3" jasmine "2.8.0" jasminewd2 "^2.1.0" - optimist "~0.6.0" q "1.4.1" saucelabs "^1.5.0" selenium-webdriver "3.6.0" source-map-support "~0.4.0" webdriver-js-extender "2.1.0" webdriver-manager "^12.0.6" + yargs "^12.0.5" proxy-addr@~2.0.5: version "2.0.6" @@ -10650,32 +10477,32 @@ react-error-overlay@^6.0.3: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== -react-fast-compare@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" - integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +react-fast-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.0.1.tgz#884d339ce1341aad22392e7a88664c71da48600e" + integrity sha512-C5vP0J644ofZGd54P8++O7AvrqMEbrGf8Ue0eAUJLJyw168dAX2aiYyX/zcY/eSNwO0IDjsKUaLE6n83D+TnEg== react-focus-lock@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.2.1.tgz#1d12887416925dc53481914b7cedd39494a3b24a" - integrity sha512-47g0xYcCTZccdzKRGufepY8oZ3W1Qg+2hn6u9SHZ0zUB6uz/4K4xJe7yYFNZ1qT6m+2JDm82F6QgKeBTbjW4PQ== + version "2.3.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.3.1.tgz#9d5d85899773609c7eefa4fc54fff6a0f5f2fc47" + integrity sha512-j15cWLPzH0gOmRrUg01C09Peu8qbcdVqr6Bjyfxj80cNZmH+idk/bNBYEDSmkAtwkXI+xEYWSmHYqtaQhZ8iUQ== dependencies: "@babel/runtime" "^7.0.0" - focus-lock "^0.6.6" + focus-lock "^0.6.7" prop-types "^15.6.2" react-clientside-effect "^1.2.2" use-callback-ref "^1.2.1" use-sidecar "^1.0.1" react-helmet-async@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.4.tgz#079ef10b7fefcaee6240fefd150711e62463cc97" - integrity sha512-KTGHE9sz8N7+fCkZ2a3vzXH9eIkiTNhL2NhKR7XzzQl3WsGlCHh76arauJUIiGdfhjeMp7DY7PkASAmYFXeJYg== + version "1.0.5" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.5.tgz#d2557bf274e32280a877ecb648b81740d8fb0bf1" + integrity sha512-nqGA5a1HRZsw1lzDn+bYuUN2FyHRiY+DgjRVhEOKVBDTrrqJCpCIOuY/IRHdobr+KD1gGTP0WabZsTrIHnFKJA== dependencies: - "@babel/runtime" "^7.3.4" + "@babel/runtime" "^7.9.2" invariant "^2.2.4" prop-types "^15.7.2" - react-fast-compare "^2.0.4" + react-fast-compare "^3.0.1" shallowequal "^1.1.0" react-hotkeys@2.0.0: @@ -10791,23 +10618,6 @@ read-package-tree@5.3.1: readdir-scoped-modules "^1.0.0" util-promisify "^2.1.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.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" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -10880,14 +10690,6 @@ recursive-readdir@2.2.2: dependencies: minimatch "3.0.4" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - reflect-metadata@^0.1.2: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" @@ -11008,13 +10810,6 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" @@ -11105,15 +10900,10 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.3.2: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + version "1.16.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.16.1.tgz#49fac5d8bacf1fd53f200fa51247ae736175832c" + integrity sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig== dependencies: path-parse "^1.0.6" @@ -11307,9 +11097,9 @@ schema-utils@^1.0.0: ajv-keywords "^3.1.0" schema-utils@^2.0.1, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: - version "2.6.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" - integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== + version "2.6.6" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c" + integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA== dependencies: ajv "^6.12.0" ajv-keywords "^3.4.1" @@ -11379,9 +11169,9 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.0.0, semver@^7.1.1: - version "7.2.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.2.2.tgz#d01432d74ed3010a20ffaf909d63a691520521cd" - integrity sha512-Zo84u6o2PebMSK3zjJ6Zp5wi8VnQZnEaCP13Ul/lt1ANsLACxnJxq4EEm1PY94/por1Hm9+7xpIswdS5AkieMA== + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== send@0.17.1, send@latest: version "0.17.1" @@ -11785,7 +11575,7 @@ source-map@0.7.3, source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -11795,13 +11585,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= - dependencies: - amdefine ">=0.0.4" - sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" @@ -11948,9 +11731,9 @@ static-extend@^0.1.1: integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= store2@^2.7.1: - version "2.11.0" - resolved "https://registry.yarnpkg.com/store2/-/store2-2.11.0.tgz#307636a239014ef4d8f1c8b47afe903509484fc8" - integrity sha512-WeIZ5+c/KzBSutSqOjUCAkk1qTLVBcYUuvrhNx8ndjLZKdZRfP6Vv7AOxlynuL6tVU/6zt6e2CTHwWI5KE+fKg== + version "2.11.1" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.11.1.tgz#118645f1b5e38d20604852362183955e360a5893" + integrity sha512-llZqXAXjG2E4FvWsZxFmBDfh6kqQuGFZm64TX23qW02Hf4dyElhDEbYx1IIVTEMKWrrDnDA9oqOjY8WHo2NgcA== stream-browserify@^2.0.1: version "2.0.2" @@ -12165,13 +11948,6 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.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" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -12187,19 +11963,12 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - strip-json-comments@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== -style-loader@1.1.3, style-loader@^1.0.0: +style-loader@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200" integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw== @@ -12207,6 +11976,14 @@ style-loader@1.1.3, style-loader@^1.0.0: loader-utils "^1.2.3" schema-utils "^2.6.4" +style-loader@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.4.tgz#1ad81283cefe51096756fd62697258edad933230" + integrity sha512-SbBHRD8fwK3pX+4UDF4ETxUF0+rCvk29LWTTI7Rt0cgsDjAj3SWM76ByTe6u2+4IlJ/WwluB7wuslWETCoPQdg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.5" + stylehacks@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" @@ -12244,13 +12021,6 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -12550,11 +12320,6 @@ tree-kill@1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - ts-dedent@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-1.1.1.tgz#68fad040d7dbd53a90f545b450702340e17d18f3" @@ -12685,7 +12450,7 @@ typescript@^2.4.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== -typescript@~3.8.3: +typescript@latest, typescript@~3.8.3: version "3.8.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== @@ -12696,9 +12461,9 @@ ua-parser-js@0.7.21: integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== uglify-js@^3.1.4: - version "3.9.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.0.tgz#037163a936992050ed5d14f5d5c4014126019661" - integrity sha512-j5wNQBWaql8gr06dOUrfaohHlscboQZ9B8sNsoK5o4sBjm7Ht9dxSbrMXyktQpA16Acaij8AcoozteaPYZON0g== + version "3.9.1" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.1.tgz#a56a71c8caa2d36b5556cc1fd57df01ae3491539" + integrity sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA== dependencies: commander "~2.20.3" @@ -12849,11 +12614,9 @@ url@^0.11.0: querystring "0.2.0" use-callback-ref@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.2.tgz#43f6270a2979915d0b0c715581859026c68ad5f8" - integrity sha512-s7WLAjMmcgSQ6ocTv93xfljIhpIi6r7f+bH54BX7eP26c0Q+W0iemfFBHYND2cSfaWpweiN0/NVtXVMKRlktdg== - dependencies: - "@types/react" "^16.9.11" + version "1.2.3" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.3.tgz#9f939dfb5740807bbf9dd79cdd4e99d27e827756" + integrity sha512-DPBPh1i2adCZoIArRlTuKRy7yue7QogtEnfv0AKrWsY+GA+4EKe37zhRDouNnyWMoNQFYZZRF+2dLHsWE4YvJA== use-sidecar@^1.0.1: version "1.0.2" @@ -12932,6 +12695,11 @@ uuid@^3.0.0, uuid@^3.0.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + v8-compile-cache@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" @@ -13234,7 +13002,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@^1.1.1, which@^1.2.1, which@^1.2.10, which@^1.2.9, which@^1.3.1: +which@^1.2.1, which@^1.2.10, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -13272,11 +13040,6 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -13390,11 +13153,11 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.7.2: - version "1.8.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.3.tgz#2f420fca58b68ce3a332d0ca64be1d191dd3f87a" - integrity sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw== + version "1.9.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.9.0.tgz#dc1ff3e24837b62bc3c8ae02c28e16ee5742b9d6" + integrity sha512-3GLZOj8A9Gsp0Fw3kOyj0zqk4xMq+YvhbHSDYALd2NMOfIpyZeBhz32ZiNU7AtX1MtXX/9JJgxSElGRwvv9enA== dependencies: - "@babel/runtime" "^7.8.7" + "@babel/runtime" "^7.9.0" yargs-parser@^11.1.1: version "11.1.1" @@ -13405,14 +13168,14 @@ yargs-parser@^11.1.1: decamelize "^1.2.0" yargs-parser@^18.1.0, yargs-parser@^18.1.1: - version "18.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" - integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@12.0.5: +yargs@12.0.5, yargs@^12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==