diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..06a54cf --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.eslint.json', + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'airbnb-base', + 'airbnb-typescript/base', + 'prettier', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3881e51..52a2b0a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,6 +18,6 @@ jobs: restore-keys: | ${{ runner.os }}-node- - - run: npm install #TODO: --only-prod, le build crash à voir pq - - run: npm install -g @angular/cli > /dev/null - - run: npm run build:prod + - run: yarn install #TODO: --only-prod, le build crash à voir pq + - run: yarn install -g @angular/cli > /dev/null + - run: yarn build:prod diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..dcb7279 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/package.json b/package.json index 359ec4d..2bc2fab 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build": "ng build", "build:prod": "uglifyjs ./src/assets/scripts/embbed-chatbot.js -m -o ./src/assets/scripts/embbed-chatbot.min.js && ng build webchat --configuration production --base-href /chatbot/ --output-hashing=all && ng build --configuration production --base-href /backoffice/ --output-hashing=all", "test": "ng test", - "lint": "ng lint", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "e2e": "ng e2e", "cypress:local": "concurrently \"npm run start:local\" \"cypress open\"", "cypress:dev": "concurrently \"npm run start:dev\" \"cypress open\"", @@ -60,11 +60,18 @@ "@types/jasmine": "~3.3.8", "@types/jasminewd2": "~2.0.3", "@types/node": "^18.11.18", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", "codelyzer": "^6.0.2", "concurrently": "^5.3.0", "cypress": "^7.7.0", "cypress-file-upload": "^5.0.8", "cypress-intellij-reporter": "^0.0.6", + "eslint": "^8.54.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.1.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", "jasmine-core": "~4.5.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~6.4.1", @@ -73,9 +80,9 @@ "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "^2.0.0", "ng-packagr": "^15.1.0", + "prettier": "^3.1.0", "protractor": "~7.0.0", "ts-node": "~7.0.0", - "tslint": "^6.1.3", "typescript": "~4.9.4" } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 2d5a717..b78c96f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,12 +1,12 @@ import { NgModule } from '@angular/core'; -import { AppComponent } from './app.component'; -import { AppRoutingModule } from './app.routing'; import { MAT_DATE_LOCALE } from '@angular/material/core'; import { ServiceWorkerModule } from '@angular/service-worker'; -import { environment } from '../environments/environment'; import { HIGHLIGHT_OPTIONS, HighlightOptions } from 'ngx-highlightjs'; import { CoreModule } from '@core/core.module'; +import { environment } from '../environments/environment'; +import { AppRoutingModule } from './app.routing'; +import { AppComponent } from './app.component'; @NgModule({ declarations: [ diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 2a72bd6..e7f9db4 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -1,14 +1,14 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { NotAuthenticatedLayoutComponent } from './components/not-authenticated-layout/not-authenticated-layout.component'; import { RouterModule } from '@angular/router'; -import { AuthenticatedLayoutComponent } from './components/authenticated-layout/authenticated-layout.component'; import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { ToastrModule } from 'ngx-toastr'; import { JwtInterceptor } from './interceptors/jwt.interceptor'; import { ErrorInterceptor } from './interceptors/error.interceptor'; -import { ToastrModule } from 'ngx-toastr'; +import { AuthenticatedLayoutComponent } from './components/authenticated-layout/authenticated-layout.component'; +import { NotAuthenticatedLayoutComponent } from './components/not-authenticated-layout/not-authenticated-layout.component'; import { FooterComponent } from './components/footer/footer.component'; import { MaterialModule } from '../modules/material/material.module'; import { SideMenuComponent } from './components/authenticated-layout/side-menu/side-menu.component'; diff --git a/src/app/core/guards/auth.guard.ts b/src/app/core/guards/auth.guard.ts index d31c18b..b3b4f03 100644 --- a/src/app/core/guards/auth.guard.ts +++ b/src/app/core/guards/auth.guard.ts @@ -28,10 +28,10 @@ export class AuthGuard implements CanActivate, CanActivateChild { if (this._authService.isAuthenticated() && isAuthPage) { this._router.navigate(['']); return false; - } else if (!this._authService.isAuthenticated() && !isAuthPage) { + } if (!this._authService.isAuthenticated() && !isAuthPage) { this._router.navigate(['auth']); return false; - } else if (allowedRole && !isAuthPage && this._authService.isAuthenticated() && this._authService.user.role !== allowedRole) { + } if (allowedRole && !isAuthPage && this._authService.isAuthenticated() && this._authService.user.role !== allowedRole) { this._router.navigate(['']); return false; } diff --git a/src/app/core/interceptors/error.interceptor.ts b/src/app/core/interceptors/error.interceptor.ts index 988074d..36c99d7 100644 --- a/src/app/core/interceptors/error.interceptor.ts +++ b/src/app/core/interceptors/error.interceptor.ts @@ -3,8 +3,8 @@ import { Inject, Injectable } from '@angular/core'; import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; import { Router } from '@angular/router'; -import { AuthService } from '../services/auth.service'; import { ToastrService } from 'ngx-toastr'; +import { AuthService } from '../services/auth.service'; @Injectable({ providedIn: 'root', @@ -38,7 +38,7 @@ export class ErrorInterceptor implements HttpInterceptor { } private _showBackendMessage(err: HttpErrorResponse): void { - const error: Error = err.error; + const {error} = err; const messageToShow = (error && error.message) ? this._generateErrorMessage(error.message) : 'Une erreur est survenue'; this._toastr.error(messageToShow); } diff --git a/src/app/core/interceptors/jwt.interceptor.ts b/src/app/core/interceptors/jwt.interceptor.ts index bfd9aed..64e0c3f 100644 --- a/src/app/core/interceptors/jwt.interceptor.ts +++ b/src/app/core/interceptors/jwt.interceptor.ts @@ -9,6 +9,7 @@ import { AuthService } from '../services/auth.service'; export class JwtInterceptor implements HttpInterceptor { token$: Observable; + currentToken: string; constructor(private _authService: AuthService) { @@ -22,7 +23,7 @@ export class JwtInterceptor implements HttpInterceptor { } let newHeaders = request.headers.set('Authorization', - 'Bearer ' + this.currentToken); + `Bearer ${ this.currentToken}`); newHeaders = newHeaders.set('Cache-Control', 'no-cache'); newHeaders = newHeaders.set('Pragma', 'no-cache'); newHeaders = newHeaders.set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT'); diff --git a/src/app/core/models/auth-response.model.ts b/src/app/core/models/auth-response.model.ts index 7f17159..cbb7de5 100644 --- a/src/app/core/models/auth-response.model.ts +++ b/src/app/core/models/auth-response.model.ts @@ -2,5 +2,6 @@ import { User } from './user.model'; export class AuthResponse { chatbotToken: string; + user: User; } diff --git a/src/app/core/models/config.model.ts b/src/app/core/models/config.model.ts index ac0a473..f6d2efe 100644 --- a/src/app/core/models/config.model.ts +++ b/src/app/core/models/config.model.ts @@ -1,32 +1,52 @@ export class Config { name: string; + function: string; + icon: string; + primaryColor: string; + secondaryColor: string; + mediaSize: number; + trainingRasa: boolean; + needTraining: boolean; + lastTrainingAt: string; + storage: boolean; + apiKey: string; // EMBEDDED embeddedIcon: string; + description: string; + help: string; + helpBtn: string; + chatBtn: string; + faqBtn: string; + showFaq: boolean; + showFallbackSuggestions: boolean; // DESCRIPTION problematic: string; + audience: string; // CONFIG showIntentSearch: boolean; + delayBetweenMessages: number; + isTree: boolean; } diff --git a/src/app/core/models/file-historic.model.ts b/src/app/core/models/file-historic.model.ts index 635d162..f9cc88b 100644 --- a/src/app/core/models/file-historic.model.ts +++ b/src/app/core/models/file-historic.model.ts @@ -1,5 +1,7 @@ export class FileHistoric { id: number; + name: string; + createdAt: Date; } diff --git a/src/app/core/models/file-template-check-resume.model.ts b/src/app/core/models/file-template-check-resume.model.ts index 1f01150..dbd48ed 100644 --- a/src/app/core/models/file-template-check-resume.model.ts +++ b/src/app/core/models/file-template-check-resume.model.ts @@ -1,6 +1,9 @@ export class FileTemplateCheckResume { categories: string[]; + questionsNumber: number; + warnings: { [key: string]: string } = {}; + errors: { [key: string]: string } = {}; } diff --git a/src/app/core/models/import-file.model.ts b/src/app/core/models/import-file.model.ts index dd89c14..35fae78 100644 --- a/src/app/core/models/import-file.model.ts +++ b/src/app/core/models/import-file.model.ts @@ -1,6 +1,9 @@ export class ImportFile { file: File; + deleteIntents: boolean; + oldURL: string; + newURL: string; } diff --git a/src/app/core/models/import-response.model.ts b/src/app/core/models/import-response.model.ts index 8109d16..115da00 100644 --- a/src/app/core/models/import-response.model.ts +++ b/src/app/core/models/import-response.model.ts @@ -1,5 +1,7 @@ export class ImportResponse { intents: number; + knowledges: number; + responses: number; } diff --git a/src/app/core/models/inbox.model.ts b/src/app/core/models/inbox.model.ts index bab0c34..81c157e 100644 --- a/src/app/core/models/inbox.model.ts +++ b/src/app/core/models/inbox.model.ts @@ -1,15 +1,23 @@ -import { Intent } from './intent.model'; import { InboxStatus } from '@enum/inbox-status.enum'; import { User } from '@model/user.model'; +import { Intent } from './intent.model'; export class Inbox { id: number; + confidence: number; + intentRanking: {name: string, confidence: number}[]; + question: string; + response: any[]; + timestamp: number; + status: InboxStatus; + intent: Intent; + user?: User; } diff --git a/src/app/core/models/intent.model.ts b/src/app/core/models/intent.model.ts index 27b982f..754d5c7 100644 --- a/src/app/core/models/intent.model.ts +++ b/src/app/core/models/intent.model.ts @@ -4,23 +4,32 @@ import { IntentStatus } from '@enum/intent-status.enum'; export class Intent { id: string; + mainQuestion: string; + status: IntentStatus; + category: string; + hidden: boolean; responses: Response[]; + knowledges: Knowledge[]; createdAt: Date; + updatedAt: Date; + expiresAt: Date; // For inbox confidence?: number; previousIntents: Intent[]; + nextIntents: Intent[]; + linkedResponses: number; constructor() { diff --git a/src/app/core/models/knowledge.model.ts b/src/app/core/models/knowledge.model.ts index 344ffbd..441a0d2 100644 --- a/src/app/core/models/knowledge.model.ts +++ b/src/app/core/models/knowledge.model.ts @@ -1,4 +1,5 @@ export class Knowledge { id: number; + question: string; } diff --git a/src/app/core/models/login.model.ts b/src/app/core/models/login.model.ts index 02a8503..90929b3 100644 --- a/src/app/core/models/login.model.ts +++ b/src/app/core/models/login.model.ts @@ -1,4 +1,5 @@ export class Login { email: string; + password: string; } diff --git a/src/app/core/models/media.model.ts b/src/app/core/models/media.model.ts index 2e077aa..0255e65 100644 --- a/src/app/core/models/media.model.ts +++ b/src/app/core/models/media.model.ts @@ -2,9 +2,13 @@ import { Intent } from '@model/intent.model'; export class Media { id: number; + file: string; + createdAt: string; + addedBy: string; + size: number; intents?: Intent[]; diff --git a/src/app/core/models/pagination-helper.model.ts b/src/app/core/models/pagination-helper.model.ts index 1c99309..a074346 100644 --- a/src/app/core/models/pagination-helper.model.ts +++ b/src/app/core/models/pagination-helper.model.ts @@ -3,9 +3,13 @@ import { PaginatedResult } from '@model/paginated-result.model'; export class PaginationHelper { currentPage: number = null; + totalPages: number; + totalElements: number; + itemCount: number; + last: boolean; constructor(public size = 20) { diff --git a/src/app/core/models/reset-password.model.ts b/src/app/core/models/reset-password.model.ts index 9a4bff0..af7dec7 100644 --- a/src/app/core/models/reset-password.model.ts +++ b/src/app/core/models/reset-password.model.ts @@ -1,4 +1,5 @@ export class ResetPassword { password: string; + token: string; } diff --git a/src/app/core/models/response.model.ts b/src/app/core/models/response.model.ts index f246968..56f5e71 100644 --- a/src/app/core/models/response.model.ts +++ b/src/app/core/models/response.model.ts @@ -3,7 +3,9 @@ import { Intent } from '@model/intent.model'; export class Response { id: number; + responseType: ResponseType; + response: string; intentId?: string; diff --git a/src/app/core/models/user.model.ts b/src/app/core/models/user.model.ts index 97857ef..2421b10 100644 --- a/src/app/core/models/user.model.ts +++ b/src/app/core/models/user.model.ts @@ -2,11 +2,16 @@ import { UserRole } from '@enum/user-role.enum'; export class User { email: string; + firstName: string; + lastName: string; role = UserRole.writer; + createdAt: string; + disabled: boolean; + endDate?: string; } diff --git a/src/app/core/services/api-pagination.service.ts b/src/app/core/services/api-pagination.service.ts index 8a3565a..86e3972 100644 --- a/src/app/core/services/api-pagination.service.ts +++ b/src/app/core/services/api-pagination.service.ts @@ -9,11 +9,15 @@ import { Router } from '@angular/router'; export class ApiPaginationService extends ApiService { protected _fullEntities$ = new BehaviorSubject([]); + protected _loaded$ = new BehaviorSubject(false); + protected _lastPage$ = new BehaviorSubject(false); + protected _pagination: PaginationHelper; public currentSearch = ''; + public currentFilters: any; protected constructor(private _httpClient: HttpClient, @@ -25,9 +29,9 @@ export class ApiPaginationService extends ApiService { this._pagination = new PaginationHelper(entitiesByPage); } - /************************ + /** ********************** ****** PAGINATION ****** - ************************/ + *********************** */ public load(page: number = 1): Observable | T[]> { this._loaded$.next(true); @@ -106,9 +110,9 @@ export class ApiPaginationService extends ApiService { this._pagination.size = items; } - /************************ + /** ********************** ********* CRUD ********* - ************************/ + *********************** */ public loadOne(itemId: string | number, redirectUrl ?: string): Observable { return this._httpClient.get(`${this._url}/${itemId}`).pipe( @@ -153,9 +157,9 @@ export class ApiPaginationService extends ApiService { } } - /************************ + /** ********************** ******** GETTER ******** - ************************/ + *********************** */ get pagination() { return this._pagination; diff --git a/src/app/core/services/api.service.ts b/src/app/core/services/api.service.ts index 1c843ec..2d6201a 100644 --- a/src/app/core/services/api.service.ts +++ b/src/app/core/services/api.service.ts @@ -1,12 +1,14 @@ import { BehaviorSubject, Observable } from 'rxjs'; import { HttpClient, HttpParams } from '@angular/common/http'; -import { environment } from '../../../environments/environment'; import { finalize, tap } from 'rxjs/operators'; +import { environment } from '../../../environments/environment'; export abstract class ApiService { protected _entities$ = new BehaviorSubject([]); + protected _loading$ = new BehaviorSubject(false); + protected _processing$ = new BehaviorSubject(false); public currentSearch = ''; @@ -15,9 +17,9 @@ export abstract class ApiService { this._url = `${environment.api_endpoint}${this._url}`; } - /************************ + /** ********************** ********* CRUD ********* - ************************/ + *********************** */ public save(item: T) { if (!item[this._idAttribute]) { @@ -28,7 +30,7 @@ export abstract class ApiService { public update(item: T, id?: string): Observable { this._processing$.next(true); - return this._h.put(`${this._url}/${id ? id : item[this._idAttribute]}`, item).pipe( + return this._h.put(`${this._url}/${id || item[this._idAttribute]}`, item).pipe( tap(entity => { this.updateEntityArray(entity); }), @@ -84,9 +86,9 @@ export abstract class ApiService { this.currentSearch = ''; } - /************************ + /** ********************** ******** GETTER ******** - ************************/ + *********************** */ get loading$(): BehaviorSubject { return this._loading$; diff --git a/src/app/core/services/auth.service.ts b/src/app/core/services/auth.service.ts index 81f82e2..89a9199 100644 --- a/src/app/core/services/auth.service.ts +++ b/src/app/core/services/auth.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; -import { environment } from '../../../environments/environment'; import { HttpClient } from '@angular/common/http'; import { finalize, tap } from 'rxjs/operators'; import { ResetPassword } from '@model/reset-password.model'; @@ -8,6 +7,7 @@ import { Router } from '@angular/router'; import { User } from '@model/user.model'; import { Login } from '@model/login.model'; import { AuthResponse } from '@model/auth-response.model'; +import { environment } from '../../../environments/environment'; @Injectable({ providedIn: 'root' @@ -15,10 +15,13 @@ import { AuthResponse } from '@model/auth-response.model'; export class AuthService { private _tokenName = 'chatbotToken'; + private _userSession = 'user'; private _token$ = new BehaviorSubject(null); + private _user$ = new BehaviorSubject(null); + private _authenticating$ = new BehaviorSubject(false); private _url = ''; diff --git a/src/app/core/services/config.service.ts b/src/app/core/services/config.service.ts index 6c1603e..4f053b0 100644 --- a/src/app/core/services/config.service.ts +++ b/src/app/core/services/config.service.ts @@ -1,11 +1,11 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { environment } from '../../../environments/environment'; import { BehaviorSubject, Observable } from 'rxjs'; import { Config } from '@model/config.model'; import { finalize, tap } from 'rxjs/operators'; import { ToastrService } from 'ngx-toastr'; import { AuthService } from '@core/services/auth.service'; +import { environment } from '../../../environments/environment'; @Injectable({ providedIn: 'root' @@ -13,8 +13,11 @@ import { AuthService } from '@core/services/auth.service'; export class ConfigService { private _url: string; + protected _loading$ = new BehaviorSubject(false); + public config$ = new BehaviorSubject(null); + private _configInterval; constructor(private _http: HttpClient, @@ -64,7 +67,7 @@ export class ConfigService { headers.append('Content-Type', 'multipart/form-data'); headers.append('Accept', 'application/json'); const options = { - headers: headers, + headers, reportProgress: true, }; diff --git a/src/app/core/services/file.service.ts b/src/app/core/services/file.service.ts index 04f1b46..5fcfabe 100644 --- a/src/app/core/services/file.service.ts +++ b/src/app/core/services/file.service.ts @@ -1,17 +1,18 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { environment } from '../../../environments/environment'; import { finalize } from 'rxjs/operators'; import { FileTemplateCheckResume } from '@model/file-template-check-resume.model'; import { ImportFile } from '@model/import-file.model'; import { FileHistoric } from '@model/file-historic.model'; +import { environment } from '../../../environments/environment'; @Injectable({ providedIn: 'root' }) export class FileService { private _url: string; + protected _loading$ = new BehaviorSubject(false); constructor(private _http: HttpClient) { @@ -26,7 +27,7 @@ export class FileService { headers.append('Content-Type', 'multipart/form-data'); headers.append('Accept', 'application/json'); const options = { - headers: headers, + headers, reportProgress: true, }; @@ -49,7 +50,7 @@ export class FileService { headers.append('Content-Type', 'multipart/form-data'); headers.append('Accept', 'application/json'); const options = { - headers: headers, + headers, reportProgress: true, }; @@ -80,9 +81,9 @@ export class FileService { ); } - /************************ + /** ********************** ******** GETTER ******** - ************************/ + *********************** */ get loading$(): BehaviorSubject { return this._loading$; diff --git a/src/app/core/services/intent.service.ts b/src/app/core/services/intent.service.ts index 9c26731..ff7382a 100644 --- a/src/app/core/services/intent.service.ts +++ b/src/app/core/services/intent.service.ts @@ -28,9 +28,9 @@ export class IntentService extends ApiPaginationService { if (listView) { this._pagination.resetPage(page); return this.getEntities(false); - } else { + } return this._loadFullTree(); - } + } private _loadFullTree(): Observable { diff --git a/src/app/core/services/media.service.ts b/src/app/core/services/media.service.ts index 31b8167..89f641c 100644 --- a/src/app/core/services/media.service.ts +++ b/src/app/core/services/media.service.ts @@ -18,14 +18,14 @@ export class MediaService extends ApiPaginationService { public createMedia(files: File[]): Observable { const formData: FormData = new FormData(); for (let i = 0; i < files.length; i++) { - formData.append('files', files[i], files[i]['name']); + formData.append('files', files[i], files[i].name); } const headers = new HttpHeaders(); headers.append('Content-Type', 'multipart/form-data'); headers.append('Accept', 'application/json'); const options = { - headers: headers, + headers, reportProgress: true, }; @@ -45,7 +45,7 @@ export class MediaService extends ApiPaginationService { headers.append('Content-Type', 'multipart/form-data'); headers.append('Accept', 'application/json'); const options = { - headers: headers, + headers, reportProgress: true, }; diff --git a/src/app/core/services/public-config.service.ts b/src/app/core/services/public-config.service.ts index fb138ae..5cd4d4d 100644 --- a/src/app/core/services/public-config.service.ts +++ b/src/app/core/services/public-config.service.ts @@ -1,9 +1,9 @@ import { Injectable } from '@angular/core'; -import { environment } from '../../../environments/environment'; import { BehaviorSubject, Observable } from 'rxjs'; import { Config } from '@model/config.model'; import { finalize, tap } from 'rxjs/operators'; import { HttpClient } from '@angular/common/http'; +import { environment } from '../../../environments/environment'; @Injectable({ providedIn: 'root' @@ -11,7 +11,9 @@ import { HttpClient } from '@angular/common/http'; export class PublicConfigService { private _url: string; + protected _loading$ = new BehaviorSubject(false); + public config$ = new BehaviorSubject(null); constructor(private _http: HttpClient) { diff --git a/src/app/core/services/rasa.service.ts b/src/app/core/services/rasa.service.ts index e40e3e0..cca16ad 100644 --- a/src/app/core/services/rasa.service.ts +++ b/src/app/core/services/rasa.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { environment } from '../../../environments/environment'; import { BehaviorSubject, Observable } from 'rxjs'; import { finalize } from 'rxjs/operators'; +import { environment } from '../../../environments/environment'; @Injectable({ providedIn: 'root' @@ -10,6 +10,7 @@ import { finalize } from 'rxjs/operators'; export class RasaService { private _url = `${environment.api_endpoint}/rasa`; + loading$ = new BehaviorSubject(false); constructor(private _http: HttpClient) { } diff --git a/src/app/core/services/ref-data.service.ts b/src/app/core/services/ref-data.service.ts index 5f72dc9..9fa5260 100644 --- a/src/app/core/services/ref-data.service.ts +++ b/src/app/core/services/ref-data.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; import { HttpClient } from '@angular/common/http'; -import { environment } from '../../../environments/environment'; import { finalize, tap } from 'rxjs/operators'; +import { environment } from '../../../environments/environment'; @Injectable({ providedIn: 'root' @@ -10,6 +10,7 @@ import { finalize, tap } from 'rxjs/operators'; export class RefDataService { private _url = `${environment.api_endpoint}/ref-data`; + private _loading$ = new BehaviorSubject(false); categories$ = new BehaviorSubject([]); diff --git a/src/app/core/services/stats.service.ts b/src/app/core/services/stats.service.ts index 9cde0e9..8ce7c5f 100644 --- a/src/app/core/services/stats.service.ts +++ b/src/app/core/services/stats.service.ts @@ -1,9 +1,9 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; -import { environment } from '../../../environments/environment'; import { BehaviorSubject, Observable } from 'rxjs'; import * as moment from 'moment'; import { InboxStatus } from '@enum/*'; +import { environment } from '../../../environments/environment'; @Injectable({ providedIn: 'root' @@ -11,8 +11,11 @@ import { InboxStatus } from '@enum/*'; export class StatsService { private _url = `${environment.api_endpoint}/stats`; + protected _loading$ = new BehaviorSubject(false); + public _currentFilters$ = new BehaviorSubject(null); + public currentFilters = { startDate: null, endDate: null @@ -23,55 +26,55 @@ export class StatsService { } getGraphData(): Observable { - return this._http.post(this._url + '/line_data', this.currentFilters); + return this._http.post(`${this._url }/line_data`, this.currentFilters); } getBestQuestionsData(): Observable { - return this._http.post(this._url + '/best_data', this.currentFilters); + return this._http.post(`${this._url }/best_data`, this.currentFilters); } getBestCategoriesData(): Observable { - return this._http.post(this._url + '/best_categories', this.currentFilters); + return this._http.post(`${this._url }/best_categories`, this.currentFilters); } getWorstQuestionsData(): Observable { - return this._http.post(this._url + '/worst_data', this.currentFilters); + return this._http.post(`${this._url }/worst_data`, this.currentFilters); } getKPIData(): Observable { - return this._http.post(this._url + '/kpi_data', this.currentFilters); + return this._http.post(`${this._url }/kpi_data`, this.currentFilters); } getFaqMostQuestionsData(): Observable { - return this._http.post(this._url + '/faq_most_questions', this.currentFilters); + return this._http.post(`${this._url }/faq_most_questions`, this.currentFilters); } getFaqMostCategoriesData(): Observable { - return this._http.post(this._url + '/faq_most_categories', this.currentFilters); + return this._http.post(`${this._url }/faq_most_categories`, this.currentFilters); } getFaqKPIData(): Observable { - return this._http.post(this._url + '/faq_kpi_data', this.currentFilters); + return this._http.post(`${this._url }/faq_kpi_data`, this.currentFilters); } getFeedbackMostQuestionsData(inboxStatus: InboxStatus): Observable { - return this._http.post(this._url + `/feedback_${inboxStatus}_questions`, this.currentFilters); + return this._http.post(`${this._url }/feedback_${inboxStatus}_questions`, this.currentFilters); } getFeedbackMostCategoriesData(inboxStatus: InboxStatus): Observable { - return this._http.post(this._url + `/feedback_${inboxStatus}_categories`, this.currentFilters); + return this._http.post(`${this._url }/feedback_${inboxStatus}_categories`, this.currentFilters); } getFeedbackKPIData(): Observable { - return this._http.post(this._url + '/feedback_kpi_data', this.currentFilters); + return this._http.post(`${this._url }/feedback_kpi_data`, this.currentFilters); } setCurrentFilters(startDate, endDate) { - startDate = startDate ? startDate : null; - endDate = endDate ? endDate : null; + startDate = startDate || null; + endDate = endDate || null; this.currentFilters = { - startDate: startDate, - endDate: endDate + startDate, + endDate }; } diff --git a/src/app/core/utils/utils.ts b/src/app/core/utils/utils.ts index 772fded..e5a0376 100644 --- a/src/app/core/utils/utils.ts +++ b/src/app/core/utils/utils.ts @@ -13,18 +13,19 @@ export class Utils { static getDirtyValues(formGroup: FormGroup): any { const dirtyFormValues = {}; - formGroup['_forEachChild']((control, name) => { - if (control.dirty) { - dirtyFormValues[name] = control.value; + Object.keys(formGroup.controls).forEach(key => { + if(formGroup.get(key).dirty) { + dirtyFormValues[key] = formGroup.get(key).value; } }); return dirtyFormValues; } static uuid() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { // tslint:disable-next-line - const r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } diff --git a/src/app/modules/auth/auth.module.ts b/src/app/modules/auth/auth.module.ts index 3f3c732..a2f1fa6 100644 --- a/src/app/modules/auth/auth.module.ts +++ b/src/app/modules/auth/auth.module.ts @@ -1,9 +1,9 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; import { SignInComponent } from './sign-in/sign-in.component'; import { AuthRoutingModule } from './auth.routing'; import { MaterialModule } from '../material/material.module'; -import { ReactiveFormsModule } from '@angular/forms'; import { AuthLayoutComponent } from './auth-layout/auth-layout.component'; import { ResetPasswordComponent } from './reset-password/reset-password.component'; import { ForgotPasswordComponent } from './forgot-password/forgot-password.component'; diff --git a/src/app/modules/auth/reset-password/reset-password.component.ts b/src/app/modules/auth/reset-password/reset-password.component.ts index fb3a36f..503a091 100644 --- a/src/app/modules/auth/reset-password/reset-password.component.ts +++ b/src/app/modules/auth/reset-password/reset-password.component.ts @@ -12,8 +12,11 @@ import { AuthService } from '../../../core/services/auth.service'; export class ResetPasswordComponent implements OnInit { resetPasswordForm: FormGroup; + hidePassword = true; + hideCheckPassword = true; + token; constructor(private _fb: FormBuilder, @@ -21,7 +24,7 @@ export class ResetPasswordComponent implements OnInit { private _route: ActivatedRoute, private _router: Router) { this._route.queryParams.subscribe(params => { - this.token = params['token']; + this.token = params.token; }); } diff --git a/src/app/modules/auth/sign-in/sign-in.component.ts b/src/app/modules/auth/sign-in/sign-in.component.ts index f932a64..242a7d7 100644 --- a/src/app/modules/auth/sign-in/sign-in.component.ts +++ b/src/app/modules/auth/sign-in/sign-in.component.ts @@ -11,6 +11,7 @@ import { AuthService } from '@core/services/auth.service'; export class SignInComponent implements OnInit { signInForm: FormGroup; + hidePassword = true; constructor(private _fb: FormBuilder, diff --git a/src/app/modules/configuration/chatbot-access/chatbot-access.component.ts b/src/app/modules/configuration/chatbot-access/chatbot-access.component.ts index 700c091..c82f3f4 100644 --- a/src/app/modules/configuration/chatbot-access/chatbot-access.component.ts +++ b/src/app/modules/configuration/chatbot-access/chatbot-access.component.ts @@ -9,7 +9,7 @@ import { Clipboard } from '@angular/cdk/clipboard'; }) export class ChatbotAccessComponent implements OnInit { - chatbotPath = window.location.origin + '/chatbot/'; + chatbotPath = `${window.location.origin }/chatbot/`; embeddedCode = ` diff --git a/src/app/modules/configuration/chatbot-config/chatbot-config.component.ts b/src/app/modules/configuration/chatbot-config/chatbot-config.component.ts index 4ba9ce3..bde7efa 100644 --- a/src/app/modules/configuration/chatbot-config/chatbot-config.component.ts +++ b/src/app/modules/configuration/chatbot-config/chatbot-config.component.ts @@ -18,11 +18,17 @@ import { DestroyObservable } from '@core/utils/destroy-observable'; export class ChatbotConfigComponent extends DestroyObservable implements OnInit { customizationForm: FormGroup; + descriptionForm: FormGroup; + embeddedForm: FormGroup; + chatbotConfig: Config; + icons = ['avion.png', 'bateau.png', 'camion.png', 'tank.png', 'parachute.png', 'femme.png', 'homme.png']; + iconPreview = null; + embeddedIconPreview = null; constructor(private _configService: ConfigService, @@ -73,7 +79,7 @@ export class ChatbotConfigComponent extends DestroyObservable implements OnInit } selectIcon(iconName: string) { - this._http.get('assets/img/icons/' + iconName, {responseType: 'blob'}).subscribe((file: any) => { + this._http.get(`assets/img/icons/${ iconName}`, {responseType: 'blob'}).subscribe((file: any) => { file.name = iconName; this._storeIcon(file); }); @@ -164,7 +170,7 @@ export class ChatbotConfigComponent extends DestroyObservable implements OnInit audience: [this.chatbotConfig.audience, [Validators.required, Validators.maxLength(200)]], }); - if (!!this.chatbotConfig.icon) { + if (this.chatbotConfig.icon) { this._http.get(`${this.mediaPath}${encodeURI(this.chatbotConfig.icon)}`, {responseType: 'blob'}).subscribe((file: any) => { file.name = this.chatbotConfig.icon; this._storeIcon(file); @@ -172,7 +178,7 @@ export class ChatbotConfigComponent extends DestroyObservable implements OnInit }); } - if (!!this.chatbotConfig.embeddedIcon) { + if (this.chatbotConfig.embeddedIcon) { this._http.get(`${this.mediaPath}${encodeURI(this.chatbotConfig.embeddedIcon)}`, {responseType: 'blob'}).subscribe((file: any) => { file.name = this.chatbotConfig.embeddedIcon; this._storeIcon(file, true); diff --git a/src/app/modules/configuration/chatbot-config/chatbot-embedded-preview/chatbot-embedded-preview.component.ts b/src/app/modules/configuration/chatbot-config/chatbot-embedded-preview/chatbot-embedded-preview.component.ts index f6fbe97..95b6e44 100644 --- a/src/app/modules/configuration/chatbot-config/chatbot-embedded-preview/chatbot-embedded-preview.component.ts +++ b/src/app/modules/configuration/chatbot-config/chatbot-embedded-preview/chatbot-embedded-preview.component.ts @@ -9,7 +9,9 @@ import { Config } from '@model/config.model'; export class ChatbotEmbeddedPreviewComponent implements OnInit { @Input() chatbot: Config; + @Input() iconSrc: string; + @Input() embeddedIconSrc: string; constructor() { } diff --git a/src/app/modules/configuration/chatbot-config/chatbot-preview/chatbot-preview.component.ts b/src/app/modules/configuration/chatbot-config/chatbot-preview/chatbot-preview.component.ts index 78ec297..5dca0ec 100644 --- a/src/app/modules/configuration/chatbot-config/chatbot-preview/chatbot-preview.component.ts +++ b/src/app/modules/configuration/chatbot-config/chatbot-preview/chatbot-preview.component.ts @@ -9,6 +9,7 @@ import { Config } from '@model/config.model'; export class ChatbotPreviewComponent implements OnInit { @Input() chatbot: Config; + @Input() iconSrc: string; constructor() { diff --git a/src/app/modules/configuration/chatbot-tech/chatbot-tech.component.ts b/src/app/modules/configuration/chatbot-tech/chatbot-tech.component.ts index 34447c5..57f02de 100644 --- a/src/app/modules/configuration/chatbot-tech/chatbot-tech.component.ts +++ b/src/app/modules/configuration/chatbot-tech/chatbot-tech.component.ts @@ -16,6 +16,7 @@ import { Clipboard } from '@angular/cdk/clipboard'; export class ChatbotTechComponent extends DestroyObservable implements OnInit { techForm: FormGroup; + chatbotConfig: Config; constructor(private _configService: ConfigService, diff --git a/src/app/modules/configuration/chatbot-users/chatbot-users.component.ts b/src/app/modules/configuration/chatbot-users/chatbot-users.component.ts index 055bd46..5b73bba 100644 --- a/src/app/modules/configuration/chatbot-users/chatbot-users.component.ts +++ b/src/app/modules/configuration/chatbot-users/chatbot-users.component.ts @@ -3,9 +3,9 @@ import { UserService } from '@core/services/user.service'; import { BehaviorSubject } from 'rxjs'; import { User } from '@model/user.model'; import { UserRole, UserRole_Fr } from '@enum/user-role.enum'; -import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/confirm-dialog.component'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { filter } from 'rxjs/operators'; +import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/confirm-dialog.component'; import { detailInOutAnimation } from '../../shared/components/chatbot-list-item/chatbot-list-item.animation'; @Component({ @@ -19,9 +19,13 @@ import { detailInOutAnimation } from '../../shared/components/chatbot-list-item/ export class ChatbotUsersComponent implements OnInit { users$: BehaviorSubject; + loading$: BehaviorSubject; + addUser = false; + userSelected: string = null; + userRole_Fr = UserRole_Fr; constructor(private _userService: UserService, diff --git a/src/app/modules/configuration/chatbot-users/user-form/user-form.component.ts b/src/app/modules/configuration/chatbot-users/user-form/user-form.component.ts index 943683b..bb253ee 100644 --- a/src/app/modules/configuration/chatbot-users/user-form/user-form.component.ts +++ b/src/app/modules/configuration/chatbot-users/user-form/user-form.component.ts @@ -12,10 +12,13 @@ import { User } from '@model/user.model'; export class UserFormComponent implements OnInit { userForm: FormGroup; + userRole = Object.keys(UserRole); + userRole_Fr = UserRole_Fr; @Input() user = new User(); + @Output() cancel: EventEmitter = new EventEmitter(); constructor(private _fb: FormBuilder, diff --git a/src/app/modules/configuration/configuration.module.ts b/src/app/modules/configuration/configuration.module.ts index 200eeff..ed72127 100644 --- a/src/app/modules/configuration/configuration.module.ts +++ b/src/app/modules/configuration/configuration.module.ts @@ -1,5 +1,9 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; +import { ColorPickerModule } from 'ngx-color-picker'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { HighlightModule } from 'ngx-highlightjs'; import { ConfigurationLayoutComponent } from './configuration-layout/configuration-layout.component'; import { ConfigurationRoutingModule } from './configuration.routing'; import { MaterialModule } from '../material/material.module'; @@ -8,12 +12,8 @@ import { ChatbotAccessComponent } from './chatbot-access/chatbot-access.componen import { ChatbotConfigComponent } from './chatbot-config/chatbot-config.component'; import { ChatbotUsersComponent } from './chatbot-users/chatbot-users.component'; import { UserFormComponent } from './chatbot-users/user-form/user-form.component'; -import { ReactiveFormsModule } from '@angular/forms'; -import { ColorPickerModule } from 'ngx-color-picker'; import { ChatbotPreviewComponent } from './chatbot-config/chatbot-preview/chatbot-preview.component'; import { ChatbotEmbeddedPreviewComponent } from './chatbot-config/chatbot-embedded-preview/chatbot-embedded-preview.component'; -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { HighlightModule } from 'ngx-highlightjs'; import { ChatbotTechComponent } from './chatbot-tech/chatbot-tech.component'; @NgModule({ diff --git a/src/app/modules/inbox/inbox-list/inbox-assignation-dialog/inbox-assignation-dialog.component.ts b/src/app/modules/inbox/inbox-list/inbox-assignation-dialog/inbox-assignation-dialog.component.ts index 6661c16..0a154ba 100644 --- a/src/app/modules/inbox/inbox-list/inbox-assignation-dialog/inbox-assignation-dialog.component.ts +++ b/src/app/modules/inbox/inbox-list/inbox-assignation-dialog/inbox-assignation-dialog.component.ts @@ -11,6 +11,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; export class InboxAssignationDialogComponent implements OnInit { public inbox: Inbox; + public assignationForm: FormGroup; constructor(public dialogRef: MatDialogRef, diff --git a/src/app/modules/inbox/inbox-list/inbox-filter/inbox-filter.component.ts b/src/app/modules/inbox/inbox-list/inbox-filter/inbox-filter.component.ts index cf2a910..30f95be 100644 --- a/src/app/modules/inbox/inbox-list/inbox-filter/inbox-filter.component.ts +++ b/src/app/modules/inbox/inbox-list/inbox-filter/inbox-filter.component.ts @@ -18,8 +18,11 @@ import { saveAs } from 'file-saver'; export class InboxFilterComponent extends DestroyObservable implements OnInit, OnDestroy { inboxFilters: FormGroup; + categories$: BehaviorSubject; + statutes = Object.keys(InboxStatus); + inboxStatus_Fr = InboxStatus_Fr; constructor(private _fb: FormBuilder, diff --git a/src/app/modules/inbox/inbox-list/inbox-intent/inbox-intent.component.ts b/src/app/modules/inbox/inbox-list/inbox-intent/inbox-intent.component.ts index 8cd5b69..c1ffebe 100644 --- a/src/app/modules/inbox/inbox-list/inbox-intent/inbox-intent.component.ts +++ b/src/app/modules/inbox/inbox-list/inbox-intent/inbox-intent.component.ts @@ -18,16 +18,27 @@ import { RefDataService } from '@core/services/ref-data.service'; export class InboxIntentComponent extends DestroyObservable implements OnInit { @Input() inbox: Inbox; + @Output() close: EventEmitter = new EventEmitter(); + intents: Intent[]; + allIntents: Intent[]; + intentForm: FormGroup; + categories$: BehaviorSubject; + filteredIntents$: BehaviorSubject = new BehaviorSubject([]); + addIntent = false; + modifyIntent = false; + newIntent = new Intent(); + intentToEdit = null; + public intentFilterCtrl: FormControl = new FormControl(); constructor(private _fb: FormBuilder, @@ -46,9 +57,7 @@ export class InboxIntentComponent extends DestroyObservable implements OnInit { i.confidence = i.confidence ? Math.round(i.confidence * 100) : 0; return i; }); - this.intents.sort(function(a, b) { - return a.confidence > b.confidence ? -1 : b.confidence > a.confidence ? 1 : 0; - }); + this.intents.sort((a, b) => a.confidence > b.confidence ? -1 : b.confidence > a.confidence ? 1 : 0); this._initSelectFilter(); this._initFormGroup(); this.allIntents = this.intents; @@ -62,7 +71,7 @@ export class InboxIntentComponent extends DestroyObservable implements OnInit { this.addIntent = false; return; } - this._inboxService.save( {id: this.inbox.id, intent: intent}).subscribe(() => { + this._inboxService.save( {id: this.inbox.id, intent}).subscribe(() => { this._configService.getConfig().subscribe(); this.close.emit(true); }); @@ -76,16 +85,14 @@ export class InboxIntentComponent extends DestroyObservable implements OnInit { } getFilteredIntents(category) { - this.intents = category ? this.allIntents.filter((intent: Intent) => { - return intent.category && intent.category.includes(category); - }) : this.allIntents; + this.intents = category ? this.allIntents.filter((intent: Intent) => intent.category && intent.category.includes(category)) : this.allIntents; this._initSelectFilter(); } private _initFormGroup() { const intent = this.intents.find(i => i.id === this.inbox.intent?.id); this.intentForm = this._fb.group({ - intent: [intent ? intent : null, Validators.required] + intent: [intent || null, Validators.required] }); } @@ -111,10 +118,10 @@ export class InboxIntentComponent extends DestroyObservable implements OnInit { if (!search) { this.filteredIntents$.next(this.intents.slice()); return; - } else { + } // remove accent & special chars keywords = search.normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase().split(' '); - } + // filter the intents this.filteredIntents$.next( this.intents.filter(intent => { diff --git a/src/app/modules/inbox/inbox-list/inbox-list.component.ts b/src/app/modules/inbox/inbox-list/inbox-list.component.ts index 1cbec75..ce6b5ba 100644 --- a/src/app/modules/inbox/inbox-list/inbox-list.component.ts +++ b/src/app/modules/inbox/inbox-list/inbox-list.component.ts @@ -8,13 +8,13 @@ import { InboxStatus, InboxStatus_Fr, UserRole_Fr } from '@enum/inbox-status.enu import { ToastrService } from 'ngx-toastr'; import { UserService } from '@core/services/user.service'; import { User } from '@model/user.model'; -import { detailInOutAnimation } from '../../shared/components/chatbot-list-item/chatbot-list-item.animation'; import { ConfigService } from '@core/services/config.service'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; -import { InboxAssignationDialogComponent } from './inbox-assignation-dialog/inbox-assignation-dialog.component'; -import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/confirm-dialog.component'; import { filter } from 'rxjs/operators'; import * as humanizeDuration from 'humanize-duration'; +import { InboxAssignationDialogComponent } from './inbox-assignation-dialog/inbox-assignation-dialog.component'; +import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/confirm-dialog.component'; +import { detailInOutAnimation } from '../../shared/components/chatbot-list-item/chatbot-list-item.animation'; @Component({ selector: 'app-inbox-list', @@ -27,14 +27,23 @@ import * as humanizeDuration from 'humanize-duration'; export class InboxListComponent implements OnInit { inboxes$: BehaviorSubject; + loading$: Observable; + processing$: Observable; + users$: Observable; + pagination: PaginationHelper; + inboxStatus_Fr = InboxStatus_Fr; + inboxIntent: number; + inboxPreview: number; + multipleSelection: number[] = []; + userRole_fr = UserRole_Fr; constructor(public inboxService: InboxService, @@ -116,7 +125,7 @@ export class InboxListComponent implements OnInit { this.inboxService.assign(inbox, null).subscribe(); this._dialog.open(InboxAssignationDialogComponent, { data: { - inbox: inbox + inbox } }); } diff --git a/src/app/modules/inbox/inbox.module.ts b/src/app/modules/inbox/inbox.module.ts index b50fd21..1c979c7 100644 --- a/src/app/modules/inbox/inbox.module.ts +++ b/src/app/modules/inbox/inbox.module.ts @@ -1,15 +1,15 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { InboxLayoutComponent } from './inbox-layout/inbox-layout.component'; import { InboxRoutingModule } from './inbox.routing'; import { MaterialModule } from '../material/material.module'; import { SharedModule } from '../shared/shared.module'; -import { ReactiveFormsModule } from '@angular/forms'; import { InboxFilterComponent } from './inbox-list/inbox-filter/inbox-filter.component'; import { InboxListComponent } from './inbox-list/inbox-list.component'; import { InboxIntentComponent } from './inbox-list/inbox-intent/inbox-intent.component'; import { InboxPreviewComponent } from './inbox-list/inbox-preview/inbox-preview.component'; -import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { IntentModule } from '../intent/intent.module'; import { InboxAssignationDialogComponent } from './inbox-list/inbox-assignation-dialog/inbox-assignation-dialog.component'; diff --git a/src/app/modules/intent/create-edit-intent/intent-form/intent-form.component.ts b/src/app/modules/intent/create-edit-intent/intent-form/intent-form.component.ts index 717dc5d..0983e4d 100644 --- a/src/app/modules/intent/create-edit-intent/intent-form/intent-form.component.ts +++ b/src/app/modules/intent/create-edit-intent/intent-form/intent-form.component.ts @@ -18,7 +18,9 @@ import { RefDataService } from '@core/services/ref-data.service'; export class IntentFormComponent implements OnInit { @Input() intent: Intent; + @Input() redirect = true; + @Output() close: EventEmitter = new EventEmitter(); intentForm: FormGroup; diff --git a/src/app/modules/intent/create-edit-intent/intent-form/knowledge-form/knowledge-form.component.ts b/src/app/modules/intent/create-edit-intent/intent-form/knowledge-form/knowledge-form.component.ts index 790ee59..dc8d316 100644 --- a/src/app/modules/intent/create-edit-intent/intent-form/knowledge-form/knowledge-form.component.ts +++ b/src/app/modules/intent/create-edit-intent/intent-form/knowledge-form/knowledge-form.component.ts @@ -9,8 +9,11 @@ import { FormGroup } from '@angular/forms'; export class KnowledgeFormComponent implements OnInit, AfterViewInit { @ViewChild('knowledgeInput') knowledgeInput: ElementRef; + @Input() knowledgeForm: FormGroup; + @Output() deleteKnowledge: EventEmitter = new EventEmitter(); + @Output() addKnowledge: EventEmitter = new EventEmitter(); constructor() { diff --git a/src/app/modules/intent/create-edit-intent/intent-form/question-form/question-form.component.ts b/src/app/modules/intent/create-edit-intent/intent-form/question-form/question-form.component.ts index 8be1965..03f4fc2 100644 --- a/src/app/modules/intent/create-edit-intent/intent-form/question-form/question-form.component.ts +++ b/src/app/modules/intent/create-edit-intent/intent-form/question-form/question-form.component.ts @@ -14,7 +14,9 @@ import { DestroyObservable } from '@core/utils/destroy-observable'; export class QuestionFormComponent extends DestroyObservable implements OnInit { @Input() questionForm: FormGroup; + categories$: BehaviorSubject; + filteredCategories$: Observable; constructor(private _refDataService: RefDataService, @@ -61,7 +63,7 @@ export class QuestionFormComponent extends DestroyObservable implements OnInit { if (exists) { this.questionForm.get('id').setErrors({'exists': true}); } else if (this.questionForm.get('id').hasError('exists')) { - delete this.questionForm.get('id').errors['exists']; + delete this.questionForm.get('id').errors.exists; } this.questionForm.updateValueAndValidity(); }); diff --git a/src/app/modules/intent/create-edit-intent/intent-form/response-form/file-form/file-form.component.ts b/src/app/modules/intent/create-edit-intent/intent-form/response-form/file-form/file-form.component.ts index 3d895e3..72f3b34 100644 --- a/src/app/modules/intent/create-edit-intent/intent-form/response-form/file-form/file-form.component.ts +++ b/src/app/modules/intent/create-edit-intent/intent-form/response-form/file-form/file-form.component.ts @@ -10,7 +10,9 @@ import { ResponseType } from '@enum/*'; export class FileFormComponent implements OnInit { @Input() responseFormControl: FormControl; + buttonsForm: FormArray; + responseType = ResponseType; constructor(private _fb: FormBuilder) { @@ -36,7 +38,7 @@ export class FileFormComponent implements OnInit { private _initFormArray() { this.buttonsForm = this._fb.array([]); - const value = this.responseFormControl.value; + const {value} = this.responseFormControl; if (!value) { return this.buttonsForm.push(this._initFormControl()); } diff --git a/src/app/modules/intent/create-edit-intent/intent-form/response-form/file-item/file-item.component.ts b/src/app/modules/intent/create-edit-intent/intent-form/response-form/file-item/file-item.component.ts index 47d09a6..b1a1972 100644 --- a/src/app/modules/intent/create-edit-intent/intent-form/response-form/file-item/file-item.component.ts +++ b/src/app/modules/intent/create-edit-intent/intent-form/response-form/file-item/file-item.component.ts @@ -1,8 +1,8 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; -import { MediaListDialogComponent } from '../media-list/media-list-dialog.component'; import { filter, tap } from 'rxjs/operators'; import { Media } from '@model/media.model'; +import { MediaListDialogComponent } from '../media-list/media-list-dialog.component'; @Component({ selector: 'app-file-item', @@ -12,7 +12,9 @@ import { Media } from '@model/media.model'; export class FileItemComponent implements OnInit { @Input() disabled = false; + @Input() media: Media = null; + @Input() onlyImages = false; @Output() mediaChange = new EventEmitter(); diff --git a/src/app/modules/intent/create-edit-intent/intent-form/response-form/image-file-form/image-file-form.component.ts b/src/app/modules/intent/create-edit-intent/intent-form/response-form/image-file-form/image-file-form.component.ts index f5c138c..f2e9b68 100644 --- a/src/app/modules/intent/create-edit-intent/intent-form/response-form/image-file-form/image-file-form.component.ts +++ b/src/app/modules/intent/create-edit-intent/intent-form/response-form/image-file-form/image-file-form.component.ts @@ -13,11 +13,15 @@ import { DomSanitizer } from '@angular/platform-browser'; export class ImageFileFormComponent implements OnInit { @Input() responseFormControl: FormControl; + @Input() responseType: ResponseType; + @Input() index: number; btnText: string = null; + url: string = null; + media: Media = null; constructor(@Inject(Window) private _window: Window, @@ -42,7 +46,7 @@ export class ImageFileFormComponent implements OnInit { if (this.isImage) { return 'Image'; } - return `Lien / Fichier ${idx ? idx : ''}`; + return `Lien / Fichier ${idx || ''}`; } getInputLabel() { @@ -98,11 +102,11 @@ export class ImageFileFormComponent implements OnInit { } private _initResponse() { - const value = this.responseFormControl.value; + const {value} = this.responseFormControl; let file; if (this.isImage) { file = value; - } else if (!!value) { + } else if (value) { file = value.substring(value.indexOf('<') + 1, value.indexOf('>')).trim(); this.btnText = value.substring(0, value.indexOf('<')).trim(); } @@ -110,7 +114,7 @@ export class ImageFileFormComponent implements OnInit { this.media = { file: file.replace(this.mediaPath, '') }; - } else if (!!file) { + } else if (file) { this.url = file; } } diff --git a/src/app/modules/intent/create-edit-intent/intent-form/response-form/media-list/media-list-dialog.component.ts b/src/app/modules/intent/create-edit-intent/intent-form/response-form/media-list/media-list-dialog.component.ts index 69494bd..63a2c2d 100644 --- a/src/app/modules/intent/create-edit-intent/intent-form/response-form/media-list/media-list-dialog.component.ts +++ b/src/app/modules/intent/create-edit-intent/intent-form/response-form/media-list/media-list-dialog.component.ts @@ -12,9 +12,13 @@ import { Utils } from '@core/utils/utils'; export class MediaListDialogComponent implements OnInit { medias: Media[] = []; + mediaSelected: Media; + onlyImages = false; + decodeURI = decodeURI; + utils = Utils; constructor(@Inject(MAT_DIALOG_DATA) public data: any, diff --git a/src/app/modules/intent/create-edit-intent/intent-form/response-form/quick-reply-form/quick-reply-form.component.ts b/src/app/modules/intent/create-edit-intent/intent-form/response-form/quick-reply-form/quick-reply-form.component.ts index 7f7a562..d8f6c59 100644 --- a/src/app/modules/intent/create-edit-intent/intent-form/response-form/quick-reply-form/quick-reply-form.component.ts +++ b/src/app/modules/intent/create-edit-intent/intent-form/response-form/quick-reply-form/quick-reply-form.component.ts @@ -14,9 +14,13 @@ import { IntentService } from '@core/services/intent.service'; export class QuickReplyFormComponent extends DestroyObservable implements OnInit { @Input() responseFormControl: FormControl; + quickRepliesForm: FormArray; + intents: Intent[]; + filteredIntents$: BehaviorSubject = new BehaviorSubject([]); + public intentFilterCtrl: FormControl = new FormControl(); constructor(private _fb: FormBuilder, @@ -48,7 +52,7 @@ export class QuickReplyFormComponent extends DestroyObservable implements OnInit private _initFormArray() { this.quickRepliesForm = this._fb.array([]); - const value = this.responseFormControl.value; + const {value} = this.responseFormControl; if (!value) { return this.quickRepliesForm.push(this._initFormGroup()); } @@ -99,9 +103,9 @@ export class QuickReplyFormComponent extends DestroyObservable implements OnInit if (!search) { this.filteredIntents$.next(this.intents.slice()); return; - } else { + } keywords = search.toLowerCase().split(' '); - } + // filter the intents this.filteredIntents$.next( this.intents.filter(intent => { diff --git a/src/app/modules/intent/create-edit-intent/intent-form/response-form/response-form.component.ts b/src/app/modules/intent/create-edit-intent/intent-form/response-form/response-form.component.ts index d242a44..5e54450 100644 --- a/src/app/modules/intent/create-edit-intent/intent-form/response-form/response-form.component.ts +++ b/src/app/modules/intent/create-edit-intent/intent-form/response-form/response-form.component.ts @@ -16,7 +16,9 @@ export class ResponseFormComponent implements OnInit { @Input() index: number; responseType = ResponseType; + responseTypeKeys = Object.keys(ResponseType); + responseType_Fr = ResponseType_Fr; constructor(private _fb: FormBuilder) { diff --git a/src/app/modules/intent/intent-file/intent-file.component.ts b/src/app/modules/intent/intent-file/intent-file.component.ts index 20e9d51..2af9f55 100644 --- a/src/app/modules/intent/intent-file/intent-file.component.ts +++ b/src/app/modules/intent/intent-file/intent-file.component.ts @@ -4,12 +4,12 @@ import { FileService } from '@core/services/file.service'; import { FileTemplateCheckResume } from '@model/file-template-check-resume.model'; import { saveAs } from 'file-saver'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; -import { WarningsDialogComponent } from './warnings-dialog/warnings-dialog.component'; import { FileHistoric } from '@model/file-historic.model'; import { finalize } from 'rxjs/operators'; import { ToastrService } from 'ngx-toastr'; import { ImportResponse } from '@model/import-response.model'; import { ConfigService } from '@core/services/config.service'; +import { WarningsDialogComponent } from './warnings-dialog/warnings-dialog.component'; @Component({ selector: 'app-intent-file', @@ -19,9 +19,13 @@ import { ConfigService } from '@core/services/config.service'; export class IntentFileComponent implements OnInit { importFileFormGroup: FormGroup; + fileTemplateCheckResume: FileTemplateCheckResume; + historicFiles: FileHistoric[]; + historicFilesFiltered: FileHistoric[]; + objectKeys = Object.keys; constructor(private _fb: FormBuilder, @@ -105,7 +109,7 @@ export class IntentFileComponent implements OnInit { this._dialog.open(WarningsDialogComponent, { width: '100%', height: '90%', - data: {isError: isError, details: detailsArray} + data: {isError, details: detailsArray} }); } diff --git a/src/app/modules/intent/intent-file/warnings-dialog/warnings-dialog.component.ts b/src/app/modules/intent/intent-file/warnings-dialog/warnings-dialog.component.ts index 3abdd81..e360944 100644 --- a/src/app/modules/intent/intent-file/warnings-dialog/warnings-dialog.component.ts +++ b/src/app/modules/intent/intent-file/warnings-dialog/warnings-dialog.component.ts @@ -10,6 +10,7 @@ import { KeyValue } from '@angular/common'; export class WarningsDialogComponent implements OnInit { isError: boolean; + details: { [key: string]: string }; constructor(public dialogRef: MatDialogRef, diff --git a/src/app/modules/intent/intent-full-tree/create-edit-intent-dialog/create-edit-intent-dialog.component.ts b/src/app/modules/intent/intent-full-tree/create-edit-intent-dialog/create-edit-intent-dialog.component.ts index 4d5985d..b6600b5 100644 --- a/src/app/modules/intent/intent-full-tree/create-edit-intent-dialog/create-edit-intent-dialog.component.ts +++ b/src/app/modules/intent/intent-full-tree/create-edit-intent-dialog/create-edit-intent-dialog.component.ts @@ -11,6 +11,7 @@ import { Intent } from '@model/intent.model'; export class CreateEditIntentDialogComponent implements OnInit { private _intentId: string; + public intent: Intent; constructor(public dialogRef: MatDialogRef, diff --git a/src/app/modules/intent/intent-full-tree/intent-finder-dialog/intent-finder-dialog.component.ts b/src/app/modules/intent/intent-full-tree/intent-finder-dialog/intent-finder-dialog.component.ts index fa4d0b2..d8f9ba6 100644 --- a/src/app/modules/intent/intent-full-tree/intent-finder-dialog/intent-finder-dialog.component.ts +++ b/src/app/modules/intent/intent-full-tree/intent-finder-dialog/intent-finder-dialog.component.ts @@ -14,6 +14,7 @@ export class IntentFinderDialogComponent implements OnInit { private _allIntents: Intent[]; public filteredIntents: Intent[]; + public intentSelected: Intent; constructor(public dialogRef: MatDialogRef, @@ -32,16 +33,16 @@ export class IntentFinderDialogComponent implements OnInit { return; } // get the search keyword - const query: string = $event.query; - const categories: string[] = $event.categories; + const {query} = $event; + const {categories} = $event; let keywords; if (!query && (!categories || categories.length < 1)) { this.filteredIntents = this._allIntents.slice(); return; - } else { + } // remove accent & special chars keywords = query.normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase().split(' '); - } + // filter the intents this.filteredIntents = this._allIntents.filter(intent => { if (categories && categories.length > 0) { diff --git a/src/app/modules/intent/intent-full-tree/intent-full-tree.component.ts b/src/app/modules/intent/intent-full-tree/intent-full-tree.component.ts index 2ad8e1c..188d981 100644 --- a/src/app/modules/intent/intent-full-tree/intent-full-tree.component.ts +++ b/src/app/modules/intent/intent-full-tree/intent-full-tree.component.ts @@ -2,12 +2,12 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { IntentService } from '@core/services/intent.service'; import { Observable, Subscription } from 'rxjs'; import { Intent } from '@model/intent.model'; -import { CreateEditIntentDialogComponent } from './create-edit-intent-dialog/create-edit-intent-dialog.component'; -import { IntentFinderDialogComponent } from './intent-finder-dialog/intent-finder-dialog.component'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { PanZoomAPI, PanZoomConfig } from 'ngx-panzoom'; import domtoimage from 'dom-to-image'; import * as moment from 'moment'; +import { IntentFinderDialogComponent } from './intent-finder-dialog/intent-finder-dialog.component'; +import { CreateEditIntentDialogComponent } from './create-edit-intent-dialog/create-edit-intent-dialog.component'; @Component({ selector: 'app-intent-full-tree', @@ -18,19 +18,28 @@ export class IntentFullTreeComponent implements OnInit, OnDestroy { // intents$: BehaviorSubject; notSingleIntents: Intent[] = []; + loading$: Observable; + dragScrollDisabled = true; + fullScreen = false; + onLeafSelected: string; + onHighlightLeafs: string; + panZoomConfig: PanZoomConfig = new PanZoomConfig({ zoomOnDoubleClick: false, zoomOnMouseWheel: false, panOnClickDrag: true, keepInBounds: false }); + dataUrl: string; + public panZoomAPI: PanZoomAPI; + private _apiSubscription: Subscription; constructor(private _intentService: IntentService, @@ -109,7 +118,7 @@ export class IntentFullTreeComponent implements OnInit, OnDestroy { downloadCanvasBest(event) { const anchor = event.target; - const name = 'arbre-' + moment(new Date()).format('DDMMYYYYHHmmss') + '.jpg'; + const name = `arbre-${ moment(new Date()).format('DDMMYYYYHHmmss') }.jpg`; // get the canvas anchor.href = this.dataUrl; diff --git a/src/app/modules/intent/intent-full-tree/intent-preview-response/intent-preview-response.component.ts b/src/app/modules/intent/intent-full-tree/intent-preview-response/intent-preview-response.component.ts index 5b66480..161568b 100644 --- a/src/app/modules/intent/intent-full-tree/intent-preview-response/intent-preview-response.component.ts +++ b/src/app/modules/intent/intent-full-tree/intent-preview-response/intent-preview-response.component.ts @@ -10,6 +10,7 @@ import { ResponseType } from '@enum/*'; export class IntentPreviewResponseComponent implements OnInit { private _response: Response; + get response(): Response { return this._response; } @@ -20,6 +21,7 @@ export class IntentPreviewResponseComponent implements OnInit { } responseType = ResponseType; + quickReplies = []; constructor() { diff --git a/src/app/modules/intent/intent-full-tree/intent-tree-branch/intent-tree-branch.component.ts b/src/app/modules/intent/intent-full-tree/intent-tree-branch/intent-tree-branch.component.ts index 6666a56..0c27501 100644 --- a/src/app/modules/intent/intent-full-tree/intent-tree-branch/intent-tree-branch.component.ts +++ b/src/app/modules/intent/intent-full-tree/intent-tree-branch/intent-tree-branch.component.ts @@ -12,11 +12,17 @@ import { ResponseService } from '@core/services/response.service'; export class IntentTreeBranchComponent implements OnInit { @Input() onLeafSelected: string; + @Input() onHighlightLeafs: string; + @Input() intent: Intent; + @Input() isRoot: boolean; + @Output() leafSelected: EventEmitter = new EventEmitter(); + @Output() highlightLeafs: EventEmitter = new EventEmitter(); + @Output() deleteLeaf: EventEmitter = new EventEmitter(); public intentBranches: Intent[][] = []; @@ -29,9 +35,7 @@ export class IntentTreeBranchComponent implements OnInit { } deleteIntentResponse(intentId: string) { - const responseIdx = this.intent.responses.findIndex(r => { - return r.responseType === ResponseType.quick_reply && r.response.includes(`<${intentId}>`); - }); + const responseIdx = this.intent.responses.findIndex(r => r.responseType === ResponseType.quick_reply && r.response.includes(`<${intentId}>`)); let responses = this.intent.responses[responseIdx].response.split(';'); responses = responses.filter(r => !r.includes(`<${intentId}>`)); this.intent.responses[responseIdx].response = responses.join(';'); diff --git a/src/app/modules/intent/intent-full-tree/intent-tree-leaf/intent-tree-leaf.component.ts b/src/app/modules/intent/intent-full-tree/intent-tree-leaf/intent-tree-leaf.component.ts index 10a0c1a..8a04be1 100644 --- a/src/app/modules/intent/intent-full-tree/intent-tree-leaf/intent-tree-leaf.component.ts +++ b/src/app/modules/intent/intent-full-tree/intent-tree-leaf/intent-tree-leaf.component.ts @@ -2,13 +2,13 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Intent } from '@model/intent.model'; import { Utils } from '@core/utils/utils'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; -import { CreateEditIntentDialogComponent } from '../create-edit-intent-dialog/create-edit-intent-dialog.component'; -import { IntentFinderDialogComponent } from '../intent-finder-dialog/intent-finder-dialog.component'; import { ResponseType } from '@enum/*'; import { ResponseService } from '@core/services/response.service'; import { ToastrService } from 'ngx-toastr'; import { Response } from '@model/response.model'; import { IntentService } from '@core/services/intent.service'; +import { IntentFinderDialogComponent } from '../intent-finder-dialog/intent-finder-dialog.component'; +import { CreateEditIntentDialogComponent } from '../create-edit-intent-dialog/create-edit-intent-dialog.component'; @Component({ selector: 'app-intent-tree-leaf', @@ -33,13 +33,21 @@ export class IntentTreeLeafComponent implements OnInit { } @Input() intent: Intent; + @Input() isRoot: boolean; + @Output() leafSelected: EventEmitter = new EventEmitter(); + @Output() highlightLeafs: EventEmitter = new EventEmitter(); + @Output() deleteLeaf: EventEmitter = new EventEmitter(); + selected = false; + highlighted = false; + showResponses = false; + id = Utils.uuid(); constructor(private _dialog: MatDialog, @@ -126,24 +134,20 @@ export class IntentTreeLeafComponent implements OnInit { private _addQuickReply(intent: Intent): Response { const qr = new Response(intent); qr.responseType = ResponseType.quick_reply; - const index = intent.responses.findIndex((r, idx) => { - return r.responseType === ResponseType.text && - (!intent.responses[idx + 1] || (intent.responses[idx + 1].responseType === ResponseType.text)); - }); + const index = intent.responses.findIndex((r, idx) => r.responseType === ResponseType.text && + (!intent.responses[idx + 1] || (intent.responses[idx + 1].responseType === ResponseType.text))); intent.responses.splice(index + 1, 0, qr); return intent.responses[index + 1]; } private _checkBeforeAddingChoice(intent: Intent): boolean { - return intent.responses.findIndex((r, idx) => { - return r.responseType === ResponseType.quick_reply || (r.responseType === ResponseType.text && - (!intent.responses[idx + 1] || (intent.responses[idx + 1].responseType === ResponseType.text))); - }) >= 0; + return intent.responses.findIndex((r, idx) => r.responseType === ResponseType.quick_reply || (r.responseType === ResponseType.text && + (!intent.responses[idx + 1] || (intent.responses[idx + 1].responseType === ResponseType.text)))) >= 0; } private _formatIntent(intent: Intent): Intent { - const intentToReturn = Object.assign({}, intent); + const intentToReturn = { ...intent}; delete intentToReturn.createdAt; return intentToReturn; } diff --git a/src/app/modules/intent/intent-list/intent-filter/intent-filter.component.ts b/src/app/modules/intent/intent-list/intent-filter/intent-filter.component.ts index af1e2f2..08b9a27 100644 --- a/src/app/modules/intent/intent-list/intent-filter/intent-filter.component.ts +++ b/src/app/modules/intent/intent-list/intent-filter/intent-filter.component.ts @@ -17,12 +17,17 @@ import { UserRole_Fr } from '@enum/*'; }) export class IntentFilterComponent extends DestroyObservable implements OnInit, OnDestroy { @Input() light = false; + @Input() standalone = false; + @Output() intentFilterChanges: EventEmitter = new EventEmitter(); intentFilters: FormGroup; + categories$: BehaviorSubject; + users$: Observable; + userRole_fr = UserRole_Fr; constructor(private _fb: FormBuilder, diff --git a/src/app/modules/intent/intent-list/intent-list.component.ts b/src/app/modules/intent/intent-list/intent-list.component.ts index eb61af4..bf4d72e 100644 --- a/src/app/modules/intent/intent-list/intent-list.component.ts +++ b/src/app/modules/intent/intent-list/intent-list.component.ts @@ -3,13 +3,13 @@ import { IntentService } from '@core/services/intent.service'; import { BehaviorSubject, forkJoin, Observable } from 'rxjs'; import { Intent } from '@model/intent.model'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; -import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/confirm-dialog.component'; import { filter } from 'rxjs/operators'; import { PaginationHelper } from '@model/pagination-helper.model'; -import { detailInOutAnimation } from '../../shared/components/chatbot-list-item/chatbot-list-item.animation'; import { IntentStatus, IntentStatus_Fr } from '@enum/*'; import { ConfigService } from '@core/services/config.service'; import { ToastrService } from 'ngx-toastr'; +import { detailInOutAnimation } from '../../shared/components/chatbot-list-item/chatbot-list-item.animation'; +import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/confirm-dialog.component'; import { IntentTreeDialogComponent } from '../intent-tree-modal/intent-tree-dialog.component'; @Component({ @@ -23,13 +23,21 @@ import { IntentTreeDialogComponent } from '../intent-tree-modal/intent-tree-dial export class IntentListComponent implements OnInit { intents$: BehaviorSubject; + pagination: PaginationHelper; + loading$: Observable; + intentSelected: string; + intentTree: string; + intentStatus = IntentStatus; + intentStatusFr = IntentStatus_Fr; + multipleSelection: string[] = []; + listView: boolean; constructor(public intentService: IntentService, @@ -139,7 +147,7 @@ export class IntentListComponent implements OnInit { width: '80%', autoFocus: false, data: { - intentId: intentId + intentId } }); } diff --git a/src/app/modules/intent/intent-tree-modal/intent-tree-dialog.component.ts b/src/app/modules/intent/intent-tree-modal/intent-tree-dialog.component.ts index 369c43d..342659a 100644 --- a/src/app/modules/intent/intent-tree-modal/intent-tree-dialog.component.ts +++ b/src/app/modules/intent/intent-tree-modal/intent-tree-dialog.component.ts @@ -11,6 +11,7 @@ import { IntentService } from '@core/services/intent.service'; export class IntentTreeDialogComponent implements OnInit { public intentId: string; + public intent: Intent; constructor(public dialogRef: MatDialogRef, diff --git a/src/app/modules/intent/intent-tree/intent-tree.component.ts b/src/app/modules/intent/intent-tree/intent-tree.component.ts index db09e06..29295af 100644 --- a/src/app/modules/intent/intent-tree/intent-tree.component.ts +++ b/src/app/modules/intent/intent-tree/intent-tree.component.ts @@ -9,6 +9,7 @@ import { Intent } from '@model/intent.model'; export class IntentTreeComponent implements OnInit { @Input() intent: Intent; + @Output() intentChanged: EventEmitter = new EventEmitter(); constructor() { diff --git a/src/app/modules/intent/intent.module.ts b/src/app/modules/intent/intent.module.ts index 514a80b..74ec3c5 100644 --- a/src/app/modules/intent/intent.module.ts +++ b/src/app/modules/intent/intent.module.ts @@ -1,10 +1,12 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; +import { NgxPanZoomModule } from 'ngx-panzoom'; import { IntentRoutingModule } from './intent.routing'; import { IntentLayoutComponent } from './intent-layout/intent-layout.component'; import { MaterialModule } from '../material/material.module'; import { IntentFileComponent } from './intent-file/intent-file.component'; -import { ReactiveFormsModule } from '@angular/forms'; import { SharedModule } from '../shared/shared.module'; import { CreateEditIntentComponent } from './create-edit-intent/create-edit-intent.component'; import { WarningsDialogComponent } from './intent-file/warnings-dialog/warnings-dialog.component'; @@ -15,7 +17,6 @@ import { ImageFileFormComponent } from './create-edit-intent/intent-form/respons import { FileItemComponent } from './create-edit-intent/intent-form/response-form/file-item/file-item.component'; import { MediaListDialogComponent } from './create-edit-intent/intent-form/response-form/media-list/media-list-dialog.component'; import { QuickReplyFormComponent } from './create-edit-intent/intent-form/response-form/quick-reply-form/quick-reply-form.component'; -import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { KnowledgeFormComponent } from './create-edit-intent/intent-form/knowledge-form/knowledge-form.component'; import { IntentFilterComponent } from './intent-list/intent-filter/intent-filter.component'; import { IntentListComponent } from './intent-list/intent-list.component'; @@ -28,7 +29,6 @@ import { IntentTreeBranchComponent } from './intent-full-tree/intent-tree-branch import { IntentPreviewResponseComponent } from './intent-full-tree/intent-preview-response/intent-preview-response.component'; import { CreateEditIntentDialogComponent } from './intent-full-tree/create-edit-intent-dialog/create-edit-intent-dialog.component'; import { IntentFinderDialogComponent } from './intent-full-tree/intent-finder-dialog/intent-finder-dialog.component'; -import { NgxPanZoomModule } from 'ngx-panzoom'; @NgModule({ declarations: [ diff --git a/src/app/modules/media/media-list/media-edit/media-edit.component.ts b/src/app/modules/media/media-list/media-edit/media-edit.component.ts index 804f851..03bd429 100644 --- a/src/app/modules/media/media-list/media-edit/media-edit.component.ts +++ b/src/app/modules/media/media-list/media-edit/media-edit.component.ts @@ -10,7 +10,9 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; export class MediaEditComponent implements OnInit { @Input() media: Media; + mediaForm: FormGroup; + @Output() newMediaName: EventEmitter = new EventEmitter(); constructor(private _fb: FormBuilder) { diff --git a/src/app/modules/media/media-list/media-list.component.ts b/src/app/modules/media/media-list/media-list.component.ts index 34623d5..3437081 100644 --- a/src/app/modules/media/media-list/media-list.component.ts +++ b/src/app/modules/media/media-list/media-list.component.ts @@ -4,13 +4,13 @@ import { Media } from '@model/media.model'; import { MediaService } from '@core/services/media.service'; import { ToastrService } from 'ngx-toastr'; import { PaginationHelper } from '@model/pagination-helper.model'; -import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/confirm-dialog.component'; import { filter } from 'rxjs/operators'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Utils } from '@core/utils/utils'; -import { detailInOutAnimation } from '../../shared/components/chatbot-list-item/chatbot-list-item.animation'; import { ConfigService } from '@core/services/config.service'; import { Config } from '@model/config.model'; +import { detailInOutAnimation } from '../../shared/components/chatbot-list-item/chatbot-list-item.animation'; +import { ConfirmDialogComponent } from '../../shared/components/confirm-dialog/confirm-dialog.component'; @Component({ selector: 'app-media-list', @@ -23,15 +23,25 @@ import { Config } from '@model/config.model'; export class MediaListComponent implements OnInit { medias$: BehaviorSubject; + pagination: PaginationHelper; + loading$: Observable; + processing$: Observable; + config$: Observable; + decodeURI = decodeURI; + mediaEdit: number; + mediaReplace: number; + mediaLink: number; + utils = Utils; + multipleSelection: number[] = []; constructor(public mediaService: MediaService, @@ -86,12 +96,12 @@ export class MediaListComponent implements OnInit { this.mediaLink = null; this.mediaEdit = null; this.mediaReplace = (this.mediaReplace === mediaId) ? null : mediaId; - return; + } } uploadMedia($event) { - const files: File[] = $event.target.files; + const {files} = $event.target; if (!files || files.length < 1) { return; } @@ -99,7 +109,7 @@ export class MediaListComponent implements OnInit { const filesize = (file.size / 1024 / 1024); if (filesize > 5) { this._toast.error('Les poids des fichiers doivent être inférieur à 5Mb.', 'Fichier volumineux'); - return; + } }); this.mediaService.createMedia(files).subscribe(() => { diff --git a/src/app/modules/media/media-list/replace-media/replace-media.component.ts b/src/app/modules/media/media-list/replace-media/replace-media.component.ts index 0427a48..055f0c1 100644 --- a/src/app/modules/media/media-list/replace-media/replace-media.component.ts +++ b/src/app/modules/media/media-list/replace-media/replace-media.component.ts @@ -12,7 +12,9 @@ export class ReplaceMediaComponent implements OnInit { @Output() replaceMedia: EventEmitter = new EventEmitter(); public replaceFile: File; + public utils = Utils; + imgPreview = null; constructor(private _toast: ToastrService) { diff --git a/src/app/modules/media/media.module.ts b/src/app/modules/media/media.module.ts index 1f3d34c..2829758 100644 --- a/src/app/modules/media/media.module.ts +++ b/src/app/modules/media/media.module.ts @@ -1,10 +1,10 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; import { MediaLayoutComponent } from './media-layout/media-layout.component'; import { MediaRoutingModule } from './media.routing'; import { MaterialModule } from '../material/material.module'; import { SharedModule } from '../shared/shared.module'; -import { ReactiveFormsModule } from '@angular/forms'; import { MediaListComponent } from './media-list/media-list.component'; import { MediaFilterComponent } from './media-list/media-filter/media-filter.component'; import { MediaIntentsComponent } from './media-list/media-intents/media-intents.component'; diff --git a/src/app/modules/shared/components/chatbot-list-item/chatbot-list-item.component.ts b/src/app/modules/shared/components/chatbot-list-item/chatbot-list-item.component.ts index 24cf34f..f298d1c 100644 --- a/src/app/modules/shared/components/chatbot-list-item/chatbot-list-item.component.ts +++ b/src/app/modules/shared/components/chatbot-list-item/chatbot-list-item.component.ts @@ -8,8 +8,11 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; export class ChatbotListItemComponent implements OnInit { @Input() checkable = false; + @Input() checked: boolean; + @Output() checkedClicked: EventEmitter = new EventEmitter(); + @Output() cardClicked: EventEmitter = new EventEmitter(); constructor() { diff --git a/src/app/modules/shared/components/pagination/pagination.component.ts b/src/app/modules/shared/components/pagination/pagination.component.ts index c9f3ff3..0eb1ca8 100644 --- a/src/app/modules/shared/components/pagination/pagination.component.ts +++ b/src/app/modules/shared/components/pagination/pagination.component.ts @@ -9,6 +9,7 @@ import { PaginationHelper } from '@model/pagination-helper.model'; export class PaginationComponent implements OnInit { @Input() pagination: PaginationHelper; + @Output() changePage: EventEmitter = new EventEmitter(); constructor() { diff --git a/src/app/modules/stats/stats-list/faq-stats-kpi/faq-stats-kpi.component.ts b/src/app/modules/stats/stats-list/faq-stats-kpi/faq-stats-kpi.component.ts index 54e0275..2bbdacb 100644 --- a/src/app/modules/stats/stats-list/faq-stats-kpi/faq-stats-kpi.component.ts +++ b/src/app/modules/stats/stats-list/faq-stats-kpi/faq-stats-kpi.component.ts @@ -11,30 +11,31 @@ import { StatsService } from '@core/services/stats.service'; export class FaqStatsKpiComponent extends DestroyObservable implements OnInit { visitors = null; + avgQuestionsPerUser = null; - constructor(private _statsService: StatsService) { + constructor(private statsService: StatsService) { super(); } ngOnInit(): void { // If you want to add time filter - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe( - (value) => { + () => { this.getData(); } ); } getData() { - this._statsService.getFaqKPIData().subscribe( - (value) => { + this.statsService.getFaqKPIData().subscribe( + (value: any) => { // console.log(value); - this.visitors = value['uniqueVisitorsNumber'].visitors; - this.avgQuestionsPerUser = Math.round(value['avgQuestionPerVisitor'].averagequestions * 100) / 100; + this.visitors = value.uniqueVisitorsNumber.visitors; + this.avgQuestionsPerUser = Math.round(value.avgQuestionPerVisitor.averagequestions * 100) / 100; } ); } diff --git a/src/app/modules/stats/stats-list/faq-stats-most-categories/faq-stats-most-categories.component.ts b/src/app/modules/stats/stats-list/faq-stats-most-categories/faq-stats-most-categories.component.ts index c11dc49..d41ca23 100644 --- a/src/app/modules/stats/stats-list/faq-stats-most-categories/faq-stats-most-categories.component.ts +++ b/src/app/modules/stats/stats-list/faq-stats-most-categories/faq-stats-most-categories.component.ts @@ -13,14 +13,15 @@ import * as moment from 'moment'; export class FaqStatsMostCategoriesComponent extends DestroyObservable implements OnInit { results: any[]; + dataUrl: string; - constructor(private _statsService: StatsService) { + constructor(private statsService: StatsService) { super(); } ngOnInit(): void { - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe(() => { @@ -30,16 +31,14 @@ export class FaqStatsMostCategoriesComponent extends DestroyObservable implement } getGraph() { - this._statsService.getFaqMostCategoriesData().subscribe( - (value) => { - this.results = value['mostAskedCategories'].map(elem => { - return { - value: [parseInt(elem['count'], 10)], - name: elem['category'] - }; - }); + this.statsService.getFaqMostCategoriesData().subscribe( + (value: any) => { + this.results = value.mostAskedCategories.map(elem => ({ + value: [parseInt(elem.count, 10)], + name: elem.category + })); setTimeout(() => { - this._setGraphMargin(); + this.setGraphMargin(); }); } ); @@ -47,7 +46,7 @@ export class FaqStatsMostCategoriesComponent extends DestroyObservable implement downloadCanvasBest(event) { const anchor = event.target; - const name = 'mostFaqCategoriesChart-' + moment(new Date()).format('DDMMYYYYHHmmss') + '.jpg'; + const name = `mostFaqCategoriesChart-${ moment(new Date()).format('DDMMYYYYHHmmss') }.jpg`; // get the canvas anchor.href = this.dataUrl; @@ -65,16 +64,16 @@ export class FaqStatsMostCategoriesComponent extends DestroyObservable implement @HostListener('window:resize', ['$event']) onResize(event) { - this._setGraphMargin(); + this.setGraphMargin(); } - private _setGraphMargin() { + private setGraphMargin() { const legendNode = document.querySelectorAll('.faq-stats-most-categories .chart-legend')[0]; const graphNode = document.querySelectorAll('.faq-stats-most-categories .chart-container')[0]; if (!graphNode) { return; } - graphNode.style.marginBottom = legendNode.clientHeight + 'px'; + graphNode.style.marginBottom = `${legendNode.clientHeight }px`; } } diff --git a/src/app/modules/stats/stats-list/faq-stats-most-questions/faq-stats-most-questions.component.ts b/src/app/modules/stats/stats-list/faq-stats-most-questions/faq-stats-most-questions.component.ts index 63777a5..7cf4cae 100644 --- a/src/app/modules/stats/stats-list/faq-stats-most-questions/faq-stats-most-questions.component.ts +++ b/src/app/modules/stats/stats-list/faq-stats-most-questions/faq-stats-most-questions.component.ts @@ -13,14 +13,15 @@ import domtoimage from 'dom-to-image'; export class FaqStatsMostQuestionsComponent extends DestroyObservable implements OnInit { results: any[]; + dataUrl: string; - constructor(private _statsService: StatsService) { + constructor(private statsService: StatsService) { super(); } ngOnInit(): void { - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe(() => { @@ -30,16 +31,14 @@ export class FaqStatsMostQuestionsComponent extends DestroyObservable implements } getGraph() { - this._statsService.getFaqMostQuestionsData().subscribe( - (value) => { - this.results = value['mostAskedQuestions'].map(elem => { - return { - value: [parseInt(elem['count'], 10)], - name: elem['question'] - }; - }); + this.statsService.getFaqMostQuestionsData().subscribe( + (value: any) => { + this.results = value.mostAskedQuestions.map(elem => ({ + value: [parseInt(elem.count, 10)], + name: elem.question + })); setTimeout(() => { - this._setGraphMargin(); + this.setGraphMargin(); }); } ); @@ -47,7 +46,7 @@ export class FaqStatsMostQuestionsComponent extends DestroyObservable implements downloadCanvasBest(event) { const anchor = event.target; - const name = 'mostFaqQuestionsChart-' + moment(new Date()).format('DDMMYYYYHHmmss') + '.jpg'; + const name = `mostFaqQuestionsChart-${ moment(new Date()).format('DDMMYYYYHHmmss') }.jpg`; // get the canvas anchor.href = this.dataUrl; @@ -65,16 +64,16 @@ export class FaqStatsMostQuestionsComponent extends DestroyObservable implements @HostListener('window:resize', ['$event']) onResize(event) { - this._setGraphMargin(); + this.setGraphMargin(); } - private _setGraphMargin() { + private setGraphMargin() { const legendNode = document.querySelectorAll('.faq-stats-most-questions .chart-legend')[0]; const graphNode = document.querySelectorAll('.faq-stats-most-questions .chart-container')[0]; if (!graphNode) { return; } - graphNode.style.marginBottom = legendNode.clientHeight + 'px'; + graphNode.style.marginBottom = `${legendNode.clientHeight }px`; } } diff --git a/src/app/modules/stats/stats-list/feedbacks-stats-kpi/feedbacks-stats-kpi.component.ts b/src/app/modules/stats/stats-list/feedbacks-stats-kpi/feedbacks-stats-kpi.component.ts index dbcf667..44fef75 100644 --- a/src/app/modules/stats/stats-list/feedbacks-stats-kpi/feedbacks-stats-kpi.component.ts +++ b/src/app/modules/stats/stats-list/feedbacks-stats-kpi/feedbacks-stats-kpi.component.ts @@ -11,38 +11,43 @@ import { takeUntil } from 'rxjs/operators'; export class FeedbacksStatsKpiComponent extends DestroyObservable implements OnInit { relevantQuestions = null; + avgRelevantQuestions = null; + wrongQuestions = null; + avgWrongQuestions = null; + offtopicQuestions = null; + avgOfftopicQuestions = null; - constructor(private _statsService: StatsService) { + constructor(private statsService: StatsService) { super(); } ngOnInit(): void { // If you want to add time filter - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe( - (value) => { + () => { this.getData(); } ); } getData() { - this._statsService.getFeedbackKPIData().subscribe( - (value) => { + this.statsService.getFeedbackKPIData().subscribe( + (value: any) => { // console.log(value); - this.relevantQuestions = value['relevantQuestions'].countFeedback; - this.avgRelevantQuestions = Math.round(value['relevantQuestionsPct'].ratioFeedback * 100) / 100; - this.wrongQuestions = value['wrongQuestions'].countFeedback; - this.avgWrongQuestions = Math.round(value['wrongQuestionsPct'].ratioFeedback * 100) / 100; - this.offtopicQuestions = value['offtopicQuestions'].countFeedback; - this.avgOfftopicQuestions = Math.round(value['offtopicQuestionsPct'].ratioFeedback * 100) / 100; + this.relevantQuestions = value.relevantQuestions.countFeedback; + this.avgRelevantQuestions = Math.round(value.relevantQuestionsPct.ratioFeedback * 100) / 100; + this.wrongQuestions = value.wrongQuestions.countFeedback; + this.avgWrongQuestions = Math.round(value.wrongQuestionsPct.ratioFeedback * 100) / 100; + this.offtopicQuestions = value.offtopicQuestions.countFeedback; + this.avgOfftopicQuestions = Math.round(value.offtopicQuestionsPct.ratioFeedback * 100) / 100; } ); } diff --git a/src/app/modules/stats/stats-list/feedbacks-stats-most-categories/feedbacks-stats-most-categories.component.ts b/src/app/modules/stats/stats-list/feedbacks-stats-most-categories/feedbacks-stats-most-categories.component.ts index 81cb47b..7afa20d 100644 --- a/src/app/modules/stats/stats-list/feedbacks-stats-most-categories/feedbacks-stats-most-categories.component.ts +++ b/src/app/modules/stats/stats-list/feedbacks-stats-most-categories/feedbacks-stats-most-categories.component.ts @@ -14,17 +14,19 @@ import domtoimage from 'dom-to-image'; export class FeedbacksStatsMostCategoriesComponent extends DestroyObservable implements OnInit { @Input() status: InboxStatus; + @Input() index: number; results: any[]; + dataUrl: string; - constructor(private _statsService: StatsService) { + constructor(private statsService: StatsService) { super(); } ngOnInit(): void { - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe(() => { @@ -34,16 +36,14 @@ export class FeedbacksStatsMostCategoriesComponent extends DestroyObservable imp } getGraph() { - this._statsService.getFeedbackMostCategoriesData(this.status).subscribe( - (value) => { - this.results = value['mostAskedCategories'].map(elem => { - return { - value: [parseInt(elem['count'], 10)], - name: elem['category'] - }; - }); + this.statsService.getFeedbackMostCategoriesData(this.status).subscribe( + (value: any) => { + this.results = value.mostAskedCategories.map(elem => ({ + value: [parseInt(elem.count, 10)], + name: elem.category + })); setTimeout(() => { - this._setGraphMargin(); + this.setGraphMargin(); }); } ); @@ -51,7 +51,7 @@ export class FeedbacksStatsMostCategoriesComponent extends DestroyObservable imp downloadCanvasBest(event) { const anchor = event.target; - const name = 'mostFeedbacksCategoriesChart-' + moment(new Date()).format('DDMMYYYYHHmmss') + '.jpg'; + const name = `mostFeedbacksCategoriesChart-${ moment(new Date()).format('DDMMYYYYHHmmss') }.jpg`; // get the canvas anchor.href = this.dataUrl; @@ -69,16 +69,16 @@ export class FeedbacksStatsMostCategoriesComponent extends DestroyObservable imp @HostListener('window:resize', ['$event']) onResize(event) { - this._setGraphMargin(); + this.setGraphMargin(); } - private _setGraphMargin() { + private setGraphMargin() { const legendNode = document.querySelectorAll('.feedbacks-stats-most-categories .chart-legend')[0]; const graphNode = document.querySelectorAll('.feedbacks-stats-most-categories .chart-container')[0]; if (!graphNode) { return; } - graphNode.style.marginBottom = legendNode.clientHeight + 'px'; + graphNode.style.marginBottom = `${legendNode.clientHeight }px`; } } diff --git a/src/app/modules/stats/stats-list/feedbacks-stats-most-questions/feedbacks-stats-most-questions.component.ts b/src/app/modules/stats/stats-list/feedbacks-stats-most-questions/feedbacks-stats-most-questions.component.ts index 6f4aba2..82f3941 100644 --- a/src/app/modules/stats/stats-list/feedbacks-stats-most-questions/feedbacks-stats-most-questions.component.ts +++ b/src/app/modules/stats/stats-list/feedbacks-stats-most-questions/feedbacks-stats-most-questions.component.ts @@ -14,17 +14,19 @@ import domtoimage from 'dom-to-image'; export class FeedbacksStatsMostQuestionsComponent extends DestroyObservable implements OnInit { @Input() status: InboxStatus; + @Input() index: number; results: any[]; + dataUrl: string; - constructor(private _statsService: StatsService) { + constructor(private statsService: StatsService) { super(); } ngOnInit(): void { - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe(() => { @@ -34,16 +36,14 @@ export class FeedbacksStatsMostQuestionsComponent extends DestroyObservable impl } getGraph() { - this._statsService.getFeedbackMostQuestionsData(this.status).subscribe( - (value) => { - this.results = value['mostAskedQuestions'].map(elem => { - return { - value: [parseInt(elem['count'], 10)], - name: elem['question'] - }; - }); + this.statsService.getFeedbackMostQuestionsData(this.status).subscribe( + (value: any) => { + this.results = value.mostAskedQuestions.map(elem => ({ + value: [parseInt(elem.count, 10)], + name: elem.question + })); setTimeout(() => { - this._setGraphMargin(); + this.setGraphMargin(); }); } ); @@ -51,7 +51,7 @@ export class FeedbacksStatsMostQuestionsComponent extends DestroyObservable impl downloadCanvasBest(event) { const anchor = event.target; - const name = 'mostFeedbacksQuestionsChart-' + moment(new Date()).format('DDMMYYYYHHmmss') + '.jpg'; + const name = `mostFeedbacksQuestionsChart-${ moment(new Date()).format('DDMMYYYYHHmmss') }.jpg`; // get the canvas anchor.href = this.dataUrl; @@ -68,17 +68,17 @@ export class FeedbacksStatsMostQuestionsComponent extends DestroyObservable impl } @HostListener('window:resize', ['$event']) - onResize(event) { - this._setGraphMargin(); + onResize() { + this.setGraphMargin(); } - private _setGraphMargin() { + private setGraphMargin() { const legendNode = document.querySelectorAll('.feedbacks-stats-most-questions .chart-legend')[0]; const graphNode = document.querySelectorAll('.feedbacks-stats-most-questions .chart-container')[0]; if (!graphNode) { return; } - graphNode.style.marginBottom = legendNode.clientHeight + 'px'; + graphNode.style.marginBottom = `${legendNode.clientHeight }px`; } } diff --git a/src/app/modules/stats/stats-list/stats-best-categories/stats-best-categories.component.ts b/src/app/modules/stats/stats-list/stats-best-categories/stats-best-categories.component.ts index 92c6841..039594e 100644 --- a/src/app/modules/stats/stats-list/stats-best-categories/stats-best-categories.component.ts +++ b/src/app/modules/stats/stats-list/stats-best-categories/stats-best-categories.component.ts @@ -13,15 +13,16 @@ import domtoimage from 'dom-to-image'; export class StatsBestCategoriesComponent extends DestroyObservable implements OnInit { chartData: any[]; + dataUrl: string; - constructor(private _statsService: StatsService) { + constructor(private statsService: StatsService) { super(); } ngOnInit(): void { // If you want to add time filter - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe(() => { @@ -31,16 +32,14 @@ export class StatsBestCategoriesComponent extends DestroyObservable implements O } getGraph() { - this._statsService.getBestCategoriesData().subscribe( - (value) => { - this.chartData = value['mostAskedCategories'].map(elem => { - return { - value: [parseInt(elem['count'], 10)], - name: elem['category'] - }; - }); + this.statsService.getBestCategoriesData().subscribe( + (value: any) => { + this.chartData = value.mostAskedCategories.map(elem => ({ + value: [parseInt(elem.count, 10)], + name: elem.category + })); setTimeout(() => { - this._setGraphMargin(); + this.setGraphMargin(); }); } ); @@ -48,7 +47,7 @@ export class StatsBestCategoriesComponent extends DestroyObservable implements O downloadCanvasBest(event) { const anchor = event.target; - const name = 'bestCategoriesChart-' + moment(new Date()).format('DDMMYYYYHHmmss') + '.jpg'; + const name = `bestCategoriesChart-${ moment(new Date()).format('DDMMYYYYHHmmss') }.jpg`; // get the canvas anchor.href = this.dataUrl; anchor.download = name; @@ -64,17 +63,17 @@ export class StatsBestCategoriesComponent extends DestroyObservable implements O } @HostListener('window:resize', ['$event']) - onResize(event) { - this._setGraphMargin(); + onResize() { + this.setGraphMargin(); } - private _setGraphMargin() { + private setGraphMargin() { const legendNode = document.querySelectorAll('.stats-best-categories .chart-legend')[0]; const graphNode = document.querySelectorAll('.stats-best-categories .chart-container')[0]; if (!graphNode) { return; } - graphNode.style.marginBottom = legendNode.clientHeight + 'px'; + graphNode.style.marginBottom = `${legendNode.clientHeight }px`; } } diff --git a/src/app/modules/stats/stats-list/stats-best-questions/stats-best-questions.component.ts b/src/app/modules/stats/stats-list/stats-best-questions/stats-best-questions.component.ts index 8a2dab3..b55d362 100644 --- a/src/app/modules/stats/stats-list/stats-best-questions/stats-best-questions.component.ts +++ b/src/app/modules/stats/stats-list/stats-best-questions/stats-best-questions.component.ts @@ -13,14 +13,15 @@ import domtoimage from 'dom-to-image'; export class StatsBestQuestionsComponent extends DestroyObservable implements OnInit { chartData: any[]; + dataUrl: string; - constructor(private _statsService: StatsService) { + constructor(private statsService: StatsService) { super(); } ngOnInit(): void { - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe(() => { @@ -30,16 +31,14 @@ export class StatsBestQuestionsComponent extends DestroyObservable implements On } getGraph() { - this._statsService.getBestQuestionsData().subscribe( - (value) => { - this.chartData = value['mostAskedQuestions'].map(elem => { - return { - value: [parseInt(elem['count'], 10)], - name: elem['question'] - }; - }); + this.statsService.getBestQuestionsData().subscribe( + (value: any) => { + this.chartData = value.mostAskedQuestions.map(elem => ({ + value: [parseInt(elem.count, 10)], + name: elem.question + })); setTimeout(() => { - this._setGraphMargin(); + this.setGraphMargin(); }); } ); @@ -47,7 +46,7 @@ export class StatsBestQuestionsComponent extends DestroyObservable implements On downloadCanvasBest(event) { const anchor = event.target; - const name = 'bestQuestionsChart-' + moment(new Date()).format('DDMMYYYYHHmmss') + '.jpg'; + const name = `bestQuestionsChart-${ moment(new Date()).format('DDMMYYYYHHmmss') }.jpg`; // get the canvas anchor.href = this.dataUrl; @@ -64,17 +63,17 @@ export class StatsBestQuestionsComponent extends DestroyObservable implements On } @HostListener('window:resize', ['$event']) - onResize(event) { - this._setGraphMargin(); + onResize() { + this.setGraphMargin(); } - private _setGraphMargin() { + private setGraphMargin() { const legendNode = document.querySelectorAll('.stats-best-questions .chart-legend')[0]; const graphNode = document.querySelectorAll('.stats-best-questions .chart-container')[0]; if (!graphNode) { return; } - graphNode.style.marginBottom = legendNode.clientHeight + 'px'; + graphNode.style.marginBottom = `${legendNode.clientHeight }px`; } } diff --git a/src/app/modules/stats/stats-list/stats-filter/stats-filter.component.ts b/src/app/modules/stats/stats-list/stats-filter/stats-filter.component.ts index 2fb4a3d..3c300ec 100644 --- a/src/app/modules/stats/stats-list/stats-filter/stats-filter.component.ts +++ b/src/app/modules/stats/stats-list/stats-filter/stats-filter.component.ts @@ -13,6 +13,7 @@ import * as moment from 'moment'; export class StatsFilterComponent extends DestroyObservable implements OnInit, OnDestroy { statsFilters: FormGroup; + today = new Date(); constructor(private _fb: FormBuilder, diff --git a/src/app/modules/stats/stats-list/stats-graph/stats-graph.component.ts b/src/app/modules/stats/stats-list/stats-graph/stats-graph.component.ts index 4ac0d44..41cedc7 100644 --- a/src/app/modules/stats/stats-list/stats-graph/stats-graph.component.ts +++ b/src/app/modules/stats/stats-list/stats-graph/stats-graph.component.ts @@ -1,5 +1,5 @@ import { DestroyObservable } from '@core/utils/destroy-observable'; -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { StatsService } from '@core/services/stats.service'; import { takeUntil } from 'rxjs/operators'; import * as moment from 'moment'; @@ -14,33 +14,46 @@ import domtoimage from 'dom-to-image'; export class StatsGraphComponent extends DestroyObservable implements OnInit { startDate: Date; + endDate: Date; - private _datasetQuestions = {series: [], name: 'Questions posées'}; - private _datasetIntents = {series: [], name: 'Questions ajoutées'}; - private _datasetVisitors = {series: [], name: 'Nb sessions'}; - private _datasetFeedbacks = {series: [], name: 'Retours utilisateurs'}; + private datasetQuestions = {series: [], name: 'Questions posées'}; + + private datasetIntents = {series: [], name: 'Questions ajoutées'}; + + private datasetVisitors = {series: [], name: 'Nb sessions'}; + + private datasetFeedbacks = {series: [], name: 'Retours utilisateurs'}; questionsPanel = []; + intentPanel = []; + visitorsPanel = []; + feedbacksPanel = []; + questionDisplay = true; + visitorsDisplay = true; + intentDisplay = false; + feedbackDisplay = true; curve = shape.curveMonotoneX; + chartDataBis: any[]; + dataUrl: string; - constructor(public _statsService: StatsService) { + constructor(public statsService: StatsService) { super(); } ngOnInit(): void { // If you want to add time filter - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe( @@ -57,23 +70,23 @@ export class StatsGraphComponent extends DestroyObservable implements OnInit { this.startDate = this.endDate; } - this._statsService.getGraphData().subscribe( - (result) => { - this._fillDataset(this._datasetQuestions, result['askedQuestionsNumber'], this.startDate, this.endDate); - this._fillDataset(this._datasetVisitors, result['visitorNumber'], this.startDate, this.endDate); - this._fillDataset(this._datasetIntents, result['dbQuestionSize'], this.startDate, this.endDate); - this._fillDataset(this._datasetFeedbacks, result['feedbacksNumber'], this.startDate, this.endDate); - - this.questionsPanel = this.getPanelData(this._datasetQuestions.series); - this.visitorsPanel = this.getPanelData(this._datasetVisitors.series); - this.intentPanel = this.getPanelData(this._datasetIntents.series); - this.feedbacksPanel = this.getPanelData(this._datasetFeedbacks.series); + this.statsService.getGraphData().subscribe( + (result: any) => { + this.fillDataset(this.datasetQuestions, result.askedQuestionsNumber, this.startDate, this.endDate); + this.fillDataset(this.datasetVisitors, result.visitorNumber, this.startDate, this.endDate); + this.fillDataset(this.datasetIntents, result.dbQuestionSize, this.startDate, this.endDate); + this.fillDataset(this.datasetFeedbacks, result.feedbacksNumber, this.startDate, this.endDate); + + this.questionsPanel = this.getPanelData(this.datasetQuestions.series); + this.visitorsPanel = this.getPanelData(this.datasetVisitors.series); + this.intentPanel = this.getPanelData(this.datasetIntents.series); + this.feedbacksPanel = this.getPanelData(this.datasetFeedbacks.series); this.displayPanel(); } ); } - private _fillDataset(dataset: any, elem: any[], start, end) { + private fillDataset(dataset: any, elem: any[], start, end) { const current = start ? new Date(start) : this.startDate; end = moment(end).set({hour: 0, minute: 0, second: 0, millisecond: 0}); dataset.series = []; @@ -95,16 +108,16 @@ export class StatsGraphComponent extends DestroyObservable implements OnInit { } getPanelData(values) { - const dataArray = []; - dataArray['count'] = 0; + const dataArray: any = {}; + dataArray.count = 0; values.forEach(elem => { - dataArray['count'] = dataArray['count'] + Number(elem.value); + dataArray.count += Number(elem.value); }); - dataArray['maxNb'] = values.reduce((a, b) => Math.max(a && a.value !== undefined ? a.value : a, b.value)); - dataArray['minNb'] = values.reduce((a, b) => Math.min(a && a.value !== undefined ? a.value : a, b.value)); + dataArray.maxNb = values.reduce((a, b) => Math.max(a && a.value !== undefined ? a.value : a, b.value)); + dataArray.minNb = values.reduce((a, b) => Math.min(a && a.value !== undefined ? a.value : a, b.value)); - dataArray['maxDay'] = moment(values[values.findIndex(v => v.value === dataArray['maxNb'])].name).format('dddd Do MMM YYYY'); - dataArray['minDay'] = moment(values[values.findIndex(v => v.value === dataArray['minNb'])].name).format('dddd Do MMM YYYY'); + dataArray.maxDay = moment(values[values.findIndex(v => v.value === dataArray.maxNb)].name).format('dddd Do MMM YYYY'); + dataArray.minDay = moment(values[values.findIndex(v => v.value === dataArray.minNb)].name).format('dddd Do MMM YYYY'); return dataArray; } @@ -112,19 +125,19 @@ export class StatsGraphComponent extends DestroyObservable implements OnInit { displayPanel() { this.chartDataBis = []; - this.questionDisplay ? this.chartDataBis.push({...this._datasetQuestions}) : - this.chartDataBis.push(Object.assign({...this._datasetQuestions}, {series: []})); - this.visitorsDisplay ? this.chartDataBis.push({...this._datasetVisitors}) : - this.chartDataBis.push(Object.assign({...this._datasetVisitors}, {series: []})); - this.intentDisplay ? this.chartDataBis.push({...this._datasetIntents}) : - this.chartDataBis.push(Object.assign({...this._datasetIntents}, {series: []})); - this.feedbackDisplay ? this.chartDataBis.push({...this._datasetFeedbacks}) : - this.chartDataBis.push(Object.assign({...this._datasetFeedbacks}, {series: []})); + this.questionDisplay ? this.chartDataBis.push({...this.datasetQuestions}) : + this.chartDataBis.push({...this.datasetQuestions, series: []}); + this.visitorsDisplay ? this.chartDataBis.push({...this.datasetVisitors}) : + this.chartDataBis.push({...this.datasetVisitors, series: []}); + this.intentDisplay ? this.chartDataBis.push({...this.datasetIntents}) : + this.chartDataBis.push({...this.datasetIntents, series: []}); + this.feedbackDisplay ? this.chartDataBis.push({...this.datasetFeedbacks}) : + this.chartDataBis.push({...this.datasetFeedbacks, series: []}); } downloadCanvas(event) { const anchor = event.target; - const name = 'globalStats-' + moment(new Date()).format('DDMMYYYYHHmmss') + '.jpg'; + const name = `globalStats-${ moment(new Date()).format('DDMMYYYYHHmmss') }.jpg`; // get the canvas anchor.href = this.dataUrl; anchor.download = name; diff --git a/src/app/modules/stats/stats-list/stats-kpi/stats-kpi.component.ts b/src/app/modules/stats/stats-list/stats-kpi/stats-kpi.component.ts index e47a435..9660472 100644 --- a/src/app/modules/stats/stats-list/stats-kpi/stats-kpi.component.ts +++ b/src/app/modules/stats/stats-list/stats-kpi/stats-kpi.component.ts @@ -11,18 +11,22 @@ import { takeUntil } from 'rxjs/operators'; export class StatsKpiComponent extends DestroyObservable implements OnInit { visitors = null; + ratioResponseOk = null; + ratioResponseSure = null; + avgQuestionsPerUser = null; + avgResponseTime = null; - constructor(private _statsService: StatsService) { + constructor(private statsService: StatsService) { super(); } ngOnInit(): void { // If you want to add time filter - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe( @@ -33,16 +37,16 @@ export class StatsKpiComponent extends DestroyObservable implements OnInit { } getData(dates) { - this._statsService.getKPIData().subscribe( - (value) => { + this.statsService.getKPIData().subscribe( + (value: any) => { // console.log(value); - this.visitors = value['uniqueVisitorsNumber'].visitors; - this.ratioResponseOk = value['ratioChatbotResponseOk'].ratioresponseok; - this.ratioResponseSure = value['ratioChatbotResponseSure'].ratioresponseok; - this.avgQuestionsPerUser = Math.round(value['avgQuestionPerVisitor'].averagequestions * 100) / 100; - this.avgResponseTime = Math.round(value['avgChatbotResponseTime'].averageresponse) / 1000 + ' seconde'; - if ((value['avgChatbotResponseTime'].averageresponse / 1000) > 1 ) { - this.avgResponseTime = this.avgResponseTime + 's'; + this.visitors = value.uniqueVisitorsNumber.visitors; + this.ratioResponseOk = value.ratioChatbotResponseOk.ratioresponseok; + this.ratioResponseSure = value.ratioChatbotResponseSure.ratioresponseok; + this.avgQuestionsPerUser = Math.round(value.avgQuestionPerVisitor.averagequestions * 100) / 100; + this.avgResponseTime = `${Math.round(value.avgChatbotResponseTime.averageresponse) / 1000 } seconde`; + if ((value.avgChatbotResponseTime.averageresponse / 1000) > 1 ) { + this.avgResponseTime += 's'; } } ); diff --git a/src/app/modules/stats/stats-list/stats-list.component.ts b/src/app/modules/stats/stats-list/stats-list.component.ts index ff2d03f..56c0e9a 100644 --- a/src/app/modules/stats/stats-list/stats-list.component.ts +++ b/src/app/modules/stats/stats-list/stats-list.component.ts @@ -9,6 +9,7 @@ import { InboxStatus } from '@enum/*'; export class StatsListComponent implements OnInit { statView = 'chatbot'; + inboxStatus = InboxStatus; constructor() { diff --git a/src/app/modules/stats/stats-list/stats-worst-questions/stats-worst-questions.component.ts b/src/app/modules/stats/stats-list/stats-worst-questions/stats-worst-questions.component.ts index ac5b810..83cd83f 100644 --- a/src/app/modules/stats/stats-list/stats-worst-questions/stats-worst-questions.component.ts +++ b/src/app/modules/stats/stats-list/stats-worst-questions/stats-worst-questions.component.ts @@ -1,6 +1,6 @@ import { DestroyObservable } from '@core/utils/destroy-observable'; import { StatsService } from '@core/services/stats.service'; -import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; @@ -12,30 +12,31 @@ import { Subject } from 'rxjs'; export class StatsWorstQuestionsComponent extends DestroyObservable implements OnInit { destroy$: Subject = new Subject(); + worstQuestions: Array = []; - constructor(public _statsService: StatsService) { + constructor(public statsService: StatsService) { super(); } ngOnInit(): void { - this._statsService._currentFilters$ + this.statsService._currentFilters$ .pipe( takeUntil(this.destroy$)) .subscribe( (value) => { - this._statsService.setCurrentFilters(value?.startDate, value?.endDate); + this.statsService.setCurrentFilters(value?.startDate, value?.endDate); this.getData(value); } ); } getData(dates) { - this._statsService.getWorstQuestionsData().subscribe( - (value) => { + this.statsService.getWorstQuestionsData().subscribe( + (value: any) => { this.worstQuestions = []; - value['lessAskedQuestions'].forEach(elem => { - this.worstQuestions.push(elem['question']); + value.lessAskedQuestions.forEach(elem => { + this.worstQuestions.push(elem.question); }); } ); diff --git a/src/app/modules/stats/stats.module.ts b/src/app/modules/stats/stats.module.ts index 78515bc..e6f7d0d 100644 --- a/src/app/modules/stats/stats.module.ts +++ b/src/app/modules/stats/stats.module.ts @@ -1,10 +1,11 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { NgxChartsModule } from '@swimlane/ngx-charts'; import { StatsLayoutComponent } from './stats-layout/stats-layout.component'; import { StatsRoutingModule } from './stats.routing'; import { MaterialModule } from '../material/material.module'; import { SharedModule } from '../shared/shared.module'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { StatsListComponent } from './stats-list/stats-list.component'; import { StatsFilterComponent } from './stats-list/stats-filter/stats-filter.component'; import { StatsGraphComponent } from './stats-list/stats-graph/stats-graph.component'; @@ -16,7 +17,6 @@ import { FaqStatsMostQuestionsComponent } from './stats-list/faq-stats-most-ques import { FaqStatsMostCategoriesComponent } from './stats-list/faq-stats-most-categories/faq-stats-most-categories.component'; import { FaqStatsKpiComponent } from './stats-list/faq-stats-kpi/faq-stats-kpi.component'; import { FeedbacksStatsKpiComponent } from './stats-list/feedbacks-stats-kpi/feedbacks-stats-kpi.component'; -import { NgxChartsModule } from '@swimlane/ngx-charts'; import { FeedbacksStatsMostQuestionsComponent } from './stats-list/feedbacks-stats-most-questions/feedbacks-stats-most-questions.component'; import { FeedbacksStatsMostCategoriesComponent } from './stats-list/feedbacks-stats-most-categories/feedbacks-stats-most-categories.component'; diff --git a/src/polyfills.ts b/src/polyfills.ts index 7a30acf..12885a2 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -14,7 +14,7 @@ * Learn more in https://angular.io/guide/browser-support */ -/*************************************************************************************************** +/** ************************************************************************************************* * BROWSER POLYFILLS */ import 'core-js'; @@ -27,7 +27,8 @@ import 'classlist.js'; // Run `npm install --save classlist.js`. * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). */ -import 'web-animations-js'; // Run `npm install --save web-animations-js`. +import 'web-animations-js'; +import 'zone.js/dist/zone'; // Run `npm install --save web-animations-js`. /** * By default, zone.js will patch all possible macroTask and DomEvents @@ -53,13 +54,12 @@ import 'web-animations-js'; // Run `npm install --save web-animations-js`. * */ -/*************************************************************************************************** +/** ************************************************************************************************* * Zone JS is required by default for Angular itself. */ -(window as any).__Zone_enable_cross_context_check = true; -import 'zone.js/dist/zone'; // Included with Angular CLI. +(window as any).__Zone_enable_cross_context_check = true; // Included with Angular CLI. -/*************************************************************************************************** +/** ************************************************************************************************* * APPLICATION IMPORTS */ diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 0000000..90fe20b --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "src/**/*.ts", + "projects/**/*.ts", + "cypress/**/*.ts", + ".eslintrc.cjs" + ] +} diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 5065137..0000000 --- a/tslint.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "rulesDirectory": [ - "node_modules/codelyzer" - ], - "rules": { - "arrow-return-shorthand": true, - "callable-types": true, - "class-name": true, - "comment-format": [ - true, - "check-space" - ], - "curly": true, - "deprecation": { - "severity": "warn" - }, - "eofline": true, - "forin": true, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "import-spacing": true, - "indent": [ - true, - "spaces" - ], - "interface-over-type-literal": true, - "label-position": true, - "max-line-length": [ - true, - 140 - ], - "member-access": false, - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-arg": true, - "no-bitwise": true, - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-construct": true, - "no-debugger": true, - "no-duplicate-super": true, - "no-empty": false, - "no-empty-interface": true, - "no-eval": true, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-misused-new": true, - "no-non-null-assertion": true, - "no-shadowed-variable": true, - "no-string-literal": false, - "no-string-throw": true, - "no-switch-case-fall-through": true, - "no-trailing-whitespace": true, - "no-unnecessary-initializer": true, - "no-unused-expression": true, - "no-var-keyword": true, - "object-literal-sort-keys": false, - "one-line": [ - true, - "check-open-brace", - "check-catch", - "check-else", - "check-whitespace" - ], - "prefer-const": true, - "quotemark": [ - true, - "single" - ], - "radix": true, - "semicolon": [ - true, - "always" - ], - "triple-equals": [ - true, - "allow-null-check" - ], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "unified-signatures": true, - "variable-name": false, - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ], - "no-output-on-prefix": true, - "no-inputs-metadata-property": true, - "no-outputs-metadata-property": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-output-rename": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true, - "component-class-suffix": true, - "directive-class-suffix": true - } -} diff --git a/yarn.lock b/yarn.lock index acfe3fb..8a9b43b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -1584,11 +1589,62 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz#200a0965cf654ac28b971358ecdca9cc5b44c335" integrity sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" + integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.54.0": + version "8.54.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.54.0.tgz#4fab9a2ff7860082c304f750e94acd644cf984cf" + integrity sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ== + "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + dependencies: + "@humanwhocodes/object-schema" "^2.0.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2389,7 +2445,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -2697,11 +2753,16 @@ dependencies: "@types/jasmine" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + "@types/mime@*": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" @@ -2773,6 +2834,11 @@ resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.26.tgz#fc7d87d580affa2e52685b2e881bc201819a5836" integrity sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg== +"@types/semver@^7.5.0": + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== + "@types/send@*": version "0.17.4" resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" @@ -2828,6 +2894,96 @@ dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@^6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz#2a647d278bb48bf397fef07ba0507612ff9dd812" + integrity sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/type-utils" "6.12.0" + "@typescript-eslint/utils" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.12.0.tgz#9fb21ed7d88065a4a2ee21eb80b8578debb8217c" + integrity sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg== + dependencies: + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/typescript-estree" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz#5833a16dbe19cfbad639d4d33bcca5e755c7044b" + integrity sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw== + dependencies: + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" + +"@typescript-eslint/type-utils@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz#968f7c95162808d69950ab5dff710ad730e58287" + integrity sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng== + dependencies: + "@typescript-eslint/typescript-estree" "6.12.0" + "@typescript-eslint/utils" "6.12.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.12.0.tgz#ffc5297bcfe77003c8b7b545b51c2505748314ac" + integrity sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q== + +"@typescript-eslint/typescript-estree@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz#764ccc32598549e5b48ec99e3b85f89b1385310c" + integrity sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw== + dependencies: + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/visitor-keys" "6.12.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.12.0.tgz#c6ce8c06fe9b0212620e5674a2036f6f8f611754" + integrity sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.12.0" + "@typescript-eslint/types" "6.12.0" + "@typescript-eslint/typescript-estree" "6.12.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz#5877950de42a0f3344261b7a1eee15417306d7e9" + integrity sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw== + dependencies: + "@typescript-eslint/types" "6.12.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -2987,7 +3143,12 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== -acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.2: +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.11.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== @@ -3063,7 +3224,7 @@ ajv@8.12.0, ajv@^8.0.0, ajv@^8.11.0, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.12.3, ajv@^6.12.5: +ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3199,6 +3360,14 @@ aria-query@^3.0.0: ast-types-flow "0.0.7" commander "^2.11.0" +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3209,6 +3378,17 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -3216,11 +3396,60 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3287,6 +3516,11 @@ autoprefixer@^10.4.12: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3533,11 +3767,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== - builtin-modules@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -3626,7 +3855,7 @@ cachedir@^2.3.0: resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== -call-bind@^1.0.0: +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== @@ -3684,7 +3913,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.3.0, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3693,7 +3922,7 @@ chalk@^2.3.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3915,7 +4144,7 @@ commander@^10.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -commander@^2.11.0, commander@^2.12.1, commander@^2.20.0: +commander@^2.11.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3975,6 +4204,11 @@ concurrently@^5.3.0: tree-kill "^1.2.2" yargs "^13.3.0" +confusing-browser-globals@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + connect-history-api-fallback@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" @@ -4104,7 +4338,7 @@ critters@0.0.16: postcss "^8.3.7" pretty-bytes "^5.3.0" -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4432,7 +4666,7 @@ debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, de dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.6: +debug@^3.1.0, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -4449,6 +4683,11 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" @@ -4468,7 +4707,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.1.1: +define-data-property@^1.0.1, define-data-property@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== @@ -4482,6 +4721,15 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + del@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -4545,11 +4793,6 @@ diff@^3.1.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4569,6 +4812,20 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-serialize@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" @@ -4763,11 +5020,81 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -4856,7 +5183,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@4.0.0: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== @@ -4866,6 +5193,67 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb-typescript@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz#fda960eee4a510f092a9a1c139035ac588937ddc" + integrity sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig== + dependencies: + eslint-config-airbnb-base "^15.0.0" + +eslint-config-prettier@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f" + integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" + integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.14.2" + eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -4874,11 +5262,84 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.54.0: + version "8.54.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.54.0.tgz#588e0dd4388af91a2e8fa37ea64924074c783537" + integrity sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.3" + "@eslint/js" "8.54.0" + "@humanwhocodes/config-array" "^0.11.13" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + 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.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -4891,7 +5352,7 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -5055,7 +5516,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11, fast-glob@^3.3.0: +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -5071,6 +5532,11 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fastparse@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" @@ -5104,6 +5570,13 @@ figures@^3.0.0, figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + file-saver@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" @@ -5151,7 +5624,7 @@ find-cache-dir@^3.3.2: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@5.0.0: +find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -5174,12 +5647,21 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.2.7: +flatted@^3.2.7, flatted@^3.2.9: version "3.2.9" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== @@ -5189,6 +5671,13 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" @@ -5279,6 +5768,21 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -5303,7 +5807,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== @@ -5330,6 +5834,14 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -5351,7 +5863,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: +glob-parent@^6.0.1, glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -5397,7 +5909,7 @@ glob@^10.2.2: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7: +glob@^7.0.3, glob@^7.0.6, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5421,6 +5933,32 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.19.0: + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + globby@^13.1.1: version "13.2.2" resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" @@ -5456,6 +5994,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -5481,6 +6024,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -5503,11 +6051,18 @@ has-proto@^1.0.1: resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -5733,6 +6288,11 @@ ignore-walk@^6.0.0: dependencies: minimatch "^9.0.0" +ignore@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + ignore@^5.2.4: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -5837,6 +6397,15 @@ inquirer@8.2.4: through "^2.3.6" wrap-ansi "^7.0.0" +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + "internmap@1 - 2": version "2.0.3" resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" @@ -5862,11 +6431,27 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -5874,6 +6459,14 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -5886,6 +6479,11 @@ is-builtin-module@^3.2.1: dependencies: builtin-modules "^3.3.0" +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-ci@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" @@ -5893,13 +6491,20 @@ is-ci@^3.0.0: dependencies: ci-info "^3.2.0" -is-core-module@^2.13.0, is-core-module@^2.8.1, is-core-module@^2.9.0: +is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.8.1, is-core-module@^2.9.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -5920,7 +6525,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -5950,6 +6555,18 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -5974,7 +6591,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-path-inside@^3.0.2: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -5996,11 +6613,47 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -6011,6 +6664,13 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-what@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" @@ -6023,6 +6683,11 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -6156,7 +6821,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0: +js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -6186,6 +6851,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -6216,11 +6886,23 @@ json-schema@0.4.0: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + json5@^2.1.2, json5@^2.2.1, json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -6349,6 +7031,13 @@ karma@~6.4.1: ua-parser-js "^0.7.30" yargs "^16.1.1" +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^3.0.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -6417,6 +7106,14 @@ less@^4.1.3: needle "^3.1.0" source-map "~0.6.0" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + license-webpack-plugin@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz#1e18442ed20b754b82f1adeff42249b81d11aec6" @@ -6496,6 +7193,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.once@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" @@ -6739,7 +7441,7 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6860,7 +7562,7 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: +mkdirp@^0.5.1, mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -6942,6 +7644,11 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + needle@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" @@ -7215,11 +7922,63 @@ object-assign@^4, object-assign@^4.0.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.9.0: +object-inspect@^1.13.1, object-inspect@^1.9.0: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -7276,6 +8035,18 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + ora@5.4.1, ora@^5.1.0, ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -7637,6 +8408,16 @@ postcss@8.4.31, postcss@^8.2.14, postcss@^8.3.7, postcss@^8.4.16, postcss@^8.4.1 picocolors "^1.0.0" source-map-js "^1.0.2" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" + integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== + pretty-bytes@^5.3.0, pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -7905,6 +8686,15 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" @@ -8012,7 +8802,7 @@ resolve@1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.3.2: +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.22.4: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -8103,6 +8893,16 @@ rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.5.6: dependencies: tslib "^2.1.0" +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -8113,6 +8913,15 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -8227,7 +9036,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3: +semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -8305,6 +9114,15 @@ set-function-length@^1.1.1: gopd "^1.0.1" has-property-descriptors "^1.0.0" +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -8369,6 +9187,11 @@ sigstore@^1.0.0: "@sigstore/tuf" "^1.0.3" make-fetch-happen "^11.0.1" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slash@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" @@ -8644,6 +9467,33 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -8686,12 +9536,17 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -8796,7 +9651,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@0.2.0: +text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== @@ -8877,6 +9732,11 @@ tree-kill@1.2.2, 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== +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + ts-node@~7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" @@ -8891,12 +9751,22 @@ ts-node@~7.0.0: source-map-support "^0.5.6" yn "^2.0.0" +tsconfig-paths@^3.14.2: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== -tslib@^1.10.0, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -8906,32 +9776,6 @@ tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tslint@^6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" - integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.3" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.13.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - tuf-js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" @@ -8953,6 +9797,18 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -8966,6 +9822,45 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typed-assert@^1.0.8: version "1.0.9" resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.9.tgz#8af9d4f93432c4970ec717e3006f33f135b06213" @@ -8995,6 +9890,16 @@ uglify-to-browserify@~1.0.0: resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" integrity sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -9334,11 +10239,33 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== +which-typed-array@^1.1.11, which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + which@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"