diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js new file mode 100644 index 000000000..79191f6c1 --- /dev/null +++ b/frontend/.eslintrc.js @@ -0,0 +1,118 @@ +/* eslint-disable */ + +module.exports = { + "env": { + "browser": true, + "node": true + }, + "extends": [ + "airbnb-typescript/base" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "tsconfig.json" + }, + "plugins": [ + "eslint-plugin-import", + "@typescript-eslint", + ], + "rules": { + "@typescript-eslint/dot-notation": "off", + "@typescript-eslint/indent": "off", + "@typescript-eslint/lines-between-class-members": "off", + "@typescript-eslint/member-delimiter-style": [ + "error", + { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + ], + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "variable", + "format": [ + "camelCase", + "PascalCase", + "UPPER_CASE", + ], + "leadingUnderscore": "allow", + "trailingUnderscore": "allow", + }, + { + "selector": "typeLike", + "format": [ + "PascalCase" + ], + } + ], + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", + "@typescript-eslint/no-unused-expressions": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-shadow": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + } + ], + "@typescript-eslint/return-await": "off", + "@typescript-eslint/quotes": [ + "error", + "single" + ], + "@typescript-eslint/semi": [ + "error", + "always" + ], + "import/extensions": [ + "error", + "never" + ], + "import/extensions": "off", + "import/no-extraneous-dependencies": "off", + "import/no-useless-path-segments": "off", + "import/prefer-default-export": "off", + "arrow-body-style": "off", + "arrow-parens": "off", + "class-methods-use-this": "off", + "default-case": "off", + "function-paren-newline": "off", + "implicit-arrow-linebreak": "off", + "linebreak-style": "off", + "max-classes-per-file": "off", + "max-len": "off", + "newline-per-chained-call": "off", + "no-else-return": "off", + "no-mixed-operators": "off", + "no-nested-ternary": "off", + "no-param-reassign": "off", + "no-plusplus": "off", + "no-prototype-builtins": "off", + "no-restricted-syntax": "off", + "no-underscore-dangle": "off", + "object-curly-newline": [ + "error", + { + "ObjectExpression": { + "consistent": true + }, + "ObjectPattern": { + "consistent": true + }, + "ImportDeclaration": "never", + "ExportDeclaration": "never" + } + ], + "operator-linebreak": "off", + "prefer-destructuring": "off" + } +}; diff --git a/frontend/app-config/karma-test-shim.js b/frontend/app-config/karma-test-shim.js index f806db455..5b346bcb4 100644 --- a/frontend/app-config/karma-test-shim.js +++ b/frontend/app-config/karma-test-shim.js @@ -1,4 +1,6 @@ -Error.stackTraceLimit = Infinity; +/* eslint-disable */ + +Error.stackTraceLimit = Infinity; require('core-js/proposals/reflect-metadata'); diff --git a/frontend/app-config/karma.conf.js b/frontend/app-config/karma.conf.js index b5411f2bd..cfc45e38c 100644 --- a/frontend/app-config/karma.conf.js +++ b/frontend/app-config/karma.conf.js @@ -1,4 +1,6 @@ -const webpackConfig = require('./webpack.config'); +/* eslint-disable */ + +const webpackConfig = require('./webpack.config'); module.exports = function (config) { var _config = { diff --git a/frontend/app-config/karma.coverage.conf.js b/frontend/app-config/karma.coverage.conf.js index 28a244514..69ee10d38 100644 --- a/frontend/app-config/karma.coverage.conf.js +++ b/frontend/app-config/karma.coverage.conf.js @@ -1,4 +1,6 @@ -const webpackConfig = require('./webpack.config'); +/* eslint-disable */ + +const webpackConfig = require('./webpack.config'); module.exports = function (config) { var _config = { diff --git a/frontend/app-config/webpack.config.js b/frontend/app-config/webpack.config.js index 20ddf3378..b54747a90 100644 --- a/frontend/app-config/webpack.config.js +++ b/frontend/app-config/webpack.config.js @@ -1,3 +1,5 @@ +/* eslint-disable */ + const webpack = require('webpack'), path = require('path'); const appRoot = path.resolve(__dirname, '..'); @@ -23,8 +25,8 @@ const plugins = { NgToolsWebpack: require('@ngtools/webpack'), // https://github.com/NMFR/optimize-css-assets-webpack-plugin OptimizeCSSAssetsPlugin: require("optimize-css-assets-webpack-plugin"), - // https://github.com/jrparish/tslint-webpack-plugin - TsLintPlugin: require('tslint-webpack-plugin'), + // https://webpack.js.org/plugins/eslint-webpack-plugin/ + ESLintPlugin: require('eslint-webpack-plugin'), // https://www.npmjs.com/package/sass-lint-webpack SassLintPlugin: require('sass-lint-webpack'), // https://www.npmjs.com/package/webpack-bundle-analyzer @@ -315,19 +317,15 @@ module.exports = function (env) { }) ); - config.plugins.push( - new plugins.TsLintPlugin({ - files: ['./app/**/*.ts'], - /** - * Path to a configuration file. - */ - config: root('tslint.json'), - /** - * Wait for linting and fail the build when linting error occur. - */ - waitForLinting: isProduction - }) - ); + if (isProduction) { + config.plugins.push( + new plugins.ESLintPlugin({ + files: [ + './app/**/*.ts' + ] + }) + ); + } } if (!isTestCoverage) { diff --git a/frontend/app/app.component.ts b/frontend/app/app.component.ts index ffcf70fed..6f01c9463 100644 --- a/frontend/app/app.component.ts +++ b/frontend/app/app.component.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -10,8 +10,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'sqx-app', styleUrls: ['./app.component.scss'], - templateUrl: './app.component.html' + templateUrl: './app.component.html', }) export class AppComponent { public isLoaded?: boolean | null; -} \ No newline at end of file +} diff --git a/frontend/app/app.module.ts b/frontend/app/app.module.ts index 90bcfbf7e..91f4394c4 100644 --- a/frontend/app/app.module.ts +++ b/frontend/app/app.module.ts @@ -1,4 +1,3 @@ - /* * Squidex Headless CMS * @@ -6,6 +5,9 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable global-require */ +/* eslint-disable import/no-dynamic-require */ + import { CommonModule } from '@angular/common'; import { HttpClientModule } from '@angular/common/http'; import { ApplicationRef, NgModule } from '@angular/core'; @@ -78,10 +80,10 @@ function configLocalizerService() { SqxFrameworkModule.forRoot(), SqxSharedModule.forRoot(), SqxShellModule, - routing + routing, ], declarations: [ - AppComponent + AppComponent, ], providers: [ { provide: ApiUrlConfig, useFactory: configApiUrl }, @@ -89,16 +91,17 @@ function configLocalizerService() { { provide: DecimalSeparatorConfig, useFactory: configDecimalSeparator }, { provide: LocalizerService, useFactory: configLocalizerService }, { provide: TitlesConfig, useFactory: configTitles }, - { provide: UIOptions, useFactory: configUIOptions } + { provide: UIOptions, useFactory: configUIOptions }, ], - entryComponents: [AppComponent] + entryComponents: [AppComponent], }) export class AppModule { public ngDoBootstrap(appRef: ApplicationRef) { try { appRef.bootstrap(AppComponent); } catch (e) { + // eslint-disable-next-line no-console console.log('Application element not found'); } } -} \ No newline at end of file +} diff --git a/frontend/app/app.routes.ts b/frontend/app/app.routes.ts index 5f4e58d98..df49c6319 100644 --- a/frontend/app/app.routes.ts +++ b/frontend/app/app.routes.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -14,7 +14,7 @@ const routes: Routes = [ { path: '', component: HomePageComponent, - canActivate: [MustBeNotAuthenticatedGuard] + canActivate: [MustBeNotAuthenticatedGuard], }, { path: 'app', @@ -24,12 +24,12 @@ const routes: Routes = [ { path: '', loadChildren: () => import('./features/apps/module').then(m => m.SqxFeatureAppsModule), - canActivate: [UnsetAppGuard] + canActivate: [UnsetAppGuard], }, { path: 'administration', loadChildren: () => import('./features/administration/module').then(m => m.SqxFeatureAdministrationModule), - canActivate: [UnsetAppGuard] + canActivate: [UnsetAppGuard], }, { path: ':appName', @@ -38,52 +38,52 @@ const routes: Routes = [ children: [ { path: '', - loadChildren: () => import('./features/dashboard/module').then(m => m.SqxFeatureDashboardModule) + loadChildren: () => import('./features/dashboard/module').then(m => m.SqxFeatureDashboardModule), }, { path: 'content', - loadChildren: () => import('./features/content/module').then(m => m.SqxFeatureContentModule) + loadChildren: () => import('./features/content/module').then(m => m.SqxFeatureContentModule), }, { path: 'schemas', - loadChildren: () => import('./features/schemas/module').then(m => m.SqxFeatureSchemasModule) + loadChildren: () => import('./features/schemas/module').then(m => m.SqxFeatureSchemasModule), }, { path: 'assets', - loadChildren: () => import('./features/assets/module').then(m => m.SqxFeatureAssetsModule) + loadChildren: () => import('./features/assets/module').then(m => m.SqxFeatureAssetsModule), }, { path: 'rules', - loadChildren: () => import('./features/rules/module').then(m => m.SqxFeatureRulesModule) + loadChildren: () => import('./features/rules/module').then(m => m.SqxFeatureRulesModule), }, { path: 'settings', - loadChildren: () => import('./features/settings/module').then(m => m.SqxFeatureSettingsModule) + loadChildren: () => import('./features/settings/module').then(m => m.SqxFeatureSettingsModule), }, { path: 'api', - loadChildren: () => import('./features/api/module').then(m => m.SqxFeatureApiModule) - } - ] - } - ] + loadChildren: () => import('./features/api/module').then(m => m.SqxFeatureApiModule), + }, + ], + }, + ], }, { path: 'logout', - component: LogoutPageComponent + component: LogoutPageComponent, }, { path: 'login', - component: LoginPageComponent + component: LoginPageComponent, }, { path: 'forbidden', - component: ForbiddenPageComponent + component: ForbiddenPageComponent, }, { path: '**', - component: NotFoundPageComponent - } + component: NotFoundPageComponent, + }, ]; -export const routing: ModuleWithProviders = RouterModule.forRoot(routes, { useHash: false }); \ No newline at end of file +export const routing: ModuleWithProviders = RouterModule.forRoot(routes, { useHash: false }); diff --git a/frontend/app/app.ts b/frontend/app/app.ts index 99142eea5..8e977734d 100644 --- a/frontend/app/app.ts +++ b/frontend/app/app.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -14,4 +14,4 @@ if (process.env.NODE_ENV === 'production') { enableProdMode(); } -platformBrowserDynamic().bootstrapModule(AppModule); \ No newline at end of file +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/frontend/app/declarations.d.ts b/frontend/app/declarations.d.ts index 5b4b13358..43716dcf2 100644 --- a/frontend/app/declarations.d.ts +++ b/frontend/app/declarations.d.ts @@ -17,4 +17,4 @@ declare module 'sortablejs' { } export function create(element: any, options: any): Ref; -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/administration-area.component.ts b/frontend/app/features/administration/administration-area.component.ts index 194a3a264..bbfc8eb29 100644 --- a/frontend/app/features/administration/administration-area.component.ts +++ b/frontend/app/features/administration/administration-area.component.ts @@ -11,11 +11,11 @@ import { UIState } from '@app/shared'; @Component({ selector: 'sqx-administration-area', styleUrls: ['./administration-area.component.scss'], - templateUrl: './administration-area.component.html' + templateUrl: './administration-area.component.html', }) export class AdministrationAreaComponent { constructor( - public readonly uiState: UIState + public readonly uiState: UIState, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/declarations.ts b/frontend/app/features/administration/declarations.ts index 41eaef0b4..9ab76df1c 100644 --- a/frontend/app/features/administration/declarations.ts +++ b/frontend/app/features/administration/declarations.ts @@ -14,4 +14,4 @@ export * from './pages/event-consumers/event-consumers-page.component'; export * from './pages/restore/restore-page.component'; export * from './pages/users/user-page.component'; export * from './pages/users/user.component'; -export * from './pages/users/users-page.component'; \ No newline at end of file +export * from './pages/users/users-page.component'; diff --git a/frontend/app/features/administration/guards/user-must-exist.guard.spec.ts b/frontend/app/features/administration/guards/user-must-exist.guard.spec.ts index b01b0df17..f0b635398 100644 --- a/frontend/app/features/administration/guards/user-must-exist.guard.spec.ts +++ b/frontend/app/features/administration/guards/user-must-exist.guard.spec.ts @@ -12,7 +12,6 @@ import { IMock, Mock, Times } from 'typemoq'; import { UserMustExistGuard } from './user-must-exist.guard'; describe('UserMustExistGuard', () => { - let usersState: IMock; let router: IMock; let userGuard: UserMustExistGuard; @@ -31,8 +30,8 @@ describe('UserMustExistGuard', () => { const route: any = { params: { - userId: '123' - } + userId: '123', + }, }; userGuard.canActivate(route).subscribe(x => { @@ -52,8 +51,8 @@ describe('UserMustExistGuard', () => { const route: any = { params: { - userId: '123' - } + userId: '123', + }, }; userGuard.canActivate(route).subscribe(x => { @@ -73,8 +72,8 @@ describe('UserMustExistGuard', () => { const route: any = { params: { - userId: undefined - } + userId: undefined, + }, }; userGuard.canActivate(route).subscribe(x => { @@ -94,8 +93,8 @@ describe('UserMustExistGuard', () => { const route: any = { params: { - userId: 'new' - } + userId: 'new', + }, }; userGuard.canActivate(route).subscribe(x => { @@ -106,4 +105,4 @@ describe('UserMustExistGuard', () => { usersState.verify(x => x.select(null), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/features/administration/guards/user-must-exist.guard.ts b/frontend/app/features/administration/guards/user-must-exist.guard.ts index 0939f33ca..127af87b5 100644 --- a/frontend/app/features/administration/guards/user-must-exist.guard.ts +++ b/frontend/app/features/administration/guards/user-must-exist.guard.ts @@ -16,7 +16,7 @@ import { map, tap } from 'rxjs/operators'; export class UserMustExistGuard implements CanActivate { constructor( private readonly usersState: UsersState, - private readonly router: Router + private readonly router: Router, ) { } @@ -38,4 +38,4 @@ export class UserMustExistGuard implements CanActivate { return result; } -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/internal.ts b/frontend/app/features/administration/internal.ts index ac0dd8762..f565cfdf7 100644 --- a/frontend/app/features/administration/internal.ts +++ b/frontend/app/features/administration/internal.ts @@ -9,4 +9,4 @@ export * from './services/event-consumers.service'; export * from './services/users.service'; export * from './state/event-consumers.state'; export * from './state/users.forms'; -export * from './state/users.state'; \ No newline at end of file +export * from './state/users.state'; diff --git a/frontend/app/features/administration/module.ts b/frontend/app/features/administration/module.ts index 071efedc9..07267d162 100644 --- a/frontend/app/features/administration/module.ts +++ b/frontend/app/features/administration/module.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { SqxFrameworkModule, SqxSharedModule } from '@app/shared'; @@ -22,15 +20,15 @@ const routes: Routes = [ children: [ { path: 'event-consumers', - component: EventConsumersPageComponent + component: EventConsumersPageComponent, }, { path: 'cluster', - component: ClusterPageComponent + component: ClusterPageComponent, }, { path: 'restore', - component: RestorePageComponent + component: RestorePageComponent, }, { path: 'users', @@ -39,21 +37,21 @@ const routes: Routes = [ { path: ':userId', component: UserPageComponent, - canActivate: [UserMustExistGuard] - } - ] - } - ] - } - ] - } + canActivate: [UserMustExistGuard], + }, + ], + }, + ], + }, + ], + }, ]; @NgModule({ imports: [ RouterModule.forChild(routes), SqxFrameworkModule, - SqxSharedModule + SqxSharedModule, ], declarations: [ AdministrationAreaComponent, @@ -63,14 +61,14 @@ const routes: Routes = [ RestorePageComponent, UserComponent, UserPageComponent, - UsersPageComponent + UsersPageComponent, ], providers: [ EventConsumersService, EventConsumersState, UserMustExistGuard, UsersService, - UsersState - ] + UsersState, + ], }) -export class SqxFeatureAdministrationModule {} \ No newline at end of file +export class SqxFeatureAdministrationModule {} diff --git a/frontend/app/features/administration/pages/cluster/cluster-page.component.ts b/frontend/app/features/administration/pages/cluster/cluster-page.component.ts index 73cfc022e..f6e5bac2d 100644 --- a/frontend/app/features/administration/pages/cluster/cluster-page.component.ts +++ b/frontend/app/features/administration/pages/cluster/cluster-page.component.ts @@ -10,7 +10,7 @@ import { Component } from '@angular/core'; @Component({ selector: 'sqx-cluster-area', styleUrls: ['./cluster-page.component.scss'], - templateUrl: './cluster-page.component.html' + templateUrl: './cluster-page.component.html', }) export class ClusterPageComponent { -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/pages/event-consumers/event-consumer.component.ts b/frontend/app/features/administration/pages/event-consumers/event-consumer.component.ts index 73178a1e0..e68b024ae 100644 --- a/frontend/app/features/administration/pages/event-consumers/event-consumer.component.ts +++ b/frontend/app/features/administration/pages/event-consumers/event-consumer.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: component-selector - import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { EventConsumerDto, EventConsumersState } from '@app/features/administration/internal'; @@ -14,7 +12,7 @@ import { EventConsumerDto, EventConsumersState } from '@app/features/administrat selector: '[sqxEventConsumer]', styleUrls: ['./event-consumer.component.scss'], templateUrl: './event-consumer.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class EventConsumerComponent { @Output() @@ -24,7 +22,7 @@ export class EventConsumerComponent { public eventConsumer: EventConsumerDto; constructor( - private readonly eventConsumersState: EventConsumersState + private readonly eventConsumersState: EventConsumersState, ) { } @@ -39,4 +37,4 @@ export class EventConsumerComponent { public reset() { this.eventConsumersState.reset(this.eventConsumer); } -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/pages/event-consumers/event-consumers-page.component.ts b/frontend/app/features/administration/pages/event-consumers/event-consumers-page.component.ts index db581d1f1..f0fd8a783 100644 --- a/frontend/app/features/administration/pages/event-consumers/event-consumers-page.component.ts +++ b/frontend/app/features/administration/pages/event-consumers/event-consumers-page.component.ts @@ -14,14 +14,14 @@ import { switchMap } from 'rxjs/operators'; @Component({ selector: 'sqx-event-consumers-page', styleUrls: ['./event-consumers-page.component.scss'], - templateUrl: './event-consumers-page.component.html' + templateUrl: './event-consumers-page.component.html', }) export class EventConsumersPageComponent extends ResourceOwner implements OnInit { public eventConsumerErrorDialog = new DialogModel(); public eventConsumerError?: string; constructor( - public readonly eventConsumersState: EventConsumersState + public readonly eventConsumersState: EventConsumersState, ) { super(); } @@ -44,4 +44,4 @@ export class EventConsumersPageComponent extends ResourceOwner implements OnInit this.eventConsumerError = eventConsumer.error; this.eventConsumerErrorDialog.show(); } -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/pages/restore/restore-page.component.ts b/frontend/app/features/administration/pages/restore/restore-page.component.ts index 4b90fdba0..0333ec034 100644 --- a/frontend/app/features/administration/pages/restore/restore-page.component.ts +++ b/frontend/app/features/administration/pages/restore/restore-page.component.ts @@ -13,7 +13,7 @@ import { timer } from 'rxjs'; @Component({ selector: 'sqx-restore-page', styleUrls: ['./restore-page.component.scss'], - templateUrl: './restore-page.component.html' + templateUrl: './restore-page.component.html', }) export class RestorePageComponent { public restoreForm = new RestoreForm(this.formBuilder); @@ -25,7 +25,7 @@ export class RestorePageComponent { public readonly authState: AuthService, private readonly backupsService: BackupsService, private readonly dialogs: DialogService, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } @@ -43,4 +43,4 @@ export class RestorePageComponent { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/pages/users/user-page.component.ts b/frontend/app/features/administration/pages/users/user-page.component.ts index f638fd444..456d459bd 100644 --- a/frontend/app/features/administration/pages/users/user-page.component.ts +++ b/frontend/app/features/administration/pages/users/user-page.component.ts @@ -14,7 +14,7 @@ import { ResourceOwner } from '@app/shared'; @Component({ selector: 'sqx-user-page', styleUrls: ['./user-page.component.scss'], - templateUrl: './user-page.component.html' + templateUrl: './user-page.component.html', }) export class UserPageComponent extends ResourceOwner implements OnInit { public isEditable = false; @@ -26,7 +26,7 @@ export class UserPageComponent extends ResourceOwner implements OnInit { public readonly usersState: UsersState, private readonly formBuilder: FormBuilder, private readonly route: ActivatedRoute, - private readonly router: Router + private readonly router: Router, ) { super(); } @@ -41,7 +41,7 @@ export class UserPageComponent extends ResourceOwner implements OnInit { const permissions: string[] = []; - this.userForm.load(user || { permissions } ); + this.userForm.load(user || { permissions }); this.userForm.setEnabled(this.isEditable); })); } diff --git a/frontend/app/features/administration/pages/users/user.component.ts b/frontend/app/features/administration/pages/users/user.component.ts index de9779295..7590b2df2 100644 --- a/frontend/app/features/administration/pages/users/user.component.ts +++ b/frontend/app/features/administration/pages/users/user.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: component-selector - import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { UserDto, UsersState } from '@app/features/administration/internal'; @@ -14,14 +12,14 @@ import { UserDto, UsersState } from '@app/features/administration/internal'; selector: '[sqxUser]', styleUrls: ['./user.component.scss'], templateUrl: './user.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class UserComponent { @Input('sqxUser') public user: UserDto; constructor( - private readonly usersState: UsersState + private readonly usersState: UsersState, ) { } @@ -36,4 +34,4 @@ export class UserComponent { public delete() { this.usersState.delete(this.user); } -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/pages/users/users-page.component.ts b/frontend/app/features/administration/pages/users/users-page.component.ts index ffead1698..ae69bcb1a 100644 --- a/frontend/app/features/administration/pages/users/users-page.component.ts +++ b/frontend/app/features/administration/pages/users/users-page.component.ts @@ -15,15 +15,15 @@ import { ResourceOwner, Router2State } from '@app/framework'; styleUrls: ['./users-page.component.scss'], templateUrl: './users-page.component.html', providers: [ - Router2State - ] + Router2State, + ], }) export class UsersPageComponent extends ResourceOwner implements OnInit { public usersFilter = new FormControl(); constructor( public readonly usersRoute: Router2State, - public readonly usersState: UsersState + public readonly usersState: UsersState, ) { super(); @@ -54,4 +54,4 @@ export class UsersPageComponent extends ResourceOwner implements OnInit { public trackByUser(_index: number, user: UserDto) { return user.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/services/event-consumers.service.spec.ts b/frontend/app/features/administration/services/event-consumers.service.spec.ts index 53fa2dbac..e09bc936f 100644 --- a/frontend/app/features/administration/services/event-consumers.service.spec.ts +++ b/frontend/app/features/administration/services/event-consumers.service.spec.ts @@ -14,12 +14,12 @@ describe('EventConsumersService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ EventConsumersService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -29,106 +29,102 @@ describe('EventConsumersService', () => { it('should make get request to get event consumers', inject([EventConsumersService, HttpTestingController], (eventConsumersService: EventConsumersService, httpMock: HttpTestingController) => { + let eventConsumers: EventConsumersDto; - let eventConsumers: EventConsumersDto; + eventConsumersService.getEventConsumers().subscribe(result => { + eventConsumers = result; + }); - eventConsumersService.getEventConsumers().subscribe(result => { - eventConsumers = result; - }); + const req = httpMock.expectOne('http://service/p/api/event-consumers'); - const req = httpMock.expectOne('http://service/p/api/event-consumers'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush({ + items: [ + eventConsumerResponse(12), + eventConsumerResponse(13), + ], + }); - req.flush({ - items: [ - eventConsumerResponse(12), - eventConsumerResponse(13) - ] - }); - - expect(eventConsumers!).toEqual( - new EventConsumersDto([ - createEventConsumer(12), - createEventConsumer(13) - ])); - })); + expect(eventConsumers!).toEqual( + new EventConsumersDto([ + createEventConsumer(12), + createEventConsumer(13), + ])); + })); it('should make put request to start event consumer', inject([EventConsumersService, HttpTestingController], (eventConsumersService: EventConsumersService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + start: { method: 'PUT', href: 'api/event-consumers/event-consumer123/start' }, + }, + }; - const resource: Resource = { - _links: { - start: { method: 'PUT', href: 'api/event-consumers/event-consumer123/start' } - } - }; + let eventConsumer: EventConsumerDto; - let eventConsumer: EventConsumerDto; + eventConsumersService.putStart(resource).subscribe(response => { + eventConsumer = response; + }); - eventConsumersService.putStart(resource).subscribe(response => { - eventConsumer = response; - }); + const req = httpMock.expectOne('http://service/p/api/event-consumers/event-consumer123/start'); - const req = httpMock.expectOne('http://service/p/api/event-consumers/event-consumer123/start'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(eventConsumerResponse(123)); - req.flush(eventConsumerResponse(123)); - - expect(eventConsumer!).toEqual(createEventConsumer(123)); - })); + expect(eventConsumer!).toEqual(createEventConsumer(123)); + })); it('should make put request to stop event consumer', inject([EventConsumersService, HttpTestingController], (eventConsumersService: EventConsumersService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + stop: { method: 'PUT', href: 'api/event-consumers/event-consumer123/stop' }, + }, + }; - const resource: Resource = { - _links: { - stop: { method: 'PUT', href: 'api/event-consumers/event-consumer123/stop' } - } - }; + let eventConsumer: EventConsumerDto; - let eventConsumer: EventConsumerDto; + eventConsumersService.putStop(resource).subscribe(response => { + eventConsumer = response; + }); - eventConsumersService.putStop(resource).subscribe(response => { - eventConsumer = response; - }); + const req = httpMock.expectOne('http://service/p/api/event-consumers/event-consumer123/stop'); - const req = httpMock.expectOne('http://service/p/api/event-consumers/event-consumer123/stop'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(eventConsumerResponse(12)); - req.flush(eventConsumerResponse(12)); - - expect(eventConsumer!).toEqual(createEventConsumer(12)); - })); + expect(eventConsumer!).toEqual(createEventConsumer(12)); + })); it('should make put request to reset event consumer', inject([EventConsumersService, HttpTestingController], (eventConsumersService: EventConsumersService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + reset: { method: 'PUT', href: 'api/event-consumers/event-consumer123/reset' }, + }, + }; - const resource: Resource = { - _links: { - reset: { method: 'PUT', href: 'api/event-consumers/event-consumer123/reset' } - } - }; + let eventConsumer: EventConsumerDto; - let eventConsumer: EventConsumerDto; + eventConsumersService.putReset(resource).subscribe(response => { + eventConsumer = response; + }); - eventConsumersService.putReset(resource).subscribe(response => { - eventConsumer = response; - }); + const req = httpMock.expectOne('http://service/p/api/event-consumers/event-consumer123/reset'); - const req = httpMock.expectOne('http://service/p/api/event-consumers/event-consumer123/reset'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(eventConsumerResponse(12)); - req.flush(eventConsumerResponse(12)); - - expect(eventConsumer!).toEqual(createEventConsumer(12)); - })); + expect(eventConsumer!).toEqual(createEventConsumer(12)); + })); function eventConsumerResponse(id: number, suffix = '') { const key = `${id}${suffix}`; @@ -141,15 +137,15 @@ describe('EventConsumersService', () => { isResetting: true, error: `failure${key}`, _links: { - reset: { method: 'PUT', href: `/event-consumers/${id}/reset` } - } + reset: { method: 'PUT', href: `/event-consumers/${id}/reset` }, + }, }; } }); export function createEventConsumer(id: number, suffix = '') { const links: ResourceLinks = { - reset: { method: 'PUT', href: `/event-consumers/${id}/reset` } + reset: { method: 'PUT', href: `/event-consumers/${id}/reset` }, }; const key = `${id}${suffix}`; @@ -161,4 +157,4 @@ export function createEventConsumer(id: number, suffix = '') { true, `failure${key}`, `position${key}`); -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/services/event-consumers.service.ts b/frontend/app/features/administration/services/event-consumers.service.ts index de78b8efa..0fd448640 100644 --- a/frontend/app/features/administration/services/event-consumers.service.ts +++ b/frontend/app/features/administration/services/event-consumers.service.ts @@ -15,7 +15,7 @@ export class EventConsumersDto { public readonly _links: ResourceLinks; constructor( - public readonly items: ReadonlyArray, links?: ResourceLinks + public readonly items: ReadonlyArray, links?: ResourceLinks, ) { this._links = links || {}; } @@ -34,7 +34,7 @@ export class EventConsumerDto { public readonly isStopped?: boolean, public readonly isResetting?: boolean, public readonly error?: string, - public readonly position?: string + public readonly position?: string, ) { this._links = links; @@ -48,7 +48,7 @@ export class EventConsumerDto { export class EventConsumersService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } diff --git a/frontend/app/features/administration/services/users.service.spec.ts b/frontend/app/features/administration/services/users.service.spec.ts index 818baffc6..963f91ae3 100644 --- a/frontend/app/features/administration/services/users.service.spec.ts +++ b/frontend/app/features/administration/services/users.service.spec.ts @@ -11,15 +11,15 @@ import { ApiUrlConfig, Resource, ResourceLinks } from '@app/framework'; import { UserDto, UsersDto, UsersService } from './users.service'; describe('UsersService', () => { - beforeEach(() => { + beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ UsersService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -29,197 +29,189 @@ describe('UsersService', () => { it('should make get request to get many users', inject([UsersService, HttpTestingController], (userManagementService: UsersService, httpMock: HttpTestingController) => { + let users: UsersDto; - let users: UsersDto; + userManagementService.getUsers(20, 30).subscribe(result => { + users = result; + }); - userManagementService.getUsers(20, 30).subscribe(result => { - users = result; - }); + const req = httpMock.expectOne('http://service/p/api/user-management?take=20&skip=30&query='); - const req = httpMock.expectOne('http://service/p/api/user-management?take=20&skip=30&query='); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush({ + total: 100, + items: [ + userResponse(12), + userResponse(13), + ], + }); - req.flush({ - total: 100, - items: [ - userResponse(12), - userResponse(13) - ] - }); - - expect(users!).toEqual( - new UsersDto(100, [ - createUser(12), - createUser(13) - ])); - })); + expect(users!).toEqual( + new UsersDto(100, [ + createUser(12), + createUser(13), + ])); + })); it('should make get request with query to get many users', inject([UsersService, HttpTestingController], (userManagementService: UsersService, httpMock: HttpTestingController) => { + let users: UsersDto; - let users: UsersDto; + userManagementService.getUsers(20, 30, 'my-query').subscribe(result => { + users = result; + }); - userManagementService.getUsers(20, 30, 'my-query').subscribe(result => { - users = result; - }); - - const req = httpMock.expectOne('http://service/p/api/user-management?take=20&skip=30&query=my-query'); + const req = httpMock.expectOne('http://service/p/api/user-management?take=20&skip=30&query=my-query'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ - total: 100, - items: [ - userResponse(12), - userResponse(13) - ] - }); + req.flush({ + total: 100, + items: [ + userResponse(12), + userResponse(13), + ], + }); - expect(users!).toEqual( - new UsersDto(100, [ - createUser(12), - createUser(13) - ])); - })); + expect(users!).toEqual( + new UsersDto(100, [ + createUser(12), + createUser(13), + ])); + })); it('should make get request to get single user', inject([UsersService, HttpTestingController], (userManagementService: UsersService, httpMock: HttpTestingController) => { + let user: UserDto; - let user: UserDto; + userManagementService.getUser('123').subscribe(result => { + user = result; + }); - userManagementService.getUser('123').subscribe(result => { - user = result; - }); - - const req = httpMock.expectOne('http://service/p/api/user-management/123'); + const req = httpMock.expectOne('http://service/p/api/user-management/123'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(userResponse(12)); + req.flush(userResponse(12)); - expect(user!).toEqual(createUser(12)); - })); + expect(user!).toEqual(createUser(12)); + })); it('should make post request to create user', inject([UsersService, HttpTestingController], (userManagementService: UsersService, httpMock: HttpTestingController) => { + const dto = { email: 'mail@squidex.io', displayName: 'Squidex User', permissions: ['Permission1'], password: 'password' }; - const dto = { email: 'mail@squidex.io', displayName: 'Squidex User', permissions: ['Permission1'], password: 'password' }; - - let user: UserDto; + let user: UserDto; - userManagementService.postUser(dto).subscribe(result => { - user = result; - }); + userManagementService.postUser(dto).subscribe(result => { + user = result; + }); - const req = httpMock.expectOne('http://service/p/api/user-management'); + const req = httpMock.expectOne('http://service/p/api/user-management'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(userResponse(12)); + req.flush(userResponse(12)); - expect(user!).toEqual(createUser(12)); - })); + expect(user!).toEqual(createUser(12)); + })); it('should make put request to update user', inject([UsersService, HttpTestingController], (userManagementService: UsersService, httpMock: HttpTestingController) => { + const dto = { email: 'mail@squidex.io', displayName: 'Squidex User', permissions: ['Permission1'], password: 'password' }; - const dto = { email: 'mail@squidex.io', displayName: 'Squidex User', permissions: ['Permission1'], password: 'password' }; - - const resource: Resource = { - _links: { - update: { method: 'PUT', href: 'api/user-management/123' } - } - }; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: 'api/user-management/123' }, + }, + }; - let user: UserDto; + let user: UserDto; - userManagementService.putUser(resource, dto).subscribe(result => { - user = result; - }); + userManagementService.putUser(resource, dto).subscribe(result => { + user = result; + }); - const req = httpMock.expectOne('http://service/p/api/user-management/123'); + const req = httpMock.expectOne('http://service/p/api/user-management/123'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(userResponse(12)); + req.flush(userResponse(12)); - expect(user!).toEqual(createUser(12)); - })); + expect(user!).toEqual(createUser(12)); + })); it('should make put request to lock user', inject([UsersService, HttpTestingController], (userManagementService: UsersService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + lock: { method: 'PUT', href: 'api/user-management/123/lock' }, + }, + }; - const resource: Resource = { - _links: { - lock: { method: 'PUT', href: 'api/user-management/123/lock' } - } - }; + let user: UserDto; - let user: UserDto; + userManagementService.lockUser(resource).subscribe(result => { + user = result; + }); - userManagementService.lockUser(resource).subscribe(result => { - user = result; - }); - - const req = httpMock.expectOne('http://service/p/api/user-management/123/lock'); + const req = httpMock.expectOne('http://service/p/api/user-management/123/lock'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(userResponse(12)); + req.flush(userResponse(12)); - expect(user!).toEqual(createUser(12)); - })); + expect(user!).toEqual(createUser(12)); + })); it('should make put request to unlock user', inject([UsersService, HttpTestingController], (userManagementService: UsersService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + unlock: { method: 'PUT', href: 'api/user-management/123/unlock' }, + }, + }; - const resource: Resource = { - _links: { - unlock: { method: 'PUT', href: 'api/user-management/123/unlock' } - } - }; - - let user: UserDto; + let user: UserDto; - userManagementService.unlockUser(resource).subscribe(result => { - user = result; - }); + userManagementService.unlockUser(resource).subscribe(result => { + user = result; + }); - const req = httpMock.expectOne('http://service/p/api/user-management/123/unlock'); + const req = httpMock.expectOne('http://service/p/api/user-management/123/unlock'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(userResponse(12)); + req.flush(userResponse(12)); - expect(user!).toEqual(createUser(12)); - })); + expect(user!).toEqual(createUser(12)); + })); it('should make delete request to delete user', inject([UsersService, HttpTestingController], (userManagementService: UsersService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: 'api/user-management/123' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: 'api/user-management/123' } - } - }; + userManagementService.deleteUser(resource).subscribe(); - userManagementService.deleteUser(resource).subscribe(); + const req = httpMock.expectOne('http://service/p/api/user-management/123'); - const req = httpMock.expectOne('http://service/p/api/user-management/123'); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({}); - })); + req.flush({}); + })); function userResponse(id: number, suffix = '') { const key = `${id}${suffix}`; @@ -229,21 +221,21 @@ describe('UsersService', () => { email: `user${key}@domain.com`, displayName: `user${key}`, permissions: [ - `Permission${key}` + `Permission${key}`, ], isLocked: true, _links: { update: { - method: 'PUT', href: `/users/${id}` - } - } + method: 'PUT', href: `/users/${id}`, + }, + }, }; } }); export function createUser(id: number, suffix = '') { const links: ResourceLinks = { - update: { method: 'PUT', href: `/users/${id}` } + update: { method: 'PUT', href: `/users/${id}` }, }; const key = `${id}${suffix}`; @@ -253,7 +245,7 @@ export function createUser(id: number, suffix = '') { `user${key}@domain.com`, `user${key}`, [ - `Permission${key}` + `Permission${key}`, ], true); -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/services/users.service.ts b/frontend/app/features/administration/services/users.service.ts index 0d91a5033..b4d70ceb0 100644 --- a/frontend/app/features/administration/services/users.service.ts +++ b/frontend/app/features/administration/services/users.service.ts @@ -30,7 +30,7 @@ export class UserDto { public readonly email: string, public readonly displayName: string, public readonly permissions: ReadonlyArray = [], - public readonly isLocked?: boolean + public readonly isLocked?: boolean, ) { this._links = links; @@ -44,7 +44,7 @@ export class UserDto { type Permissions = readonly string[]; export type CreateUserDto = - Readonly<{ email: string, displayName: string, permissions: Permissions, password: string }>; + Readonly<{ email: string; displayName: string; permissions: Permissions; password: string }>; export type UpdateUserDto = Partial; @@ -53,14 +53,14 @@ export type UpdateUserDto = export class UsersService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } public getUsers(take: number, skip: number, query?: string): Observable { const url = this.apiUrl.buildUrl(`api/user-management?take=${take}&skip=${skip}&query=${query || ''}`); - return this.http.get<{ total: number, items: any[] } & Resource>(url).pipe( + return this.http.get<{ total: number; items: any[] } & Resource>(url).pipe( map(({ total, items, _links }) => { const users = items.map(parseUser); @@ -143,4 +143,4 @@ function parseUser(response: any) { response.displayName, response.permissions, response.isLocked); -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/state/event-consumers.state.spec.ts b/frontend/app/features/administration/state/event-consumers.state.spec.ts index edb7f17cb..3e51672a0 100644 --- a/frontend/app/features/administration/state/event-consumers.state.spec.ts +++ b/frontend/app/features/administration/state/event-consumers.state.spec.ts @@ -119,4 +119,4 @@ describe('EventConsumersState', () => { expect(eventConsumersState.snapshot.eventConsumers).toEqual([eventConsumer1, updated]); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/features/administration/state/event-consumers.state.ts b/frontend/app/features/administration/state/event-consumers.state.ts index 4d975b6ac..e6e743cc3 100644 --- a/frontend/app/features/administration/state/event-consumers.state.ts +++ b/frontend/app/features/administration/state/event-consumers.state.ts @@ -37,7 +37,7 @@ export class EventConsumersState extends State { constructor( private readonly dialogs: DialogService, - private readonly eventConsumersService: EventConsumersService + private readonly eventConsumersService: EventConsumersService, ) { super({ eventConsumers: [] }, 'EventConsumers'); } @@ -64,7 +64,7 @@ export class EventConsumersState extends State { this.next({ eventConsumers, isLoaded: true, - isLoading: false + isLoading: false, }, 'Loading Success'); }), finalize(() => { @@ -104,4 +104,4 @@ export class EventConsumersState extends State { return { ...s, eventConsumers }; }, 'Updated'); } -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/state/users.forms.ts b/frontend/app/features/administration/state/users.forms.ts index 1029aa6f3..b104c7d0d 100644 --- a/frontend/app/features/administration/state/users.forms.ts +++ b/frontend/app/features/administration/state/users.forms.ts @@ -11,33 +11,33 @@ import { UpdateUserDto, UserDto } from './../services/users.service'; export class UserForm extends Form { constructor( - formBuilder: FormBuilder + formBuilder: FormBuilder, ) { super(formBuilder.group({ email: ['', [ Validators.email, Validators.required, - Validators.maxLength(100) - ] + Validators.maxLength(100), + ], ], displayName: ['', [ Validators.required, - Validators.maxLength(100) - ] + Validators.maxLength(100), + ], ], password: ['', [ - Validators.required - ] + Validators.required, + ], ], passwordConfirm: ['', [ - ValidatorsEx.match('password', 'i18n:users.passwordConfirmValidationMessage') - ] + ValidatorsEx.match('password', 'i18n:users.passwordConfirmValidationMessage'), + ], ], - permissions: [''] + permissions: [''], })); } @@ -62,4 +62,4 @@ export class UserForm extends Form { return { ...value, permissions }; } -} \ No newline at end of file +} diff --git a/frontend/app/features/administration/state/users.state.spec.ts b/frontend/app/features/administration/state/users.state.spec.ts index 1e0af9c99..7b04eb13f 100644 --- a/frontend/app/features/administration/state/users.state.spec.ts +++ b/frontend/app/features/administration/state/users.state.spec.ts @@ -234,7 +234,7 @@ describe('UsersState', () => { it('should update selected user if reloaded', () => { const newUsers = [ createUser(1, '_new'), - createUser(2, '_new') + createUser(2, '_new'), ]; usersService.setup(x => x.getUsers(10, 0, undefined)) @@ -267,4 +267,4 @@ describe('UsersState', () => { expect(usersState.snapshot.selectedUser).toBeNull(); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/features/administration/state/users.state.ts b/frontend/app/features/administration/state/users.state.ts index ea5fd2112..7229ac8a6 100644 --- a/frontend/app/features/administration/state/users.state.ts +++ b/frontend/app/features/administration/state/users.state.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable object-curly-newline */ + import { Injectable } from '@angular/core'; import '@app/framework/utils/rxjs-extensions'; import { DialogService, getPagingInfo, ListState, shareSubscribed, State } from '@app/shared'; @@ -24,7 +26,7 @@ interface Snapshot extends ListState { } export type UsersList = ReadonlyArray; -export type UsersResult = { total: number, users: UsersList }; +export type UsersResult = { total: number; users: UsersList }; @Injectable() export class UsersState extends State { @@ -51,13 +53,13 @@ export class UsersState extends State { constructor( private readonly dialogs: DialogService, - private readonly usersService: UsersService + private readonly usersService: UsersService, ) { super({ users: [], page: 0, pageSize: 10, - total: 0 + total: 0, }, 'Users'); } @@ -119,7 +121,7 @@ export class UsersState extends State { isLoaded: true, isLoading: false, selectedUser, - total + total, }; }, 'Loading Success'); }), @@ -190,7 +192,7 @@ export class UsersState extends State { return this.loadInternal(false); } - public page(paging: { page: number, pageSize: number }) { + public page(paging: { page: number; pageSize: number }) { if (!this.next(paging, 'Loading Paged')) { return EMPTY; } @@ -200,7 +202,7 @@ export class UsersState extends State { private replaceUser(user: UserDto) { return this.next(s => { - const users = s.users.map(u => u.id === user.id ? user : u); + const users = s.users.map(u => (u.id === user.id ? user : u)); const selectedUser = s.selectedUser?.id !== user.id ? @@ -210,4 +212,4 @@ export class UsersState extends State { return { ...s, users, selectedUser }; }, 'Updated'); } -} \ No newline at end of file +} diff --git a/frontend/app/features/api/api-area.component.ts b/frontend/app/features/api/api-area.component.ts index 5e16f5fde..324d236b8 100644 --- a/frontend/app/features/api/api-area.component.ts +++ b/frontend/app/features/api/api-area.component.ts @@ -11,11 +11,11 @@ import { AppsState } from '@app/shared'; @Component({ selector: 'sqx-api-area', styleUrls: ['./api-area.component.scss'], - templateUrl: './api-area.component.html' + templateUrl: './api-area.component.html', }) export class ApiAreaComponent { constructor( - public readonly appsState: AppsState + public readonly appsState: AppsState, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/features/api/index.ts b/frontend/app/features/api/index.ts index da0f82225..898be9a7c 100644 --- a/frontend/app/features/api/index.ts +++ b/frontend/app/features/api/index.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/features/api/module.ts b/frontend/app/features/api/module.ts index c09ad4f7a..2e51133af 100644 --- a/frontend/app/features/api/module.ts +++ b/frontend/app/features/api/module.ts @@ -16,25 +16,25 @@ const routes: Routes = [ component: ApiAreaComponent, children: [ { - path: '' + path: '', }, { path: 'graphql', - component: GraphQLPageComponent - } - ] - } + component: GraphQLPageComponent, + }, + ], + }, ]; @NgModule({ imports: [ RouterModule.forChild(routes), SqxFrameworkModule, - SqxSharedModule + SqxSharedModule, ], declarations: [ ApiAreaComponent, - GraphQLPageComponent - ] + GraphQLPageComponent, + ], }) -export class SqxFeatureApiModule {} \ No newline at end of file +export class SqxFeatureApiModule {} diff --git a/frontend/app/features/api/pages/graphql/graphql-page.component.ts b/frontend/app/features/api/pages/graphql/graphql-page.component.ts index e4327e287..ef4ef8f7c 100644 --- a/frontend/app/features/api/pages/graphql/graphql-page.component.ts +++ b/frontend/app/features/api/pages/graphql/graphql-page.component.ts @@ -16,7 +16,7 @@ import { catchError } from 'rxjs/operators'; @Component({ selector: 'sqx-graphql-page', styleUrls: ['./graphql-page.component.scss'], - templateUrl: './graphql-page.component.html' + templateUrl: './graphql-page.component.html', }) export class GraphQLPageComponent implements AfterViewInit { @ViewChild('graphiQLContainer', { static: false }) @@ -24,7 +24,7 @@ export class GraphQLPageComponent implements AfterViewInit { constructor( private readonly appsState: AppsState, - private readonly graphQlService: GraphQlService + private readonly graphQlService: GraphQlService, ) { } @@ -33,9 +33,9 @@ export class GraphQLPageComponent implements AfterViewInit { React.createElement(GraphiQL, { fetcher: (params: any) => { return this.request(params); - } + }, }), - this.graphiQLContainer.nativeElement + this.graphiQLContainer.nativeElement, ); } @@ -44,4 +44,4 @@ export class GraphQLPageComponent implements AfterViewInit { catchError(response => of(response.error))) .toPromise(); } -} \ No newline at end of file +} diff --git a/frontend/app/features/apps/index.ts b/frontend/app/features/apps/index.ts index da0f82225..898be9a7c 100644 --- a/frontend/app/features/apps/index.ts +++ b/frontend/app/features/apps/index.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/features/apps/module.ts b/frontend/app/features/apps/module.ts index 4d4f9631f..952dd53ea 100644 --- a/frontend/app/features/apps/module.ts +++ b/frontend/app/features/apps/module.ts @@ -13,21 +13,21 @@ import { AppComponent, AppsPageComponent, NewsDialogComponent, OnboardingDialogC const routes: Routes = [ { path: '', - component: AppsPageComponent - } + component: AppsPageComponent, + }, ]; @NgModule({ imports: [ RouterModule.forChild(routes), SqxFrameworkModule, - SqxSharedModule + SqxSharedModule, ], declarations: [ AppComponent, AppsPageComponent, NewsDialogComponent, - OnboardingDialogComponent - ] + OnboardingDialogComponent, + ], }) -export class SqxFeatureAppsModule {} \ No newline at end of file +export class SqxFeatureAppsModule {} diff --git a/frontend/app/features/apps/pages/app.component.ts b/frontend/app/features/apps/pages/app.component.ts index d47129aec..3c1badff3 100644 --- a/frontend/app/features/apps/pages/app.component.ts +++ b/frontend/app/features/apps/pages/app.component.ts @@ -13,9 +13,9 @@ import { AppDto, fadeAnimation, ModalModel } from '@app/shared'; styleUrls: ['./app.component.scss'], templateUrl: './app.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppComponent { @Input() @@ -25,4 +25,4 @@ export class AppComponent { public leave = new EventEmitter(); public dropdown = new ModalModel(); -} \ No newline at end of file +} diff --git a/frontend/app/features/apps/pages/apps-page.component.ts b/frontend/app/features/apps/pages/apps-page.component.ts index d50f05459..5ffa7bd84 100644 --- a/frontend/app/features/apps/pages/apps-page.component.ts +++ b/frontend/app/features/apps/pages/apps-page.component.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -13,7 +13,7 @@ import { take } from 'rxjs/operators'; @Component({ selector: 'sqx-apps-page', styleUrls: ['./apps-page.component.scss'], - templateUrl: './apps-page.component.html' + templateUrl: './apps-page.component.html', }) export class AppsPageComponent implements OnInit { public addAppDialog = new DialogModel(); @@ -33,7 +33,7 @@ export class AppsPageComponent implements OnInit { private readonly localStore: LocalStoreService, private readonly newsService: NewsService, private readonly onboardingService: OnboardingService, - private readonly uiOptions: UIOptions + private readonly uiOptions: UIOptions, ) { if (uiOptions.get('showInfo')) { this.info = uiOptions.get('more.info'); @@ -78,4 +78,4 @@ export class AppsPageComponent implements OnInit { public trackByApp(_index: number, app: AppDto) { return app.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/apps/pages/news-dialog.component.ts b/frontend/app/features/apps/pages/news-dialog.component.ts index bbb796bad..43f8e2e8b 100644 --- a/frontend/app/features/apps/pages/news-dialog.component.ts +++ b/frontend/app/features/apps/pages/news-dialog.component.ts @@ -11,7 +11,7 @@ import { FeatureDto } from '@app/shared'; @Component({ selector: 'sqx-news-dialog', styleUrls: ['./news-dialog.component.scss'], - templateUrl: './news-dialog.component.html' + templateUrl: './news-dialog.component.html', }) export class NewsDialogComponent { @Output() @@ -23,4 +23,4 @@ export class NewsDialogComponent { public trackByFeature(_index: number, feature: FeatureDto) { return feature; } -} \ No newline at end of file +} diff --git a/frontend/app/features/apps/pages/onboarding-dialog.component.ts b/frontend/app/features/apps/pages/onboarding-dialog.component.ts index 9a7098202..b11a4b96d 100644 --- a/frontend/app/features/apps/pages/onboarding-dialog.component.ts +++ b/frontend/app/features/apps/pages/onboarding-dialog.component.ts @@ -13,8 +13,8 @@ import { fadeAnimation, slideAnimation } from '@app/framework'; styleUrls: ['./onboarding-dialog.component.scss'], templateUrl: './onboarding-dialog.component.html', animations: [ - fadeAnimation, slideAnimation - ] + fadeAnimation, slideAnimation, + ], }) export class OnboardingDialogComponent { public step = 0; @@ -25,4 +25,4 @@ export class OnboardingDialogComponent { public next() { this.step += 1; } -} \ No newline at end of file +} diff --git a/frontend/app/features/assets/index.ts b/frontend/app/features/assets/index.ts index da0f82225..898be9a7c 100644 --- a/frontend/app/features/assets/index.ts +++ b/frontend/app/features/assets/index.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/features/assets/module.ts b/frontend/app/features/assets/module.ts index 68175d0be..3c8cffed3 100644 --- a/frontend/app/features/assets/module.ts +++ b/frontend/app/features/assets/module.ts @@ -17,22 +17,22 @@ const routes: Routes = [ children: [ { path: 'filters', - component: AssetsFiltersPageComponent - } - ] - } + component: AssetsFiltersPageComponent, + }, + ], + }, ]; @NgModule({ imports: [ RouterModule.forChild(routes), SqxFrameworkModule, - SqxSharedModule + SqxSharedModule, ], declarations: [ AssetsFiltersPageComponent, AssetsPageComponent, - AssetTagsComponent - ] + AssetTagsComponent, + ], }) -export class SqxFeatureAssetsModule {} \ No newline at end of file +export class SqxFeatureAssetsModule {} diff --git a/frontend/app/features/assets/pages/asset-tags.component.ts b/frontend/app/features/assets/pages/asset-tags.component.ts index bf4960203..34a5abf1b 100644 --- a/frontend/app/features/assets/pages/asset-tags.component.ts +++ b/frontend/app/features/assets/pages/asset-tags.component.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */ + import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { TagItem, TagsSelected } from '@app/shared'; @@ -12,7 +14,7 @@ import { TagItem, TagsSelected } from '@app/shared'; selector: 'sqx-asset-tags', styleUrls: ['./asset-tags.component.scss'], templateUrl: './asset-tags.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetTagsComponent { @Output() @@ -38,4 +40,4 @@ export class AssetTagsComponent { public trackByTag(_index: number, tag: TagItem) { return tag.name; } -} \ No newline at end of file +} diff --git a/frontend/app/features/assets/pages/assets-filters-page.component.ts b/frontend/app/features/assets/pages/assets-filters-page.component.ts index 4474ed255..3e45ae77c 100644 --- a/frontend/app/features/assets/pages/assets-filters-page.component.ts +++ b/frontend/app/features/assets/pages/assets-filters-page.component.ts @@ -11,13 +11,13 @@ import { AssetsState, Queries, Query, UIState } from '@app/shared'; @Component({ selector: 'sqx-assets-filters-page', styleUrls: ['./assets-filters-page.component.scss'], - templateUrl: './assets-filters-page.component.html' + templateUrl: './assets-filters-page.component.html', }) export class AssetsFiltersPageComponent { public assetsQueries: Queries; constructor(uiState: UIState, - public readonly assetsState: AssetsState + public readonly assetsState: AssetsState, ) { this.assetsQueries = new Queries(uiState, 'assets'); } @@ -41,4 +41,4 @@ export class AssetsFiltersPageComponent { public trackByTag(_index: number, tag: { name: string }) { return tag.name; } -} \ No newline at end of file +} diff --git a/frontend/app/features/assets/pages/assets-page.component.ts b/frontend/app/features/assets/pages/assets-page.component.ts index 3cf4f5b76..7f99ee6cd 100644 --- a/frontend/app/features/assets/pages/assets-page.component.ts +++ b/frontend/app/features/assets/pages/assets-page.component.ts @@ -14,8 +14,8 @@ import { Settings } from '@app/shared/state/settings'; styleUrls: ['./assets-page.component.scss'], templateUrl: './assets-page.component.html', providers: [ - Router2State - ] + Router2State, + ], }) export class AssetsPageComponent extends ResourceOwner implements OnInit { public queries = new Queries(this.uiState, 'assets'); @@ -28,7 +28,7 @@ export class AssetsPageComponent extends ResourceOwner implements OnInit { public readonly assetsRoute: Router2State, public readonly assetsState: AssetsState, private readonly localStore: LocalStoreService, - private readonly uiState: UIState + private readonly uiState: UIState, ) { super(); @@ -69,4 +69,4 @@ export class AssetsPageComponent extends ResourceOwner implements OnInit { this.localStore.setBoolean(Settings.Local.ASSETS_MODE, isListView); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/index.ts b/frontend/app/features/content/index.ts index da0f82225..898be9a7c 100644 --- a/frontend/app/features/content/index.ts +++ b/frontend/app/features/content/index.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/features/content/module.ts b/frontend/app/features/content/module.ts index 9c1f71601..602b9d7aa 100644 --- a/frontend/app/features/content/module.ts +++ b/frontend/app/features/content/module.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { CanDeactivateGuard, ContentMustExistGuard, LoadLanguagesGuard, LoadSchemasGuard, SchemaMustExistPublishedGuard, SchemaMustNotBeSingletonGuard, SqxFrameworkModule, SqxSharedModule } from '@app/shared'; @@ -19,7 +17,7 @@ const routes: Routes = [ canActivate: [LoadLanguagesGuard, LoadSchemasGuard], children: [ { - path: '' + path: '', }, { path: ':schemaName', @@ -33,19 +31,19 @@ const routes: Routes = [ children: [ { path: 'filters', - component: ContentsFiltersPageComponent + component: ContentsFiltersPageComponent, }, { - path: 'sidebar', - component: SidebarPageComponent - } - ] + path: 'sidebar', + component: SidebarPageComponent, + }, + ], }, { path: 'new', component: ContentPageComponent, canActivate: [SchemaMustNotBeSingletonGuard, ContentMustExistGuard], - canDeactivate: [CanDeactivateGuard] + canDeactivate: [CanDeactivateGuard], }, { path: ':contentId', @@ -53,33 +51,33 @@ const routes: Routes = [ canActivate: [ContentMustExistGuard], canDeactivate: [CanDeactivateGuard], children: [ - { + { path: 'history', component: ContentHistoryPageComponent, data: { - channel: 'contents.{contentId}' - } + channel: 'contents.{contentId}', + }, }, { - path: 'comments', - component: CommentsPageComponent + path: 'comments', + component: CommentsPageComponent, }, { - path: 'sidebar', - component: SidebarPageComponent - } - ] - } - ] - }] - } + path: 'sidebar', + component: SidebarPageComponent, + }, + ], + }, + ], + }], + }, ]; @NgModule({ imports: [ RouterModule.forChild(routes), SqxFrameworkModule, - SqxSharedModule + SqxSharedModule, ], declarations: [ ArrayEditorComponent, @@ -120,7 +118,7 @@ const routes: Routes = [ ReferencesEditorComponent, SchemasPageComponent, SidebarPageComponent, - StockPhotoEditorComponent - ] + StockPhotoEditorComponent, + ], }) -export class SqxFeatureContentModule {} \ No newline at end of file +export class SqxFeatureContentModule {} diff --git a/frontend/app/features/content/pages/comments/comments-page.component.ts b/frontend/app/features/content/pages/comments/comments-page.component.ts index 5a31bf70d..750f6c2b9 100644 --- a/frontend/app/features/content/pages/comments/comments-page.component.ts +++ b/frontend/app/features/content/pages/comments/comments-page.component.ts @@ -12,13 +12,13 @@ import { map } from 'rxjs/operators'; @Component({ selector: 'sqx-comments-page', styleUrls: ['./comments-page.component.scss'], - templateUrl: './comments-page.component.html' + templateUrl: './comments-page.component.html', }) export class CommentsPageComponent { public commentsId = this.route.parent!.params.pipe(map(x => x['contentId'])); constructor( - private readonly route: ActivatedRoute + private readonly route: ActivatedRoute, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/content/content-event.component.ts b/frontend/app/features/content/pages/content/content-event.component.ts index d9d9e82f9..bbd2be611 100644 --- a/frontend/app/features/content/pages/content/content-event.component.ts +++ b/frontend/app/features/content/pages/content/content-event.component.ts @@ -12,7 +12,7 @@ import { ContentDto, HistoryEventDto } from '@app/shared'; selector: 'sqx-content-event', styleUrls: ['./content-event.component.scss'], templateUrl: './content-event.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentEventComponent implements OnChanges { @Output() @@ -35,4 +35,4 @@ export class ContentEventComponent implements OnChanges { this.event.eventType === 'ContentCreatedEventV2') && !this.event.version.eq(this.content.version); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/content/content-history-page.component.ts b/frontend/app/features/content/pages/content/content-history-page.component.ts index f42708ee3..e1efb1729 100644 --- a/frontend/app/features/content/pages/content/content-history-page.component.ts +++ b/frontend/app/features/content/pages/content/content-history-page.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: triple-equals - import { Component, OnInit, ViewChild } from '@angular/core'; import { AppsState, ContentDto, ContentsState, defined, fadeAnimation, HistoryEventDto, HistoryService, ModalModel, ResourceOwner, SchemasState, switchSafe } from '@app/shared'; import { Observable, timer } from 'rxjs'; @@ -19,8 +17,8 @@ import { ContentPageComponent } from './content-page.component'; styleUrls: ['./content-history-page.component.scss'], templateUrl: './content-history-page.component.html', animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class ContentHistoryPageComponent extends ResourceOwner implements OnInit { @ViewChild('dueTimeSelector', { static: false }) @@ -41,7 +39,7 @@ export class ContentHistoryPageComponent extends ResourceOwner implements OnInit private readonly contentPage: ContentPageComponent, private readonly contentsState: ContentsState, private readonly historyService: HistoryService, - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { super(); } @@ -95,4 +93,4 @@ export class ContentHistoryPageComponent extends ResourceOwner implements OnInit public trackByEvent(_index: number, event: HistoryEventDto) { return event.eventId; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/content/content-page.component.ts b/frontend/app/features/content/pages/content/content-page.component.ts index 9c8b1e4ac..9ed0631a5 100644 --- a/frontend/app/features/content/pages/content/content-page.component.ts +++ b/frontend/app/features/content/pages/content/content-page.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { Component, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { ApiUrlConfig, AppLanguageDto, AppsState, AuthService, AutoSaveKey, AutoSaveService, CanComponentDeactivate, ContentDto, ContentsState, defined, DialogService, EditContentForm, fadeAnimation, LanguagesState, ModalModel, ResourceOwner, SchemaDto, SchemasState, TempService, Version } from '@app/shared'; @@ -19,8 +17,8 @@ import { ContentReferencesComponent } from './references/content-references.comp styleUrls: ['./content-page.component.scss'], templateUrl: './content-page.component.html', animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class ContentPageComponent extends ResourceOwner implements CanComponentDeactivate, OnInit { private isLoadingContent: boolean; @@ -46,7 +44,7 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD public confirmPreview = () => { return this.checkPendingChangesBeforePreview(); - } + }; constructor(apiUrl: ApiUrlConfig, authService: AuthService, appsState: AppsState, public readonly contentsState: ContentsState, @@ -56,7 +54,7 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD private readonly route: ActivatedRoute, private readonly router: Router, private readonly schemasState: SchemasState, - private readonly tempService: TempService + private readonly tempService: TempService, ) { super(); @@ -64,7 +62,7 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD apiUrl: apiUrl.buildUrl('api'), appId: contentsState.appId, appName: appsState.appName, - user: authService.user + user: authService.user, }; } @@ -104,7 +102,7 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD this.autoSaveKey = { schemaId: this.schema.id, schemaVersion: this.schema.version, - contentId: content?.id + contentId: content?.id, }; const dataAutosaved = this.autoSaveService.fetch(this.autoSaveKey); @@ -139,7 +137,7 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD if (confirmed) { this.autoSaveService.remove(this.autoSaveKey); } - }) + }), ); } @@ -284,4 +282,4 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD function isOtherContent(lhs: ContentDto | undefined | null, rhs: ContentDto | undefined | null) { return !lhs || !rhs || lhs.id !== rhs.id; -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/content/editor/content-editor.component.ts b/frontend/app/features/content/pages/content/editor/content-editor.component.ts index 64b53d45e..5abc99891 100644 --- a/frontend/app/features/content/pages/content/editor/content-editor.component.ts +++ b/frontend/app/features/content/pages/content/editor/content-editor.component.ts @@ -11,7 +11,7 @@ import { AppLanguageDto, EditContentForm, FieldForm, FieldSection, RootFieldDto, @Component({ selector: 'sqx-content-editor', styleUrls: ['./content-editor.component.scss'], - templateUrl: './content-editor.component.html' + templateUrl: './content-editor.component.html', }) export class ContentEditorComponent { @Output() @@ -44,4 +44,4 @@ export class ContentEditorComponent { public trackBySection(_index: number, section: FieldSection) { return section.separator?.fieldId; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/content/editor/content-field.component.ts b/frontend/app/features/content/pages/content/editor/content-field.component.ts index 75eebd2b8..fc229ad71 100644 --- a/frontend/app/features/content/pages/content/editor/content-field.component.ts +++ b/frontend/app/features/content/pages/content/editor/content-field.component.ts @@ -13,7 +13,7 @@ import { map } from 'rxjs/operators'; @Component({ selector: 'sqx-content-field', styleUrls: ['./content-field.component.scss'], - templateUrl: './content-field.component.html' + templateUrl: './content-field.component.html', }) export class ContentFieldComponent implements OnChanges { @Output() @@ -67,7 +67,7 @@ export class ContentFieldComponent implements OnChanges { constructor( private readonly appsState: AppsState, private readonly localStore: LocalStoreService, - private readonly translations: TranslationsService + private readonly translations: TranslationsService, ) { } @@ -82,7 +82,7 @@ export class ContentFieldComponent implements OnChanges { this.isDifferent = combineLatest([ value$(this.formModel.form), - value$(this.formModelCompare!.form) + value$(this.formModelCompare!.form), ]).pipe(map(([lhs, rhs]) => !Types.equals(lhs, rhs, true))); } } @@ -162,4 +162,4 @@ export class ContentFieldComponent implements OnChanges { private configKey() { return Settings.Local.FIELD_ALL(this.schema?.id, this.formModel.field.fieldId); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/content/editor/content-section.component.ts b/frontend/app/features/content/pages/content/editor/content-section.component.ts index 840e64184..4ef1eca30 100644 --- a/frontend/app/features/content/pages/content/editor/content-section.component.ts +++ b/frontend/app/features/content/pages/content/editor/content-section.component.ts @@ -17,7 +17,7 @@ interface State { selector: 'sqx-content-section', styleUrls: ['./content-section.component.scss'], templateUrl: './content-section.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentSectionComponent extends StatefulComponent implements OnChanges { @Output() @@ -48,10 +48,10 @@ export class ContentSectionComponent extends StatefulComponent implements public languages: ReadonlyArray; constructor(changeDetector: ChangeDetectorRef, - private readonly localStore: LocalStoreService + private readonly localStore: LocalStoreService, ) { super(changeDetector, { - isCollapsed: false + isCollapsed: false, }); this.changes.subscribe(state => { @@ -68,7 +68,7 @@ export class ContentSectionComponent extends StatefulComponent implements public toggle() { this.next(s => ({ ...s, - isCollapsed: !s.isCollapsed + isCollapsed: !s.isCollapsed, })); } @@ -83,4 +83,4 @@ export class ContentSectionComponent extends StatefulComponent implements private configKey(): string { return Settings.Local.FIELD_COLLAPSED(this.schema?.id, this.formSection?.separator?.fieldId); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/content/editor/field-languages.component.ts b/frontend/app/features/content/pages/content/editor/field-languages.component.ts index dc9f80a4c..c7ec82554 100644 --- a/frontend/app/features/content/pages/content/editor/field-languages.component.ts +++ b/frontend/app/features/content/pages/content/editor/field-languages.component.ts @@ -12,7 +12,7 @@ import { AppLanguageDto, RootFieldDto } from '@app/shared'; selector: 'sqx-field-languages', styleUrls: ['./field-languages.component.scss'], templateUrl: './field-languages.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class FieldLanguagesComponent { @Output() @@ -36,4 +36,4 @@ export class FieldLanguagesComponent { public toggleShowAllControls() { this.showAllControlsChange.emit(!this.showAllControls); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/content/references/content-references.component.ts b/frontend/app/features/content/pages/content/references/content-references.component.ts index 5f58367e3..b232bb6cc 100644 --- a/frontend/app/features/content/pages/content/references/content-references.component.ts +++ b/frontend/app/features/content/pages/content/references/content-references.component.ts @@ -14,8 +14,8 @@ import { AppLanguageDto, ComponentContentsState, ContentDto, QuerySynchronizer, templateUrl: './content-references.component.html', changeDetection: ChangeDetectionStrategy.OnPush, providers: [ - Router2State, ComponentContentsState - ] + Router2State, ComponentContentsState, + ], }) export class ContentReferencesComponent implements OnChanges { @Input() @@ -29,7 +29,7 @@ export class ContentReferencesComponent implements OnChanges { constructor( public readonly contentsRoute: Router2State, - public readonly contentsState: ComponentContentsState + public readonly contentsState: ComponentContentsState, ) { } @@ -64,4 +64,4 @@ export class ContentReferencesComponent implements OnChanges { public trackByContent(_index: number, content: ContentDto) { return content.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/contents/contents-filters-page.component.ts b/frontend/app/features/content/pages/contents/contents-filters-page.component.ts index e556f04ee..2ea4dec9b 100644 --- a/frontend/app/features/content/pages/contents/contents-filters-page.component.ts +++ b/frontend/app/features/content/pages/contents/contents-filters-page.component.ts @@ -12,23 +12,23 @@ import { map } from 'rxjs/operators'; @Component({ selector: 'sqx-contents-filters-page', styleUrls: ['./contents-filters-page.component.scss'], - templateUrl: './contents-filters-page.component.html' + templateUrl: './contents-filters-page.component.html', }) export class ContentsFiltersPageComponent { public schemaQueries = this.schemasState.selectedSchema.pipe( defined(), - map(schema => new Queries(this.uiState, `schemas.${schema.name}`) + map(schema => new Queries(this.uiState, `schemas.${schema.name}`), )); constructor( public readonly contentsState: ContentsState, private readonly schemasState: SchemasState, - private readonly uiState: UIState + private readonly uiState: UIState, ) { } public search(query: Query) { this.contentsState.search(query); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/contents/contents-page.component.ts b/frontend/app/features/content/pages/contents/contents-page.component.ts index e79caa709..5eb386160 100644 --- a/frontend/app/features/content/pages/contents/contents-page.component.ts +++ b/frontend/app/features/content/pages/contents/contents-page.component.ts @@ -5,7 +5,7 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length +/* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */ import { Component, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; @@ -19,11 +19,11 @@ import { DueTimeSelectorComponent } from './../../shared/due-time-selector.compo styleUrls: ['./contents-page.component.scss'], templateUrl: './contents-page.component.html', providers: [ - Router2State + Router2State, ], animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class ContentsPageComponent extends ResourceOwner implements OnInit { @ViewChild('dueTimeSelector', { static: false }) @@ -36,7 +36,7 @@ export class ContentsPageComponent extends ResourceOwner implements OnInit { public searchModal = new ModalModel(); - public selectedItems: { [id: string]: boolean; } = {}; + public selectedItems: { [id: string]: boolean } = {}; public selectedAll = false; public selectionCount = 0; public selectionCanDelete = false; @@ -53,7 +53,7 @@ export class ContentsPageComponent extends ResourceOwner implements OnInit { combineLatest([ this.schemasState.selectedSchema.pipe(defined()), this.languagesState.isoLanguages, - this.contentsState.statuses + this.contentsState.statuses, ]).pipe( map(values => queryModelFromSchema(values[0], values[1], values[2]))); @@ -71,7 +71,7 @@ export class ContentsPageComponent extends ResourceOwner implements OnInit { private readonly router: Router, private readonly schemasState: SchemasState, private readonly tempService: TempService, - private readonly uiState: UIState + private readonly uiState: UIState, ) { super(); } @@ -234,4 +234,4 @@ export class ContentsPageComponent extends ResourceOwner implements OnInit { function getSchemaName(route: ActivatedRoute) { return route.params.pipe(map(x => x['schemaName'] as string), distinctUntilChanged()); -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/contents/custom-view-editor.component.ts b/frontend/app/features/content/pages/contents/custom-view-editor.component.ts index 74d16bbd5..a11351fa0 100644 --- a/frontend/app/features/content/pages/contents/custom-view-editor.component.ts +++ b/frontend/app/features/content/pages/contents/custom-view-editor.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; @@ -14,7 +12,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Out selector: 'sqx-custom-view-editor', styleUrls: ['./custom-view-editor.component.scss'], templateUrl: './custom-view-editor.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class CustomViewEditorComponent implements OnChanges { @Output() @@ -53,4 +51,4 @@ export class CustomViewEditorComponent implements OnChanges { private updateFieldNames(fieldNames: ReadonlyArray) { this.fieldNamesChange.emit(fieldNames); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/schemas/schemas-page.component.ts b/frontend/app/features/content/pages/schemas/schemas-page.component.ts index 7df1714e2..0a0c03abc 100644 --- a/frontend/app/features/content/pages/schemas/schemas-page.component.ts +++ b/frontend/app/features/content/pages/schemas/schemas-page.component.ts @@ -12,7 +12,7 @@ import { LocalStoreService, SchemaCategory, SchemasState, Settings } from '@app/ @Component({ selector: 'sqx-schemas-page', styleUrls: ['./schemas-page.component.scss'], - templateUrl: './schemas-page.component.html' + templateUrl: './schemas-page.component.html', }) export class SchemasPageComponent { public schemasFilter = new FormControl(); @@ -25,7 +25,7 @@ export class SchemasPageComponent { constructor( public readonly schemasState: SchemasState, - private readonly localStore: LocalStoreService + private readonly localStore: LocalStoreService, ) { this.isCollapsed = localStore.getBoolean(Settings.Local.SCHEMAS_COLLAPSED); } @@ -39,4 +39,4 @@ export class SchemasPageComponent { public trackByCategory(_index: number, category: SchemaCategory) { return category.name; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/pages/sidebar/sidebar-page.component.ts b/frontend/app/features/content/pages/sidebar/sidebar-page.component.ts index cf569dee1..318ecfe8b 100644 --- a/frontend/app/features/content/pages/sidebar/sidebar-page.component.ts +++ b/frontend/app/features/content/pages/sidebar/sidebar-page.component.ts @@ -15,12 +15,12 @@ import { map } from 'rxjs/operators'; selector: 'sqx-sidebar-page', styleUrls: ['./sidebar-page.component.scss'], templateUrl: './sidebar-page.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SidebarPageComponent { public url = combineLatest([ this.schemasState.selectedSchema.pipe(defined()), - this.contentsState.selectedContent + this.contentsState.selectedContent, ]).pipe(map(([schema, content]) => { const url = content ? @@ -32,7 +32,7 @@ export class SidebarPageComponent { constructor( public readonly contentsState: ContentsState, - public readonly schemasState: SchemasState + public readonly schemasState: SchemasState, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/content-extension.component.ts b/frontend/app/features/content/shared/content-extension.component.ts index c20b9971b..7b05567ac 100644 --- a/frontend/app/features/content/shared/content-extension.component.ts +++ b/frontend/app/features/content/shared/content-extension.component.ts @@ -14,7 +14,7 @@ import { AppsState, AuthService, computeEditorUrl, ContentDto, SchemaDto } from selector: 'sqx-content-extension', styleUrls: ['./content-extension.component.scss'], templateUrl: './content-extension.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentExtensionComponent extends ResourceOwner implements AfterViewInit, OnChanges { private readonly context: any; @@ -36,7 +36,7 @@ export class ContentExtensionComponent extends ResourceOwner implements AfterVie constructor(apiUrl: ApiUrlConfig, authService: AuthService, private readonly appsState: AppsState, private readonly renderer: Renderer2, - private readonly router: Router + private readonly router: Router, ) { super(); @@ -44,7 +44,7 @@ export class ContentExtensionComponent extends ResourceOwner implements AfterVie apiUrl: apiUrl.buildUrl('api'), appId: appsState.snapshot.selectedApp!.id, appName: appsState.snapshot.selectedApp!.name, - user: authService.user + user: authService.user, }; } @@ -118,4 +118,4 @@ export class ContentExtensionComponent extends ResourceOwner implements AfterVie iframe.contentWindow.postMessage(message, '*'); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/content-status.component.ts b/frontend/app/features/content/shared/content-status.component.ts index 5157a39bc..70371790d 100644 --- a/frontend/app/features/content/shared/content-status.component.ts +++ b/frontend/app/features/content/shared/content-status.component.ts @@ -12,7 +12,7 @@ import { ScheduleDto } from '@app/shared'; selector: 'sqx-content-status', styleUrls: ['./content-status.component.scss'], templateUrl: './content-status.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentStatusComponent { @Input() @@ -48,4 +48,4 @@ export class ContentStatusComponent { return this.status; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/due-time-selector.component.ts b/frontend/app/features/content/shared/due-time-selector.component.ts index 187028973..041789b64 100644 --- a/frontend/app/features/content/shared/due-time-selector.component.ts +++ b/frontend/app/features/content/shared/due-time-selector.component.ts @@ -14,7 +14,7 @@ const OPTION_IMMEDIATELY = 'Immediately'; @Component({ selector: 'sqx-due-time-selector', styleUrls: ['./due-time-selector.component.scss'], - templateUrl: './due-time-selector.component.html' + templateUrl: './due-time-selector.component.html', }) export class DueTimeSelectorComponent { private dueTimeResult: Subject; @@ -54,4 +54,4 @@ export class DueTimeSelectorComponent { this.dueTimeResult = null!; this.dueTime = null; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/forms/array-editor.component.ts b/frontend/app/features/content/shared/forms/array-editor.component.ts index 0fc627d82..ee3f112a4 100644 --- a/frontend/app/features/content/shared/forms/array-editor.component.ts +++ b/frontend/app/features/content/shared/forms/array-editor.component.ts @@ -18,8 +18,8 @@ import { ArrayItemComponent } from './array-item.component'; templateUrl: './array-editor.component.html', changeDetection: ChangeDetectionStrategy.OnPush, animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class ArrayEditorComponent implements OnChanges { @Input() @@ -70,7 +70,7 @@ export class ArrayEditorComponent implements OnChanges { this.isFull = combineLatest([ this.isDisabled, - this.formModel.itemChanges + this.formModel.itemChanges, ]).pipe(map(([disabled, items]) => { return disabled || items.length >= maxItems; })); @@ -126,4 +126,4 @@ export class ArrayEditorComponent implements OnChanges { child.reset(); }); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/forms/array-item.component.ts b/frontend/app/features/content/shared/forms/array-item.component.ts index 61b73d643..ae776c8c6 100644 --- a/frontend/app/features/content/shared/forms/array-item.component.ts +++ b/frontend/app/features/content/shared/forms/array-item.component.ts @@ -20,7 +20,7 @@ interface State { selector: 'sqx-array-item', styleUrls: ['./array-item.component.scss'], templateUrl: './array-item.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ArrayItemComponent extends StatefulComponent implements OnChanges { @Output() @@ -70,10 +70,10 @@ export class ArrayItemComponent extends StatefulComponent implements OnCh public title: Observable; - constructor(changeDetector: ChangeDetectorRef + constructor(changeDetector: ChangeDetectorRef, ) { super(changeDetector, { - isCollapsed: false + isCollapsed: false, }); } @@ -142,4 +142,4 @@ export class ArrayItemComponent extends StatefulComponent implements OnCh public trackBySection(_index: number, section: FieldSection) { return section.separator?.fieldId; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/forms/assets-editor.component.ts b/frontend/app/features/content/shared/forms/assets-editor.component.ts index 140e0ba07..2435bea3d 100644 --- a/frontend/app/features/content/shared/forms/assets-editor.component.ts +++ b/frontend/app/features/content/shared/forms/assets-editor.component.ts @@ -11,13 +11,13 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { AppsState, AssetDto, AssetsService, DialogModel, LocalStoreService, MessageBus, Settings, sorted, StatefulControlComponent, Types } from '@app/shared'; export const SQX_ASSETS_EDITOR_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AssetsEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AssetsEditorComponent), multi: true, }; class AssetUpdated { constructor( public readonly asset: AssetDto, - public readonly source: any + public readonly source: any, ) { } } @@ -41,9 +41,9 @@ interface State { styleUrls: ['./assets-editor.component.scss'], templateUrl: './assets-editor.component.html', providers: [ - SQX_ASSETS_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_ASSETS_EDITOR_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetsEditorComponent extends StatefulControlComponent> implements OnInit { @Input() @@ -60,12 +60,12 @@ export class AssetsEditorComponent extends StatefulControlComponent ({ ...s, - assetFiles: [file, ...s.assetFiles] + assetFiles: [file, ...s.assetFiles], })); } } @@ -136,7 +136,7 @@ export class AssetsEditorComponent extends StatefulControlComponent ({ ...s, assetFiles: s.assetFiles.removed(file), - assets: [asset, ...s.assets] + assets: [asset, ...s.assets], })); this.updateValue(); @@ -162,7 +162,7 @@ export class AssetsEditorComponent extends StatefulControlComponent ({ ...s, - assetFiles: s.assetFiles.removed(file) + assetFiles: s.assetFiles.removed(file), })); } @@ -187,4 +187,4 @@ export class AssetsEditorComponent extends StatefulControlComponent) { return field.field.fieldId; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/forms/component.component.ts b/frontend/app/features/content/shared/forms/component.component.ts index cd58aa62c..ccbdf621d 100644 --- a/frontend/app/features/content/shared/forms/component.component.ts +++ b/frontend/app/features/content/shared/forms/component.component.ts @@ -15,8 +15,8 @@ import { ComponentSectionComponent } from './component-section.component'; templateUrl: './component.component.html', changeDetection: ChangeDetectionStrategy.OnPush, animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class ComponentComponent extends ResourceOwner implements OnChanges { @Input() @@ -44,7 +44,7 @@ export class ComponentComponent extends ResourceOwner implements OnChanges { public schemasList: ReadonlyArray; constructor( - private readonly changeDetector: ChangeDetectorRef + private readonly changeDetector: ChangeDetectorRef, ) { super(); } @@ -78,4 +78,4 @@ export class ComponentComponent extends ResourceOwner implements OnChanges { public trackBySection(_index: number, section: FieldSection) { return section.separator?.fieldId; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/forms/field-editor.component.ts b/frontend/app/features/content/shared/forms/field-editor.component.ts index 3e65f8281..6557ee74b 100644 --- a/frontend/app/features/content/shared/forms/field-editor.component.ts +++ b/frontend/app/features/content/shared/forms/field-editor.component.ts @@ -14,7 +14,7 @@ import { map } from 'rxjs/operators'; @Component({ selector: 'sqx-field-editor', styleUrls: ['./field-editor.component.scss'], - templateUrl: './field-editor.component.html' + templateUrl: './field-editor.component.html', }) export class FieldEditorComponent implements OnChanges { @Input() @@ -89,4 +89,4 @@ export class FieldEditorComponent implements OnChanges { public unset() { this.formModel.unset(); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/forms/iframe-editor.component.ts b/frontend/app/features/content/shared/forms/iframe-editor.component.ts index 26578af2e..888a66292 100644 --- a/frontend/app/features/content/shared/forms/iframe-editor.component.ts +++ b/frontend/app/features/content/shared/forms/iframe-editor.component.ts @@ -12,7 +12,7 @@ import { DialogModel, DialogService, StatefulControlComponent, Types } from '@ap import { AppsState, AssetDto, computeEditorUrl } from '@app/shared'; export const SQX_IFRAME_EDITOR_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => IFrameEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => IFrameEditorComponent), multi: true, }; interface State { @@ -25,9 +25,9 @@ interface State { styleUrls: ['./iframe-editor.component.scss'], templateUrl: './iframe-editor.component.html', providers: [ - SQX_IFRAME_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_IFRAME_EDITOR_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class IFrameEditorComponent extends StatefulControlComponent implements OnChanges, OnDestroy, AfterViewInit { private value: any; @@ -72,10 +72,10 @@ export class IFrameEditorComponent extends StatefulControlComponent private readonly appsState: AppsState, private readonly dialogs: DialogService, private readonly renderer: Renderer2, - private readonly router: Router + private readonly router: Router, ) { super(changeDetector, { - isFullscreen: false + isFullscreen: false, }); } @@ -272,4 +272,4 @@ export class IFrameEditorComponent extends StatefulControlComponent iframe.contentWindow.postMessage(message, '*'); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/forms/stock-photo-editor.component.ts b/frontend/app/features/content/shared/forms/stock-photo-editor.component.ts index 78398c181..56dc4d785 100644 --- a/frontend/app/features/content/shared/forms/stock-photo-editor.component.ts +++ b/frontend/app/features/content/shared/forms/stock-photo-editor.component.ts @@ -12,7 +12,7 @@ import { of } from 'rxjs'; import { debounceTime, map, switchMap, tap } from 'rxjs/operators'; export const SQX_STOCK_PHOTO_EDITOR_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StockPhotoEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StockPhotoEditorComponent), multi: true, }; interface State { @@ -28,9 +28,9 @@ interface State { styleUrls: ['./stock-photo-editor.component.scss'], templateUrl: './stock-photo-editor.component.html', providers: [ - SQX_STOCK_PHOTO_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_STOCK_PHOTO_EDITOR_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class StockPhotoEditorComponent extends StatefulControlComponent implements OnInit { @Input() @@ -63,7 +63,7 @@ export class StockPhotoEditorComponent extends StatefulControlComponent) { @@ -69,7 +69,7 @@ export class ContentsColumnsPipe implements PipeTransform { @Pipe({ name: 'sqxContentListWidth', - pure: true + pure: true, }) export class ContentListWidthPipe implements PipeTransform { public transform(value: ReadonlyArray) { @@ -82,7 +82,7 @@ export class ContentListWidthPipe implements PipeTransform { } @Directive({ - selector: '[sqxContentListCell]' + selector: '[sqxContentListCell]', }) export class ContentListCellDirective implements OnChanges { @Input('sqxContentListCell') @@ -90,7 +90,7 @@ export class ContentListCellDirective implements OnChanges { constructor( private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -103,4 +103,4 @@ export class ContentListCellDirective implements OnChanges { this.renderer.setStyle(this.element.nativeElement, 'width', width); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/list/content-list-field.component.ts b/frontend/app/features/content/shared/list/content-list-field.component.ts index 1051fa4ef..b0d215527 100644 --- a/frontend/app/features/content/shared/list/content-list-field.component.ts +++ b/frontend/app/features/content/shared/list/content-list-field.component.ts @@ -18,7 +18,7 @@ interface State { selector: 'sqx-content-list-field', styleUrls: ['./content-list-field.component.scss'], templateUrl: './content-list-field.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentListFieldComponent extends StatefulComponent implements OnChanges { @Input() @@ -38,7 +38,7 @@ export class ContentListFieldComponent extends StatefulComponent implemen constructor(changeDetector: ChangeDetectorRef) { super(changeDetector, { - formatted: '' + formatted: '', }); } @@ -73,4 +73,4 @@ export class ContentListFieldComponent extends StatefulComponent implemen public get fieldName() { return Types.is(this.field, RootFieldDto) ? this.field.name : this.field; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/list/content-list-header.component.ts b/frontend/app/features/content/shared/list/content-list-header.component.ts index e8600cac1..cafa34519 100644 --- a/frontend/app/features/content/shared/list/content-list-header.component.ts +++ b/frontend/app/features/content/shared/list/content-list-header.component.ts @@ -12,7 +12,7 @@ import { LanguageDto, MetaFields, Query, RootFieldDto, TableField, Types } from selector: 'sqx-content-list-header', styleUrls: ['./content-list-header.component.scss'], templateUrl: './content-list-header.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentListHeaderComponent { @Input() @@ -52,4 +52,4 @@ export class ContentListHeaderComponent { return `data.${this.field.name}.iv`; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/list/content-value-editor.component.ts b/frontend/app/features/content/shared/list/content-value-editor.component.ts index 64d0d5add..bf6bc41d5 100644 --- a/frontend/app/features/content/shared/list/content-value-editor.component.ts +++ b/frontend/app/features/content/shared/list/content-value-editor.component.ts @@ -13,7 +13,7 @@ import { FieldDto, MathHelper } from '@app/shared'; selector: 'sqx-content-value-editor', styleUrls: ['./content-value-editor.component.scss'], templateUrl: './content-value-editor.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentValueEditorComponent { @Input() @@ -23,4 +23,4 @@ export class ContentValueEditorComponent { public form: FormGroup; public readonly uniqueId = MathHelper.guid(); -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/list/content-value.component.ts b/frontend/app/features/content/shared/list/content-value.component.ts index 834588a75..52b9bf78a 100644 --- a/frontend/app/features/content/shared/list/content-value.component.ts +++ b/frontend/app/features/content/shared/list/content-value.component.ts @@ -12,7 +12,7 @@ import { HtmlValue, Types } from '@app/shared'; selector: 'sqx-content-value', styleUrls: ['./content-value.component.scss'], templateUrl: './content-value.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentValueComponent { @Input() @@ -21,4 +21,4 @@ export class ContentValueComponent { public get isPlain() { return !Types.is(this.value, HtmlValue); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/list/content.component.ts b/frontend/app/features/content/shared/list/content.component.ts index 6f30afc38..222e9cc74 100644 --- a/frontend/app/features/content/shared/list/content.component.ts +++ b/frontend/app/features/content/shared/list/content.component.ts @@ -16,9 +16,9 @@ import { ContentListFieldComponent } from './content-list-field.component'; styleUrls: ['./content.component.scss'], templateUrl: './content.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentComponent implements OnChanges { @Output() @@ -65,7 +65,7 @@ export class ContentComponent implements OnChanges { constructor( private readonly changeDetector: ChangeDetectorRef, - private readonly contentsState: ContentsState + private readonly contentsState: ContentsState, ) { } @@ -89,7 +89,7 @@ export class ContentComponent implements OnChanges { if (value) { this.contentsState.patch(this.content, value) .subscribe(() => { - this.patchForm.submitCompleted({ noReset: true}); + this.patchForm.submitCompleted({ noReset: true }); this.changeDetector.markForCheck(); }, error => { @@ -113,4 +113,4 @@ export class ContentComponent implements OnChanges { this.fields.forEach(x => x.reset()); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/preview-button.component.ts b/frontend/app/features/content/shared/preview-button.component.ts index eadd298b0..a5fde63d0 100644 --- a/frontend/app/features/content/shared/preview-button.component.ts +++ b/frontend/app/features/content/shared/preview-button.component.ts @@ -23,9 +23,9 @@ interface State { styleUrls: ['./preview-button.component.scss'], templateUrl: './preview-button.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class PreviewButtonComponent extends StatefulComponent implements OnInit { @Input() @@ -40,10 +40,10 @@ export class PreviewButtonComponent extends StatefulComponent implements public dropdown = new ModalModel(); constructor(changeDetector: ChangeDetectorRef, - private readonly localStore: LocalStoreService + private readonly localStore: LocalStoreService, ) { super(changeDetector, { - previewNamesMore: [] + previewNamesMore: [], }); } @@ -104,4 +104,4 @@ export class PreviewButtonComponent extends StatefulComponent implements private configKey() { return Settings.Local.SCHEMA_PREVIEW(this.schema.id); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/references/content-creator.component.ts b/frontend/app/features/content/shared/references/content-creator.component.ts index e2509fd73..1d2c8325d 100644 --- a/frontend/app/features/content/shared/references/content-creator.component.ts +++ b/frontend/app/features/content/shared/references/content-creator.component.ts @@ -13,8 +13,8 @@ import { AppLanguageDto, ComponentContentsState, ContentDto, EditContentForm, Re styleUrls: ['./content-creator.component.scss'], templateUrl: './content-creator.component.html', providers: [ - ComponentContentsState - ] + ComponentContentsState, + ], }) export class ContentCreatorComponent extends ResourceOwner implements OnInit { @Output() @@ -45,7 +45,7 @@ export class ContentCreatorComponent extends ResourceOwner implements OnInit { constructor( private readonly contentsState: ComponentContentsState, - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { super(); } @@ -121,4 +121,4 @@ export class ContentCreatorComponent extends ResourceOwner implements OnInit { public emitSelect(content: ContentDto) { this.select.emit([content]); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/references/content-selector-item.component.ts b/frontend/app/features/content/shared/references/content-selector-item.component.ts index 7aa8104f3..1ff46d98b 100644 --- a/frontend/app/features/content/shared/references/content-selector-item.component.ts +++ b/frontend/app/features/content/shared/references/content-selector-item.component.ts @@ -14,7 +14,7 @@ import { ContentDto, LanguageDto, SchemaDto } from '@app/shared'; selector: '[sqxContentSelectorItem]', styleUrls: ['./content-selector-item.component.scss'], templateUrl: './content-selector-item.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentSelectorItemComponent { @Output() @@ -44,4 +44,4 @@ export class ContentSelectorItemComponent { public select(isSelected: boolean) { this.selectedChange.emit(isSelected); } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/references/content-selector.component.ts b/frontend/app/features/content/shared/references/content-selector.component.ts index 716647f3e..14a8ea92c 100644 --- a/frontend/app/features/content/shared/references/content-selector.component.ts +++ b/frontend/app/features/content/shared/references/content-selector.component.ts @@ -13,8 +13,8 @@ import { ApiUrlConfig, AppsState, ComponentContentsState, ContentDto, LanguageDt styleUrls: ['./content-selector.component.scss'], templateUrl: './content-selector.component.html', providers: [ - ComponentContentsState - ] + ComponentContentsState, + ], }) export class ContentSelectorComponent extends ResourceOwner implements OnInit { @Output() @@ -43,7 +43,7 @@ export class ContentSelectorComponent extends ResourceOwner implements OnInit { public queryModel: QueryModel; - public selectedItems: { [id: string]: ContentDto; } = {}; + public selectedItems: { [id: string]: ContentDto } = {}; public selectionCount = 0; public selectedAll = false; @@ -51,7 +51,7 @@ export class ContentSelectorComponent extends ResourceOwner implements OnInit { public readonly appsState: AppsState, public readonly apiUrl: ApiUrlConfig, public readonly contentsState: ComponentContentsState, - public readonly schemasState: SchemasState + public readonly schemasState: SchemasState, ) { super(); } @@ -145,4 +145,4 @@ export class ContentSelectorComponent extends ResourceOwner implements OnInit { public trackByContent(_index: number, content: ContentDto): string { return content.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/references/reference-item.component.ts b/frontend/app/features/content/shared/references/reference-item.component.ts index 237bd84ba..4d39b1c5b 100644 --- a/frontend/app/features/content/shared/references/reference-item.component.ts +++ b/frontend/app/features/content/shared/references/reference-item.component.ts @@ -14,7 +14,7 @@ import { AppLanguageDto, ContentDto, getContentValue } from '@app/shared'; selector: '[sqxReferenceItem]', styleUrls: ['./reference-item.component.scss'], templateUrl: './reference-item.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ReferenceItemComponent implements OnChanges { @Output() @@ -70,4 +70,4 @@ export class ReferenceItemComponent implements OnChanges { this.values = values; } -} \ No newline at end of file +} diff --git a/frontend/app/features/content/shared/references/references-editor.component.ts b/frontend/app/features/content/shared/references/references-editor.component.ts index 4a8b424c1..63d1b0544 100644 --- a/frontend/app/features/content/shared/references/references-editor.component.ts +++ b/frontend/app/features/content/shared/references/references-editor.component.ts @@ -11,7 +11,7 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { AppLanguageDto, AppsState, ContentDto, ContentsService, DialogModel, sorted, StatefulControlComponent, Types } from '@app/shared'; export const SQX_REFERENCES_EDITOR_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ReferencesEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ReferencesEditorComponent), multi: true, }; interface State { @@ -27,9 +27,9 @@ interface State { styleUrls: ['./references-editor.component.scss'], templateUrl: './references-editor.component.html', providers: [ - SQX_REFERENCES_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_REFERENCES_EDITOR_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ReferencesEditorComponent extends StatefulControlComponent> { @Input() @@ -59,7 +59,7 @@ export class ReferencesEditorComponent extends StatefulControlComponent x.totalCalls) - })) + data: this.usage.details[k].map(x => x.totalCalls), + })), }; } } @@ -57,4 +57,4 @@ export class ApiCallsCardComponent implements OnChanges { window.open(url, '_blank'); }); } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/api-calls-summary-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-calls-summary-card.component.ts index b7336382e..2d491a696 100644 --- a/frontend/app/features/dashboard/pages/cards/api-calls-summary-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-calls-summary-card.component.ts @@ -13,9 +13,9 @@ import { AppDto, CallsUsageDto, fadeAnimation } from '@app/shared'; styleUrls: ['./api-calls-summary-card.component.scss'], templateUrl: './api-calls-summary-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiCallsSummaryCardComponent implements OnChanges { @Input() @@ -33,4 +33,4 @@ export class ApiCallsSummaryCardComponent implements OnChanges { this.callsAllowed = this.usage.allowedCalls; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/api-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-card.component.ts index 2edfce610..c5da9e82b 100644 --- a/frontend/app/features/dashboard/pages/cards/api-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-card.component.ts @@ -13,11 +13,11 @@ import { AppDto, fadeAnimation } from '@app/shared'; styleUrls: ['./api-card.component.scss'], templateUrl: './api-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiCardComponent { @Input() public app: AppDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/api-performance-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-performance-card.component.ts index cc65b5c0b..a7ebe0cda 100644 --- a/frontend/app/features/dashboard/pages/cards/api-performance-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-performance-card.component.ts @@ -1,4 +1,3 @@ - /* * Squidex Headless CMS * @@ -15,9 +14,9 @@ import { ChartHelpers, ChartOptions } from './shared'; styleUrls: ['./api-performance-card.component.scss'], templateUrl: './api-performance-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiPerformanceCardComponent implements OnChanges { @Input() @@ -51,11 +50,11 @@ export class ApiPerformanceCardComponent implements OnChanges { backgroundColor: ChartHelpers.getBackgroundColor(i), borderColor: ChartHelpers.getBorderColor(i), borderWidth: 1, - data: this.usage.details[k].map(x => x.averageElapsedMs) - })) + data: this.usage.details[k].map(x => x.averageElapsedMs), + })), }; this.chartSummary = this.usage.averageElapsedMs; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/api-traffic-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-traffic-card.component.ts index 1b079e860..72cd1eb2c 100644 --- a/frontend/app/features/dashboard/pages/cards/api-traffic-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-traffic-card.component.ts @@ -1,4 +1,3 @@ - /* * Squidex Headless CMS * @@ -15,9 +14,9 @@ import { ChartHelpers, ChartOptions } from './shared'; styleUrls: ['./api-traffic-card.component.scss'], templateUrl: './api-traffic-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiTrafficCardComponent implements OnChanges { @Input() @@ -51,11 +50,11 @@ export class ApiTrafficCardComponent implements OnChanges { backgroundColor: ChartHelpers.getBackgroundColor(i), borderColor: ChartHelpers.getBorderColor(i), borderWidth: 1, - data: this.usage.details[k].map(x => Math.round(100 * (x.totalBytes / (1024 * 1024))) / 100) - })) + data: this.usage.details[k].map(x => Math.round(100 * (x.totalBytes / (1024 * 1024))) / 100), + })), }; this.chartSummary = this.usage.totalBytes; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/api-traffic-summary-card.component.ts b/frontend/app/features/dashboard/pages/cards/api-traffic-summary-card.component.ts index e3057759c..4f7c9195b 100644 --- a/frontend/app/features/dashboard/pages/cards/api-traffic-summary-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/api-traffic-summary-card.component.ts @@ -1,4 +1,3 @@ - /* * Squidex Headless CMS * @@ -14,9 +13,9 @@ import { AppDto, CallsUsageDto, fadeAnimation } from '@app/shared'; styleUrls: ['./api-traffic-summary-card.component.scss'], templateUrl: './api-traffic-summary-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ApiTrafficSummaryCardComponent implements OnChanges { @Input() @@ -34,4 +33,4 @@ export class ApiTrafficSummaryCardComponent implements OnChanges { this.bytesAllowed = this.usage.allowedBytes; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/asset-uploads-count-card.component.ts b/frontend/app/features/dashboard/pages/cards/asset-uploads-count-card.component.ts index 058da5a5b..497fcdb8c 100644 --- a/frontend/app/features/dashboard/pages/cards/asset-uploads-count-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/asset-uploads-count-card.component.ts @@ -14,9 +14,9 @@ import { ChartHelpers, ChartOptions } from './shared'; styleUrls: ['./asset-uploads-count-card.component.scss'], templateUrl: './asset-uploads-count-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetUploadsCountCardComponent implements OnChanges { @Input() @@ -42,10 +42,10 @@ export class AssetUploadsCountCardComponent implements OnChanges { backgroundColor: ChartHelpers.getBackgroundColor(), borderColor: ChartHelpers.getBorderColor(), borderWidth: 1, - data: this.usage.map(x => x.totalCount) - } - ] + data: this.usage.map(x => x.totalCount), + }, + ], }; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/asset-uploads-size-card.component.ts b/frontend/app/features/dashboard/pages/cards/asset-uploads-size-card.component.ts index 0191a3bc2..164c69f43 100644 --- a/frontend/app/features/dashboard/pages/cards/asset-uploads-size-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/asset-uploads-size-card.component.ts @@ -14,9 +14,9 @@ import { ChartHelpers, ChartOptions } from './shared'; styleUrls: ['./asset-uploads-size-card.component.scss'], templateUrl: './asset-uploads-size-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetUploadsSizeCardComponent implements OnChanges { @Input() @@ -42,10 +42,10 @@ export class AssetUploadsSizeCardComponent implements OnChanges { backgroundColor: ChartHelpers.getBackgroundColor(), borderColor: ChartHelpers.getBorderColor(), borderWidth: 1, - data: this.usage.map(x => Math.round(100 * (x.totalSize / (1024 * 1024))) / 100) - } - ] + data: this.usage.map(x => Math.round(100 * (x.totalSize / (1024 * 1024))) / 100), + }, + ], }; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/asset-uploads-size-summary-card.component.ts b/frontend/app/features/dashboard/pages/cards/asset-uploads-size-summary-card.component.ts index ba1f541bd..c89d8a916 100644 --- a/frontend/app/features/dashboard/pages/cards/asset-uploads-size-summary-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/asset-uploads-size-summary-card.component.ts @@ -13,9 +13,9 @@ import { AppDto, CurrentStorageDto, fadeAnimation } from '@app/shared'; styleUrls: ['./asset-uploads-size-summary-card.component.scss'], templateUrl: './asset-uploads-size-summary-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetUploadsSizeSummaryCardComponent implements OnChanges { @Input() @@ -33,4 +33,4 @@ export class AssetUploadsSizeSummaryCardComponent implements OnChanges { this.storageAllowed = this.usage.maxAllowed; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/content-summary-card.component.ts b/frontend/app/features/dashboard/pages/cards/content-summary-card.component.ts index ac2129d57..78873c979 100644 --- a/frontend/app/features/dashboard/pages/cards/content-summary-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/content-summary-card.component.ts @@ -18,9 +18,9 @@ interface State { styleUrls: ['./content-summary-card.component.scss'], templateUrl: './content-summary-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContentSummaryCardComponent extends StatefulComponent implements OnInit { @Input() @@ -30,10 +30,10 @@ export class ContentSummaryCardComponent extends StatefulComponent implem public options: any; constructor(changeDetector: ChangeDetectorRef, - private readonly contentsService: ContentsService + private readonly contentsService: ContentsService, ) { super(changeDetector, { - itemCount: 0 + itemCount: 0, }); } @@ -58,4 +58,4 @@ export class ContentSummaryCardComponent extends StatefulComponent implem this.next({ itemCount: 0 }); }); } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/github-card.component.ts b/frontend/app/features/dashboard/pages/cards/github-card.component.ts index 1e2d1b547..e4eb96fae 100644 --- a/frontend/app/features/dashboard/pages/cards/github-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/github-card.component.ts @@ -13,11 +13,11 @@ import { AppDto, fadeAnimation } from '@app/shared'; styleUrls: ['./github-card.component.scss'], templateUrl: './github-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class GithubCardComponent { @Input() public app: AppDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/history-card.component.ts b/frontend/app/features/dashboard/pages/cards/history-card.component.ts index 49895edfa..c08b0e819 100644 --- a/frontend/app/features/dashboard/pages/cards/history-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/history-card.component.ts @@ -14,9 +14,9 @@ import { Observable } from 'rxjs'; styleUrls: ['./history-card.component.scss'], templateUrl: './history-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class HistoryCardComponent implements OnChanges { @Input() @@ -25,11 +25,11 @@ export class HistoryCardComponent implements OnChanges { public history: Observable>; constructor( - private readonly historyService: HistoryService + private readonly historyService: HistoryService, ) { } public ngOnChanges() { this.history = this.historyService.getHistory(this.app.name, ''); } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/iframe-card.component.ts b/frontend/app/features/dashboard/pages/cards/iframe-card.component.ts index 3f7d291e7..21d6206e7 100644 --- a/frontend/app/features/dashboard/pages/cards/iframe-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/iframe-card.component.ts @@ -13,9 +13,9 @@ import { AppDto, fadeAnimation } from '@app/shared'; styleUrls: ['./iframe-card.component.scss'], templateUrl: './iframe-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class IFrameCardComponent implements AfterViewInit { @ViewChild('iframe', { static: false }) @@ -30,4 +30,4 @@ export class IFrameCardComponent implements AfterViewInit { public ngAfterViewInit() { this.iframe.nativeElement.src = this.options?.src; } -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/schema-card.component.ts b/frontend/app/features/dashboard/pages/cards/schema-card.component.ts index 123d7210a..39112d32e 100644 --- a/frontend/app/features/dashboard/pages/cards/schema-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/schema-card.component.ts @@ -13,11 +13,11 @@ import { AppDto, fadeAnimation } from '@app/shared'; styleUrls: ['./schema-card.component.scss'], templateUrl: './schema-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SchemaCardComponent { @Input() public app: AppDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/shared.ts b/frontend/app/features/dashboard/pages/cards/shared.ts index 135b8a7a3..d5ba2f459 100644 --- a/frontend/app/features/dashboard/pages/cards/shared.ts +++ b/frontend/app/features/dashboard/pages/cards/shared.ts @@ -18,7 +18,7 @@ const ColorSchema: ReadonlyArray = [ ' 50, 211, 50', '131, 50, 211', '211, 50, 211', - '211, 50, 131' + '211, 50, 131', ]; export module ChartHelpers { @@ -49,16 +49,16 @@ export module ChartOptions { scales: { xAxes: [{ display: true, - stacked: false + stacked: false, }], yAxes: [{ ticks: { - beginAtZero: true + beginAtZero: true, }, - stacked: false - }] + stacked: false, + }], }, - maintainAspectRatio: false + maintainAspectRatio: false, }; export const Stacked = { @@ -66,15 +66,15 @@ export module ChartOptions { scales: { xAxes: [{ display: true, - stacked: true + stacked: true, }], yAxes: [{ ticks: { - beginAtZero: true + beginAtZero: true, }, - stacked: true - }] + stacked: true, + }], }, - maintainAspectRatio: false + maintainAspectRatio: false, }; -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/cards/support-card.component.ts b/frontend/app/features/dashboard/pages/cards/support-card.component.ts index 24a9aaa10..e7e9263ae 100644 --- a/frontend/app/features/dashboard/pages/cards/support-card.component.ts +++ b/frontend/app/features/dashboard/pages/cards/support-card.component.ts @@ -13,11 +13,11 @@ import { AppDto, fadeAnimation } from '@app/shared'; styleUrls: ['./support-card.component.scss'], templateUrl: './support-card.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SupportCardComponent { @Input() public app: AppDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/dashboard/pages/dashboard-config.component.ts b/frontend/app/features/dashboard/pages/dashboard-config.component.ts index 1ef88a613..938861aab 100644 --- a/frontend/app/features/dashboard/pages/dashboard-config.component.ts +++ b/frontend/app/features/dashboard/pages/dashboard-config.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; import { AppDto, AppsState, AuthService, DialogModel, DialogService, fadeAnimation, ModalModel, Types, UIState } from '@app/shared'; import { GridsterItem } from 'angular-gridster2'; @@ -17,8 +15,8 @@ import { take } from 'rxjs/operators'; styleUrls: ['./dashboard-config.component.scss'], templateUrl: './dashboard-config.component.html', animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class DashboardConfigComponent implements OnChanges { @Input() @@ -44,7 +42,7 @@ export class DashboardConfigComponent implements OnChanges { public readonly appsState: AppsState, public readonly authState: AuthService, private readonly dialogs: DialogService, - private readonly uiState: UIState + private readonly uiState: UIState, ) { } @@ -123,5 +121,5 @@ const DEFAULT_CONFIG: GridsterItem[] = [ { cols: 2, rows: 1, x: 2, y: 3, type: 'api-traffic', name: 'i18n:dashboard.trafficChart' }, { cols: 1, rows: 1, x: 0, y: 4, type: 'api-traffic-summary', name: 'i18n:dashboard.trafficSummaryCard' }, - { cols: 2, rows: 1, x: 1, y: 4, type: 'history', name: 'i18n:dashboard.historyCard' } -]; \ No newline at end of file + { cols: 2, rows: 1, x: 1, y: 4, type: 'history', name: 'i18n:dashboard.historyCard' }, +]; diff --git a/frontend/app/features/dashboard/pages/dashboard-page.component.scss b/frontend/app/features/dashboard/pages/dashboard-page.component.scss index 98d79a0de..d361f88d4 100644 --- a/frontend/app/features/dashboard/pages/dashboard-page.component.scss +++ b/frontend/app/features/dashboard/pages/dashboard-page.component.scss @@ -91,7 +91,7 @@ gridster-item { &-href { &:hover { - @include box-shadow-outer(0, 3px, 16px, .2px); + @include box-shadow-outer(0, 3px, 16px, .2); } } } diff --git a/frontend/app/features/dashboard/pages/dashboard-page.component.ts b/frontend/app/features/dashboard/pages/dashboard-page.component.ts index 4b5fb4a42..501a05d6f 100644 --- a/frontend/app/features/dashboard/pages/dashboard-page.component.ts +++ b/frontend/app/features/dashboard/pages/dashboard-page.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { AfterViewInit, Component, NgZone, OnInit, Renderer2, ViewChild } from '@angular/core'; import { AppsState, AuthService, CallsUsageDto, CurrentStorageDto, DateTime, defined, fadeAnimation, LocalStoreService, ResourceOwner, Settings, StorageUsagePerDateDto, switchSafe, UsagesService } from '@app/shared'; import { GridsterComponent, GridsterConfig, GridsterItem, GridType } from 'angular-gridster2'; @@ -16,8 +14,8 @@ import { GridsterComponent, GridsterConfig, GridsterItem, GridType } from 'angul styleUrls: ['./dashboard-page.component.scss'], templateUrl: './dashboard-page.component.html', animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class DashboardPageComponent extends ResourceOwner implements AfterViewInit, OnInit { @ViewChild('grid') @@ -45,7 +43,7 @@ export class DashboardPageComponent extends ResourceOwner implements AfterViewIn private readonly localStore: LocalStoreService, private readonly renderer: Renderer2, private readonly usagesService: UsagesService, - private readonly zone: NgZone + private readonly zone: NgZone, ) { super(); @@ -107,7 +105,7 @@ export class DashboardPageComponent extends ResourceOwner implements AfterViewIn const DEFAULT_OPTIONS: GridsterConfig = { displayGrid: 'onDrag&Resize', draggable: { - enabled: true + enabled: true, }, fixedColWidth: 254, fixedRowHeight: 254, @@ -120,6 +118,6 @@ const DEFAULT_OPTIONS: GridsterConfig = { outerMarginRight: 16, outerMarginTop: 120, resizable: { - enabled: true - } -}; \ No newline at end of file + enabled: true, + }, +}; diff --git a/frontend/app/features/rules/declarations.ts b/frontend/app/features/rules/declarations.ts index bece8a1f5..534009fff 100644 --- a/frontend/app/features/rules/declarations.ts +++ b/frontend/app/features/rules/declarations.ts @@ -20,4 +20,4 @@ export * from './shared/triggers/asset-changed-trigger.component'; export * from './shared/triggers/comment-trigger.component'; export * from './shared/triggers/content-changed-trigger.component'; export * from './shared/triggers/schema-changed-trigger.component'; -export * from './shared/triggers/usage-trigger.component'; \ No newline at end of file +export * from './shared/triggers/usage-trigger.component'; diff --git a/frontend/app/features/rules/index.ts b/frontend/app/features/rules/index.ts index da0f82225..898be9a7c 100644 --- a/frontend/app/features/rules/index.ts +++ b/frontend/app/features/rules/index.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/features/rules/module.ts b/frontend/app/features/rules/module.ts index 38a193b1c..11302f01b 100644 --- a/frontend/app/features/rules/module.ts +++ b/frontend/app/features/rules/module.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { HelpComponent, RuleMustExistGuard, SqxFrameworkModule, SqxSharedModule } from '@app/shared'; @@ -23,20 +21,20 @@ const routes: Routes = [ children: [ { path: 'events', - component: RuleEventsPageComponent + component: RuleEventsPageComponent, }, { path: 'simulator', - component: RuleSimulatorPageComponent + component: RuleSimulatorPageComponent, }, { path: 'help', component: HelpComponent, data: { - helpPage: '05-integrated/rules' - } - } - ] + helpPage: '05-integrated/rules', + }, + }, + ], }, { path: ':ruleId', component: RulePageComponent, @@ -44,28 +42,28 @@ const routes: Routes = [ children: [ { path: 'events', - component: RuleEventsPageComponent + component: RuleEventsPageComponent, }, { path: 'simulator', - component: RuleSimulatorPageComponent + component: RuleSimulatorPageComponent, }, { path: 'help', component: HelpComponent, data: { - helpPage: '05-integrated/rules' - } - } - ] - } + helpPage: '05-integrated/rules', + }, + }, + ], + }, ]; @NgModule({ imports: [ RouterModule.forChild(routes), SqxFrameworkModule, - SqxSharedModule + SqxSharedModule, ], declarations: [ AssetChangedTriggerComponent, @@ -83,7 +81,7 @@ const routes: Routes = [ RulesPageComponent, SchemaChangedTriggerComponent, SimulatedRuleEventComponent, - UsageTriggerComponent - ] + UsageTriggerComponent, + ], }) -export class SqxFeatureRulesModule {} \ No newline at end of file +export class SqxFeatureRulesModule {} diff --git a/frontend/app/features/rules/pages/events/rule-event.component.ts b/frontend/app/features/rules/pages/events/rule-event.component.ts index 9e33bce77..484f04f7d 100644 --- a/frontend/app/features/rules/pages/events/rule-event.component.ts +++ b/frontend/app/features/rules/pages/events/rule-event.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: component-selector - import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { RuleEventDto } from '@app/shared'; @@ -14,7 +12,7 @@ import { RuleEventDto } from '@app/shared'; selector: '[sqxRuleEvent]', styleUrls: ['./rule-event.component.scss'], templateUrl: './rule-event.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RuleEventComponent { @Input('sqxRuleEvent') diff --git a/frontend/app/features/rules/pages/events/rule-events-page.component.ts b/frontend/app/features/rules/pages/events/rule-events-page.component.ts index 120d79784..834c35615 100644 --- a/frontend/app/features/rules/pages/events/rule-events-page.component.ts +++ b/frontend/app/features/rules/pages/events/rule-events-page.component.ts @@ -14,8 +14,8 @@ import { ResourceOwner, Router2State, RuleEventDto, RuleEventsState } from '@app styleUrls: ['./rule-events-page.component.scss'], templateUrl: './rule-events-page.component.html', providers: [ - Router2State - ] + Router2State, + ], }) export class RuleEventsPageComponent extends ResourceOwner implements OnInit { public selectedEventId: string | null = null; @@ -23,7 +23,7 @@ export class RuleEventsPageComponent extends ResourceOwner implements OnInit { constructor( private readonly route: ActivatedRoute, public readonly ruleEventsRoute: Router2State, - public readonly ruleEventsState: RuleEventsState + public readonly ruleEventsState: RuleEventsState, ) { super(); } @@ -66,4 +66,4 @@ export class RuleEventsPageComponent extends ResourceOwner implements OnInit { public trackByRuleEvent(_index: number, ruleEvent: RuleEventDto) { return ruleEvent.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/pages/rule/rule-page.component.ts b/frontend/app/features/rules/pages/rule/rule-page.component.ts index d30158e3c..df618597e 100644 --- a/frontend/app/features/rules/pages/rule/rule-page.component.ts +++ b/frontend/app/features/rules/pages/rule/rule-page.component.ts @@ -10,12 +10,12 @@ import { FormBuilder } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { ActionForm, ALL_TRIGGERS, ResourceOwner, RuleDto, RuleElementDto, RulesService, RulesState, SchemasState, TriggerForm } from '@app/shared'; -type ComponentState = { type: string; values: any; form: T; }; +type ComponentState = { type: string; values: any; form: T }; @Component({ selector: 'sqx-rule-page', styleUrls: ['./rule-page.component.scss'], - templateUrl: './rule-page.component.html' + templateUrl: './rule-page.component.html', }) export class RulePageComponent extends ResourceOwner implements OnInit { public supportedActions: { [name: string]: RuleElementDto }; @@ -43,7 +43,7 @@ export class RulePageComponent extends ResourceOwner implements OnInit { public readonly schemasState: SchemasState, private readonly formBuilder: FormBuilder, private readonly route: ActivatedRoute, - private readonly router: Router + private readonly router: Router, ) { super(); } @@ -81,7 +81,6 @@ export class RulePageComponent extends ResourceOwner implements OnInit { this.resetAction(); this.resetTrigger(); } - } public selectAction(type: string, values = {}) { diff --git a/frontend/app/features/rules/pages/rules/rule.component.ts b/frontend/app/features/rules/pages/rules/rule.component.ts index 468137ce2..7ec298c30 100644 --- a/frontend/app/features/rules/pages/rules/rule.component.ts +++ b/frontend/app/features/rules/pages/rules/rule.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: component-selector - import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { ActionsDto, fadeAnimation, ModalModel, RuleDto, RulesState, TriggersDto } from '@app/shared'; @@ -15,9 +13,9 @@ import { ActionsDto, fadeAnimation, ModalModel, RuleDto, RulesState, TriggersDto styleUrls: ['./rule.component.scss'], templateUrl: './rule.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RuleComponent { @Input() @@ -36,7 +34,7 @@ export class RuleComponent { } constructor( - private readonly rulesState: RulesState + private readonly rulesState: RulesState, ) { } @@ -63,4 +61,4 @@ export class RuleComponent { public trigger() { this.rulesState.trigger(this.rule); } -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/pages/rules/rules-page.component.ts b/frontend/app/features/rules/pages/rules/rules-page.component.ts index 68acf0f00..02ca631e2 100644 --- a/frontend/app/features/rules/pages/rules/rules-page.component.ts +++ b/frontend/app/features/rules/pages/rules/rules-page.component.ts @@ -11,7 +11,7 @@ import { ALL_TRIGGERS, RuleDto, RuleElementDto, RulesService, RulesState, Schema @Component({ selector: 'sqx-rules-page', styleUrls: ['./rules-page.component.scss'], - templateUrl: './rules-page.component.html' + templateUrl: './rules-page.component.html', }) export class RulesPageComponent implements OnInit { public supportedActions: { [name: string]: RuleElementDto }; @@ -20,7 +20,7 @@ export class RulesPageComponent implements OnInit { constructor( public readonly rulesState: RulesState, public readonly rulesService: RulesService, - public readonly schemasState: SchemasState + public readonly schemasState: SchemasState, ) { } diff --git a/frontend/app/features/rules/pages/simulator/rule-simulator-page.component.ts b/frontend/app/features/rules/pages/simulator/rule-simulator-page.component.ts index bb0818bd7..633a76299 100644 --- a/frontend/app/features/rules/pages/simulator/rule-simulator-page.component.ts +++ b/frontend/app/features/rules/pages/simulator/rule-simulator-page.component.ts @@ -12,14 +12,14 @@ import { ResourceOwner, RuleSimulatorState, SimulatedRuleEventDto } from '@app/s @Component({ selector: 'sqx-simulator-events-page', styleUrls: ['./rule-simulator-page.component.scss'], - templateUrl: './rule-simulator-page.component.html' + templateUrl: './rule-simulator-page.component.html', }) export class RuleSimulatorPageComponent extends ResourceOwner implements OnInit { public selectedRuleEvent?: SimulatedRuleEventDto | null; constructor( private route: ActivatedRoute, - public readonly ruleSimulatorState: RuleSimulatorState + public readonly ruleSimulatorState: RuleSimulatorState, ) { super(); } @@ -43,4 +43,4 @@ export class RuleSimulatorPageComponent extends ResourceOwner implements OnInit this.selectedRuleEvent = event; } } -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/pages/simulator/simulated-rule-event.component.ts b/frontend/app/features/rules/pages/simulator/simulated-rule-event.component.ts index 118e2e9ed..11640c9ec 100644 --- a/frontend/app/features/rules/pages/simulator/simulated-rule-event.component.ts +++ b/frontend/app/features/rules/pages/simulator/simulated-rule-event.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: component-selector - import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { SimulatedRuleEventDto } from '@app/shared'; @@ -14,7 +12,7 @@ import { SimulatedRuleEventDto } from '@app/shared'; selector: '[sqxSimulatedRuleEvent]', styleUrls: ['./simulated-rule-event.component.scss'], templateUrl: './simulated-rule-event.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SimulatedRuleEventComponent { @Input('sqxSimulatedRuleEvent') diff --git a/frontend/app/features/rules/shared/actions/formattable-input.component.ts b/frontend/app/features/rules/shared/actions/formattable-input.component.ts index 20fab4c5e..bc98eb98a 100644 --- a/frontend/app/features/rules/shared/actions/formattable-input.component.ts +++ b/frontend/app/features/rules/shared/actions/formattable-input.component.ts @@ -10,7 +10,7 @@ import { ControlValueAccessor, DefaultValueAccessor, NG_VALUE_ACCESSOR } from '@ import { CodeEditorComponent, Types } from '@app/framework'; export const SQX_FORMATTABLE_INPUT_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FormattableInputComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FormattableInputComponent), multi: true, }; type TemplateMode = 'Text' | 'Script' | 'Liquid'; @@ -22,9 +22,9 @@ const MODES: ReadonlyArray = ['Text', 'Script', 'Liquid']; styleUrls: ['./formattable-input.component.scss'], templateUrl: './formattable-input.component.html', providers: [ - SQX_FORMATTABLE_INPUT_CONTROL_VALUE_ACCESSOR + SQX_FORMATTABLE_INPUT_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormattableInputComponent implements ControlValueAccessor, AfterViewInit { private fnChanged = (_: any) => { /* NOOP */ }; @@ -147,4 +147,4 @@ export class FormattableInputComponent implements ControlValueAccessor, AfterVie return value; } -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/shared/actions/generic-action.component.ts b/frontend/app/features/rules/shared/actions/generic-action.component.ts index 3e923337c..3438d3ae6 100644 --- a/frontend/app/features/rules/shared/actions/generic-action.component.ts +++ b/frontend/app/features/rules/shared/actions/generic-action.component.ts @@ -12,9 +12,9 @@ import { ActionForm } from '@app/shared'; selector: 'sqx-generic-action', styleUrls: ['./generic-action.component.scss'], templateUrl: './generic-action.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class GenericActionComponent { @Input() public actionForm: ActionForm; -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/shared/rule-element.component.ts b/frontend/app/features/rules/shared/rule-element.component.ts index ee0da2b1e..187c1a28e 100644 --- a/frontend/app/features/rules/shared/rule-element.component.ts +++ b/frontend/app/features/rules/shared/rule-element.component.ts @@ -12,7 +12,7 @@ import { RuleElementDto } from '@app/shared'; selector: 'sqx-rule-element', styleUrls: ['./rule-element.component.scss'], templateUrl: './rule-element.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RuleElementComponent { @Input() @@ -26,4 +26,4 @@ export class RuleElementComponent { @Input() public disabled: boolean; -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/shared/rule-icon.component.ts b/frontend/app/features/rules/shared/rule-icon.component.ts index 36e63bb6e..bae24c238 100644 --- a/frontend/app/features/rules/shared/rule-icon.component.ts +++ b/frontend/app/features/rules/shared/rule-icon.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: component-selector - import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { RuleElementDto } from '@app/shared'; @@ -14,7 +12,7 @@ import { RuleElementDto } from '@app/shared'; selector: 'sqx-rule-icon', styleUrls: ['./rule-icon.component.scss'], templateUrl: './rule-icon.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RuleIconComponent { @Input() @@ -22,4 +20,4 @@ export class RuleIconComponent { @Input() public size: 'sm' | 'md' | 'lg' = 'sm'; -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/shared/triggers/asset-changed-trigger.component.ts b/frontend/app/features/rules/shared/triggers/asset-changed-trigger.component.ts index f3b83e4a3..468307151 100644 --- a/frontend/app/features/rules/shared/triggers/asset-changed-trigger.component.ts +++ b/frontend/app/features/rules/shared/triggers/asset-changed-trigger.component.ts @@ -11,7 +11,7 @@ import { TriggerForm } from '@app/shared'; @Component({ selector: 'sqx-asset-changed-trigger', styleUrls: ['./asset-changed-trigger.component.scss'], - templateUrl: './asset-changed-trigger.component.html' + templateUrl: './asset-changed-trigger.component.html', }) export class AssetChangedTriggerComponent { @Input() @@ -19,4 +19,4 @@ export class AssetChangedTriggerComponent { @Input() public triggerForm: TriggerForm; -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/shared/triggers/comment-trigger.component.ts b/frontend/app/features/rules/shared/triggers/comment-trigger.component.ts index 8e50aa12a..0fbad7c66 100644 --- a/frontend/app/features/rules/shared/triggers/comment-trigger.component.ts +++ b/frontend/app/features/rules/shared/triggers/comment-trigger.component.ts @@ -11,7 +11,7 @@ import { TriggerForm } from '@app/shared'; @Component({ selector: 'sqx-comment-trigger', styleUrls: ['./comment-trigger.component.scss'], - templateUrl: './comment-trigger.component.html' + templateUrl: './comment-trigger.component.html', }) export class CommentTriggerComponent { @Input() @@ -19,4 +19,4 @@ export class CommentTriggerComponent { @Input() public triggerForm: TriggerForm; -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/shared/triggers/content-changed-trigger.component.ts b/frontend/app/features/rules/shared/triggers/content-changed-trigger.component.ts index 91a4cf194..12a5356cf 100644 --- a/frontend/app/features/rules/shared/triggers/content-changed-trigger.component.ts +++ b/frontend/app/features/rules/shared/triggers/content-changed-trigger.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { Component, Input, OnChanges } from '@angular/core'; import { SchemaDto, TriggerForm } from '@app/shared'; @@ -19,7 +17,7 @@ export interface TriggerSchemaForm { @Component({ selector: 'sqx-content-changed-trigger', styleUrls: ['./content-changed-trigger.component.scss'], - templateUrl: './content-changed-trigger.component.html' + templateUrl: './content-changed-trigger.component.html', }) export class ContentChangedTriggerComponent implements OnChanges { @Input() @@ -77,7 +75,7 @@ export class ContentChangedTriggerComponent implements OnChanges { } public updateCondition(schema: SchemaDto, condition: string) { - this.triggerSchemas = this.triggerSchemas.map(s => s.schema === schema ? { schema, condition } : s); + this.triggerSchemas = this.triggerSchemas.map(s => (s.schema === schema ? { schema, condition } : s)); this.updateValue(); } @@ -96,4 +94,4 @@ export class ContentChangedTriggerComponent implements OnChanges { public trackBySchema(_index: number, schema: SchemaDto) { return schema.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/shared/triggers/schema-changed-trigger.component.ts b/frontend/app/features/rules/shared/triggers/schema-changed-trigger.component.ts index 3a06a315c..e31079a14 100644 --- a/frontend/app/features/rules/shared/triggers/schema-changed-trigger.component.ts +++ b/frontend/app/features/rules/shared/triggers/schema-changed-trigger.component.ts @@ -11,7 +11,7 @@ import { TriggerForm } from '@app/shared'; @Component({ selector: 'sqx-schema-changed-trigger', styleUrls: ['./schema-changed-trigger.component.scss'], - templateUrl: './schema-changed-trigger.component.html' + templateUrl: './schema-changed-trigger.component.html', }) export class SchemaChangedTriggerComponent { @Input() @@ -19,4 +19,4 @@ export class SchemaChangedTriggerComponent { @Input() public triggerForm: TriggerForm; -} \ No newline at end of file +} diff --git a/frontend/app/features/rules/shared/triggers/usage-trigger.component.ts b/frontend/app/features/rules/shared/triggers/usage-trigger.component.ts index c14e16837..b8ea7d20b 100644 --- a/frontend/app/features/rules/shared/triggers/usage-trigger.component.ts +++ b/frontend/app/features/rules/shared/triggers/usage-trigger.component.ts @@ -11,9 +11,9 @@ import { TriggerForm } from '@app/shared'; @Component({ selector: 'sqx-usage-trigger', styleUrls: ['./usage-trigger.component.scss'], - templateUrl: './usage-trigger.component.html' + templateUrl: './usage-trigger.component.html', }) export class UsageTriggerComponent { @Input() public triggerForm: TriggerForm; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/declarations.ts b/frontend/app/features/schemas/declarations.ts index b6835491b..655d6e576 100644 --- a/frontend/app/features/schemas/declarations.ts +++ b/frontend/app/features/schemas/declarations.ts @@ -44,4 +44,4 @@ export * from './pages/schema/scripts/schema-scripts-form.component'; export * from './pages/schema/ui/field-list.component'; export * from './pages/schema/ui/schema-ui-form.component'; export * from './pages/schemas/schema-form.component'; -export * from './pages/schemas/schemas-page.component'; \ No newline at end of file +export * from './pages/schemas/schemas-page.component'; diff --git a/frontend/app/features/schemas/index.ts b/frontend/app/features/schemas/index.ts index da0f82225..898be9a7c 100644 --- a/frontend/app/features/schemas/index.ts +++ b/frontend/app/features/schemas/index.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/features/schemas/module.ts b/frontend/app/features/schemas/module.ts index e3e4ae79a..71096f048 100644 --- a/frontend/app/features/schemas/module.ts +++ b/frontend/app/features/schemas/module.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { HelpComponent, LoadSchemasGuard, SchemaMustExistGuard, SqxFrameworkModule, SqxSharedModule } from '@app/shared'; @@ -29,23 +27,23 @@ const routes: Routes = [ path: 'help', component: HelpComponent, data: { - helpPage: '05-integrated/schemas' - } - } - ] - } - ] - } + helpPage: '05-integrated/schemas', + }, + }, + ], + }, + ], + }, ]; @NgModule({ imports: [ RouterModule.forChild(routes), SqxFrameworkModule, - SqxSharedModule + SqxSharedModule, ], providers: [ - SchemaMustExistGuard + SchemaMustExistGuard, ], declarations: [ ArrayValidationComponent, @@ -87,7 +85,7 @@ const routes: Routes = [ StringUIComponent, StringValidationComponent, TagsUIComponent, - TagsValidationComponent - ] + TagsValidationComponent, + ], }) -export class SqxFeatureSchemasModule {} \ No newline at end of file +export class SqxFeatureSchemasModule {} diff --git a/frontend/app/features/schemas/pages/messages.ts b/frontend/app/features/schemas/pages/messages.ts index f0a5205ce..a4f7249da 100644 --- a/frontend/app/features/schemas/pages/messages.ts +++ b/frontend/app/features/schemas/pages/messages.ts @@ -7,7 +7,7 @@ export class SchemaCloning { constructor( - public readonly schema: any + public readonly schema: any, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/common/schema-edit-form.component.ts b/frontend/app/features/schemas/pages/schema/common/schema-edit-form.component.ts index 16ab01073..a488d4f5e 100644 --- a/frontend/app/features/schemas/pages/schema/common/schema-edit-form.component.ts +++ b/frontend/app/features/schemas/pages/schema/common/schema-edit-form.component.ts @@ -12,7 +12,7 @@ import { EditSchemaForm, SchemaDto, SchemasState } from '@app/shared'; @Component({ selector: 'sqx-schema-edit-form', styleUrls: ['./schema-edit-form.component.scss'], - templateUrl: './schema-edit-form.component.html' + templateUrl: './schema-edit-form.component.html', }) export class SchemaEditFormComponent implements OnChanges { @Input() @@ -24,7 +24,7 @@ export class SchemaEditFormComponent implements OnChanges { constructor( private readonly formBuilder: FormBuilder, - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { } @@ -51,4 +51,4 @@ export class SchemaEditFormComponent implements OnChanges { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/export/schema-export-form.component.ts b/frontend/app/features/schemas/pages/schema/export/schema-export-form.component.ts index 7e31e9ec0..42847ee19 100644 --- a/frontend/app/features/schemas/pages/schema/export/schema-export-form.component.ts +++ b/frontend/app/features/schemas/pages/schema/export/schema-export-form.component.ts @@ -12,7 +12,7 @@ import { SchemaDto, SchemasState, SynchronizeSchemaForm } from '@app/shared'; @Component({ selector: 'sqx-schema-export-form', styleUrls: ['./schema-export-form.component.scss'], - templateUrl: './schema-export-form.component.html' + templateUrl: './schema-export-form.component.html', }) export class SchemaExportFormComponent implements OnChanges { @Input() @@ -24,7 +24,7 @@ export class SchemaExportFormComponent implements OnChanges { constructor( private readonly formBuilder: FormBuilder, - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { } @@ -50,4 +50,4 @@ export class SchemaExportFormComponent implements OnChanges { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/field-wizard.component.ts b/frontend/app/features/schemas/pages/schema/fields/field-wizard.component.ts index 2304a2730..827607d8c 100644 --- a/frontend/app/features/schemas/pages/schema/fields/field-wizard.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/field-wizard.component.ts @@ -14,7 +14,7 @@ const DEFAULT_FIELD = { name: '', partitioning: 'invariant', properties: createP @Component({ selector: 'sqx-field-wizard', styleUrls: ['./field-wizard.component.scss'], - templateUrl: './field-wizard.component.html' + templateUrl: './field-wizard.component.html', }) export class FieldWizardComponent implements OnInit { @ViewChild('nameInput', { static: false }) @@ -46,7 +46,7 @@ export class FieldWizardComponent implements OnInit { constructor( private readonly formBuilder: FormBuilder, private readonly schemasState: SchemasState, - public readonly languagesState: LanguagesState + public readonly languagesState: LanguagesState, ) { } diff --git a/frontend/app/features/schemas/pages/schema/fields/field.component.ts b/frontend/app/features/schemas/pages/schema/fields/field.component.ts index 0681b9b28..122935d0d 100644 --- a/frontend/app/features/schemas/pages/schema/fields/field.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/field.component.ts @@ -15,8 +15,8 @@ import { AppSettingsDto, createProperties, DialogModel, EditFieldForm, fadeAnima styleUrls: ['./field.component.scss'], templateUrl: './field.component.html', animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class FieldComponent implements OnChanges { @Input() @@ -51,7 +51,7 @@ export class FieldComponent implements OnChanges { constructor( private readonly formBuilder: FormBuilder, - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { this.trackByFieldFn = this.trackByField.bind(this); } @@ -94,7 +94,7 @@ export class FieldComponent implements OnChanges { } public sortFields(event: CdkDragDrop>) { - this.schemasState.orderFields(this.schema, sorted(event), this.field).subscribe(); + this.schemasState.orderFields(this.schema, sorted(event), this.field as any).subscribe(); } public lockField() { @@ -123,4 +123,4 @@ export class FieldComponent implements OnChanges { public trackByField(_index: number, field: NestedFieldDto) { return field.fieldId + this.schema.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/forms/field-form-common.component.ts b/frontend/app/features/schemas/pages/schema/fields/forms/field-form-common.component.ts index e87b8d195..652fa490f 100644 --- a/frontend/app/features/schemas/pages/schema/fields/forms/field-form-common.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/forms/field-form-common.component.ts @@ -12,7 +12,7 @@ import { FieldDto } from '@app/shared'; @Component({ selector: 'sqx-field-form-common', styleUrls: ['./field-form-common.component.scss'], - templateUrl: './field-form-common.component.html' + templateUrl: './field-form-common.component.html', }) export class FieldFormCommonComponent { @Input() @@ -20,4 +20,4 @@ export class FieldFormCommonComponent { @Input() public field: FieldDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.ts index bfecc0da5..aa5a8fedf 100644 --- a/frontend/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/forms/field-form-ui.component.ts @@ -12,7 +12,7 @@ import { FieldDto } from '@app/shared'; @Component({ selector: 'sqx-field-form-ui', styleUrls: ['./field-form-ui.component.scss'], - templateUrl: './field-form-ui.component.html' + templateUrl: './field-form-ui.component.html', }) export class FieldFormUIComponent { @Input() @@ -20,4 +20,4 @@ export class FieldFormUIComponent { @Input() public field: FieldDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.ts index 8b2052c0f..024c0d0a7 100644 --- a/frontend/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/forms/field-form-validation.component.ts @@ -12,7 +12,7 @@ import { AppSettingsDto, FieldDto, LanguageDto } from '@app/shared'; @Component({ selector: 'sqx-field-form-validation', styleUrls: ['./field-form-validation.component.scss'], - templateUrl: './field-form-validation.component.html' + templateUrl: './field-form-validation.component.html', }) export class FieldFormValidationComponent { @Input() @@ -29,4 +29,4 @@ export class FieldFormValidationComponent { @Input() public isLocalizable?: boolean | null; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/forms/field-form.component.ts b/frontend/app/features/schemas/pages/schema/fields/forms/field-form.component.ts index 34105dfec..7eb521b2a 100644 --- a/frontend/app/features/schemas/pages/schema/fields/forms/field-form.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/forms/field-form.component.ts @@ -12,7 +12,7 @@ import { AppSettingsDto, FieldDto, LanguageDto } from '@app/shared'; @Component({ selector: 'sqx-field-form', styleUrls: ['./field-form.component.scss'], - templateUrl: './field-form.component.html' + templateUrl: './field-form.component.html', }) export class FieldFormComponent implements AfterViewInit { @Input() @@ -52,4 +52,4 @@ export class FieldFormComponent implements AfterViewInit { public selectTab(tab: number) { this.selectedTab = tab; } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/schema-fields.component.ts b/frontend/app/features/schemas/pages/schema/fields/schema-fields.component.ts index 33fd252a1..5af9e4fab 100644 --- a/frontend/app/features/schemas/pages/schema/fields/schema-fields.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/schema-fields.component.ts @@ -12,7 +12,7 @@ import { AppsState, DialogModel, FieldDto, fieldTypes, LanguagesState, SchemaDto @Component({ selector: 'sqx-schema-fields', styleUrls: ['./schema-fields.component.scss'], - templateUrl: './schema-fields.component.html' + templateUrl: './schema-fields.component.html', }) export class SchemaFieldsComponent implements OnInit { public fieldTypes = fieldTypes; @@ -27,7 +27,7 @@ export class SchemaFieldsComponent implements OnInit { constructor( public readonly appsState: AppsState, public readonly schemasState: SchemasState, - public readonly languageState: LanguagesState + public readonly languageState: LanguagesState, ) { this.trackByFieldFn = this.trackByField.bind(this); } @@ -43,4 +43,4 @@ export class SchemaFieldsComponent implements OnInit { public trackByField(_index: number, field: FieldDto) { return field.fieldId + this.schema.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/array-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/array-validation.component.ts index 3be3ef3a3..6832b993e 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/array-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/array-validation.component.ts @@ -12,7 +12,7 @@ import { ArrayFieldPropertiesDto, FieldDto, SchemaTagSource } from '@app/shared' @Component({ selector: 'sqx-array-validation', styleUrls: ['array-validation.component.scss'], - templateUrl: 'array-validation.component.html' + templateUrl: 'array-validation.component.html', }) export class ArrayValidationComponent { @Input() @@ -25,7 +25,7 @@ export class ArrayValidationComponent { public properties: ArrayFieldPropertiesDto; constructor( - public readonly schemasSource: SchemaTagSource + public readonly schemasSource: SchemaTagSource, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts index 0f0c6b02a..21158e4af 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts @@ -12,7 +12,7 @@ import { AssetsFieldPropertiesDto, FieldDto } from '@app/shared'; @Component({ selector: 'sqx-assets-ui', styleUrls: ['assets-ui.component.scss'], - templateUrl: 'assets-ui.component.html' + templateUrl: 'assets-ui.component.html', }) export class AssetsUIComponent { @Input() @@ -23,4 +23,4 @@ export class AssetsUIComponent { @Input() public properties: AssetsFieldPropertiesDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/assets-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/assets-validation.component.ts index f5d8b57a4..efa248530 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/assets-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/assets-validation.component.ts @@ -12,7 +12,7 @@ import { AssetsFieldPropertiesDto, FieldDto, LanguageDto } from '@app/shared'; @Component({ selector: 'sqx-assets-validation', styleUrls: ['assets-validation.component.scss'], - templateUrl: 'assets-validation.component.html' + templateUrl: 'assets-validation.component.html', }) export class AssetsValidationComponent { @Input() @@ -29,4 +29,4 @@ export class AssetsValidationComponent { @Input() public isLocalizable?: boolean | null; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/boolean-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/boolean-ui.component.ts index d794cc453..eac8ebcb2 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/boolean-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/boolean-ui.component.ts @@ -12,7 +12,7 @@ import { BooleanFieldPropertiesDto, BOOLEAN_FIELD_EDITORS, FieldDto } from '@app @Component({ selector: 'sqx-boolean-ui', styleUrls: ['boolean-ui.component.scss'], - templateUrl: 'boolean-ui.component.html' + templateUrl: 'boolean-ui.component.html', }) export class BooleanUIComponent { @Input() @@ -25,4 +25,4 @@ export class BooleanUIComponent { public properties: BooleanFieldPropertiesDto; public editors = BOOLEAN_FIELD_EDITORS; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/boolean-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/boolean-validation.component.ts index 207cbc8da..3c98d6b6f 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/boolean-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/boolean-validation.component.ts @@ -13,7 +13,7 @@ import { Observable } from 'rxjs'; @Component({ selector: 'sqx-boolean-validation', styleUrls: ['boolean-validation.component.scss'], - templateUrl: 'boolean-validation.component.html' + templateUrl: 'boolean-validation.component.html', }) export class BooleanValidationComponent implements OnChanges { @Input() @@ -39,4 +39,4 @@ export class BooleanValidationComponent implements OnChanges { hasNoValue$(this.fieldForm.controls['isRequired']); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/component-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/component-ui.component.ts index 63adeb36e..3b8969d18 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/component-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/component-ui.component.ts @@ -12,7 +12,7 @@ import { FieldDto, ReferencesFieldPropertiesDto } from '@app/shared'; @Component({ selector: 'sqx-component-ui', styleUrls: ['component-ui.component.scss'], - templateUrl: 'component-ui.component.html' + templateUrl: 'component-ui.component.html', }) export class ComponentUIComponent { @Input() @@ -23,4 +23,4 @@ export class ComponentUIComponent { @Input() public properties: ReferencesFieldPropertiesDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/component-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/component-validation.component.ts index e3414b966..f5dc27e3b 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/component-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/component-validation.component.ts @@ -12,7 +12,7 @@ import { FieldDto, ReferencesFieldPropertiesDto, SchemaTagSource } from '@app/sh @Component({ selector: 'sqx-component-validation', styleUrls: ['component-validation.component.scss'], - templateUrl: 'component-validation.component.html' + templateUrl: 'component-validation.component.html', }) export class ComponentValidationComponent { @Input() @@ -25,7 +25,7 @@ export class ComponentValidationComponent { public properties: ReferencesFieldPropertiesDto; constructor( - public readonly schemasSource: SchemaTagSource + public readonly schemasSource: SchemaTagSource, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/components-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/components-ui.component.ts index f14f070d0..f9e614204 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/components-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/components-ui.component.ts @@ -12,7 +12,7 @@ import { FieldDto, ReferencesFieldPropertiesDto } from '@app/shared'; @Component({ selector: 'sqx-components-ui', styleUrls: ['components-ui.component.scss'], - templateUrl: 'components-ui.component.html' + templateUrl: 'components-ui.component.html', }) export class ComponentsUIComponent { @Input() @@ -23,4 +23,4 @@ export class ComponentsUIComponent { @Input() public properties: ReferencesFieldPropertiesDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/components-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/components-validation.component.ts index 0739e9485..9a6b41db3 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/components-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/components-validation.component.ts @@ -12,7 +12,7 @@ import { FieldDto, ReferencesFieldPropertiesDto, SchemaTagSource } from '@app/sh @Component({ selector: 'sqx-components-validation', styleUrls: ['components-validation.component.scss'], - templateUrl: 'components-validation.component.html' + templateUrl: 'components-validation.component.html', }) export class ComponentsValidationComponent { @Input() @@ -25,7 +25,7 @@ export class ComponentsValidationComponent { public properties: ReferencesFieldPropertiesDto; constructor( - public readonly schemasSource: SchemaTagSource + public readonly schemasSource: SchemaTagSource, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/date-time-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/date-time-ui.component.ts index 5ad46ebe7..d34ac3f78 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/date-time-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/date-time-ui.component.ts @@ -12,7 +12,7 @@ import { DateTimeFieldPropertiesDto, DATETIME_FIELD_EDITORS, FieldDto, FloatConv @Component({ selector: 'sqx-date-time-ui', styleUrls: ['date-time-ui.component.scss'], - templateUrl: 'date-time-ui.component.html' + templateUrl: 'date-time-ui.component.html', }) export class DateTimeUIComponent { public readonly converter = FloatConverter.INSTANCE; @@ -27,4 +27,4 @@ export class DateTimeUIComponent { public properties: DateTimeFieldPropertiesDto; public editors = DATETIME_FIELD_EDITORS; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/date-time-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/date-time-validation.component.ts index 6043d28df..7b49f8657 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/date-time-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/date-time-validation.component.ts @@ -15,7 +15,7 @@ const CALCULATED_DEFAULT_VALUES: ReadonlyArray = ['Now', 'Today']; @Component({ selector: 'sqx-date-time-validation', styleUrls: ['date-time-validation.component.scss'], - templateUrl: 'date-time-validation.component.html' + templateUrl: 'date-time-validation.component.html', }) export class DateTimeValidationComponent implements OnChanges { @Input() @@ -47,4 +47,4 @@ export class DateTimeValidationComponent implements OnChanges { hasNoValue$(this.fieldForm.controls['calculatedDefaultValue']); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/geolocation-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/geolocation-ui.component.ts index e25bb7a83..d198d78f4 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/geolocation-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/geolocation-ui.component.ts @@ -12,7 +12,7 @@ import { FieldDto, GeolocationFieldPropertiesDto } from '@app/shared'; @Component({ selector: 'sqx-geolocation-ui', styleUrls: ['geolocation-ui.component.scss'], - templateUrl: 'geolocation-ui.component.html' + templateUrl: 'geolocation-ui.component.html', }) export class GeolocationUIComponent { @Input() @@ -23,4 +23,4 @@ export class GeolocationUIComponent { @Input() public properties: GeolocationFieldPropertiesDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/geolocation-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/geolocation-validation.component.ts index 64db37dee..66b1cfec3 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/geolocation-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/geolocation-validation.component.ts @@ -12,7 +12,7 @@ import { FieldDto, GeolocationFieldPropertiesDto } from '@app/shared'; @Component({ selector: 'sqx-geolocation-validation', styleUrls: ['geolocation-validation.component.scss'], - templateUrl: 'geolocation-validation.component.html' + templateUrl: 'geolocation-validation.component.html', }) export class GeolocationValidationComponent { @Input() @@ -23,4 +23,4 @@ export class GeolocationValidationComponent { @Input() public properties: GeolocationFieldPropertiesDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/json-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/json-ui.component.ts index 8d7a48ef1..e6912d90b 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/json-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/json-ui.component.ts @@ -12,7 +12,7 @@ import { FieldDto, JsonFieldPropertiesDto } from '@app/shared'; @Component({ selector: 'sqx-json-ui', styleUrls: ['json-ui.component.scss'], - templateUrl: 'json-ui.component.html' + templateUrl: 'json-ui.component.html', }) export class JsonUIComponent { @Input() @@ -23,4 +23,4 @@ export class JsonUIComponent { @Input() public properties: JsonFieldPropertiesDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/json-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/json-validation.component.ts index ec55a7fac..94d09d6b2 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/json-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/json-validation.component.ts @@ -12,7 +12,7 @@ import { FieldDto, JsonFieldPropertiesDto } from '@app/shared'; @Component({ selector: 'sqx-json-validation', styleUrls: ['json-validation.component.scss'], - templateUrl: 'json-validation.component.html' + templateUrl: 'json-validation.component.html', }) export class JsonValidationComponent { @Input() @@ -23,4 +23,4 @@ export class JsonValidationComponent { @Input() public properties: JsonFieldPropertiesDto; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/number-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/number-ui.component.ts index e5f533691..f5c438ace 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/number-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/number-ui.component.ts @@ -14,7 +14,7 @@ import { map } from 'rxjs/operators'; @Component({ selector: 'sqx-number-ui', styleUrls: ['number-ui.component.scss'], - templateUrl: 'number-ui.component.html' + templateUrl: 'number-ui.component.html', }) export class NumberUIComponent extends ResourceOwner implements OnChanges { public readonly converter = FloatConverter.INSTANCE; @@ -58,4 +58,4 @@ export class NumberUIComponent extends ResourceOwner implements OnChanges { })); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/number-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/number-validation.component.ts index 7b6bb46e0..b42fe1565 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/number-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/number-validation.component.ts @@ -12,7 +12,7 @@ import { FieldDto, LanguageDto, NumberFieldPropertiesDto, RootFieldDto, Types } @Component({ selector: 'sqx-number-validation', styleUrls: ['number-validation.component.scss'], - templateUrl: 'number-validation.component.html' + templateUrl: 'number-validation.component.html', }) export class NumberValidationComponent { @Input() @@ -33,4 +33,4 @@ export class NumberValidationComponent { public get showUnique() { return Types.is(this.field, RootFieldDto) && !this.field.isLocalizable; } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/references-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/references-ui.component.ts index 7dbb7ba36..75906fa81 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/references-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/references-ui.component.ts @@ -12,7 +12,7 @@ import { FieldDto, ReferencesFieldPropertiesDto, REFERENCES_FIELD_EDITORS } from @Component({ selector: 'sqx-references-ui', styleUrls: ['references-ui.component.scss'], - templateUrl: 'references-ui.component.html' + templateUrl: 'references-ui.component.html', }) export class ReferencesUIComponent { @Input() @@ -25,4 +25,4 @@ export class ReferencesUIComponent { public properties: ReferencesFieldPropertiesDto; public editors = REFERENCES_FIELD_EDITORS; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/references-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/references-validation.component.ts index a8735aa11..13ae33fd4 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/references-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/references-validation.component.ts @@ -12,7 +12,7 @@ import { FieldDto, LanguageDto, ReferencesFieldPropertiesDto, SchemaTagSource } @Component({ selector: 'sqx-references-validation', styleUrls: ['references-validation.component.scss'], - templateUrl: 'references-validation.component.html' + templateUrl: 'references-validation.component.html', }) export class ReferencesValidationComponent { @Input() @@ -31,7 +31,7 @@ export class ReferencesValidationComponent { public isLocalizable?: boolean | null; constructor( - public readonly schemasSource: SchemaTagSource + public readonly schemasSource: SchemaTagSource, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/string-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/string-ui.component.ts index 38070a787..f615128f2 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/string-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/string-ui.component.ts @@ -14,7 +14,7 @@ import { map } from 'rxjs/operators'; @Component({ selector: 'sqx-string-ui', styleUrls: ['string-ui.component.scss'], - templateUrl: 'string-ui.component.html' + templateUrl: 'string-ui.component.html', }) export class StringUIComponent extends ResourceOwner implements OnChanges { @Input() @@ -56,4 +56,4 @@ export class StringUIComponent extends ResourceOwner implements OnChanges { })); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.ts index 51365f4a7..cc4e9692f 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/string-validation.component.ts @@ -15,8 +15,8 @@ import { Observable } from 'rxjs'; styleUrls: ['string-validation.component.scss'], templateUrl: 'string-validation.component.html', animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class StringValidationComponent extends ResourceOwner implements OnChanges { @Input() @@ -98,4 +98,4 @@ export class StringValidationComponent extends ResourceOwner implements OnChange } } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/tags-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/tags-ui.component.ts index c2e3f1e11..33e2f8432 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/tags-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/tags-ui.component.ts @@ -12,7 +12,7 @@ import { FieldDto, TagsFieldPropertiesDto, TAGS_FIELD_EDITORS } from '@app/share @Component({ selector: 'sqx-tags-ui', styleUrls: ['tags-ui.component.scss'], - templateUrl: 'tags-ui.component.html' + templateUrl: 'tags-ui.component.html', }) export class TagsUIComponent { @Input() @@ -25,4 +25,4 @@ export class TagsUIComponent { public properties: TagsFieldPropertiesDto; public editors = TAGS_FIELD_EDITORS; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/fields/types/tags-validation.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/tags-validation.component.ts index ff248e21a..76108aebe 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/tags-validation.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/tags-validation.component.ts @@ -12,7 +12,7 @@ import { FieldDto, LanguageDto, TagsFieldPropertiesDto } from '@app/shared'; @Component({ selector: 'sqx-tags-validation', styleUrls: ['tags-validation.component.scss'], - templateUrl: 'tags-validation.component.html' + templateUrl: 'tags-validation.component.html', }) export class TagsValidationComponent { @Input() @@ -29,4 +29,4 @@ export class TagsValidationComponent { @Input() public isLocalizable?: boolean | null; -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/preview/schema-preview-urls-form.component.ts b/frontend/app/features/schemas/pages/schema/preview/schema-preview-urls-form.component.ts index 9b55c416b..22e1f718e 100644 --- a/frontend/app/features/schemas/pages/schema/preview/schema-preview-urls-form.component.ts +++ b/frontend/app/features/schemas/pages/schema/preview/schema-preview-urls-form.component.ts @@ -12,7 +12,7 @@ import { ConfigurePreviewUrlsForm, SchemaDto, SchemasState } from '@app/shared'; @Component({ selector: 'sqx-schema-preview-urls-form', styleUrls: ['./schema-preview-urls-form.component.scss'], - templateUrl: './schema-preview-urls-form.component.html' + templateUrl: './schema-preview-urls-form.component.html', }) export class SchemaPreviewUrlsFormComponent implements OnChanges { @Input() @@ -24,7 +24,7 @@ export class SchemaPreviewUrlsFormComponent implements OnChanges { constructor( private readonly formBuilder: FormBuilder, - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { } @@ -55,4 +55,4 @@ export class SchemaPreviewUrlsFormComponent implements OnChanges { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/rules/schema-field-rules-form.component.ts b/frontend/app/features/schemas/pages/schema/rules/schema-field-rules-form.component.ts index c64307ccb..e357d8e2e 100644 --- a/frontend/app/features/schemas/pages/schema/rules/schema-field-rules-form.component.ts +++ b/frontend/app/features/schemas/pages/schema/rules/schema-field-rules-form.component.ts @@ -12,7 +12,7 @@ import { ConfigureFieldRulesForm, FIELD_RULE_ACTIONS, SchemaDto, SchemasState } @Component({ selector: 'sqx-schema-field-rules-form', styleUrls: ['./schema-field-rules-form.component.scss'], - templateUrl: './schema-field-rules-form.component.html' + templateUrl: './schema-field-rules-form.component.html', }) export class SchemaFieldRulesFormComponent implements OnChanges { @Input() @@ -27,7 +27,7 @@ export class SchemaFieldRulesFormComponent implements OnChanges { constructor( private readonly formBuilder: FormBuilder, - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { } @@ -74,4 +74,4 @@ export class SchemaFieldRulesFormComponent implements OnChanges { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/schema-page.component.ts b/frontend/app/features/schemas/pages/schema/schema-page.component.ts index 6c3af1512..090392575 100644 --- a/frontend/app/features/schemas/pages/schema/schema-page.component.ts +++ b/frontend/app/features/schemas/pages/schema/schema-page.component.ts @@ -16,8 +16,8 @@ import { SchemaCloning } from './../messages'; styleUrls: ['./schema-page.component.scss'], templateUrl: './schema-page.component.html', animations: [ - fadeAnimation - ] + fadeAnimation, + ], }) export class SchemaPageComponent extends ResourceOwner implements OnInit { public readonly exact = { exact: true }; @@ -31,7 +31,7 @@ export class SchemaPageComponent extends ResourceOwner implements OnInit { public readonly schemasState: SchemasState, private readonly route: ActivatedRoute, private readonly router: Router, - private readonly messageBus: MessageBus + private readonly messageBus: MessageBus, ) { super(); } @@ -66,4 +66,4 @@ export class SchemaPageComponent extends ResourceOwner implements OnInit { private back() { this.router.navigate(['../'], { relativeTo: this.route }); } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/scripts/schema-scripts-form.component.ts b/frontend/app/features/schemas/pages/schema/scripts/schema-scripts-form.component.ts index aa36b3f1e..1f1d9d473 100644 --- a/frontend/app/features/schemas/pages/schema/scripts/schema-scripts-form.component.ts +++ b/frontend/app/features/schemas/pages/schema/scripts/schema-scripts-form.component.ts @@ -13,7 +13,7 @@ import { EMPTY, Observable } from 'rxjs'; @Component({ selector: 'sqx-schema-scripts-form', styleUrls: ['./schema-scripts-form.component.scss'], - templateUrl: './schema-scripts-form.component.html' + templateUrl: './schema-scripts-form.component.html', }) export class SchemaScriptsFormComponent implements OnChanges { @Input() @@ -30,7 +30,7 @@ export class SchemaScriptsFormComponent implements OnChanges { private readonly appsState: AppsState, private readonly formBuilder: FormBuilder, private readonly schemasState: SchemasState, - private readonly schemasService: SchemasService + private readonly schemasService: SchemasService, ) { } @@ -63,4 +63,4 @@ export class SchemaScriptsFormComponent implements OnChanges { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/ui/field-list.component.ts b/frontend/app/features/schemas/pages/schema/ui/field-list.component.ts index bd5f1d57b..ca1f544a5 100644 --- a/frontend/app/features/schemas/pages/schema/ui/field-list.component.ts +++ b/frontend/app/features/schemas/pages/schema/ui/field-list.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; import { MetaFields, SchemaDto } from '@app/shared'; @@ -17,7 +15,7 @@ const META_FIELD_NAMES = Object.values(MetaFields); selector: 'sqx-field-list', styleUrls: ['./field-list.component.scss'], templateUrl: './field-list.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class FieldListComponent implements OnChanges { @Input() @@ -64,4 +62,4 @@ export class FieldListComponent implements OnChanges { this.fieldNamesChange.emit(newNames); } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schema/ui/schema-ui-form.component.ts b/frontend/app/features/schemas/pages/schema/ui/schema-ui-form.component.ts index 2f7a30be0..5915576ab 100644 --- a/frontend/app/features/schemas/pages/schema/ui/schema-ui-form.component.ts +++ b/frontend/app/features/schemas/pages/schema/ui/schema-ui-form.component.ts @@ -8,12 +8,12 @@ import { Component, Input, OnChanges } from '@angular/core'; import { SchemaDto, SchemasState } from '@app/shared'; -type State = { fieldsInLists: ReadonlyArray, fieldsInReferences: ReadonlyArray }; +type State = { fieldsInLists: ReadonlyArray; fieldsInReferences: ReadonlyArray }; @Component({ selector: 'sqx-schema-ui-form', styleUrls: ['./schema-ui-form.component.scss'], - templateUrl: './schema-ui-form.component.html' + templateUrl: './schema-ui-form.component.html', }) export class SchemaUIFormComponent implements OnChanges { @Input() @@ -25,11 +25,11 @@ export class SchemaUIFormComponent implements OnChanges { public state: State = { fieldsInLists: [], - fieldsInReferences: [] + fieldsInReferences: [], }; constructor( - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { } @@ -38,7 +38,7 @@ export class SchemaUIFormComponent implements OnChanges { this.state = { fieldsInLists: this.schema.fieldsInLists, - fieldsInReferences: this.schema.fieldsInReferences + fieldsInReferences: this.schema.fieldsInReferences, }; } @@ -61,4 +61,4 @@ export class SchemaUIFormComponent implements OnChanges { this.schemasState.configureUIFields(this.schema, this.state); } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schemas/schema-form.component.ts b/frontend/app/features/schemas/pages/schemas/schema-form.component.ts index de4f1796c..3c7bcbaaa 100644 --- a/frontend/app/features/schemas/pages/schemas/schema-form.component.ts +++ b/frontend/app/features/schemas/pages/schemas/schema-form.component.ts @@ -12,7 +12,7 @@ import { ApiUrlConfig, AppsState, CreateSchemaForm, SchemaDto, SchemasState } fr @Component({ selector: 'sqx-schema-form', styleUrls: ['./schema-form.component.scss'], - templateUrl: './schema-form.component.html' + templateUrl: './schema-form.component.html', }) export class SchemaFormComponent implements OnInit { @Output() @@ -32,7 +32,7 @@ export class SchemaFormComponent implements OnInit { public readonly apiUrl: ApiUrlConfig, public readonly appsState: AppsState, public readonly schemasState: SchemasState, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } @@ -64,4 +64,4 @@ export class SchemaFormComponent implements OnInit { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/schemas/pages/schemas/schemas-page.component.ts b/frontend/app/features/schemas/pages/schemas/schemas-page.component.ts index 092956456..9e072a2b8 100644 --- a/frontend/app/features/schemas/pages/schemas/schemas-page.component.ts +++ b/frontend/app/features/schemas/pages/schemas/schemas-page.component.ts @@ -15,7 +15,7 @@ import { SchemaCloning } from './../messages'; @Component({ selector: 'sqx-schemas-page', styleUrls: ['./schemas-page.component.scss'], - templateUrl: './schemas-page.component.html' + templateUrl: './schemas-page.component.html', }) export class SchemasPageComponent extends ResourceOwner implements OnInit { public addSchemaDialog = new DialogModel(); @@ -30,7 +30,7 @@ export class SchemasPageComponent extends ResourceOwner implements OnInit { private readonly formBuilder: FormBuilder, private readonly messageBus: MessageBus, private readonly route: ActivatedRoute, - private readonly router: Router + private readonly router: Router, ) { super(); } @@ -62,7 +62,7 @@ export class SchemasPageComponent extends ResourceOwner implements OnInit { if (value) { try { - this.schemasState.addCategory(value.name); + this.schemasState.addCategory(value.name); } finally { this.addCategoryForm.submitCompleted(); } @@ -84,4 +84,4 @@ export class SchemasPageComponent extends ResourceOwner implements OnInit { public trackByCategory(_index: number, category: SchemaCategory) { return category.name; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/declarations.ts b/frontend/app/features/settings/declarations.ts index ea287212c..013c2bfa1 100644 --- a/frontend/app/features/settings/declarations.ts +++ b/frontend/app/features/settings/declarations.ts @@ -31,4 +31,4 @@ export * from './pages/workflows/workflow-step.component'; export * from './pages/workflows/workflow-transition.component'; export * from './pages/workflows/workflows-page.component'; export * from './pages/workflows/workflow.component'; -export * from './settings-area.component'; \ No newline at end of file +export * from './settings-area.component'; diff --git a/frontend/app/features/settings/index.ts b/frontend/app/features/settings/index.ts index da0f82225..898be9a7c 100644 --- a/frontend/app/features/settings/index.ts +++ b/frontend/app/features/settings/index.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/features/settings/module.ts b/frontend/app/features/settings/module.ts index 324e34e78..33dce0d2e 100644 --- a/frontend/app/features/settings/module.ts +++ b/frontend/app/features/settings/module.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { HelpComponent, HistoryComponent, SqxFrameworkModule, SqxSharedModule } from '@app/shared'; @@ -21,7 +19,7 @@ const routes: Routes = [ children: [ { path: '', - component: MorePageComponent + component: MorePageComponent, }, { path: 'backups', @@ -31,10 +29,10 @@ const routes: Routes = [ path: 'help', component: HelpComponent, data: { - helpPage: '05-integrated/backups' - } - } - ] + helpPage: '05-integrated/backups', + }, + }, + ], }, { path: 'clients', @@ -44,17 +42,17 @@ const routes: Routes = [ path: 'history', component: HistoryComponent, data: { - channel: 'settings.clients' - } + channel: 'settings.clients', + }, }, { path: 'help', component: HelpComponent, data: { - helpPage: '05-integrated/clients' - } - } - ] + helpPage: '05-integrated/clients', + }, + }, + ], }, { path: 'contributors', @@ -64,17 +62,17 @@ const routes: Routes = [ path: 'history', component: HistoryComponent, data: { - channel: 'settings.contributors' - } + channel: 'settings.contributors', + }, }, { path: 'help', component: HelpComponent, data: { - helpPage: '05-integrated/contributors' - } - } - ] + helpPage: '05-integrated/contributors', + }, + }, + ], }, { path: 'languages', @@ -84,21 +82,21 @@ const routes: Routes = [ path: 'history', component: HistoryComponent, data: { - channel: 'settings.languages' - } + channel: 'settings.languages', + }, }, { path: 'help', component: HelpComponent, data: { - helpPage: '05-integrated/languages' - } - } - ] + helpPage: '05-integrated/languages', + }, + }, + ], }, { path: 'settings', - component: SettingsPageComponent + component: SettingsPageComponent, }, { path: 'plans', @@ -108,10 +106,10 @@ const routes: Routes = [ path: 'history', component: HistoryComponent, data: { - channel: 'settings.plan' - } - } - ] + channel: 'settings.plan', + }, + }, + ], }, { path: 'roles', @@ -121,17 +119,17 @@ const routes: Routes = [ path: 'history', component: HistoryComponent, data: { - channel: 'settings.roles' - } + channel: 'settings.roles', + }, }, { path: 'help', component: HelpComponent, data: { - helpPage: '05-integrated/roles' - } - } - ] + helpPage: '05-integrated/roles', + }, + }, + ], }, { path: 'workflows', @@ -141,20 +139,20 @@ const routes: Routes = [ path: 'help', component: HelpComponent, data: { - helpPage: '05-integrated/workflows' - } - } - ] - } - ] - } + helpPage: '05-integrated/workflows', + }, + }, + ], + }, + ], + }, ]; @NgModule({ imports: [ RouterModule.forChild(routes), SqxFrameworkModule, - SqxSharedModule + SqxSharedModule, ], declarations: [ BackupComponent, @@ -183,7 +181,7 @@ const routes: Routes = [ WorkflowDiagramComponent, WorkflowsPageComponent, WorkflowStepComponent, - WorkflowTransitionComponent - ] + WorkflowTransitionComponent, + ], }) -export class SqxFeatureSettingsModule {} \ No newline at end of file +export class SqxFeatureSettingsModule {} diff --git a/frontend/app/features/settings/pages/backups/backup.component.ts b/frontend/app/features/settings/pages/backups/backup.component.ts index 1420e7c86..9c43f18bc 100644 --- a/frontend/app/features/settings/pages/backups/backup.component.ts +++ b/frontend/app/features/settings/pages/backups/backup.component.ts @@ -12,7 +12,7 @@ import { ApiUrlConfig, BackupDto, BackupsState, Duration } from '@app/shared'; selector: 'sqx-backup', styleUrls: ['./backup.component.scss'], templateUrl: './backup.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class BackupComponent { @Input() @@ -23,11 +23,11 @@ export class BackupComponent { } constructor( - public readonly apiUrl: ApiUrlConfig, private readonly backupsState: BackupsState + public readonly apiUrl: ApiUrlConfig, private readonly backupsState: BackupsState, ) { } public delete() { this.backupsState.delete(this.backup); } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/backups/backups-page.component.ts b/frontend/app/features/settings/pages/backups/backups-page.component.ts index c78c1c88f..1b2dac03b 100644 --- a/frontend/app/features/settings/pages/backups/backups-page.component.ts +++ b/frontend/app/features/settings/pages/backups/backups-page.component.ts @@ -13,12 +13,12 @@ import { switchMap } from 'rxjs/operators'; @Component({ selector: 'sqx-backups-page', styleUrls: ['./backups-page.component.scss'], - templateUrl: './backups-page.component.html' + templateUrl: './backups-page.component.html', }) export class BackupsPageComponent extends ResourceOwner implements OnInit { constructor( public readonly apiUrl: ApiUrlConfig, - public readonly backupsState: BackupsState + public readonly backupsState: BackupsState, ) { super(); } @@ -40,4 +40,4 @@ export class BackupsPageComponent extends ResourceOwner implements OnInit { public trackByBackup(_index: number, item: BackupDto) { return item.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/clients/client-add-form.component.ts b/frontend/app/features/settings/pages/clients/client-add-form.component.ts index d94f15985..a317201e7 100644 --- a/frontend/app/features/settings/pages/clients/client-add-form.component.ts +++ b/frontend/app/features/settings/pages/clients/client-add-form.component.ts @@ -13,14 +13,14 @@ import { AddClientForm, ClientsState } from '@app/shared'; selector: 'sqx-client-add-form', styleUrls: ['./client-add-form.component.scss'], templateUrl: './client-add-form.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ClientAddFormComponent { public addClientForm = new AddClientForm(this.formBuilder); constructor( private readonly clientsState: ClientsState, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } @@ -40,4 +40,4 @@ export class ClientAddFormComponent { public cancel() { this.addClientForm.submitCompleted(); } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/clients/client-connect-form.component.ts b/frontend/app/features/settings/pages/clients/client-connect-form.component.ts index 8419d8dd2..4832e9e4d 100644 --- a/frontend/app/features/settings/pages/clients/client-connect-form.component.ts +++ b/frontend/app/features/settings/pages/clients/client-connect-form.component.ts @@ -11,7 +11,7 @@ import { AccessTokenDto, ApiUrlConfig, AppsState, ClientDto, ClientsService, Dia @Component({ selector: 'sqx-client-connect-form', styleUrls: ['./client-connect-form.component.scss'], - templateUrl: './client-connect-form.component.html' + templateUrl: './client-connect-form.component.html', }) export class ClientConnectFormComponent implements OnInit { @Output() @@ -40,7 +40,7 @@ export class ClientConnectFormComponent implements OnInit { public readonly apiUrl: ApiUrlConfig, private readonly changeDetector: ChangeDetectorRef, private readonly clientsService: ClientsService, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { } @@ -65,7 +65,7 @@ export class ClientConnectFormComponent implements OnInit { } } -function connectHttpText(apiUrl: ApiUrlConfig, app: string, client: { id: string, secret: string }) { +function connectHttpText(apiUrl: ApiUrlConfig, app: string, client: { id: string; secret: string }) { const url = apiUrl.buildUrl('identity-server/connect/token'); return `$ curl @@ -77,7 +77,7 @@ function connectHttpText(apiUrl: ApiUrlConfig, app: string, client: { id: string scope=squidex-api'`; } -function connectLibrary(apiUrl: ApiUrlConfig, app: string, client: { id: string, secret: string }) { +function connectLibrary(apiUrl: ApiUrlConfig, app: string, client: { id: string; secret: string }) { const url = apiUrl.value; return `var clientManager = new SquidexClientManager( @@ -85,4 +85,4 @@ function connectLibrary(apiUrl: ApiUrlConfig, app: string, client: { id: string, "${app}", "${app}:${client.id}", "${client.secret}")`; -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/clients/client.component.ts b/frontend/app/features/settings/pages/clients/client.component.ts index 3a69075c7..42f08c747 100644 --- a/frontend/app/features/settings/pages/clients/client.component.ts +++ b/frontend/app/features/settings/pages/clients/client.component.ts @@ -12,7 +12,7 @@ import { AppsState, ClientDto, ClientsState, DialogModel, RoleDto } from '@app/s selector: 'sqx-client', styleUrls: ['./client.component.scss'], templateUrl: './client.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ClientComponent implements OnChanges { @Input() @@ -27,11 +27,11 @@ export class ClientComponent implements OnChanges { constructor( public readonly appsState: AppsState, - private readonly clientsState: ClientsState + private readonly clientsState: ClientsState, ) { } - public ngOnChanges(changes: SimpleChanges ) { + public ngOnChanges(changes: SimpleChanges) { if (changes['client']) { this.apiCallsLimit = this.client.apiCallsLimit; } @@ -60,4 +60,4 @@ export class ClientComponent implements OnChanges { public trackByRole(_index: number, role: RoleDto) { return role.name; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/clients/clients-page.component.ts b/frontend/app/features/settings/pages/clients/clients-page.component.ts index 818c15f0f..e158984de 100644 --- a/frontend/app/features/settings/pages/clients/clients-page.component.ts +++ b/frontend/app/features/settings/pages/clients/clients-page.component.ts @@ -11,12 +11,12 @@ import { ClientDto, ClientsState, RolesState } from '@app/shared'; @Component({ selector: 'sqx-clients-page', styleUrls: ['./clients-page.component.scss'], - templateUrl: './clients-page.component.html' + templateUrl: './clients-page.component.html', }) export class ClientsPageComponent implements OnInit { constructor( public readonly clientsState: ClientsState, - public readonly rolesState: RolesState + public readonly rolesState: RolesState, ) { } @@ -33,4 +33,4 @@ export class ClientsPageComponent implements OnInit { public trackByClient(_index: number, client: ClientDto) { return client.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/contributors/contributor-add-form.component.ts b/frontend/app/features/settings/pages/contributors/contributor-add-form.component.ts index af3055888..b7decbb50 100644 --- a/frontend/app/features/settings/pages/contributors/contributor-add-form.component.ts +++ b/frontend/app/features/settings/pages/contributors/contributor-add-form.component.ts @@ -15,7 +15,7 @@ import { withLatestFrom } from 'rxjs/operators'; export class UsersDataSource implements AutocompleteSource { constructor( private readonly contributorsState: ContributorsState, - private readonly usersService: UsersService + private readonly usersService: UsersService, ) { } @@ -39,8 +39,8 @@ export class UsersDataSource implements AutocompleteSource { styleUrls: ['./contributor-add-form.component.scss'], templateUrl: './contributor-add-form.component.html', providers: [ - UsersDataSource - ] + UsersDataSource, + ], }) export class ContributorAddFormComponent implements OnChanges { private defaultValue: any; @@ -56,7 +56,7 @@ export class ContributorAddFormComponent implements OnChanges { public readonly contributorsState: ContributorsState, public readonly usersDataSource: UsersDataSource, private readonly dialogs: DialogService, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } diff --git a/frontend/app/features/settings/pages/contributors/contributor.component.ts b/frontend/app/features/settings/pages/contributors/contributor.component.ts index 46354c577..942ba9ef6 100644 --- a/frontend/app/features/settings/pages/contributors/contributor.component.ts +++ b/frontend/app/features/settings/pages/contributors/contributor.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: component-selector - import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { ContributorDto, ContributorsState, RoleDto } from '@app/shared'; @@ -14,7 +12,7 @@ import { ContributorDto, ContributorsState, RoleDto } from '@app/shared'; selector: '[sqxContributor]', styleUrls: ['./contributor.component.scss'], templateUrl: './contributor.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ContributorComponent { @Input() @@ -27,7 +25,7 @@ export class ContributorComponent { public contributor: ContributorDto; constructor( - private readonly contributorsState: ContributorsState + private readonly contributorsState: ContributorsState, ) { } @@ -38,4 +36,4 @@ export class ContributorComponent { public changeRole(role: string) { this.contributorsState.assign({ contributorId: this.contributor.contributorId, role }); } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/contributors/contributors-page.component.ts b/frontend/app/features/settings/pages/contributors/contributors-page.component.ts index c9c97f53b..e86522c81 100644 --- a/frontend/app/features/settings/pages/contributors/contributors-page.component.ts +++ b/frontend/app/features/settings/pages/contributors/contributors-page.component.ts @@ -13,8 +13,8 @@ import { ContributorDto, ContributorsState, DialogModel, RolesState, Router2Stat styleUrls: ['./contributors-page.component.scss'], templateUrl: './contributors-page.component.html', providers: [ - Router2State - ] + Router2State, + ], }) export class ContributorsPageComponent implements OnInit { public importDialog = new DialogModel(); @@ -22,7 +22,7 @@ export class ContributorsPageComponent implements OnInit { constructor( public readonly contributorsRoute: Router2State, public readonly contributorsState: ContributorsState, - public readonly rolesState: RolesState + public readonly rolesState: RolesState, ) { } diff --git a/frontend/app/features/settings/pages/contributors/import-contributors-dialog.component.ts b/frontend/app/features/settings/pages/contributors/import-contributors-dialog.component.ts index cfac2f91d..bf55a3531 100644 --- a/frontend/app/features/settings/pages/contributors/import-contributors-dialog.component.ts +++ b/frontend/app/features/settings/pages/contributors/import-contributors-dialog.component.ts @@ -21,7 +21,7 @@ type ImportStatus = { @Component({ selector: 'sqx-import-contributors-dialog', styleUrls: ['./import-contributors-dialog.component.scss'], - templateUrl: './import-contributors-dialog.component.html' + templateUrl: './import-contributors-dialog.component.html', }) export class ImportContributorsDialogComponent { @Output() @@ -36,7 +36,7 @@ export class ImportContributorsDialogComponent { constructor( private readonly formBuilder: FormBuilder, - private readonly contributorsState: ContributorsState + private readonly contributorsState: ContributorsState, ) { } @@ -50,7 +50,7 @@ export class ImportContributorsDialogComponent { email: contributor.contributorId, result: 'Pending', resultText: 'Pending', - role: 'Developer' + role: 'Developer', })); } } @@ -78,8 +78,8 @@ export class ImportContributorsDialogComponent { } return EMPTY; - }) - ), 1) + }), + ), 1), ).subscribe(); } } diff --git a/frontend/app/features/settings/pages/languages/language-add-form.component.ts b/frontend/app/features/settings/pages/languages/language-add-form.component.ts index c10062187..da7e5a4bb 100644 --- a/frontend/app/features/settings/pages/languages/language-add-form.component.ts +++ b/frontend/app/features/settings/pages/languages/language-add-form.component.ts @@ -13,7 +13,7 @@ import { AddLanguageForm, LanguageDto, LanguagesState } from '@app/shared'; selector: 'sqx-language-add-form', styleUrls: ['./language-add-form.component.scss'], templateUrl: './language-add-form.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class LanguageAddFormComponent implements OnChanges { @Input() @@ -23,7 +23,7 @@ export class LanguageAddFormComponent implements OnChanges { constructor( private readonly languagesState: LanguagesState, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } @@ -47,4 +47,4 @@ export class LanguageAddFormComponent implements OnChanges { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/languages/language.component.ts b/frontend/app/features/settings/pages/languages/language.component.ts index daed10670..523e70b84 100644 --- a/frontend/app/features/settings/pages/languages/language.component.ts +++ b/frontend/app/features/settings/pages/languages/language.component.ts @@ -13,7 +13,7 @@ import { AppLanguageDto, EditLanguageForm, LanguageDto, LanguagesState, sorted } @Component({ selector: 'sqx-language', styleUrls: ['./language.component.scss'], - templateUrl: './language.component.html' + templateUrl: './language.component.html', }) export class LanguageComponent implements OnChanges { @Input() @@ -34,7 +34,7 @@ export class LanguageComponent implements OnChanges { constructor( private readonly formBuilder: FormBuilder, - private readonly languagesState: LanguagesState + private readonly languagesState: LanguagesState, ) { } @@ -95,4 +95,4 @@ export class LanguageComponent implements OnChanges { public trackByLanguage(_index: number, language: AppLanguageDto) { return language.iso2Code; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/languages/languages-page.component.ts b/frontend/app/features/settings/pages/languages/languages-page.component.ts index 421e6cd2e..b17621ab6 100644 --- a/frontend/app/features/settings/pages/languages/languages-page.component.ts +++ b/frontend/app/features/settings/pages/languages/languages-page.component.ts @@ -11,11 +11,11 @@ import { LanguagesState, SnapshotLanguage } from '@app/shared'; @Component({ selector: 'sqx-languages-page', styleUrls: ['./languages-page.component.scss'], - templateUrl: './languages-page.component.html' + templateUrl: './languages-page.component.html', }) export class LanguagesPageComponent implements OnInit { constructor( - public readonly languagesState: LanguagesState + public readonly languagesState: LanguagesState, ) { } @@ -30,4 +30,4 @@ export class LanguagesPageComponent implements OnInit { public trackByLanguage(_index: number, language: SnapshotLanguage) { return language.language.iso2Code; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/more/more-page.component.ts b/frontend/app/features/settings/pages/more/more-page.component.ts index bc9488a83..d566a9dcb 100644 --- a/frontend/app/features/settings/pages/more/more-page.component.ts +++ b/frontend/app/features/settings/pages/more/more-page.component.ts @@ -13,7 +13,7 @@ import { AppDto, AppsState, defined, ResourceOwner, Types, UpdateAppForm } from @Component({ selector: 'sqx-more-page', styleUrls: ['./more-page.component.scss'], - templateUrl: './more-page.component.html' + templateUrl: './more-page.component.html', }) export class MorePageComponent extends ResourceOwner implements OnInit { public app: AppDto; @@ -30,7 +30,7 @@ export class MorePageComponent extends ResourceOwner implements OnInit { constructor( private readonly appsState: AppsState, private readonly formBuilder: FormBuilder, - private readonly router: Router + private readonly router: Router, ) { super(); } @@ -107,4 +107,4 @@ export class MorePageComponent extends ResourceOwner implements OnInit { this.router.navigate(['/app']); }); } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/plans/plan.component.ts b/frontend/app/features/settings/pages/plans/plan.component.ts index a28f65a13..1e8752e42 100644 --- a/frontend/app/features/settings/pages/plans/plan.component.ts +++ b/frontend/app/features/settings/pages/plans/plan.component.ts @@ -12,14 +12,14 @@ import { PlanInfo, PlansState } from '@app/shared'; selector: 'sqx-plan', styleUrls: ['./plan.component.scss'], templateUrl: './plan.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class PlanComponent { @Input() public planInfo: PlanInfo; constructor( - public readonly plansState: PlansState + public readonly plansState: PlansState, ) { } @@ -30,4 +30,4 @@ export class PlanComponent { public changeYearly() { this.plansState.change(this.planInfo.plan.yearlyId); } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/plans/plans-page.component.ts b/frontend/app/features/settings/pages/plans/plans-page.component.ts index dd65a7510..22367e13d 100644 --- a/frontend/app/features/settings/pages/plans/plans-page.component.ts +++ b/frontend/app/features/settings/pages/plans/plans-page.component.ts @@ -12,7 +12,7 @@ import { ApiUrlConfig, PlanDto, PlansState } from '@app/shared'; @Component({ selector: 'sqx-plans-page', styleUrls: ['./plans-page.component.scss'], - templateUrl: './plans-page.component.html' + templateUrl: './plans-page.component.html', }) export class PlansPageComponent implements OnInit { private overridePlanId: string; @@ -22,7 +22,7 @@ export class PlansPageComponent implements OnInit { constructor( public readonly plansState: PlansState, private readonly apiUrl: ApiUrlConfig, - private readonly route: ActivatedRoute + private readonly route: ActivatedRoute, ) { } @@ -42,4 +42,4 @@ export class PlansPageComponent implements OnInit { public trackByPlan(_index: number, planInfo: { plan: PlanDto }) { return planInfo.plan.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/roles/role-add-form.component.ts b/frontend/app/features/settings/pages/roles/role-add-form.component.ts index 245e39603..af8ba44b4 100644 --- a/frontend/app/features/settings/pages/roles/role-add-form.component.ts +++ b/frontend/app/features/settings/pages/roles/role-add-form.component.ts @@ -13,14 +13,14 @@ import { AddRoleForm, RolesState } from '@app/shared'; selector: 'sqx-role-add-form', styleUrls: ['./role-add-form.component.scss'], templateUrl: './role-add-form.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RoleAddFormComponent { public addRoleForm = new AddRoleForm(this.formBuilder); constructor( private readonly rolesState: RolesState, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } @@ -40,4 +40,4 @@ export class RoleAddFormComponent { public cancel() { this.addRoleForm.submitCompleted(); } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/roles/role.component.ts b/frontend/app/features/settings/pages/roles/role.component.ts index d2bbc14ff..e69016d28 100644 --- a/frontend/app/features/settings/pages/roles/role.component.ts +++ b/frontend/app/features/settings/pages/roles/role.component.ts @@ -13,30 +13,30 @@ const DESCRIPTIONS = { Developer: 'i18n:roles.defaults.developer', Editor: 'i18n:roles.defaults.editor', Owner: 'i18n:roles.default.owner', - Reader: 'i18n:roles.default.reader' + Reader: 'i18n:roles.default.reader', }; -type Property = { name: string, key: string }; +type Property = { name: string; key: string }; const SIMPLE_PROPERTIES: ReadonlyArray = [{ name: 'i18n:roles.properties.hideSchemas', - key: Settings.AppProperties.HIDE_SCHEMAS + key: Settings.AppProperties.HIDE_SCHEMAS, }, { name: 'i18n:roles.properties.hideAssets', - key: Settings.AppProperties.HIDE_ASSETS + key: Settings.AppProperties.HIDE_ASSETS, }, { name: 'i18n:roles.properties.hideSettings', - key: Settings.AppProperties.HIDE_SETTINGS + key: Settings.AppProperties.HIDE_SETTINGS, }, { name: 'i18n:roles.properties.hideAPI', - key: Settings.AppProperties.HIDE_API + key: Settings.AppProperties.HIDE_API, }]; @Component({ selector: 'sqx-role', styleUrls: ['./role.component.scss'], templateUrl: './role.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RoleComponent implements OnChanges { @Input() @@ -70,7 +70,7 @@ export class RoleComponent implements OnChanges { constructor( private readonly formBuilder: FormBuilder, - private readonly rolesState: RolesState + private readonly rolesState: RolesState, ) { } @@ -136,4 +136,4 @@ export class RoleComponent implements OnChanges { public trackBySchema(_index: number, schema: SchemaDto) { return schema.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/roles/roles-page.component.ts b/frontend/app/features/settings/pages/roles/roles-page.component.ts index 0a7384201..a16c303b6 100644 --- a/frontend/app/features/settings/pages/roles/roles-page.component.ts +++ b/frontend/app/features/settings/pages/roles/roles-page.component.ts @@ -13,6 +13,7 @@ class PermissionsAutocomplete implements AutocompleteSource { private permissions: ReadonlyArray = []; constructor(appsState: AppsState, rolesService: RolesService) { + // eslint-disable-next-line no-return-assign rolesService.getPermissions(appsState.appName).subscribe(x => this.permissions = x); } @@ -24,7 +25,7 @@ class PermissionsAutocomplete implements AutocompleteSource { @Component({ selector: 'sqx-roles-page', styleUrls: ['./roles-page.component.scss'], - templateUrl: './roles-page.component.html' + templateUrl: './roles-page.component.html', }) export class RolesPageComponent implements OnInit { public allPermissions: AutocompleteSource = new PermissionsAutocomplete(this.appsState, this.rolesService); @@ -33,7 +34,7 @@ export class RolesPageComponent implements OnInit { private readonly appsState: AppsState, public readonly rolesService: RolesService, public readonly rolesState: RolesState, - public readonly schemasState: SchemasState + public readonly schemasState: SchemasState, ) { } @@ -50,4 +51,4 @@ export class RolesPageComponent implements OnInit { public trackByRole(_index: number, role: RoleDto) { return role.name; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/settings/settings-page.component.ts b/frontend/app/features/settings/pages/settings/settings-page.component.ts index 554e4a0ca..f0ae60760 100644 --- a/frontend/app/features/settings/pages/settings/settings-page.component.ts +++ b/frontend/app/features/settings/pages/settings/settings-page.component.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -12,7 +12,7 @@ import { AppSettingsDto, AppsState, EditAppSettingsForm, ResourceOwner } from '@ @Component({ selector: 'sqx-settings-page', styleUrls: ['./settings-page.component.scss'], - templateUrl: './settings-page.component.html' + templateUrl: './settings-page.component.html', }) export class SettingsPageComponent extends ResourceOwner implements OnInit { public isEditable = false; @@ -22,7 +22,7 @@ export class SettingsPageComponent extends ResourceOwner implements OnInit { constructor( private readonly appsState: AppsState, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { super(); } @@ -64,4 +64,4 @@ export class SettingsPageComponent extends ResourceOwner implements OnInit { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/workflows/workflow-add-form.component.ts b/frontend/app/features/settings/pages/workflows/workflow-add-form.component.ts index 951ba7d68..79b1b7d7f 100644 --- a/frontend/app/features/settings/pages/workflows/workflow-add-form.component.ts +++ b/frontend/app/features/settings/pages/workflows/workflow-add-form.component.ts @@ -13,14 +13,14 @@ import { AddWorkflowForm, WorkflowsState } from '@app/shared'; selector: 'sqx-workflow-add-form', styleUrls: ['./workflow-add-form.component.scss'], templateUrl: './workflow-add-form.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class WorkflowAddFormComponent { public addWorkflowForm = new AddWorkflowForm(this.formBuilder); constructor( private readonly workflowsState: WorkflowsState, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } @@ -40,4 +40,4 @@ export class WorkflowAddFormComponent { public cancel() { this.addWorkflowForm.submitCompleted(); } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/workflows/workflow-diagram.component.ts b/frontend/app/features/settings/pages/workflows/workflow-diagram.component.ts index b6bbd63b2..3aec67840 100644 --- a/frontend/app/features/settings/pages/workflows/workflow-diagram.component.ts +++ b/frontend/app/features/settings/pages/workflows/workflow-diagram.component.ts @@ -8,12 +8,12 @@ import { AfterViewInit, Component, ElementRef, Input, OnChanges, OnDestroy, ViewChild } from '@angular/core'; import { ResourceLoaderService, WorkflowDto } from '@app/shared'; -declare var vis: any; +declare const vis: any; @Component({ selector: 'sqx-workflow-diagram', styleUrls: ['./workflow-diagram.component.scss'], - templateUrl: './workflow-diagram.component.html' + templateUrl: './workflow-diagram.component.html', }) export class WorkflowDiagramComponent implements AfterViewInit, OnDestroy, OnChanges { private network: any; @@ -27,7 +27,7 @@ export class WorkflowDiagramComponent implements AfterViewInit, OnDestroy, OnCha public isLoaded = false; constructor( - private readonly resourceLoader: ResourceLoaderService + private readonly resourceLoader: ResourceLoaderService, ) { } @@ -55,7 +55,7 @@ export class WorkflowDiagramComponent implements AfterViewInit, OnDestroy, OnCha let label = `${step.name}`; if (step.noUpdate) { - label += `\nPrevent updates`; + label += '\nPrevent updates'; if (step.noUpdateExpression) { label += `\nwhen (${step.noUpdateExpression})`; @@ -67,7 +67,7 @@ export class WorkflowDiagramComponent implements AfterViewInit, OnDestroy, OnCha } if (step.name === 'Published') { - label += `\nAvailable in the API`; + label += '\nAvailable in the API'; } const node: any = { id: step.name, label, color: step.color }; @@ -115,37 +115,38 @@ const GRAPH_OPTIONS = { nodes: { borderWidth: 2, font: { - multi: true, align: 'left', + multi: true, + align: 'left', ital: { - size: 16 + size: 16, }, bold: { - size: 20 + size: 20, }, - size: 16 + size: 16, }, shape: 'dot', - shadow: true + shadow: true, }, edges: { arrows: 'to', font: { multi: true, ital: { - size: 16 + size: 16, }, - size: 16 + size: 16, }, - color: 'gray' + color: 'gray', }, layout: { - randomSeed: 2 + randomSeed: 2, }, physics: { enabled: false, repulsion: { - nodeDistance: 300 + nodeDistance: 300, }, - solver: 'repulsion' - } -}; \ No newline at end of file + solver: 'repulsion', + }, +}; diff --git a/frontend/app/features/settings/pages/workflows/workflow-step.component.ts b/frontend/app/features/settings/pages/workflows/workflow-step.component.ts index dd0dd8d5d..5dbe86822 100644 --- a/frontend/app/features/settings/pages/workflows/workflow-step.component.ts +++ b/frontend/app/features/settings/pages/workflows/workflow-step.component.ts @@ -11,7 +11,7 @@ import { WorkflowDto, WorkflowStep, WorkflowStepValues, WorkflowTransition, Work @Component({ selector: 'sqx-workflow-step', styleUrls: ['./workflow-step.component.scss'], - templateUrl: './workflow-step.component.html' + templateUrl: './workflow-step.component.html', }) export class WorkflowStepComponent implements OnChanges { public readonly onBlur: { updateOn: 'blur' } = { updateOn: 'blur' }; @@ -26,7 +26,7 @@ export class WorkflowStepComponent implements OnChanges { public transitionRemove = new EventEmitter(); @Output() - public transitionUpdate = new EventEmitter<{ transition: WorkflowTransition, values: WorkflowTransitionValues }>(); + public transitionUpdate = new EventEmitter<{ transition: WorkflowTransition; values: WorkflowTransitionValues }>(); @Output() public update = new EventEmitter(); @@ -90,4 +90,4 @@ export class WorkflowStepComponent implements OnChanges { public trackByTransition(_index: number, transition: WorkflowTransitionView) { return transition.to; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/workflows/workflow-transition.component.ts b/frontend/app/features/settings/pages/workflows/workflow-transition.component.ts index 8ada03bfb..f218cd732 100644 --- a/frontend/app/features/settings/pages/workflows/workflow-transition.component.ts +++ b/frontend/app/features/settings/pages/workflows/workflow-transition.component.ts @@ -11,7 +11,7 @@ import { RoleDto, WorkflowTransitionValues, WorkflowTransitionView } from '@app/ @Component({ selector: 'sqx-workflow-transition', styleUrls: ['./workflow-transition.component.scss'], - templateUrl: './workflow-transition.component.html' + templateUrl: './workflow-transition.component.html', }) export class WorkflowTransitionComponent { public readonly onBlur: { updateOn: 'blur' } = { updateOn: 'blur' }; @@ -42,4 +42,4 @@ export class WorkflowTransitionComponent { public trackByRole(_index: number, role: RoleDto) { return role.name; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/workflows/workflow.component.ts b/frontend/app/features/settings/pages/workflows/workflow.component.ts index 93e9c844d..cf5e11bf6 100644 --- a/frontend/app/features/settings/pages/workflows/workflow.component.ts +++ b/frontend/app/features/settings/pages/workflows/workflow.component.ts @@ -5,15 +5,13 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { Component, Input, OnChanges } from '@angular/core'; import { ErrorDto, MathHelper, SchemaTagSource, WorkflowDto, WorkflowsState, WorkflowStep, WorkflowStepValues, WorkflowTransition, WorkflowTransitionValues } from '@app/shared'; @Component({ selector: 'sqx-workflow', styleUrls: ['./workflow.component.scss'], - templateUrl: './workflow.component.html' + templateUrl: './workflow.component.html', }) export class WorkflowComponent implements OnChanges { public readonly onBlur: { updateOn: 'blur' } = { updateOn: 'blur' }; @@ -35,7 +33,7 @@ export class WorkflowComponent implements OnChanges { public selectedTab = 0; constructor( - private readonly workflowsState: WorkflowsState + private readonly workflowsState: WorkflowsState, ) { } @@ -97,7 +95,7 @@ export class WorkflowComponent implements OnChanges { this.workflow = this.workflow.removeTransition(from.name, transition.to); } - public updateTransition(update: { transition: WorkflowTransition, values: WorkflowTransitionValues }) { + public updateTransition(update: { transition: WorkflowTransition; values: WorkflowTransitionValues }) { this.workflow = this.workflow.setTransition(update.transition.from, update.transition.to, update.values); } @@ -120,4 +118,4 @@ export class WorkflowComponent implements OnChanges { public trackByStep(_index: number, step: WorkflowStep) { return step.name; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/pages/workflows/workflows-page.component.ts b/frontend/app/features/settings/pages/workflows/workflows-page.component.ts index 835dd80e9..d9cb20caa 100644 --- a/frontend/app/features/settings/pages/workflows/workflows-page.component.ts +++ b/frontend/app/features/settings/pages/workflows/workflows-page.component.ts @@ -11,7 +11,7 @@ import { ResourceOwner, RolesState, SchemaTagSource, WorkflowDto, WorkflowsState @Component({ selector: 'sqx-workflows-page', styleUrls: ['./workflows-page.component.scss'], - templateUrl: './workflows-page.component.html' + templateUrl: './workflows-page.component.html', }) export class WorkflowsPageComponent extends ResourceOwner implements OnInit { public roles: ReadonlyArray = []; @@ -19,7 +19,7 @@ export class WorkflowsPageComponent extends ResourceOwner implements OnInit { constructor( public readonly rolesState: RolesState, public readonly schemasSource: SchemaTagSource, - public readonly workflowsState: WorkflowsState + public readonly workflowsState: WorkflowsState, ) { super(); } @@ -43,4 +43,4 @@ export class WorkflowsPageComponent extends ResourceOwner implements OnInit { public trackByWorkflow(_index: number, workflow: WorkflowDto) { return workflow.id; } -} \ No newline at end of file +} diff --git a/frontend/app/features/settings/settings-area.component.ts b/frontend/app/features/settings/settings-area.component.ts index 633ebf40d..57f7b495d 100644 --- a/frontend/app/features/settings/settings-area.component.ts +++ b/frontend/app/features/settings/settings-area.component.ts @@ -11,13 +11,13 @@ import { AppsState, defined } from '@app/shared'; @Component({ selector: 'sqx-settings-area', styleUrls: ['./settings-area.component.scss'], - templateUrl: './settings-area.component.html' + templateUrl: './settings-area.component.html', }) export class SettingsAreaComponent { public selectedApp = this.appsState.selectedApp.pipe(defined()); constructor( - private readonly appsState: AppsState + private readonly appsState: AppsState, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/animations.ts b/frontend/app/framework/angular/animations.ts index 6713d34e4..b9c8940f4 100644 --- a/frontend/app/framework/angular/animations.ts +++ b/frontend/app/framework/angular/animations.ts @@ -12,21 +12,21 @@ export function buildSlideRightAnimation(name = 'slideRight', timing = '150ms'): name, [ transition(':enter', [ style({ transform: 'translateX(-100%)' }), - animate(timing, style({ transform: 'translateX(0%)' })) + animate(timing, style({ transform: 'translateX(0%)' })), ]), transition(':leave', [ - style({transform: 'translateX(0%)' }), - animate(timing, style({ transform: 'translateX(-100%)' })) + style({ transform: 'translateX(0%)' }), + animate(timing, style({ transform: 'translateX(-100%)' })), ]), state('true', - style({ transform: 'translateX(0%)' }) + style({ transform: 'translateX(0%)' }), ), state('false', - style({ transform: 'translateX(-100%)' }) + style({ transform: 'translateX(-100%)' }), ), transition('1 => 0', animate(timing)), - transition('0 => 1', animate(timing)) - ] + transition('0 => 1', animate(timing)), + ], ); } @@ -35,21 +35,21 @@ export function buildSlideAnimation(name = 'slide', timing = '400ms'): Animation name, [ transition(':enter', [ style({ transform: 'translateX(100%)' }), - animate(timing, style({ transform: 'translateX(0%)' })) + animate(timing, style({ transform: 'translateX(0%)' })), ]), transition(':leave', [ - style({transform: 'translateX(0%)' }), - animate(timing, style({ transform: 'translateX(-100%)' })) + style({ transform: 'translateX(0%)' }), + animate(timing, style({ transform: 'translateX(-100%)' })), ]), state('true', - style({ transform: 'translateX(0%)' }) + style({ transform: 'translateX(0%)' }), ), state('false', - style({ transform: 'translateX(-100%)' }) + style({ transform: 'translateX(-100%)' }), ), transition('1 => 0', animate(timing)), - transition('0 => 1', animate(timing)) - ] + transition('0 => 1', animate(timing)), + ], ); } @@ -58,21 +58,21 @@ export function buildFadeAnimation(name = 'fade', timing = '150ms'): AnimationTr name, [ transition(':enter', [ style({ opacity: 0 }), - animate(timing, style({ opacity: 1 })) + animate(timing, style({ opacity: 1 })), ]), transition(':leave', [ style({ opacity: 1 }), - animate(timing, style({ opacity: 0 })) + animate(timing, style({ opacity: 0 })), ]), state('true', - style({ opacity: 1 }) + style({ opacity: 1 }), ), state('false', - style({ opacity: 0 }) + style({ opacity: 0 }), ), transition('1 => 0', animate(timing)), - transition('0 => 1', animate(timing)) - ] + transition('0 => 1', animate(timing)), + ], ); } @@ -81,21 +81,21 @@ export function buildHeightAnimation(name = 'height', timing = '200ms'): Animati name, [ transition(':enter', [ style({ height: '0px' }), - animate(timing, style({ height: '*' })) + animate(timing, style({ height: '*' })), ]), transition(':leave', [ style({ height: '*' }), - animate(timing, style({ height: '0px' })) + animate(timing, style({ height: '0px' })), ]), state('true', - style({ height: '*' }) + style({ height: '*' }), ), state('false', - style({ height: '0px' }) + style({ height: '0px' }), ), transition('1 => 0', animate(timing)), - transition('0 => 1', animate(timing)) - ] + transition('0 => 1', animate(timing)), + ], ); } diff --git a/frontend/app/framework/angular/avatar.component.ts b/frontend/app/framework/angular/avatar.component.ts index cc6d5120c..33fbba706 100644 --- a/frontend/app/framework/angular/avatar.component.ts +++ b/frontend/app/framework/angular/avatar.component.ts @@ -12,7 +12,7 @@ import { picasso } from '@app/framework/internal'; selector: 'sqx-avatar', styleUrls: ['./avatar.component.scss'], templateUrl: './avatar.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AvatarComponent implements OnChanges { @Input() @@ -44,4 +44,4 @@ export class AvatarComponent implements OnChanges { return null; } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/code.component.ts b/frontend/app/framework/angular/code.component.ts index 7d3a9dc99..5d1bf4108 100644 --- a/frontend/app/framework/angular/code.component.ts +++ b/frontend/app/framework/angular/code.component.ts @@ -11,6 +11,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; selector: 'sqx-code', styleUrls: ['./code.component.scss'], templateUrl: './code.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class CodeComponent {} \ No newline at end of file +export class CodeComponent {} diff --git a/frontend/app/framework/angular/drag-helper.ts b/frontend/app/framework/angular/drag-helper.ts index c6b7152f3..ad54a2222 100644 --- a/frontend/app/framework/angular/drag-helper.ts +++ b/frontend/app/framework/angular/drag-helper.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: prefer-for-of - import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { Types } from './../utils/types'; @@ -30,4 +28,4 @@ export function getFiles(files: FileList | ReadonlyArray) { } return result; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/external-link.directive.ts b/frontend/app/framework/angular/external-link.directive.ts index 873b8990c..d0be9d4af 100644 --- a/frontend/app/framework/angular/external-link.directive.ts +++ b/frontend/app/framework/angular/external-link.directive.ts @@ -8,7 +8,7 @@ import { AfterViewInit, Directive, ElementRef, Input, Renderer2 } from '@angular/core'; @Directive({ - selector: '[sqxExternalLink]' + selector: '[sqxExternalLink]', }) export class ExternalLinkDirective implements AfterViewInit { @Input('sqxExternalLink') @@ -16,7 +16,7 @@ export class ExternalLinkDirective implements AfterViewInit { constructor( private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -36,4 +36,4 @@ export class ExternalLinkDirective implements AfterViewInit { this.renderer.appendChild(element, icon); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/confirm-click.directive.ts b/frontend/app/framework/angular/forms/confirm-click.directive.ts index 9770207c9..338f7fd5b 100644 --- a/frontend/app/framework/angular/forms/confirm-click.directive.ts +++ b/frontend/app/framework/angular/forms/confirm-click.directive.ts @@ -5,15 +5,13 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core'; import { DialogService } from '@app/framework/internal'; import { Subscriber } from 'rxjs'; import { take } from 'rxjs/operators'; @Directive({ - selector: '[sqxConfirmClick]' + selector: '[sqxConfirmClick]', }) export class ConfirmClickDirective { @Input() @@ -35,7 +33,7 @@ export class ConfirmClickDirective { public clickConfirmed = new EventEmitter(); constructor( - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { } @@ -46,7 +44,6 @@ export class ConfirmClickDirective { this.confirmTitle.length > 0 && this.confirmText && this.confirmText.length > 0) { - const observers = [...this.clickConfirmed.observers]; this.beforeClick.emit(); diff --git a/frontend/app/framework/angular/forms/control-errors.component.ts b/frontend/app/framework/angular/forms/control-errors.component.ts index 791dc567e..f06d76836 100644 --- a/frontend/app/framework/angular/forms/control-errors.component.ts +++ b/frontend/app/framework/angular/forms/control-errors.component.ts @@ -21,9 +21,9 @@ interface State { styleUrls: ['./control-errors.component.scss'], templateUrl: './control-errors.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ControlErrorsComponent extends StatefulComponent implements OnChanges, OnDestroy { private displayFieldName: string; @@ -42,10 +42,10 @@ export class ControlErrorsComponent extends StatefulComponent implements constructor(changeDetector: ChangeDetectorRef, @Optional() @Host() private readonly formGroupDirective: FormGroupDirective, - private readonly localizer: LocalizerService + private readonly localizer: LocalizerService, ) { super(changeDetector, { - errorMessages: [] + errorMessages: [], }); } @@ -68,7 +68,7 @@ export class ControlErrorsComponent extends StatefulComponent implements this.displayFieldName = translation; } else { - this.displayFieldName = this.localizer.get(`common.field`)!; + this.displayFieldName = this.localizer.get('common.field')!; } } @@ -97,9 +97,12 @@ export class ControlErrorsComponent extends StatefulComponent implements this.controlOriginalMarkAsTouched = this.control.markAsTouched; + // eslint-disable-next-line @typescript-eslint/no-this-alias const self = this; + // eslint-disable-next-line func-names this.control['markAsTouched'] = function () { + // eslint-disable-next-line prefer-rest-params self.controlOriginalMarkAsTouched.apply(this, arguments); self.createMessages(); @@ -120,7 +123,7 @@ export class ControlErrorsComponent extends StatefulComponent implements const errorMessages: string[] = []; if (this.control && this.control.invalid && this.isTouched && this.control.errors) { - for (const key in this.control.errors) { + for (const key in this.control.errors) { if (this.control.errors.hasOwnProperty(key)) { const message = formatError(this.localizer, this.displayFieldName, key, this.control.errors[key], this.control.value); diff --git a/frontend/app/framework/angular/forms/copy.directive.ts b/frontend/app/framework/angular/forms/copy.directive.ts index b7021a594..63709dafc 100644 --- a/frontend/app/framework/angular/forms/copy.directive.ts +++ b/frontend/app/framework/angular/forms/copy.directive.ts @@ -9,7 +9,7 @@ import { Directive, HostListener, Input, Renderer2 } from '@angular/core'; import { DialogService, Types } from '@app/framework/internal'; @Directive({ - selector: '[sqxCopy]' + selector: '[sqxCopy]', }) export class CopyDirective { @Input('sqxCopy') @@ -17,7 +17,7 @@ export class CopyDirective { constructor( private readonly dialogs: DialogService, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -66,8 +66,10 @@ export class CopyDirective { document.execCommand('copy'); this.dialogs.notifyInfo('i18n:common.clipboardAdded'); + + return true; } catch (e) { - console.log('i18n:validation.between'); + return false; } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/editable-title.component.ts b/frontend/app/framework/angular/forms/editable-title.component.ts index 8499a31b3..22ca48f06 100644 --- a/frontend/app/framework/angular/forms/editable-title.component.ts +++ b/frontend/app/framework/angular/forms/editable-title.component.ts @@ -12,7 +12,7 @@ import { Keys } from '@app/framework/internal'; @Component({ selector: 'sqx-editable-title', styleUrls: ['./editable-title.component.scss'], - templateUrl: './editable-title.component.html' + templateUrl: './editable-title.component.html', }) export class EditableTitleComponent { @Output() @@ -44,13 +44,13 @@ export class EditableTitleComponent { public renameForm = this.formBuilder.group({ name: ['', [ - Validators.required - ] - ] + Validators.required, + ], + ], }); constructor( - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } @@ -83,4 +83,4 @@ export class EditableTitleComponent { this.renaming = false; } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/editors/autocomplete.component.ts b/frontend/app/framework/angular/forms/editors/autocomplete.component.ts index b725470fa..ec52213ea 100644 --- a/frontend/app/framework/angular/forms/editors/autocomplete.component.ts +++ b/frontend/app/framework/angular/forms/editors/autocomplete.component.ts @@ -16,7 +16,7 @@ export interface AutocompleteSource { } export const SQX_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AutocompleteComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AutocompleteComponent), multi: true, }; interface State { @@ -40,12 +40,12 @@ const NO_EMIT = { emitEvent: false }; styleUrls: ['./autocomplete.component.scss'], templateUrl: './autocomplete.component.html', providers: [ - SQX_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR + SQX_AUTOCOMPLETE_CONTROL_VALUE_ACCESSOR, ], animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AutocompleteComponent extends StatefulControlComponent> implements OnInit, OnDestroy { private timer: any; @@ -93,7 +93,7 @@ export class AutocompleteComponent extends StatefulControlComponent { this.setLoading(false); }), - catchError(() => of([])) + catchError(() => of([])), ); } })) @@ -134,7 +134,7 @@ export class AutocompleteComponent extends StatefulControlComponent 0) { + this.queryInput.setValue(obj[this.displayProperty], NO_EMIT); } else { - if (this.displayProperty && this.displayProperty.length > 0) { - this.queryInput.setValue(obj[this.displayProperty], NO_EMIT); - } else { - this.queryInput.setValue(obj.toString(), NO_EMIT); - } + this.queryInput.setValue(obj.toString(), NO_EMIT); } this.resetState(); @@ -262,4 +260,4 @@ export class AutocompleteComponent extends StatefulControlComponent CheckboxGroupComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CheckboxGroupComponent), multi: true, }; let CACHED_FONT: string; @@ -30,9 +28,9 @@ interface State { styleUrls: ['./checkbox-group.component.scss'], templateUrl: './checkbox-group.component.html', providers: [ - SQX_CHECKBOX_GROUP_CONTROL_VALUE_ACCESSOR + SQX_CHECKBOX_GROUP_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class CheckboxGroupComponent extends StatefulControlComponent implements AfterViewInit, AfterViewChecked, OnChanges { private childrenWidth = 0; @@ -61,7 +59,7 @@ export class CheckboxGroupComponent extends StatefulControlComponent CodeEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => CodeEditorComponent), multi: true, }; @Component({ @@ -23,16 +23,16 @@ export const SQX_CODE_EDITOR_CONTROL_VALUE_ACCESSOR: any = { styleUrls: ['./code-editor.component.scss'], templateUrl: './code-editor.component.html', providers: [ - SQX_CODE_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_CODE_EDITOR_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class CodeEditorComponent extends StatefulControlComponent<{}, string> implements AfterViewInit, FocusComponent, OnChanges { private aceEditor: any; private valueChanged = new Subject(); private value = ''; private modelist: any; - private completions: ReadonlyArray<{ name: string, value: string }> = []; + private completions: ReadonlyArray<{ name: string; value: string }> = []; @ViewChild('editor', { static: false }) public editor: ElementRef; @@ -61,7 +61,7 @@ export class CodeEditorComponent extends StatefulControlComponent<{}, string> im } @Input() - public set completion(value: ReadonlyArray<{ name: string, description: string }> | undefined | null) { + public set completion(value: ReadonlyArray<{ name: string; description: string }> | undefined | null) { if (value) { this.completions = value.map(({ name, description }) => ({ value: name, name, meta: 'context', description })); } else { @@ -70,7 +70,7 @@ export class CodeEditorComponent extends StatefulControlComponent<{}, string> im } constructor(changeDetector: ChangeDetectorRef, - private readonly resourceLoader: ResourceLoaderService + private readonly resourceLoader: ResourceLoaderService, ) { super(changeDetector, {}); } @@ -132,7 +132,7 @@ export class CodeEditorComponent extends StatefulControlComponent<{}, string> im Promise.all([ this.resourceLoader.loadLocalScript('dependencies/ace/ace.js'), this.resourceLoader.loadLocalScript('dependencies/ace/ext/modelist.js'), - this.resourceLoader.loadLocalScript('dependencies/ace/ext/language_tools.js') + this.resourceLoader.loadLocalScript('dependencies/ace/ext/language_tools.js'), ]).then(() => { this.aceEditor = ace.edit(this.editor.nativeElement); @@ -154,7 +154,7 @@ export class CodeEditorComponent extends StatefulControlComponent<{}, string> im this.aceEditor.setOptions({ enableBasicAutocompletion: true, enableSnippets: true, - enableLiveAutocompletion: true + enableLiveAutocompletion: true, }); const previous = this.aceEditor.completers; @@ -165,12 +165,13 @@ export class CodeEditorComponent extends StatefulControlComponent<{}, string> im callback(null, this.completions); }, getDocTooltip: (item: any) => { - if (item.meta === 'context' && item.description) { + if (item.meta === 'context' && item.description) { item.docHTML = `${item.value}
${item.description}`; } }, - identifierRegexps: [/[a-zA-Z_0-9\$\-\.\u00A2-\u2000\u2070-\uFFFF]/] - } + // eslint-disable-next-line no-useless-escape + identifierRegexps: [/[a-zA-Z_0-9\$\-\.\u00A2-\u2000\u2070-\uFFFF]/], + }, ]; } @@ -240,13 +241,13 @@ export class CodeEditorComponent extends StatefulControlComponent<{}, string> im this.aceEditor.setOptions({ minLines: lines, - maxLines: lines + maxLines: lines, }); } else if (this.height === 'auto') { this.aceEditor.setOptions({ minLines: 3, - maxLines: 500 - }); + maxLines: 500, + }); } } } @@ -255,4 +256,4 @@ export class CodeEditorComponent extends StatefulControlComponent<{}, string> im this.aceEditor.setValue(value); this.aceEditor.clearSelection(); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/editors/color-picker.component.ts b/frontend/app/framework/angular/forms/editors/color-picker.component.ts index 8d4e9448f..b0f184ded 100644 --- a/frontend/app/framework/angular/forms/editors/color-picker.component.ts +++ b/frontend/app/framework/angular/forms/editors/color-picker.component.ts @@ -11,7 +11,7 @@ import { MathHelper, ModalModel, StatefulControlComponent } from '@app/framework import { FocusComponent } from './../forms-helper'; export const SQX_COLOR_PICKER_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ColorPickerComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ColorPickerComponent), multi: true, }; interface State { @@ -27,9 +27,9 @@ interface State { styleUrls: ['./color-picker.component.scss'], templateUrl: './color-picker.component.html', providers: [ - SQX_COLOR_PICKER_CONTROL_VALUE_ACCESSOR + SQX_COLOR_PICKER_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ColorPickerComponent extends StatefulControlComponent implements FocusComponent { private wasOpen = false; @@ -69,7 +69,7 @@ export class ColorPickerComponent extends StatefulControlComponent DateTimeEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateTimeEditorComponent), multi: true, }; const NO_EMIT = { emitEvent: false }; @@ -30,9 +30,9 @@ interface State { styleUrls: ['./date-time-editor.component.scss'], templateUrl: './date-time-editor.component.html', providers: [ - SQX_DATE_TIME_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_DATE_TIME_EDITOR_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class DateTimeEditorComponent extends StatefulControlComponent implements OnInit, AfterViewInit, FocusComponent { private readonly hideDateButtonsSettings: boolean; @@ -91,7 +91,7 @@ export class DateTimeEditorComponent extends StatefulControlComponent DropdownComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DropdownComponent), multi: true, }; interface State { @@ -35,9 +33,9 @@ interface State { styleUrls: ['./dropdown.component.scss'], templateUrl: './dropdown.component.html', providers: [ - SQX_DROPDOWN_CONTROL_VALUE_ACCESSOR + SQX_DROPDOWN_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class DropdownComponent extends StatefulControlComponent> implements AfterContentInit, OnChanges, OnInit { private value: any; @@ -76,34 +74,34 @@ export class DropdownComponent extends StatefulControlComponent { - if (!this.items || !queryText) { - return { query: undefined, items: this.items }; - } else { - const query = new RegExp(queryText, 'i'); - - const items = this.items.filter(x => { - if (Types.isString(x)) { - return query.test(x); - } else { - return query.test(x[this.searchProperty]); - } - }); - - return { query, items }; - } - })) + map((queryText: string) => { + if (!this.items || !queryText) { + return { query: undefined, items: this.items }; + } else { + const query = new RegExp(queryText, 'i'); + + const items = this.items.filter(x => { + if (Types.isString(x)) { + return query.test(x); + } else { + return query.test(x[this.searchProperty]); + } + }); + + return { query, items }; + } + })) .subscribe(({ query, items }) => { this.next({ suggestedItems: items || [], - query + query, }); })); } @@ -247,4 +245,4 @@ export class DropdownComponent extends StatefulControlComponent LocalizedInputComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => LocalizedInputComponent), multi: true, }; const DEFAULT_LANGUAGE = { iso2Code: 'iv', englishName: 'Invariant' }; @@ -28,12 +26,12 @@ interface State { styleUrls: ['./localized-input.component.scss'], templateUrl: './localized-input.component.html', providers: [ - SQX_LOCALIZED_INPUT_CONTROL_VALUE_ACCESSOR + SQX_LOCALIZED_INPUT_CONTROL_VALUE_ACCESSOR, ], animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class LocalizedInputComponent extends StatefulControlComponent { private value: { [key: string]: any } | undefined; @@ -75,7 +73,7 @@ export class LocalizedInputComponent extends StatefulControlComponent StarsComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => StarsComponent), multi: true, }; interface State { @@ -29,9 +29,9 @@ interface State { styleUrls: ['./stars.component.scss'], templateUrl: './stars.component.html', providers: [ - SQX_STARS_CONTROL_VALUE_ACCESSOR + SQX_STARS_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class StarsComponent extends StatefulControlComponent { private maximumStarsValue = 5; @@ -66,7 +66,7 @@ export class StarsComponent extends StatefulControlComponent TagEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TagEditorComponent), multi: true, }; let CACHED_FONT: string; @@ -37,12 +35,12 @@ interface State { styleUrls: ['./tag-editor.component.scss'], templateUrl: './tag-editor.component.html', providers: [ - SQX_TAG_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_TAG_EDITOR_CONTROL_VALUE_ACCESSOR, ], animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class TagEditorComponent extends StatefulControlComponent> implements AfterViewInit, OnChanges, OnInit { private latestValue: any; @@ -109,7 +107,7 @@ export class TagEditorComponent extends StatefulControlComponent { this.next({ suggestedIndex: -1, - suggestedItems: items || [] + suggestedItems: items || [], }); })); } @@ -271,7 +269,7 @@ export class TagEditorComponent extends StatefulControlComponentthis.addInput.value; + const value = this.addInput.value as string; if (!value || value.length === 0) { this.updateItems(this.snapshot.items.slice(0, this.snapshot.items.length - 1), false); @@ -281,7 +279,7 @@ export class TagEditorComponent extends StatefulControlComponent ToggleComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ToggleComponent), multi: true, }; interface State { @@ -23,8 +23,8 @@ interface State { styleUrls: ['./toggle.component.scss'], templateUrl: './toggle.component.html', providers: [ - SQX_TOGGLE_CONTROL_VALUE_ACCESSOR - ] + SQX_TOGGLE_CONTROL_VALUE_ACCESSOR, + ], }) export class ToggleComponent extends StatefulControlComponent { @Input() @@ -37,7 +37,7 @@ export class ToggleComponent extends StatefulControlComponent { 'validation.uniquestrings': '{field|upper} must not contain duplicate values.', 'validation.validarrayvalues': '{field|upper} contains an invalid value: {invalidvalue}.', 'validation.validdatetime': '{field|upper} is not a valid date time.', - 'validation.validvalues': '{field|upper} is not a valid value.' + 'validation.validvalues': '{field|upper} is not a valid value.', }); it('should format custom', () => { const error = formatError(localizer, 'field', 'custom', { - errors: [ - 'My Message.' - ] + errors: [ + 'My Message.', + ], }, 123); expect(error).toEqual(['Backend Error: My Message.']); @@ -50,10 +50,10 @@ describe('formatErrors', () => { it('should format custom errors', () => { const error = formatError(localizer, 'field', 'custom', { - errors: [ + errors: [ 'My Message1.', - 'My Message2.' - ] + 'My Message2.', + ], }, 123); expect(error).toEqual(['Backend Error: My Message1.', 'Backend Error: My Message2.']); @@ -61,10 +61,10 @@ describe('formatErrors', () => { it('should format custom errors without dots', () => { const error = formatError(localizer, 'field', 'custom', { - errors: [ + errors: [ 'My Message1', - 'My Message2' - ] + 'My Message2', + ], }, 123); expect(error).toEqual(['Backend Error: My Message1.', 'Backend Error: My Message2.']); @@ -202,7 +202,7 @@ describe('formatErrors', () => { const formGroup = new FormGroup({ field1: formControl1, - field2: formControl2 + field2: formControl2, }); const formError = ValidatorsEx.match('field2', 'i18n:users.passwordConfirmValidationMessage')!(formControl1)!; @@ -221,4 +221,4 @@ describe('formatErrors', () => { return formMessage; } -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/forms/error-formatting.ts b/frontend/app/framework/angular/forms/error-formatting.ts index 162b72a36..2b10ef6b7 100644 --- a/frontend/app/framework/angular/forms/error-formatting.ts +++ b/frontend/app/framework/angular/forms/error-formatting.ts @@ -7,7 +7,7 @@ import { LocalizerService, StringHelper, Types } from '@app/framework/internal'; -export function formatError(localizer: LocalizerService, field: string, type: string, properties: any, value: any, errors?: any): string | readonly string[] { +export function formatError(localizer: LocalizerService, field: string, type: string, properties: any, value: any, errors?: any): string | readonly string[] { type = type.toLowerCase(); if (type === 'custom' && Types.isArrayOfString(properties.errors)) { @@ -49,4 +49,4 @@ export function formatError(localizer: LocalizerService, field: string, type: st message = localizer.getOrKey(message, args); return message; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/error-validator.spec.ts b/frontend/app/framework/angular/forms/error-validator.spec.ts index 465537350..83fa731b9 100644 --- a/frontend/app/framework/angular/forms/error-validator.spec.ts +++ b/frontend/app/framework/angular/forms/error-validator.spec.ts @@ -15,9 +15,9 @@ describe('ErrorValidator', () => { const control = new FormGroup({ nested1: new FormArray([ new FormGroup({ - nested2: new FormControl() - }) - ]) + nested2: new FormControl(), + }), + ]), }); beforeEach(() => { @@ -34,7 +34,7 @@ describe('ErrorValidator', () => { it('should return no message if error does not match', () => { validator.setError(new ErrorDto(500, 'Error', null, [ - 'nested1Property: My Error.' + 'nested1Property: My Error.', ])); const error = validator.validator(control.get('nested1')!); @@ -44,21 +44,21 @@ describe('ErrorValidator', () => { it('should return matching error', () => { validator.setError(new ErrorDto(500, 'Error', null, [ - 'other, nested1: My Error.' + 'other, nested1: My Error.', ])); const error = validator.validator(control.get('nested1')!); expect(error).toEqual({ custom: { - errors: ['My Error.'] - } + errors: ['My Error.'], + }, }); }); it('should return matching error twice if value does not change', () => { validator.setError(new ErrorDto(500, 'Error', null, [ - 'nested1: My Error.' + 'nested1: My Error.', ])); const error1 = validator.validator(control.get('nested1')!); @@ -66,20 +66,20 @@ describe('ErrorValidator', () => { expect(error1).toEqual({ custom: { - errors: ['My Error.'] - } + errors: ['My Error.'], + }, }); expect(error2).toEqual({ custom: { - errors: ['My Error.'] - } + errors: ['My Error.'], + }, }); }); it('should not return matching error again if value has changed', () => { validator.setError(new ErrorDto(500, 'Error', null, [ - 'nested1[1].nested2: My Error.' + 'nested1[1].nested2: My Error.', ])); const nested = control.get('nested1.0.nested2'); @@ -92,8 +92,8 @@ describe('ErrorValidator', () => { expect(error1).toEqual({ custom: { - errors: ['My Error.'] - } + errors: ['My Error.'], + }, }); expect(error2).toBeNull(); @@ -101,7 +101,7 @@ describe('ErrorValidator', () => { it('should not return matching error again if value has changed to initial', () => { validator.setError(new ErrorDto(500, 'Error', null, [ - 'nested1[1].nested2: My Error.' + 'nested1[1].nested2: My Error.', ])); const nested = control.get('nested1.0.nested2'); @@ -117,8 +117,8 @@ describe('ErrorValidator', () => { expect(error1).toEqual({ custom: { - errors: ['My Error.'] - } + errors: ['My Error.'], + }, }); expect(error2).toBeNull(); @@ -128,57 +128,57 @@ describe('ErrorValidator', () => { it('should return matching errors', () => { validator.setError(new ErrorDto(500, 'Error', null, [ 'nested1: My Error1.', - 'nested1: My Error2.' + 'nested1: My Error2.', ])); const error = validator.validator(control.get('nested1')!); expect(error).toEqual({ custom: { - errors: ['My Error1.', 'My Error2.'] - } + errors: ['My Error1.', 'My Error2.'], + }, }); }); it('should return deeply matching error', () => { validator.setError(new ErrorDto(500, 'Error', null, [ - 'nested1[1].nested2: My Error.' + 'nested1[1].nested2: My Error.', ])); const error = validator.validator(control.get('nested1.0.nested2')!); expect(error).toEqual({ custom: { - errors: ['My Error.'] - } + errors: ['My Error.'], + }, }); }); it('should return partial matching error', () => { validator.setError(new ErrorDto(500, 'Error', null, [ - 'nested1[1].nested2: My Error.' + 'nested1[1].nested2: My Error.', ])); const error = validator.validator(control.get('nested1.0')!); expect(error).toEqual({ custom: { - errors: ['nested2: My Error.'] - } + errors: ['nested2: My Error.'], + }, }); }); it('should return partial matching index error', () => { validator.setError(new ErrorDto(500, 'Error', null, [ - 'nested1[1].nested2: My Error.' + 'nested1[1].nested2: My Error.', ])); const error = validator.validator(control.get('nested1')!); expect(error).toEqual({ custom: { - errors: ['[1].nested2: My Error.'] - } + errors: ['[1].nested2: My Error.'], + }, }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/forms/error-validator.ts b/frontend/app/framework/angular/forms/error-validator.ts index d8931206e..1b2948166 100644 --- a/frontend/app/framework/angular/forms/error-validator.ts +++ b/frontend/app/framework/angular/forms/error-validator.ts @@ -61,16 +61,16 @@ export class ErrorValidator { return { custom: { - errors - } + errors, + }, }; } return null; - } + }; public setError(error: ErrorDto | undefined | null) { this.values = {}; this.error = error; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/file-drop.directive.ts b/frontend/app/framework/angular/forms/file-drop.directive.ts index a5dcb1b13..a7237da4a 100644 --- a/frontend/app/framework/angular/forms/file-drop.directive.ts +++ b/frontend/app/framework/angular/forms/file-drop.directive.ts @@ -5,9 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: prefer-for-of -// tslint:disable: readonly-array - import { Directive, ElementRef, EventEmitter, HostListener, Input, Output, Renderer2 } from '@angular/core'; import { Types } from '@app/framework/internal'; @@ -15,11 +12,11 @@ const ImageTypes: ReadonlyArray = [ 'image/jpeg', 'image/png', 'image/jpg', - 'image/gif' + 'image/gif', ]; @Directive({ - selector: '[sqxDropFile]' + selector: '[sqxDropFile]', }) export class FileDropDirective { private dragCounter = 0; @@ -41,7 +38,7 @@ export class FileDropDirective { constructor( private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -117,7 +114,7 @@ export class FileDropDirective { } } - private dragEnd(number?: number ) { + private dragEnd(number?: number) { this.dragCounter = number || this.dragCounter - 1; if (this.dragCounter === 0 && !this.disabled) { @@ -148,6 +145,7 @@ export class FileDropDirective { const webkitEntry = item.webkitGetAsEntry(); if (webkitEntry && webkitEntry.isDirectory) { + // eslint-disable-next-line no-await-in-loop await this.transferWebkitTree(webkitEntry, files); } } @@ -171,6 +169,7 @@ export class FileDropDirective { const entries = await getFilesPromise(item); for (const entry of entries) { + // eslint-disable-next-line no-await-in-loop await this.transferWebkitTree(entry, files); } } @@ -281,4 +280,4 @@ function getFiles(dataTransfer: DataTransfer) { interface DragDropEvent extends MouseEvent { readonly dataTransfer: DataTransfer; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/focus-on-init.directive.spec.ts b/frontend/app/framework/angular/forms/focus-on-init.directive.spec.ts index e07900a38..1c9c03262 100644 --- a/frontend/app/framework/angular/forms/focus-on-init.directive.spec.ts +++ b/frontend/app/framework/angular/forms/focus-on-init.directive.spec.ts @@ -19,8 +19,8 @@ describe('FocusOnInitDirective', () => { }, select: () => { isSelectCalled = true; - } - } + }, + }, }; beforeEach(() => { diff --git a/frontend/app/framework/angular/forms/focus-on-init.directive.ts b/frontend/app/framework/angular/forms/focus-on-init.directive.ts index e1b377ffe..34e614691 100644 --- a/frontend/app/framework/angular/forms/focus-on-init.directive.ts +++ b/frontend/app/framework/angular/forms/focus-on-init.directive.ts @@ -9,7 +9,7 @@ import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core'; import { Types } from '@app/framework/internal'; @Directive({ - selector: '[sqxFocusOnInit]' + selector: '[sqxFocusOnInit]', }) export class FocusOnInitDirective implements AfterViewInit { @Input() @@ -19,7 +19,7 @@ export class FocusOnInitDirective implements AfterViewInit { public enabled?: string | boolean | null = true; constructor( - private readonly element: ElementRef + private readonly element: ElementRef, ) { } @@ -34,7 +34,7 @@ export class FocusOnInitDirective implements AfterViewInit { } if (this.select) { - const input: HTMLInputElement = this.element.nativeElement; + const input = this.element.nativeElement as HTMLInputElement; if (Types.isFunction(input.select)) { input.select(); @@ -42,4 +42,4 @@ export class FocusOnInitDirective implements AfterViewInit { } }, 100); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/form-alert.component.ts b/frontend/app/framework/angular/forms/form-alert.component.ts index 8c1bc604d..0ad39c8c1 100644 --- a/frontend/app/framework/angular/forms/form-alert.component.ts +++ b/frontend/app/framework/angular/forms/form-alert.component.ts @@ -11,7 +11,7 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; selector: 'sqx-form-alert', styleUrls: ['./form-alert.component.scss'], templateUrl: './form-alert.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormAlertComponent { @Input() @@ -25,4 +25,4 @@ export class FormAlertComponent { @Input() public light?: boolean | null; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/form-error.component.ts b/frontend/app/framework/angular/forms/form-error.component.ts index 065ddd509..ff537aa2e 100644 --- a/frontend/app/framework/angular/forms/form-error.component.ts +++ b/frontend/app/framework/angular/forms/form-error.component.ts @@ -12,7 +12,7 @@ import { ErrorDto } from '@app/framework/internal'; selector: 'sqx-form-error', styleUrls: ['./form-error.component.scss'], templateUrl: './form-error.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormErrorComponent implements OnChanges { @Input() @@ -35,4 +35,4 @@ export class FormErrorComponent implements OnChanges { public close() { this.show = false; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/form-hint.component.ts b/frontend/app/framework/angular/forms/form-hint.component.ts index e2b5b9d45..3f5f47712 100644 --- a/frontend/app/framework/angular/forms/form-hint.component.ts +++ b/frontend/app/framework/angular/forms/form-hint.component.ts @@ -11,7 +11,7 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; selector: 'sqx-form-hint', styleUrls: ['./form-hint.component.scss'], templateUrl: './form-hint.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class FormHintComponent { @Input() @@ -22,4 +22,4 @@ export class FormHintComponent { @Input() public marginBottom: number | string = 0; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/forms-helper.spec.ts b/frontend/app/framework/angular/forms/forms-helper.spec.ts index a3263c504..e389d023f 100644 --- a/frontend/app/framework/angular/forms/forms-helper.spec.ts +++ b/frontend/app/framework/angular/forms/forms-helper.spec.ts @@ -55,7 +55,7 @@ describe('FormHelpers', () => { it('should calculate path for nested control', () => { const control = new FormGroup({ - nested: new FormControl() + nested: new FormControl(), }); const path = getControlPath(control.get('nested')); @@ -66,8 +66,8 @@ describe('FormHelpers', () => { it('should calculate path for deeply nested control', () => { const control = new FormGroup({ nested1: new FormGroup({ - nested2: new FormControl() - }) + nested2: new FormControl(), + }), }); const path = getControlPath(control.get('nested1.nested2')); @@ -79,9 +79,9 @@ describe('FormHelpers', () => { const control = new FormGroup({ nested1: new FormArray([ new FormGroup({ - nested2: new FormControl() - }) - ]) + nested2: new FormControl(), + }), + ]), }); const path = getControlPath(control.get('nested1.0.nested2')); @@ -93,9 +93,9 @@ describe('FormHelpers', () => { const control = new FormGroup({ nested1: new FormArray([ new FormGroup({ - nested2: new FormControl() - }) - ]) + nested2: new FormControl(), + }), + ]), }); const path = getControlPath(control.get('nested1.0.nested2'), true); @@ -103,4 +103,4 @@ describe('FormHelpers', () => { expect(path).toEqual('nested1[1].nested2'); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/forms/forms-helper.ts b/frontend/app/framework/angular/forms/forms-helper.ts index aeae1eb59..fdeb61ba9 100644 --- a/frontend/app/framework/angular/forms/forms-helper.ts +++ b/frontend/app/framework/angular/forms/forms-helper.ts @@ -44,7 +44,7 @@ export function addValidator(form: AbstractControl, validator: ValidatorFn) { } } -export function getControlPath(control: AbstractControl | undefined | null, apiCompatible = false): string { +export function getControlPath(control: AbstractControl | undefined | null, apiCompatible = false): string { if (!control || !control.parent) { return ''; } @@ -142,7 +142,7 @@ export function hasNonCustomError(form: AbstractControl) { return true; } } - } else { - return false; } -} \ No newline at end of file + + return false; +} diff --git a/frontend/app/framework/angular/forms/indeterminate-value.directive.ts b/frontend/app/framework/angular/forms/indeterminate-value.directive.ts index 3c0dc1ac6..253f5b5a2 100644 --- a/frontend/app/framework/angular/forms/indeterminate-value.directive.ts +++ b/frontend/app/framework/angular/forms/indeterminate-value.directive.ts @@ -10,14 +10,14 @@ import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { Types } from '@app/framework/internal'; export const SQX_INDETERMINATE_VALUE_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => IndeterminateValueDirective), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => IndeterminateValueDirective), multi: true, }; @Directive({ selector: '[sqxIndeterminateValue]', providers: [ - SQX_INDETERMINATE_VALUE_CONTROL_VALUE_ACCESSOR - ] + SQX_INDETERMINATE_VALUE_CONTROL_VALUE_ACCESSOR, + ], }) export class IndeterminateValueDirective implements ControlValueAccessor { private callChange = (_: any) => { /* NOOP */ }; @@ -29,7 +29,7 @@ export class IndeterminateValueDirective implements ControlValueAccessor { constructor( private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -82,4 +82,4 @@ export class IndeterminateValueDirective implements ControlValueAccessor { public registerOnTouched(fn: any) { this.callTouched = fn; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/model.ts b/frontend/app/framework/angular/forms/model.ts index f3f5e94b0..d8ffa9370 100644 --- a/frontend/app/framework/angular/forms/model.ts +++ b/frontend/app/framework/angular/forms/model.ts @@ -43,7 +43,7 @@ export class Form { } constructor( - public readonly form: T + public readonly form: T, ) { addValidator(form, this.errorValidator.validator); } @@ -104,7 +104,7 @@ export class Form { } } - public submitCompleted(options?: { newValue?: TOut, noReset?: boolean }) { + public submitCompleted(options?: { newValue?: TOut; noReset?: boolean }) { this.updateSubmitState(null, false); this.enable(); @@ -128,7 +128,7 @@ export class Form { this.state.next(s => ({ submitCount: s.submitCount + (submitting ? 1 : 0), submitting, - error + error, })); if (replaceDetails) { @@ -145,4 +145,4 @@ function getError(error?: string | ErrorDto | null): ErrorDto | undefined | null } return error; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/progress-bar.component.ts b/frontend/app/framework/angular/forms/progress-bar.component.ts index 4b009c99e..1d106cd9b 100644 --- a/frontend/app/framework/angular/forms/progress-bar.component.ts +++ b/frontend/app/framework/angular/forms/progress-bar.component.ts @@ -13,10 +13,10 @@ import * as ProgressBar from 'progressbar.js'; styles: [` :host ::ng-deep svg { vertical-align: middle - }` + }`, ], template: '', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ProgressBarComponent implements OnChanges, OnInit { private progressBar: any; @@ -47,7 +47,7 @@ export class ProgressBarComponent implements OnChanges, OnInit { constructor(changeDetector: ChangeDetectorRef, private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { changeDetector.detach(); } @@ -58,7 +58,7 @@ export class ProgressBarComponent implements OnChanges, OnInit { trailColor: this.trailColor, trailWidth: this.trailWidth, strokeWidth: this.strokeWidth, - svgStyle: { width: '100%', height: '100%' } + svgStyle: { width: '100%', height: '100%' }, }; this.renderer.setStyle(this.element.nativeElement, 'display', 'block'); @@ -91,4 +91,4 @@ export class ProgressBarComponent implements OnChanges, OnInit { this.progressBar.setText(`${Math.round(value)}%`); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/transform-input.directive.ts b/frontend/app/framework/angular/forms/transform-input.directive.ts index 301a181a9..e4d9f2a9e 100644 --- a/frontend/app/framework/angular/forms/transform-input.directive.ts +++ b/frontend/app/framework/angular/forms/transform-input.directive.ts @@ -19,14 +19,14 @@ export const TransformSlugifyCased: Transform = value => slugify(value, { lower: export const TransformUpperCase: Transform = value => value.toUpperCase(); export const SQX_TRANSFORM_INPUT_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TransformInputDirective), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TransformInputDirective), multi: true, }; @Directive({ selector: '[sqxTransformInput]', providers: [ - SQX_TRANSFORM_INPUT_VALUE_ACCESSOR - ] + SQX_TRANSFORM_INPUT_VALUE_ACCESSOR, + ], }) export class TransformInputDirective implements ControlValueAccessor { private callChange = (_: any) => { /* NOOP */ }; @@ -52,7 +52,7 @@ export class TransformInputDirective implements ControlValueAccessor { constructor( private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -91,4 +91,4 @@ export class TransformInputDirective implements ControlValueAccessor { private transformValue(value: any): string { return Types.isString(value) ? this.transformer(value) : ''; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/undefinable-form-array.spec.ts b/frontend/app/framework/angular/forms/undefinable-form-array.spec.ts index 9ee63541c..b0da75704 100644 --- a/frontend/app/framework/angular/forms/undefinable-form-array.spec.ts +++ b/frontend/app/framework/angular/forms/undefinable-form-array.spec.ts @@ -11,17 +11,17 @@ import { UndefinableFormArray } from './undefinable-form-array'; describe('UndefinableFormArray', () => { const tests = [{ name: 'undefined', - value: undefined + value: undefined, }, { name: 'defined', - value: ['1'] + value: ['1'], }]; - tests.map(x => { + tests.forEach(x => { it(`should set value as <${x.name}>`, () => { const control = new UndefinableFormArray([ - new FormControl('') + new FormControl(''), ]); assertValue(control, x.value, () => { @@ -30,11 +30,11 @@ describe('UndefinableFormArray', () => { }); }); - tests.map(x => { + tests.forEach(x => { it(`should patch value as <${x.name}>`, () => { const control = new UndefinableFormArray([ - new FormControl('') + new FormControl(''), ]); assertValue(control, x.value, () => { @@ -43,11 +43,11 @@ describe('UndefinableFormArray', () => { }); }); - tests.map(x => { + tests.forEach(x => { it(`should reset value as <${x.name}>`, () => { const control = new UndefinableFormArray([ - new FormControl('') + new FormControl(''), ]); assertValue(control, x.value, () => { @@ -86,4 +86,4 @@ describe('UndefinableFormArray', () => { expect(currentValue).toEqual(expected); expect(control.getRawValue()).toEqual(expected); } -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/forms/undefinable-form-array.ts b/frontend/app/framework/angular/forms/undefinable-form-array.ts index 34583d8f6..6f4b1ee79 100644 --- a/frontend/app/framework/angular/forms/undefinable-form-array.ts +++ b/frontend/app/framework/angular/forms/undefinable-form-array.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { EventEmitter } from '@angular/core'; import { AbstractControl, AbstractControlOptions, AsyncValidatorFn, FormArray, ValidatorFn } from '@angular/forms'; import { Types } from '@app/framework/internal'; @@ -48,7 +46,7 @@ export class UndefinableFormArray extends FormArray { super.insert(index, control); } - public setValue(value?: any[], options?: { onlySelf?: boolean; emitEvent?: boolean; }) { + public setValue(value?: any[], options?: { onlySelf?: boolean; emitEvent?: boolean }) { this.isUndefined = Types.isUndefined(value); if (this.isUndefined) { @@ -58,7 +56,7 @@ export class UndefinableFormArray extends FormArray { } } - public patchValue(value?: any[], options?: { onlySelf?: boolean; emitEvent?: boolean; }) { + public patchValue(value?: any[], options?: { onlySelf?: boolean; emitEvent?: boolean }) { this.isUndefined = Types.isUndefined(value); if (this.isUndefined) { @@ -68,13 +66,13 @@ export class UndefinableFormArray extends FormArray { } } - public reset(value?: any[], options?: { onlySelf?: boolean; emitEvent?: boolean; }) { + public reset(value?: any[], options?: { onlySelf?: boolean; emitEvent?: boolean }) { this.isUndefined = Types.isUndefined(value); super.reset(value || [], options); } - public updateValueAndValidity(opts: { onlySelf?: boolean; emitEvent?: boolean; } = {}) { + public updateValueAndValidity(opts: { onlySelf?: boolean; emitEvent?: boolean } = {}) { super.updateValueAndValidity({ emitEvent: false, onlySelf: true }); if (this.isUndefined) { @@ -94,4 +92,4 @@ export class UndefinableFormArray extends FormArray { private unsetValue() { (this as { value: any }).value = undefined; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/undefinable-form-group.spec.ts b/frontend/app/framework/angular/forms/undefinable-form-group.spec.ts index 55e9c4805..193913961 100644 --- a/frontend/app/framework/angular/forms/undefinable-form-group.spec.ts +++ b/frontend/app/framework/angular/forms/undefinable-form-group.spec.ts @@ -11,17 +11,17 @@ import { UndefinableFormGroup } from './undefinable-form-group'; describe('UndefinableFormGroup', () => { const tests = [{ name: 'undefined', - value: undefined + value: undefined, }, { name: 'defined', - value: { field: ['1'] } + value: { field: ['1'] }, }]; - tests.map(x => { + tests.forEach(x => { it(`should set value as <${x.name}>`, () => { const control = new UndefinableFormGroup({ - field: new FormControl() + field: new FormControl(), }); assertValue(control, x.value, () => { @@ -30,11 +30,11 @@ describe('UndefinableFormGroup', () => { }); }); - tests.map(x => { + tests.forEach(x => { it(`should patch value as <${x.name}>`, () => { const control = new UndefinableFormGroup({ - field: new FormControl() + field: new FormControl(), }); assertValue(control, x.value, () => { @@ -43,11 +43,11 @@ describe('UndefinableFormGroup', () => { }); }); - tests.map(x => { + tests.forEach(x => { it(`should reset value as <${x.name}>`, () => { const control = new UndefinableFormGroup({ - field: new FormControl() + field: new FormControl(), }); assertValue(control, x.value, () => { @@ -68,4 +68,4 @@ describe('UndefinableFormGroup', () => { expect(currentValue).toEqual(expected); expect(control.getRawValue()).toEqual(expected); } -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/forms/undefinable-form-group.ts b/frontend/app/framework/angular/forms/undefinable-form-group.ts index e26a3228d..74b60b6f4 100644 --- a/frontend/app/framework/angular/forms/undefinable-form-group.ts +++ b/frontend/app/framework/angular/forms/undefinable-form-group.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { EventEmitter } from '@angular/core'; import { AbstractControl, AbstractControlOptions, AsyncValidatorFn, FormGroup, ValidatorFn } from '@angular/forms'; import { Types } from '@app/framework/internal'; @@ -14,7 +12,7 @@ import { Types } from '@app/framework/internal'; export class UndefinableFormGroup extends FormGroup { private isUndefined = false; - constructor(controls: { [key: string]: AbstractControl; }, validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null) { + constructor(controls: { [key: string]: AbstractControl }, validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null) { super(controls, validatorOrOpts, asyncValidator); const reduce = this['_reduceValue']; @@ -38,7 +36,7 @@ export class UndefinableFormGroup extends FormGroup { } } - public setValue(value?: {}, options?: { onlySelf?: boolean; emitEvent?: boolean; }) { + public setValue(value?: {}, options?: { onlySelf?: boolean; emitEvent?: boolean }) { this.isUndefined = Types.isUndefined(value); if (this.isUndefined) { @@ -48,7 +46,7 @@ export class UndefinableFormGroup extends FormGroup { } } - public patchValue(value?: {}, options?: { onlySelf?: boolean; emitEvent?: boolean; }) { + public patchValue(value?: {}, options?: { onlySelf?: boolean; emitEvent?: boolean }) { this.isUndefined = Types.isUndefined(value); if (this.isUndefined) { @@ -58,13 +56,13 @@ export class UndefinableFormGroup extends FormGroup { } } - public reset(value?: {}, options: {onlySelf?: boolean, emitEvent?: boolean} = {}) { + public reset(value?: {}, options: { onlySelf?: boolean; emitEvent?: boolean } = {}) { this.isUndefined = Types.isUndefined(value); super.reset(value || {}, options); } - public updateValueAndValidity(opts: { onlySelf?: boolean; emitEvent?: boolean; } = {}) { + public updateValueAndValidity(opts: { onlySelf?: boolean; emitEvent?: boolean } = {}) { super.updateValueAndValidity({ emitEvent: false, onlySelf: true }); if (this.isUndefined) { @@ -84,4 +82,4 @@ export class UndefinableFormGroup extends FormGroup { private unsetValue() { (this as { value: any }).value = undefined; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/forms/validators.spec.ts b/frontend/app/framework/angular/forms/validators.spec.ts index 1a922fea8..51da5a5d1 100644 --- a/frontend/app/framework/angular/forms/validators.spec.ts +++ b/frontend/app/framework/angular/forms/validators.spec.ts @@ -233,7 +233,7 @@ describe('ValidatorsEx.match', () => { const form = new FormGroup({ password: new FormControl('1'), - passwordConfirm: new FormControl('2', validator) + passwordConfirm: new FormControl('2', validator), }); form.controls['passwordConfirm'].setValue('1'); @@ -251,10 +251,10 @@ describe('ValidatorsEx.match', () => { const form = new FormGroup({ password: new FormControl('1'), - passwordConfirm: new FormControl('2', validator) + passwordConfirm: new FormControl('2', validator), }); - expect(validator(form.controls['passwordConfirm'])).toEqual({ match: { message: 'Passwords are not the same.' }}); + expect(validator(form.controls['passwordConfirm'])).toEqual({ match: { message: 'Passwords are not the same.' } }); }); it('should return empty object if values are the same', () => { @@ -262,7 +262,7 @@ describe('ValidatorsEx.match', () => { const form = new FormGroup({ password: new FormControl('1'), - passwordConfirm: new FormControl('1', validator) + passwordConfirm: new FormControl('1', validator), }); expect(validator(form.controls['passwordConfirm'])).toBeNull(); @@ -272,7 +272,7 @@ describe('ValidatorsEx.match', () => { const validator = ValidatorsEx.match('password', 'Passwords are not the same.'); const form = new FormGroup({ - passwordConfirm: new FormControl('2', validator) + passwordConfirm: new FormControl('2', validator), }); expect(() => validator(form.controls['passwordConfirm'])).toThrow(); @@ -324,8 +324,8 @@ describe('ValidatorsEx.pattern', () => { const error = ValidatorsEx.pattern('[0-9]{1,4}', 'My-Message')(input); const expected: any = { patternmessage: { - requiredPattern: '^[0-9]{1,4}$', actualValue: 'abc', message: 'My-Message' - } + requiredPattern: '^[0-9]{1,4}$', actualValue: 'abc', message: 'My-Message', + }, }; expect(error).toEqual(expected); @@ -337,8 +337,8 @@ describe('ValidatorsEx.pattern', () => { const error = ValidatorsEx.pattern(/^[0-9]{1,4}$/, 'My-Message')(input); const expected: any = { patternmessage: { - requiredPattern: '/^[0-9]{1,4}$/', actualValue: 'abc', message: 'My-Message' - } + requiredPattern: '/^[0-9]{1,4}$/', actualValue: 'abc', message: 'My-Message', + }, }; expect(error).toEqual(expected); @@ -350,8 +350,8 @@ describe('ValidatorsEx.pattern', () => { const error = ValidatorsEx.pattern('[0-9]{1,4}')(input); const expected: any = { pattern: { - requiredPattern: '^[0-9]{1,4}$', actualValue: 'abc' - } + requiredPattern: '^[0-9]{1,4}$', actualValue: 'abc', + }, }; expect(error).toEqual(expected); @@ -363,8 +363,8 @@ describe('ValidatorsEx.pattern', () => { const error = ValidatorsEx.pattern(/^[0-9]{1,4}$/)(input); const expected: any = { pattern: { - requiredPattern: '/^[0-9]{1,4}$/', actualValue: 'abc' - } + requiredPattern: '/^[0-9]{1,4}$/', actualValue: 'abc', + }, }; expect(error).toEqual(expected); @@ -403,4 +403,4 @@ describe('ValidatorsEx.uniqueStrings', () => { expect(error).toEqual({ uniquestrings: false }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/forms/validators.ts b/frontend/app/framework/angular/forms/validators.ts index cd4026c28..bfa8ceebf 100644 --- a/frontend/app/framework/angular/forms/validators.ts +++ b/frontend/app/framework/angular/forms/validators.ts @@ -89,13 +89,11 @@ export module ValidatorsEx { const value = parseFloat(control.value); if (min === max) { - if (isNaN(value) || value !== min) { + if (Number.isNaN(value) || value !== min) { return { exactly: { expected: min, actual: value } }; } - } else { - if (isNaN(value) || value < min || value > max) { - return { between: { min, max, actual: value }}; - } + } else if (Number.isNaN(value) || value < min || value > max) { + return { between: { min, max, actual: value } }; } return null; @@ -121,13 +119,11 @@ export module ValidatorsEx { const length: number = control.value?.length || 0; if (minLength === maxLength) { - if (isNaN(length) || length !== minLength) { + if (Number.isNaN(length) || length !== minLength) { return { exactlylength: { expected: minLength, actual: length } }; } - } else { - if (isNaN(length) || length < minLength || length > maxLength) { - return { betweenlength: { minlength: minLength, maxlength: maxLength, actual: length }}; - } + } else if (Number.isNaN(length) || length < minLength || length > maxLength) { + return { betweenlength: { minlength: minLength, maxlength: maxLength, actual: length } }; } return null; @@ -195,4 +191,4 @@ export module ValidatorsEx { return null; }; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/hover-background.directive.ts b/frontend/app/framework/angular/hover-background.directive.ts index dae87605e..c2f105ce1 100644 --- a/frontend/app/framework/angular/hover-background.directive.ts +++ b/frontend/app/framework/angular/hover-background.directive.ts @@ -8,7 +8,7 @@ import { Directive, ElementRef, HostListener, Input, Renderer2 } from '@angular/core'; @Directive({ - selector: '[sqxHoverBackground]' + selector: '[sqxHoverBackground]', }) export class HoverBackgroundDirective { private previousBackground: string | null; @@ -17,14 +17,14 @@ export class HoverBackgroundDirective { public background: string; constructor( - private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly element: ElementRef, + private readonly renderer: Renderer2, ) { } @HostListener('mouseenter') public onEnter() { - this.previousBackground = (this.element.nativeElement).style.background; + this.previousBackground = this.element.nativeElement.style.background; this.renderer.setStyle(this.element.nativeElement, 'background', this.background); } @@ -33,4 +33,4 @@ export class HoverBackgroundDirective { public onLEave() { this.renderer.setStyle(this.element.nativeElement, 'background', this.previousBackground); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/http/caching.interceptor.ts b/frontend/app/framework/angular/http/caching.interceptor.ts index a8251af17..e4ae82d99 100644 --- a/frontend/app/framework/angular/http/caching.interceptor.ts +++ b/frontend/app/framework/angular/http/caching.interceptor.ts @@ -42,4 +42,4 @@ export class CachingInterceptor implements HttpInterceptor { return next.handle(req); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/http/http-extensions.spec.ts b/frontend/app/framework/angular/http/http-extensions.spec.ts index c399d3f51..d9ce7f569 100644 --- a/frontend/app/framework/angular/http/http-extensions.spec.ts +++ b/frontend/app/framework/angular/http/http-extensions.spec.ts @@ -72,4 +72,4 @@ describe('ErrorParsing', () => { expect(result).toEqual(new ErrorDto(500, 'Fallback', null, [], response)); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/http/http-extensions.ts b/frontend/app/framework/angular/http/http-extensions.ts index e1fbf324a..cfdde5871 100644 --- a/frontend/app/framework/angular/http/http-extensions.ts +++ b/frontend/app/framework/angular/http/http-extensions.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable no-inner-declarations */ + import { HttpClient, HttpErrorResponse, HttpEvent, HttpHeaders, HttpRequest, HttpResponse } from '@angular/common/http'; import { ErrorDto, Types, Version, Versioned } from '@app/framework/internal'; import { Observable, throwError } from 'rxjs'; @@ -121,4 +123,4 @@ export function parseError(response: HttpErrorResponse, fallback: string) { } return new ErrorDto(500, fallback, null, [], response); -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/http/loading.interceptor.ts b/frontend/app/framework/angular/http/loading.interceptor.ts index 6b6573553..cbc024b78 100644 --- a/frontend/app/framework/angular/http/loading.interceptor.ts +++ b/frontend/app/framework/angular/http/loading.interceptor.ts @@ -14,7 +14,7 @@ import { finalize } from 'rxjs/operators'; @Injectable() export class LoadingInterceptor implements HttpInterceptor { constructor( - private readonly loadingService: LoadingService + private readonly loadingService: LoadingService, ) { } @@ -33,4 +33,4 @@ export class LoadingInterceptor implements HttpInterceptor { this.loadingService.completeLoading(id); })); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/image-source.directive.ts b/frontend/app/framework/angular/image-source.directive.ts index 323164095..d200e09e4 100644 --- a/frontend/app/framework/angular/image-source.directive.ts +++ b/frontend/app/framework/angular/image-source.directive.ts @@ -8,10 +8,10 @@ import { AfterViewInit, Directive, ElementRef, Input, NgZone, OnChanges, OnDestroy, OnInit, Renderer2 } from '@angular/core'; import { MathHelper, ResourceOwner, StringHelper } from '@app/framework/internal'; -const LAYOUT_CACHE: { [key: string]: { width: number, height: number } } = {}; +const LAYOUT_CACHE: { [key: string]: { width: number; height: number } } = {}; @Directive({ - selector: '[sqxImageSource]' + selector: '[sqxImageSource]', }) export class ImageSourceDirective extends ResourceOwner implements OnChanges, OnDestroy, OnInit, AfterViewInit { private size: any; @@ -34,7 +34,7 @@ export class ImageSourceDirective extends ResourceOwner implements OnChanges, On constructor( private readonly zone: NgZone, private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { super(); } @@ -90,7 +90,7 @@ export class ImageSourceDirective extends ResourceOwner implements OnChanges, On } private resize() { - let size: { width: number, height: number } = null!; + let size: { width: number; height: number } = null!; if (this.layoutKey) { size = LAYOUT_CACHE[this.layoutKey]; @@ -146,4 +146,4 @@ export class ImageSourceDirective extends ResourceOwner implements OnChanges, On }, this.loadRetries * 1000); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/language-selector.component.ts b/frontend/app/framework/angular/language-selector.component.ts index 74989e789..f36eb624f 100644 --- a/frontend/app/framework/angular/language-selector.component.ts +++ b/frontend/app/framework/angular/language-selector.component.ts @@ -8,16 +8,16 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core'; import { fadeAnimation, ModalModel } from '@app/framework/internal'; -export interface Language { iso2Code: string; englishName: string; isMasterLanguage?: boolean; } +export interface Language { iso2Code: string; englishName: string; isMasterLanguage?: boolean } @Component({ selector: 'sqx-language-selector', styleUrls: ['./language-selector.component.scss'], templateUrl: './language-selector.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class LanguageSelectorComponent implements OnChanges, OnInit { @Output() @@ -70,4 +70,4 @@ export class LanguageSelectorComponent implements OnChanges, OnInit { public trackByLanguage(_index: number, language: Language) { return language.iso2Code; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/list-view.component.ts b/frontend/app/framework/angular/list-view.component.ts index 4fccc740d..7d72f4718 100644 --- a/frontend/app/framework/angular/list-view.component.ts +++ b/frontend/app/framework/angular/list-view.component.ts @@ -18,9 +18,9 @@ interface State { styleUrls: ['./list-view.component.scss'], templateUrl: './list-view.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.Default + changeDetection: ChangeDetectionStrategy.Default, }) export class ListViewComponent extends StatefulComponent implements AfterViewInit { private timer: any; @@ -64,10 +64,10 @@ export class ListViewComponent extends StatefulComponent implements After } constructor(changeDetector: ChangeDetectorRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { super(changeDetector, { - isLoading: false + isLoading: false, }); } @@ -86,4 +86,4 @@ export class ListViewComponent extends StatefulComponent implements After } } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/modals/dialog-renderer.component.ts b/frontend/app/framework/angular/modals/dialog-renderer.component.ts index 7bc5d62b3..185eb0e29 100644 --- a/frontend/app/framework/angular/modals/dialog-renderer.component.ts +++ b/frontend/app/framework/angular/modals/dialog-renderer.component.ts @@ -25,15 +25,15 @@ interface State { styleUrls: ['./dialog-renderer.component.scss'], templateUrl: './dialog-renderer.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class DialogRendererComponent extends StatefulComponent implements OnInit { public dialogView = new DialogModel(); constructor(changeDetector: ChangeDetectorRef, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super(changeDetector, { notifications: [] }); } @@ -50,7 +50,7 @@ export class DialogRendererComponent extends StatefulComponent implements this.dialogs.notifications.subscribe(notification => { this.next(s => ({ ...s, - notifications: [...s.notifications, notification] + notifications: [...s.notifications, notification], })); if (notification.displayTime > 0) { @@ -102,7 +102,7 @@ export class DialogRendererComponent extends StatefulComponent implements public close(notification: Notification) { this.next(s => ({ ...s, - notifications: s.notifications.filter(n => notification !== n) + notifications: s.notifications.filter(n => notification !== n), })); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/modals/modal-dialog.component.ts b/frontend/app/framework/angular/modals/modal-dialog.component.ts index 531ab7cab..d64e03d9a 100644 --- a/frontend/app/framework/angular/modals/modal-dialog.component.ts +++ b/frontend/app/framework/angular/modals/modal-dialog.component.ts @@ -13,9 +13,9 @@ import { fadeAnimation } from '@app/framework/internal'; styleUrls: ['./modal-dialog.component.scss'], templateUrl: './modal-dialog.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.Default + changeDetection: ChangeDetectionStrategy.Default, }) export class ModalDialogComponent implements AfterViewInit { @Output() @@ -46,7 +46,7 @@ export class ModalDialogComponent implements AfterViewInit { public footerElement: ElementRef; constructor( - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -64,4 +64,4 @@ export class ModalDialogComponent implements AfterViewInit { } } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/modals/modal-placement.directive.ts b/frontend/app/framework/angular/modals/modal-placement.directive.ts index d5d5dcd79..737411d7a 100644 --- a/frontend/app/framework/angular/modals/modal-placement.directive.ts +++ b/frontend/app/framework/angular/modals/modal-placement.directive.ts @@ -10,7 +10,7 @@ import { positionModal, ResourceOwner } from '@app/framework/internal'; import { timer } from 'rxjs'; @Directive({ - selector: '[sqxAnchoredTo]' + selector: '[sqxAnchoredTo]', }) export class ModalPlacementDirective extends ResourceOwner implements AfterViewInit, OnDestroy { private targetElement: Element; @@ -40,7 +40,7 @@ export class ModalPlacementDirective extends ResourceOwner implements AfterViewI constructor( private readonly renderer: Renderer2, - private readonly element: ElementRef + private readonly element: ElementRef, ) { super(); } @@ -115,4 +115,4 @@ export class ModalPlacementDirective extends ResourceOwner implements AfterViewI this.renderer.setStyle(modalRef, 'top', `${y}px`); this.renderer.setStyle(modalRef, 'left', `${x}px`); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/modals/modal.directive.ts b/frontend/app/framework/angular/modals/modal.directive.ts index 5e988679a..da998abbd 100644 --- a/frontend/app/framework/angular/modals/modal.directive.ts +++ b/frontend/app/framework/angular/modals/modal.directive.ts @@ -12,7 +12,7 @@ import { RootViewComponent } from './root-view.component'; declare type Model = DialogModel | ModalModel | any; @Directive({ - selector: '[sqxModal]' + selector: '[sqxModal]', }) export class ModalDirective implements OnDestroy { private readonly eventsView = new ResourceOwner(); @@ -48,7 +48,7 @@ export class ModalDirective implements OnDestroy { private readonly renderer: Renderer2, private readonly rootView: RootViewComponent, private readonly templateRef: TemplateRef, - private readonly viewContainer: ViewContainerRef + private readonly viewContainer: ViewContainerRef, ) { } @@ -78,16 +78,14 @@ export class ModalDirective implements OnDestroy { this.changeDetector.detectChanges(); } - } else { - if (this.renderedView) { - this.renderedView.destroy(); - this.renderedView = null; - this.renderRoots = null; + } else if (this.renderedView) { + this.renderedView.destroy(); + this.renderedView = null; + this.renderRoots = null; - remove(this.renderer, ModalDirective.backdrop); + remove(this.renderer, ModalDirective.backdrop); - this.changeDetector.detectChanges(); - } + this.changeDetector.detectChanges(); } this.isOpen = isOpen; @@ -153,13 +151,13 @@ export class ModalDirective implements OnDestroy { if (this.isClickedInside(event)) { this.hideModal(this.currentModel); } - } + }; private backdropListener = (event: MouseEvent) => { if (!this.isClickedInside(event)) { this.hideModal(this.currentModel); } - } + }; private isClickedInside(event: MouseEvent) { try { @@ -210,4 +208,4 @@ function remove(renderer: Renderer2, element: any) { function isModel(model: Model): model is DialogModel | ModalModel { return Types.is(model, DialogModel) || Types.is(model, ModalModel); -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/modals/onboarding-tooltip.component.ts b/frontend/app/framework/angular/modals/onboarding-tooltip.component.ts index 0e9665207..c6735f7cc 100644 --- a/frontend/app/framework/angular/modals/onboarding-tooltip.component.ts +++ b/frontend/app/framework/angular/modals/onboarding-tooltip.component.ts @@ -14,9 +14,9 @@ import { timer } from 'rxjs'; styleUrls: ['./onboarding-tooltip.component.scss'], templateUrl: './onboarding-tooltip.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class OnboardingTooltipComponent extends StatefulComponent implements OnDestroy, OnInit { @Input() @@ -35,10 +35,9 @@ export class OnboardingTooltipComponent extends StatefulComponent implements OnD constructor(changeDetector: ChangeDetectorRef, private readonly onboardingService: OnboardingService, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { super(changeDetector, {}); - } public ngOnDestroy() { @@ -55,7 +54,7 @@ export class OnboardingTooltipComponent extends StatefulComponent implements OnD const forRect = this.for.getBoundingClientRect(); const x = forRect.left + 0.5 * forRect.width; - const y = forRect.top + 0.5 * forRect.height; + const y = forRect.top + 0.5 * forRect.height; const fromPoint = document.elementFromPoint(x, y); @@ -102,4 +101,4 @@ export class OnboardingTooltipComponent extends StatefulComponent implements OnD this.ngOnDestroy(); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/modals/root-view.component.ts b/frontend/app/framework/angular/modals/root-view.component.ts index 5a53a9d79..4d05ceb92 100644 --- a/frontend/app/framework/angular/modals/root-view.component.ts +++ b/frontend/app/framework/angular/modals/root-view.component.ts @@ -11,9 +11,9 @@ import { ChangeDetectionStrategy, Component, ViewChild, ViewContainerRef } from selector: 'sqx-root-view', styleUrls: ['./root-view.component.scss'], templateUrl: './root-view.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RootViewComponent { @ViewChild('element', { read: ViewContainerRef, static: false }) public viewContainer: ViewContainerRef; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/modals/tooltip.directive.ts b/frontend/app/framework/angular/modals/tooltip.directive.ts index c48b385ae..0fb50a81b 100644 --- a/frontend/app/framework/angular/modals/tooltip.directive.ts +++ b/frontend/app/framework/angular/modals/tooltip.directive.ts @@ -5,13 +5,11 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: directive-selector - import { Directive, ElementRef, HostListener, Input, OnDestroy, Renderer2 } from '@angular/core'; import { DialogService, Tooltip } from '@app/framework/internal'; @Directive({ - selector: '[title]' + selector: '[title]', }) export class TooltipDirective implements OnDestroy { private titleText: string; @@ -33,7 +31,7 @@ export class TooltipDirective implements OnDestroy { constructor( private readonly dialogs: DialogService, private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -83,8 +81,10 @@ export class TooltipDirective implements OnDestroy { private unsetAttribute() { try { this.renderer.setProperty(this.element.nativeElement, 'title', ''); + + return true; } catch (ex) { - return; + return false; } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pager.component.spec.ts b/frontend/app/framework/angular/pager.component.spec.ts index b789f90a7..ac79bd409 100644 --- a/frontend/app/framework/angular/pager.component.spec.ts +++ b/frontend/app/framework/angular/pager.component.spec.ts @@ -135,4 +135,4 @@ describe('Pager', () => { expect(emitted).toEqual({ page: 3, pageSize: 10 }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/pager.component.ts b/frontend/app/framework/angular/pager.component.ts index 4b2a54759..bef388e9b 100644 --- a/frontend/app/framework/angular/pager.component.ts +++ b/frontend/app/framework/angular/pager.component.ts @@ -14,11 +14,11 @@ export const PAGE_SIZES: ReadonlyArray = [10, 20, 30, 50]; selector: 'sqx-pager', styleUrls: ['./pager.component.scss'], templateUrl: './pager.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class PagerComponent implements OnChanges { @Output() - public pagingChange = new EventEmitter<{ page: number, pageSize: number }>(); + public pagingChange = new EventEmitter<{ page: number; pageSize: number }>(); @Input() public paging: PagingInfo | undefined | null; @@ -63,7 +63,7 @@ export class PagerComponent implements OnChanges { this.translationInfo = { itemFirst: this.itemFirst, itemLast: this.itemLast, - numberOfItems: total + numberOfItems: total, }; } @@ -90,4 +90,4 @@ export class PagerComponent implements OnChanges { public setPageSize(pageSize: number) { this.pagingChange.emit({ page: 0, pageSize }); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/panel-container.directive.ts b/frontend/app/framework/angular/panel-container.directive.ts index 81a859cf0..81ee7f489 100644 --- a/frontend/app/framework/angular/panel-container.directive.ts +++ b/frontend/app/framework/angular/panel-container.directive.ts @@ -5,13 +5,13 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array +/* eslint-disable import/no-cycle */ import { AfterViewInit, Directive, ElementRef, HostListener, Renderer2 } from '@angular/core'; import { PanelComponent } from './panel.component'; @Directive({ - selector: '[sqxPanelContainer]' + selector: '[sqxPanelContainer]', }) export class PanelContainerDirective implements AfterViewInit { private readonly panels: PanelComponent[] = []; @@ -20,7 +20,7 @@ export class PanelContainerDirective implements AfterViewInit { constructor( private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -101,4 +101,4 @@ export class PanelContainerDirective implements AfterViewInit { this.renderer.setProperty(this.element.nativeElement, 'scrollLeft', diff); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/panel.component.ts b/frontend/app/framework/angular/panel.component.ts index d45241c45..a75a20806 100644 --- a/frontend/app/framework/angular/panel.component.ts +++ b/frontend/app/framework/angular/panel.component.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable import/no-cycle */ + import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges, ViewChild } from '@angular/core'; import { QueryParamsHandling } from '@angular/router'; import { slideRightAnimation } from '@app/framework/internal'; @@ -15,9 +17,9 @@ import { PanelContainerDirective } from './panel-container.directive'; styleUrls: ['./panel.component.scss'], templateUrl: './panel.component.html', animations: [ - slideRightAnimation + slideRightAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class PanelComponent implements AfterViewInit, OnChanges, OnDestroy, OnInit { private widthPrevious: string; @@ -92,7 +94,7 @@ export class PanelComponent implements AfterViewInit, OnChanges, OnDestroy, OnIn constructor( private readonly container: PanelContainerDirective, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -145,4 +147,4 @@ export class PanelComponent implements AfterViewInit, OnChanges, OnDestroy, OnIn } } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pipes/colors.pipes.spec.ts b/frontend/app/framework/angular/pipes/colors.pipes.spec.ts index aefdfd4bf..75010f346 100644 --- a/frontend/app/framework/angular/pipes/colors.pipes.spec.ts +++ b/frontend/app/framework/angular/pipes/colors.pipes.spec.ts @@ -61,4 +61,4 @@ describe('LightenPipe', () => { expect(result).toEqual('#98567d'); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/pipes/colors.pipes.ts b/frontend/app/framework/angular/pipes/colors.pipes.ts index 17f7f3215..152bf6078 100644 --- a/frontend/app/framework/angular/pipes/colors.pipes.ts +++ b/frontend/app/framework/angular/pipes/colors.pipes.ts @@ -5,6 +5,10 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable one-var-declaration-per-line */ +/* eslint-disable one-var */ +/* eslint-disable no-sequences */ + import { Pipe, PipeTransform } from '@angular/core'; interface RGBColor { @@ -31,25 +35,25 @@ const ColorDefinitions: ReadonlyArray = [ process: (bits) => ({ r: parseInt(bits[1], 10) / 255, g: parseInt(bits[2], 10) / 255, - b: parseInt(bits[3], 10) / 255 - }) + b: parseInt(bits[3], 10) / 255, + }), }, { regex: /^(\w{2})(\w{2})(\w{2})$/, process: (bits) => ({ r: parseInt(bits[1], 16) / 255, g: parseInt(bits[2], 16) / 255, - b: parseInt(bits[3], 16) / 255 - }) + b: parseInt(bits[3], 16) / 255, + }), }, { regex: /^(\w{1})(\w{1})(\w{1})$/, process: (bits) => ({ r: parseInt(bits[1] + bits[1], 16) / 255, g: parseInt(bits[2] + bits[2], 16) / 255, - b: parseInt(bits[3] + bits[3], 16) / 255 - }) - } + b: parseInt(bits[3] + bits[3], 16) / 255, + }), + }, ]; function parseColor(value: string) { @@ -135,7 +139,7 @@ function colorString({ r, g, b }: RGBColor) { @Pipe({ name: 'sqxDarken', - pure: true + pure: true, }) export class DarkenPipe implements PipeTransform { public transform(value: string, percentage: number): any { @@ -150,7 +154,7 @@ export class DarkenPipe implements PipeTransform { @Pipe({ name: 'sqxLighten', - pure: true + pure: true, }) export class LightenPipe implements PipeTransform { public transform(value: string, percentage: number): any { @@ -161,4 +165,4 @@ export class LightenPipe implements PipeTransform { return colorString(hsvToRgb(hsv)); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pipes/date-time.pipes.spec.ts b/frontend/app/framework/angular/pipes/date-time.pipes.spec.ts index 3c5db0049..5d5721ad8 100644 --- a/frontend/app/framework/angular/pipes/date-time.pipes.spec.ts +++ b/frontend/app/framework/angular/pipes/date-time.pipes.spec.ts @@ -26,7 +26,7 @@ describe('DurationPipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new DurationPipe().transform(x, '-'); @@ -49,7 +49,7 @@ describe('DatePipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new DatePipe().transform(x, '-'); @@ -72,7 +72,7 @@ describe('DayPipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new DayPipe().transform(x, '-'); @@ -95,7 +95,7 @@ describe('DayOfWeekPipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new DayOfWeekPipe().transform(x, '-'); @@ -118,7 +118,7 @@ describe('FromNowPipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new FromNowPipe().transform(x, '-'); @@ -141,7 +141,7 @@ describe('FullDateTimePipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new FullDateTimePipe().transform(x, '-'); @@ -164,7 +164,7 @@ describe('MonthPipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new MonthPipe().transform(x, '-'); @@ -187,7 +187,7 @@ describe('ShortDatePipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new ShortDatePipe().transform(x, '-'); @@ -210,7 +210,7 @@ describe('ShortTimePipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new ShortTimePipe().transform(x, '-'); @@ -233,11 +233,11 @@ describe('ISODatePipe', () => { expect(actual).toBe(expected); }); - [null, undefined].map(x => { + [null, undefined].forEach(x => { it('should use fallback for non value', () => { const actual = new ISODatePipe().transform(x, '-'); expect(actual).toBe('-'); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/pipes/date-time.pipes.ts b/frontend/app/framework/angular/pipes/date-time.pipes.ts index eda084a5b..b2acd23fc 100644 --- a/frontend/app/framework/angular/pipes/date-time.pipes.ts +++ b/frontend/app/framework/angular/pipes/date-time.pipes.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -10,7 +10,7 @@ import { DateTime, Duration } from '@app/framework/internal'; @Pipe({ name: 'sqxShortDate', - pure: true + pure: true, }) export class ShortDatePipe implements PipeTransform { public transform(value: DateTime | undefined | null, fallback = ''): string { @@ -24,7 +24,7 @@ export class ShortDatePipe implements PipeTransform { @Pipe({ name: 'sqxISODate', - pure: true + pure: true, }) export class ISODatePipe implements PipeTransform { public transform(value: DateTime | undefined | null, fallback = ''): string { @@ -38,7 +38,7 @@ export class ISODatePipe implements PipeTransform { @Pipe({ name: 'sqxDate', - pure: true + pure: true, }) export class DatePipe implements PipeTransform { public transform(value: DateTime | undefined | null, fallback = ''): string { @@ -52,7 +52,7 @@ export class DatePipe implements PipeTransform { @Pipe({ name: 'sqxMonth', - pure: true + pure: true, }) export class MonthPipe implements PipeTransform { public transform(value: DateTime | undefined | null, fallback = ''): string { @@ -66,7 +66,7 @@ export class MonthPipe implements PipeTransform { @Pipe({ name: 'sqxFromNow', - pure: true + pure: true, }) export class FromNowPipe implements PipeTransform { public transform(value: DateTime | undefined | null, fallback = ''): string { @@ -80,7 +80,7 @@ export class FromNowPipe implements PipeTransform { @Pipe({ name: 'sqxDayOfWeek', - pure: true + pure: true, }) export class DayOfWeekPipe implements PipeTransform { public transform(value: DateTime | undefined | null, fallback = ''): string { @@ -94,7 +94,7 @@ export class DayOfWeekPipe implements PipeTransform { @Pipe({ name: 'sqxDay', - pure: true + pure: true, }) export class DayPipe implements PipeTransform { public transform(value: DateTime | undefined | null, fallback = ''): string { @@ -108,7 +108,7 @@ export class DayPipe implements PipeTransform { @Pipe({ name: 'sqxShortTime', - pure: true + pure: true, }) export class ShortTimePipe implements PipeTransform { public transform(value: DateTime | undefined | null, fallback = ''): string { @@ -122,7 +122,7 @@ export class ShortTimePipe implements PipeTransform { @Pipe({ name: 'sqxFullDateTime', - pure: true + pure: true, }) export class FullDateTimePipe implements PipeTransform { public transform(value: DateTime | undefined | null, fallback = ''): string { @@ -136,7 +136,7 @@ export class FullDateTimePipe implements PipeTransform { @Pipe({ name: 'sqxDuration', - pure: true + pure: true, }) export class DurationPipe implements PipeTransform { public transform(value: Duration | undefined | null, fallback = ''): string { @@ -146,4 +146,4 @@ export class DurationPipe implements PipeTransform { return value.toString(); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pipes/highlight.pipe.ts b/frontend/app/framework/angular/pipes/highlight.pipe.ts index c00a127ed..f5dd8f287 100644 --- a/frontend/app/framework/angular/pipes/highlight.pipe.ts +++ b/frontend/app/framework/angular/pipes/highlight.pipe.ts @@ -5,14 +5,12 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: no-pipe-impure - import { Pipe, PipeTransform } from '@angular/core'; import { Types } from '@app/framework/internal'; @Pipe({ name: 'sqxHighlight', - pure: false + pure: false, }) export class HighlightPipe implements PipeTransform { public transform(text: string, highlight: string | RegExp | undefined | null): string { @@ -26,4 +24,4 @@ export class HighlightPipe implements PipeTransform { return text.replace(highlight, s => `${s}`); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pipes/keys.pipe.spec.ts b/frontend/app/framework/angular/pipes/keys.pipe.spec.ts index 2e6e1f089..c55b82e10 100644 --- a/frontend/app/framework/angular/pipes/keys.pipe.spec.ts +++ b/frontend/app/framework/angular/pipes/keys.pipe.spec.ts @@ -11,7 +11,7 @@ describe('KeysPipe', () => { it('should return keys', () => { const value = { key1: 1, - key2: 2 + key2: 2, }; const pipe = new KeysPipe(); @@ -21,4 +21,4 @@ describe('KeysPipe', () => { expect(actual).toEqual(expected); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/pipes/keys.pipe.ts b/frontend/app/framework/angular/pipes/keys.pipe.ts index e1800f3cd..0062cbf36 100644 --- a/frontend/app/framework/angular/pipes/keys.pipe.ts +++ b/frontend/app/framework/angular/pipes/keys.pipe.ts @@ -9,10 +9,10 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'sqxKeys', - pure: true + pure: true, }) export class KeysPipe implements PipeTransform { public transform(value: any): any { return Object.keys(value); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pipes/markdown.pipe.spec.ts b/frontend/app/framework/angular/pipes/markdown.pipe.spec.ts index e8558dbdd..b1338502f 100644 --- a/frontend/app/framework/angular/pipes/markdown.pipe.spec.ts +++ b/frontend/app/framework/angular/pipes/markdown.pipe.spec.ts @@ -20,7 +20,7 @@ describe('MarkdownInlinePipe', () => { expect(actual).toBe('bold'); }); - [null, undefined, ''].map(x => { + [null, undefined, ''].forEach(x => { it('should return empty string for invalid value', () => { const actual = new MarkdownInlinePipe().transform(x); @@ -42,11 +42,11 @@ describe('MarkdownPipe', () => { expect(actual).toBe('

bold

\n'); }); - [null, undefined, ''].map(x => { + [null, undefined, ''].forEach(x => { it('should return empty string for invalid value', () => { const actual = new MarkdownPipe().transform(x); expect(actual).toBe(''); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/pipes/markdown.pipe.ts b/frontend/app/framework/angular/pipes/markdown.pipe.ts index daed0a293..7b89ba1d6 100644 --- a/frontend/app/framework/angular/pipes/markdown.pipe.ts +++ b/frontend/app/framework/angular/pipes/markdown.pipe.ts @@ -28,7 +28,7 @@ inlinerRenderer.link = renderer.link; @Pipe({ name: 'sqxMarkdown', - pure: true + pure: true, }) export class MarkdownPipe implements PipeTransform { public transform(text: string | undefined | null): string { @@ -42,7 +42,7 @@ export class MarkdownPipe implements PipeTransform { @Pipe({ name: 'sqxMarkdownInline', - pure: true + pure: true, }) export class MarkdownInlinePipe implements PipeTransform { public transform(text: string | undefined | null): string { @@ -52,4 +52,4 @@ export class MarkdownInlinePipe implements PipeTransform { return ''; } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pipes/money.pipe.ts b/frontend/app/framework/angular/pipes/money.pipe.ts index b8840a046..2eeb91d04 100644 --- a/frontend/app/framework/angular/pipes/money.pipe.ts +++ b/frontend/app/framework/angular/pipes/money.pipe.ts @@ -10,12 +10,12 @@ import { CurrencyConfig, DecimalSeparatorConfig } from '@app/framework/internal' @Pipe({ name: 'sqxMoney', - pure: true + pure: true, }) export class MoneyPipe implements PipeTransform { constructor( private readonly currency: CurrencyConfig, - private readonly separator: DecimalSeparatorConfig + private readonly separator: DecimalSeparatorConfig, ) { } @@ -32,4 +32,4 @@ export class MoneyPipe implements PipeTransform { return result; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pipes/name.pipe.spec.ts b/frontend/app/framework/angular/pipes/name.pipe.spec.ts index ab816a1f4..ae02ac907 100644 --- a/frontend/app/framework/angular/pipes/name.pipe.spec.ts +++ b/frontend/app/framework/angular/pipes/name.pipe.spec.ts @@ -56,4 +56,4 @@ describe('DisplayNamePipe', () => { expect(pipe.transform({})).toBe(''); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/pipes/name.pipe.ts b/frontend/app/framework/angular/pipes/name.pipe.ts index b44399f1c..b3d35fd17 100644 --- a/frontend/app/framework/angular/pipes/name.pipe.ts +++ b/frontend/app/framework/angular/pipes/name.pipe.ts @@ -10,10 +10,10 @@ import { StringHelper } from '@app/framework/internal'; @Pipe({ name: 'sqxDisplayName', - pure: true + pure: true, }) export class DisplayNamePipe implements PipeTransform { - public transform(value: any, field1 = 'label', field2 = 'name'): any { + public transform(value: any, field1 = 'label', field2 = 'name'): any { if (!value) { return ''; } @@ -39,4 +39,4 @@ export class DisplayNamePipe implements PipeTransform { return o; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pipes/numbers.pipes.spec.ts b/frontend/app/framework/angular/pipes/numbers.pipes.spec.ts index b88db2eb0..2d81dc147 100644 --- a/frontend/app/framework/angular/pipes/numbers.pipes.spec.ts +++ b/frontend/app/framework/angular/pipes/numbers.pipes.spec.ts @@ -27,4 +27,4 @@ describe('KNumberPipe', () => { expect(pipe.transform(1024)).toBe('1k'); expect(pipe.transform(1260000)).toBe('1260k'); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/pipes/numbers.pipes.ts b/frontend/app/framework/angular/pipes/numbers.pipes.ts index 46d3e8b1c..5ea94366d 100644 --- a/frontend/app/framework/angular/pipes/numbers.pipes.ts +++ b/frontend/app/framework/angular/pipes/numbers.pipes.ts @@ -9,12 +9,12 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'sqxKNumber', - pure: true + pure: true, }) export class KNumberPipe implements PipeTransform { public transform(value: number) { if (value > 1000) { - value = value / 1000; + value /= 1000; if (value < 10) { value = Math.round(value * 10) / 10; @@ -33,7 +33,7 @@ export class KNumberPipe implements PipeTransform { @Pipe({ name: 'sqxFileSize', - pure: true + pure: true, }) export class FileSizePipe implements PipeTransform { public transform(value: number) { @@ -49,6 +49,6 @@ export function calculateFileSize(value: number, factor = 1024) { u++; } - // tslint:disable-next-line: prefer-template + // eslint-disable-next-line prefer-template return (u ? `${value.toFixed(1)} ` : value) + ' kMGTPEZY'[u] + 'B'; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/pipes/translate.pipe.spec.ts b/frontend/app/framework/angular/pipes/translate.pipe.spec.ts index 5336e65ab..b38e96acc 100644 --- a/frontend/app/framework/angular/pipes/translate.pipe.spec.ts +++ b/frontend/app/framework/angular/pipes/translate.pipe.spec.ts @@ -31,7 +31,7 @@ describe('TranslatePipe', () => { const key = { translate: () => { return 'translated'; - } + }, }; const pipe = new TranslatePipe(localizer.object); @@ -45,7 +45,7 @@ describe('TranslatePipe', () => { const key = { format: () => { return 'translated'; - } + }, }; const pipe = new TranslatePipe(localizer.object); diff --git a/frontend/app/framework/angular/pipes/translate.pipe.ts b/frontend/app/framework/angular/pipes/translate.pipe.ts index 7540db5e4..dbead7bd3 100644 --- a/frontend/app/framework/angular/pipes/translate.pipe.ts +++ b/frontend/app/framework/angular/pipes/translate.pipe.ts @@ -10,11 +10,11 @@ import { LocalizerService, Types } from '@app/framework/internal'; @Pipe({ name: 'sqxTranslate', - pure: true + pure: true, }) export class TranslatePipe implements PipeTransform { constructor( - private readonly localizer: LocalizerService + private readonly localizer: LocalizerService, ) { } @@ -27,4 +27,4 @@ export class TranslatePipe implements PipeTransform { return ''; } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/popup-link.directive.ts b/frontend/app/framework/angular/popup-link.directive.ts index d735d0588..8a6a6a3ab 100644 --- a/frontend/app/framework/angular/popup-link.directive.ts +++ b/frontend/app/framework/angular/popup-link.directive.ts @@ -8,7 +8,7 @@ import { Directive, HostListener, Input } from '@angular/core'; @Directive({ - selector: '[sqxPopupLink]' + selector: '[sqxPopupLink]', }) export class PopupLinkDirective { @Input('sqxPopupLink') @@ -20,4 +20,4 @@ export class PopupLinkDirective { return false; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/resized.directive.ts b/frontend/app/framework/angular/resized.directive.ts index a2aa90dfd..8cf31c8a0 100644 --- a/frontend/app/framework/angular/resized.directive.ts +++ b/frontend/app/framework/angular/resized.directive.ts @@ -9,7 +9,7 @@ import { Directive, ElementRef, EventEmitter, Input, NgZone, OnChanges, OnDestro import { ResizeListener, ResizeService, ResourceOwner } from '@app/framework/internal'; @Directive({ - selector: '[sqxResized], [sqxResizeCondition]' + selector: '[sqxResized], [sqxResizeCondition]', }) export class ResizedDirective extends ResourceOwner implements OnDestroy, OnChanges, ResizeListener { private condition: ((rect: ClientRect) => boolean) | undefined; @@ -28,7 +28,7 @@ export class ResizedDirective extends ResourceOwner implements OnDestroy, OnChan public resize = new EventEmitter(); constructor(resizeService: ResizeService, element: ElementRef, - private readonly zone: NgZone + private readonly zone: NgZone, ) { super(); @@ -36,12 +36,12 @@ export class ResizedDirective extends ResourceOwner implements OnDestroy, OnChan } public ngOnChanges() { - const minWidth = parseInt(this.minWidth, 10); - const maxWidth = parseInt(this.maxWidth, 10); + const minWidth = parseInt(this.minWidth as any, 10); + const maxWidth = parseInt(this.maxWidth as any, 10); - if (minWidth > 0 && maxWidth > 0) { + if (minWidth > 0 && maxWidth > 0) { this.condition = rect => rect.width < minWidth! || rect.width > maxWidth!; - } else if ( maxWidth > 0) { + } else if (maxWidth > 0) { this.condition = rect => rect.width > maxWidth!; } else if (minWidth > 0) { this.condition = rect => rect.width < minWidth!; @@ -67,4 +67,4 @@ export class ResizedDirective extends ResourceOwner implements OnDestroy, OnChan }); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/routers/can-deactivate.guard.spec.ts b/frontend/app/framework/angular/routers/can-deactivate.guard.spec.ts index 4b5c6b08b..e1510a2b0 100644 --- a/frontend/app/framework/angular/routers/can-deactivate.guard.spec.ts +++ b/frontend/app/framework/angular/routers/can-deactivate.guard.spec.ts @@ -17,7 +17,7 @@ describe('CanDeactivateGuard', () => { called = true; return of(true); - } + }, }; const result = new CanDeactivateGuard().canDeactivate(component); diff --git a/frontend/app/framework/angular/routers/can-deactivate.guard.ts b/frontend/app/framework/angular/routers/can-deactivate.guard.ts index b0a8d531b..4c0bc7823 100644 --- a/frontend/app/framework/angular/routers/can-deactivate.guard.ts +++ b/frontend/app/framework/angular/routers/can-deactivate.guard.ts @@ -18,4 +18,4 @@ export class CanDeactivateGuard implements CanDeactivate public canDeactivate(component: CanComponentDeactivate) { return component?.canDeactivate ? component.canDeactivate() : true; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/routers/parent-link.directive.ts b/frontend/app/framework/angular/routers/parent-link.directive.ts index ebdece13b..f636da921 100644 --- a/frontend/app/framework/angular/routers/parent-link.directive.ts +++ b/frontend/app/framework/angular/routers/parent-link.directive.ts @@ -10,7 +10,7 @@ import { ActivatedRoute, NavigationEnd, QueryParamsHandling, Router } from '@ang import { ResourceOwner } from '@app/framework/internal'; @Directive({ - selector: '[sqxParentLink]' + selector: '[sqxParentLink]', }) export class ParentLinkDirective extends ResourceOwner implements OnInit { private url: string; @@ -25,7 +25,7 @@ export class ParentLinkDirective extends ResourceOwner implements OnInit { private readonly router: Router, private readonly route: ActivatedRoute, private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { super(); } @@ -62,4 +62,4 @@ export class ParentLinkDirective extends ResourceOwner implements OnInit { this.renderer.setProperty(this.element.nativeElement, 'href', this.url); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/routers/router-2-state.spec.ts b/frontend/app/framework/angular/routers/router-2-state.spec.ts index 108d363a0..313f99558 100644 --- a/frontend/app/framework/angular/routers/router-2-state.spec.ts +++ b/frontend/app/framework/angular/routers/router-2-state.spec.ts @@ -193,8 +193,8 @@ describe('Router2State', () => { router = Mock.ofType(); route = { snapshot: { - queryParams - } + queryParams, + }, }; state = new State({}); @@ -233,7 +233,7 @@ describe('Router2State', () => { state.next({ state1: 'hello', - state2: { squidex: true, cms: true } + state2: { squidex: true, cms: true }, }); expect(routeExtras!.replaceUrl).toBeTrue(); @@ -251,12 +251,12 @@ describe('Router2State', () => { state.next({ state1: 'hello', - state2: { squidex: true, cms: true } + state2: { squidex: true, cms: true }, }); state.next({ state1: 'hello', - state2: { squidex: true, cms: true } + state2: { squidex: true, cms: true }, }); expect(routeExtras!.replaceUrl).toBeTrue(); @@ -266,4 +266,4 @@ describe('Router2State', () => { router.verify(x => x.navigate(It.isAny(), It.isAny()), Times.exactly(2)); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/routers/router-2-state.ts b/frontend/app/framework/angular/routers/router-2-state.ts index c5b931b07..18119540c 100644 --- a/frontend/app/framework/angular/routers/router-2-state.ts +++ b/frontend/app/framework/angular/routers/router-2-state.ts @@ -5,9 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: forin -// tslint:disable: readonly-array - import { Injectable, OnDestroy } from '@angular/core'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { LocalStoreService, Types } from '@app/framework/internal'; @@ -30,7 +27,7 @@ export class PagingSynchronizer implements RouteSynchronizer { constructor( private readonly localStore: LocalStoreService, private readonly storeName: string, - private readonly defaultSize: number + private readonly defaultSize: number, ) { } @@ -43,17 +40,17 @@ export class PagingSynchronizer implements RouteSynchronizer { pageSize = parseInt(pageSizeValue, 10); } - if (pageSize <= 0 || pageSize > 100 || isNaN(pageSize)) { + if (pageSize <= 0 || pageSize > 100 || Number.isNaN(pageSize)) { pageSize = this.localStore.getInt(`${this.storeName}.pageSize`, this.defaultSize); } - if (pageSize <= 0 || pageSize > 100 || isNaN(pageSize)) { + if (pageSize <= 0 || pageSize > 100 || Number.isNaN(pageSize)) { pageSize = this.defaultSize; } let page = parseInt(query['page'], 10); - if (page <= 0 || isNaN(page)) { + if (page <= 0 || Number.isNaN(page)) { page = 0; } @@ -61,7 +58,7 @@ export class PagingSynchronizer implements RouteSynchronizer { } public parseFromState(state: any) { - let page = undefined; + let page; const pageSize: number = state.pageSize; @@ -82,7 +79,7 @@ export class StringSynchronizer implements RouteSynchronizer { constructor( private readonly key: string, - private readonly fallback?: string + private readonly fallback?: string, ) { } @@ -102,6 +99,8 @@ export class StringSynchronizer implements RouteSynchronizer { if (Types.isString(value)) { return { [this.key]: value }; } + + return undefined; } } @@ -111,7 +110,7 @@ export class StringKeysSynchronizer implements RouteSynchronizer { } constructor( - private readonly key: string + private readonly key: string, ) { } @@ -141,6 +140,8 @@ export class StringKeysSynchronizer implements RouteSynchronizer { return { [this.key]: items }; } } + + return undefined; } } @@ -167,7 +168,7 @@ export class Router2State implements OnDestroy, StateSynchronizer { constructor( private readonly route: ActivatedRoute, private readonly router: Router, - private readonly localStore: LocalStoreService + private readonly localStore: LocalStoreService, ) { } @@ -204,7 +205,7 @@ export class Router2StateMap implements StateSynchronizerMap { private readonly state: State, private readonly route: ActivatedRoute, private readonly router: Router, - private readonly localStore: LocalStoreService + private readonly localStore: LocalStoreService, ) { } @@ -238,7 +239,7 @@ export class Router2StateMap implements StateSynchronizerMap { this.router.navigate([], { queryParams: query, queryParamsHandling: 'merge', - replaceUrl: true + replaceUrl: true, }); } @@ -279,4 +280,4 @@ export class Router2StateMap implements StateSynchronizerMap { return this; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/routers/router-utils.spec.ts b/frontend/app/framework/angular/routers/router-utils.spec.ts index 2f507ae1e..5711bbddf 100644 --- a/frontend/app/framework/angular/routers/router-utils.spec.ts +++ b/frontend/app/framework/angular/routers/router-utils.spec.ts @@ -11,83 +11,83 @@ describe('RouterUtils', () => { it('should concat all params from route', () => { const snapshot = { params: { - key1: 'key1' + key1: 'key1', }, parent: { params: { key1: 'key1-parent', - key2: 'key2' - } - } + key2: 'key2', + }, + }, }; const params = allParams({ snapshot }); expect(params).toEqual({ key1: 'key1', - key2: 'key2' + key2: 'key2', }); }); it('should concat all params from snapshot', () => { const snapshot = { params: { - key1: 'key1' + key1: 'key1', }, parent: { params: { key1: 'key1-parent', - key2: 'key2' - } - } + key2: 'key2', + }, + }, }; const params = allParams(snapshot); expect(params).toEqual({ key1: 'key1', - key2: 'key2' + key2: 'key2', }); }); it('should concat all data from route', () => { const snapshot = { data: { - key1: 'key1' + key1: 'key1', }, parent: { data: { key1: 'key1-parent', - key2: 'key2' - } - } + key2: 'key2', + }, + }, }; const params = allData({ snapshot }); expect(params).toEqual({ key1: 'key1', - key2: 'key2' + key2: 'key2', }); }); it('should concat all data from snapshot', () => { const snapshot = { data: { - key1: 'key1' + key1: 'key1', }, parent: { data: { key1: 'key1-parent', - key2: 'key2' - } - } + key2: 'key2', + }, + }, }; const params = allData(snapshot); expect(params).toEqual({ key1: 'key1', - key2: 'key2' + key2: 'key2', }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/routers/router-utils.ts b/frontend/app/framework/angular/routers/router-utils.ts index cd8c667e5..b1cbb59c7 100644 --- a/frontend/app/framework/angular/routers/router-utils.ts +++ b/frontend/app/framework/angular/routers/router-utils.ts @@ -45,7 +45,7 @@ export function allParams(value: ActivatedRouteSnapshot | ActivatedRoute): Param export function childComponent(value: RouterStateSnapshot) { let current = value.root; - while (true) { + while (current) { if (current.firstChild) { current = current.firstChild; } else { @@ -54,4 +54,4 @@ export function childComponent(value: RouterStateSnapshot) { } return current.component; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/safe-html.pipe.ts b/frontend/app/framework/angular/safe-html.pipe.ts index 5b9326a96..437f8b6c5 100644 --- a/frontend/app/framework/angular/safe-html.pipe.ts +++ b/frontend/app/framework/angular/safe-html.pipe.ts @@ -10,11 +10,11 @@ import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; @Pipe({ name: 'sqxSafeHtml', - pure: true + pure: true, }) export class SafeHtmlPipe implements PipeTransform { constructor( - public readonly domSanitizer: DomSanitizer + public readonly domSanitizer: DomSanitizer, ) { } @@ -25,15 +25,15 @@ export class SafeHtmlPipe implements PipeTransform { @Pipe({ name: 'sqxSafeUrl', - pure: true + pure: true, }) export class SafeUrlPipe implements PipeTransform { constructor( - public readonly domSanitizer: DomSanitizer + public readonly domSanitizer: DomSanitizer, ) { } public transform(url: string): SafeHtml { return this.domSanitizer.bypassSecurityTrustUrl(url); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/scroll-active.directive.ts b/frontend/app/framework/angular/scroll-active.directive.ts index 507defbb0..0c1bedc28 100644 --- a/frontend/app/framework/angular/scroll-active.directive.ts +++ b/frontend/app/framework/angular/scroll-active.directive.ts @@ -8,7 +8,7 @@ import { AfterViewInit, Directive, ElementRef, Input, OnChanges, Renderer2 } from '@angular/core'; @Directive({ - selector: '[sqxScrollActive]' + selector: '[sqxScrollActive]', }) export class ScrollActiveDirective implements AfterViewInit, OnChanges { @Input('sqxScrollActive') @@ -19,7 +19,7 @@ export class ScrollActiveDirective implements AfterViewInit, OnChanges { constructor( private readonly element: ElementRef, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -58,4 +58,4 @@ export class ScrollActiveDirective implements AfterViewInit, OnChanges { } } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/shortcut.component.spec.ts b/frontend/app/framework/angular/shortcut.component.spec.ts index 6f3d9370a..a13631b0e 100644 --- a/frontend/app/framework/angular/shortcut.component.spec.ts +++ b/frontend/app/framework/angular/shortcut.component.spec.ts @@ -13,7 +13,7 @@ describe('ShortcutComponent', () => { const changeDetector: any = { detach: () => { return 0; - } + }, }; let shortcutService: ShortcutService; diff --git a/frontend/app/framework/angular/shortcut.component.ts b/frontend/app/framework/angular/shortcut.component.ts index bf8a238ab..064814558 100644 --- a/frontend/app/framework/angular/shortcut.component.ts +++ b/frontend/app/framework/angular/shortcut.component.ts @@ -10,7 +10,7 @@ import { ShortcutService, StatefulComponent } from '@app/framework/internal'; @Component({ selector: 'sqx-shortcut', - template: '' + template: '', }) export class ShortcutComponent extends StatefulComponent implements OnDestroy, OnInit { private lastKeys: string; @@ -27,7 +27,7 @@ export class ShortcutComponent extends StatefulComponent implements OnDestroy, O constructor( changeDetector: ChangeDetectorRef, private readonly shortcutService: ShortcutService, - private readonly zone: NgZone + private readonly zone: NgZone, ) { super(changeDetector, {}); @@ -55,4 +55,4 @@ export class ShortcutComponent extends StatefulComponent implements OnDestroy, O }); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/stateful.component.ts b/frontend/app/framework/angular/stateful.component.ts index be07b3396..a3b8f60a8 100644 --- a/frontend/app/framework/angular/stateful.component.ts +++ b/frontend/app/framework/angular/stateful.component.ts @@ -5,9 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array -// tslint:disable: directive-class-suffix - import { ChangeDetectorRef, Directive, OnDestroy } from '@angular/core'; import { ControlValueAccessor } from '@angular/forms'; import { Observable, Subscription } from 'rxjs'; @@ -59,7 +56,7 @@ export abstract class StatefulComponent extends State implements OnD protected constructor( private readonly changeDetector: ChangeDetectorRef, - state: T + state: T, ) { super(state); @@ -124,9 +121,9 @@ export abstract class StatefulControlComponent extends Sta this.onDisabled(this.snapshot.isDisabled); } - public onDisabled(isDisabled: boolean) { - return; + public onDisabled(_isDisabled: boolean) { + /* NOOP */ } public abstract writeValue(obj: any): void; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/status-icon.component.ts b/frontend/app/framework/angular/status-icon.component.ts index d3aaa98a5..dc50c03ef 100644 --- a/frontend/app/framework/angular/status-icon.component.ts +++ b/frontend/app/framework/angular/status-icon.component.ts @@ -11,7 +11,7 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; selector: 'sqx-status-icon', styleUrls: ['./status-icon.component.scss'], templateUrl: './status-icon.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class StatusIconComponent { @Input() @@ -22,4 +22,4 @@ export class StatusIconComponent { @Input() public size: 'lg' | 'sm' = 'lg'; -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/stop-click.directive.ts b/frontend/app/framework/angular/stop-click.directive.ts index 455c7e1a2..3b1aac342 100644 --- a/frontend/app/framework/angular/stop-click.directive.ts +++ b/frontend/app/framework/angular/stop-click.directive.ts @@ -8,7 +8,7 @@ import { Directive, HostListener, Input } from '@angular/core'; @Directive({ - selector: '[sqxStopClick]' + selector: '[sqxStopClick]', }) export class StopClickDirective { @Input('sqxStopClick') @@ -23,4 +23,4 @@ export class StopClickDirective { event.stopImmediatePropagation(); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/sync-scrolling.directive.ts b/frontend/app/framework/angular/sync-scrolling.directive.ts index c5923a4f3..284d69985 100644 --- a/frontend/app/framework/angular/sync-scrolling.directive.ts +++ b/frontend/app/framework/angular/sync-scrolling.directive.ts @@ -8,14 +8,14 @@ import { Directive, HostListener, Input, Renderer2 } from '@angular/core'; @Directive({ - selector: '[sqxSyncScrolling]' + selector: '[sqxSyncScrolling]', }) export class SyncScollingDirective { @Input('sqxSyncScrolling') public target: HTMLElement; constructor( - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -27,4 +27,4 @@ export class SyncScollingDirective { this.renderer.setStyle(this.target, 'transform', `translate(-${scroll - this.target.scrollLeft}px, 0px)`); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/sync-width.directive.ts b/frontend/app/framework/angular/sync-width.directive.ts index ed1a5d6f5..1a7ceaba8 100644 --- a/frontend/app/framework/angular/sync-width.directive.ts +++ b/frontend/app/framework/angular/sync-width.directive.ts @@ -9,7 +9,7 @@ import { AfterViewInit, Directive, ElementRef, Input, Renderer2 } from '@angular import { ResizeListener, ResizeService, ResourceOwner } from '@app/framework/internal'; @Directive({ - selector: '[sqxSyncWidth]' + selector: '[sqxSyncWidth]', }) export class SyncWidthDirective extends ResourceOwner implements AfterViewInit, ResizeListener { @Input('sqxSyncWidth') @@ -18,7 +18,7 @@ export class SyncWidthDirective extends ResourceOwner implements AfterViewInit, constructor( private readonly element: ElementRef, private readonly renderer: Renderer2, - private readonly resizeService: ResizeService + private readonly resizeService: ResizeService, ) { super(); @@ -42,4 +42,4 @@ export class SyncWidthDirective extends ResourceOwner implements AfterViewInit, this.renderer.setStyle(this.target, 'width', `${width}px`); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/tab-router-link.directive.ts b/frontend/app/framework/angular/tab-router-link.directive.ts index 36b07f117..01e9913c6 100644 --- a/frontend/app/framework/angular/tab-router-link.directive.ts +++ b/frontend/app/framework/angular/tab-router-link.directive.ts @@ -9,7 +9,7 @@ import { Directive, HostListener, Input } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; @Directive({ - selector: '[sqxTabRouterLink]' + selector: '[sqxTabRouterLink]', }) export class TabRouterlinkDirective { @Input('sqxTabRouterLink') @@ -17,14 +17,14 @@ export class TabRouterlinkDirective { constructor( private readonly router: Router, - private readonly route: ActivatedRoute + private readonly route: ActivatedRoute, ) { } @HostListener('click', ['$event']) public onClick(event: MouseEvent) { const urlTree = this.router.createUrlTree(this.commands, { - relativeTo: this.route + relativeTo: this.route, }); if (event.ctrlKey) { @@ -35,4 +35,4 @@ export class TabRouterlinkDirective { this.router.navigateByUrl(urlTree); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/template-wrapper.directive.ts b/frontend/app/framework/angular/template-wrapper.directive.ts index f3533458f..1cbfddd38 100644 --- a/frontend/app/framework/angular/template-wrapper.directive.ts +++ b/frontend/app/framework/angular/template-wrapper.directive.ts @@ -8,7 +8,7 @@ import { Directive, EmbeddedViewRef, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewContainerRef } from '@angular/core'; @Directive({ - selector: '[sqxTemplateWrapper]' + selector: '[sqxTemplateWrapper]', }) export class TemplateWrapperDirective implements OnDestroy, OnInit, OnChanges { @Input() @@ -26,7 +26,7 @@ export class TemplateWrapperDirective implements OnDestroy, OnInit, OnChanges { public view: EmbeddedViewRef; public constructor( - private readonly viewContainer: ViewContainerRef + private readonly viewContainer: ViewContainerRef, ) { } @@ -40,9 +40,9 @@ export class TemplateWrapperDirective implements OnDestroy, OnInit, OnChanges { const { index, context } = this; const data = { - '\$implicit': this.item, + $implicit: this.item, index, - context + context, }; this.view = this.viewContainer.createEmbeddedView(this.templateRef, data); @@ -63,4 +63,4 @@ export class TemplateWrapperDirective implements OnDestroy, OnInit, OnChanges { } } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/title.component.spec.ts b/frontend/app/framework/angular/title.component.spec.ts index 178ace3f8..dbcb44fc9 100644 --- a/frontend/app/framework/angular/title.component.spec.ts +++ b/frontend/app/framework/angular/title.component.spec.ts @@ -53,4 +53,4 @@ describe('TitleComponent', () => { titleService.verify(x => x.pop(), Times.never()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/angular/title.component.ts b/frontend/app/framework/angular/title.component.ts index b0dbf5bfd..85b9ddf3e 100644 --- a/frontend/app/framework/angular/title.component.ts +++ b/frontend/app/framework/angular/title.component.ts @@ -11,7 +11,7 @@ import { TitleService } from '@app/framework/internal'; @Component({ selector: 'sqx-title', template: '', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class TitleComponent implements OnDestroy { private previous: any; @@ -24,7 +24,7 @@ export class TitleComponent implements OnDestroy { } constructor( - private readonly titleService: TitleService + private readonly titleService: TitleService, ) { } @@ -33,4 +33,4 @@ export class TitleComponent implements OnDestroy { this.titleService.pop(); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/angular/video-player.component.ts b/frontend/app/framework/angular/video-player.component.ts index aae187452..5bb904b31 100644 --- a/frontend/app/framework/angular/video-player.component.ts +++ b/frontend/app/framework/angular/video-player.component.ts @@ -8,13 +8,13 @@ import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, OnChanges, OnDestroy, Renderer2, ViewChild } from '@angular/core'; import { ResourceLoaderService } from '@app/framework/internal'; -declare var videojs: any; +declare const videojs: any; @Component({ selector: 'sqx-video-player', styleUrls: ['./video-player.component.scss'], templateUrl: './video-player.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class VideoPlayerComponent implements AfterViewInit, OnDestroy, OnChanges { private player: any; @@ -30,7 +30,7 @@ export class VideoPlayerComponent implements AfterViewInit, OnDestroy, OnChanges constructor( private readonly resourceLoader: ResourceLoaderService, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { } @@ -51,15 +51,15 @@ export class VideoPlayerComponent implements AfterViewInit, OnDestroy, OnChanges public ngAfterViewInit(): void { Promise.all([ this.resourceLoader.loadLocalScript('dependencies/videojs/video.min.js'), - this.resourceLoader.loadLocalStyle('dependencies/videojs/video-js.min.css') + this.resourceLoader.loadLocalStyle('dependencies/videojs/video-js.min.css'), ]).then(() => { this.renderer.removeClass(this.video.nativeElement, 'hidden'); this.player = videojs(this.video.nativeElement, { - fluid: true + fluid: true, }); this.ngOnChanges(); }); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/configurations.ts b/frontend/app/framework/configurations.ts index 86e9ec84c..6a1afe404 100644 --- a/frontend/app/framework/configurations.ts +++ b/frontend/app/framework/configurations.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -7,7 +7,7 @@ export class UIOptions { constructor( - private readonly value: any + private readonly value: any, ) { } @@ -58,7 +58,7 @@ export class CurrencyConfig { constructor( public readonly code: string, public readonly symbol: string, - public readonly showAfter: boolean = true + public readonly showAfter: boolean = true, ) { } } @@ -69,4 +69,4 @@ export class DecimalSeparatorConfig { export class ProductionModeConfig { constructor(public readonly isProductionMode: boolean) {} -} \ No newline at end of file +} diff --git a/frontend/app/framework/declarations.ts b/frontend/app/framework/declarations.ts index 0f59a704c..f8c0b73e5 100644 --- a/frontend/app/framework/declarations.ts +++ b/frontend/app/framework/declarations.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -78,4 +78,4 @@ export * from './angular/template-wrapper.directive'; export * from './angular/title.component'; export * from './angular/video-player.component'; export * from './internal'; -export * from './state'; \ No newline at end of file +export * from './state'; diff --git a/frontend/app/framework/index.ts b/frontend/app/framework/index.ts index f07977061..52813190b 100644 --- a/frontend/app/framework/index.ts +++ b/frontend/app/framework/index.ts @@ -1,11 +1,11 @@ -/* +/* * Squidex Headless CMS * * @license * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +import './utils/array-extensions'; + export * from './declarations'; export * from './module'; - -import './utils/array-extensions'; diff --git a/frontend/app/framework/internal.ts b/frontend/app/framework/internal.ts index cbf09e27c..29888d35b 100644 --- a/frontend/app/framework/internal.ts +++ b/frontend/app/framework/internal.ts @@ -40,4 +40,4 @@ export * from './utils/rxjs-extensions'; export * from './utils/string-helper'; export * from './utils/tag-values'; export * from './utils/types'; -export * from './utils/version'; \ No newline at end of file +export * from './utils/version'; diff --git a/frontend/app/framework/module.ts b/frontend/app/framework/module.ts index e27bf788a..afb85ffa1 100644 --- a/frontend/app/framework/module.ts +++ b/frontend/app/framework/module.ts @@ -1,12 +1,10 @@ -/* +/* * Squidex Headless CMS * * @license * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { CommonModule } from '@angular/common'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { ModuleWithProviders, NgModule } from '@angular/core'; @@ -19,7 +17,7 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc ColorPickerModule, CommonModule, FormsModule, - ReactiveFormsModule + ReactiveFormsModule, ], declarations: [ AutocompleteComponent, @@ -96,7 +94,7 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc TooltipDirective, TransformInputDirective, TranslatePipe, - VideoPlayerComponent + VideoPlayerComponent, ], exports: [ AutocompleteComponent, @@ -176,8 +174,8 @@ import { AnalyticsService, AutocompleteComponent, AvatarComponent, CachingInterc TooltipDirective, TransformInputDirective, TranslatePipe, - VideoPlayerComponent - ] + VideoPlayerComponent, + ], }) export class SqxFrameworkModule { public static forRoot(): ModuleWithProviders { @@ -200,14 +198,14 @@ export class SqxFrameworkModule { { provide: HTTP_INTERCEPTORS, useClass: LoadingInterceptor, - multi: true + multi: true, }, { provide: HTTP_INTERCEPTORS, useClass: CachingInterceptor, - multi: true - } - ] + multi: true, + }, + ], }; } - } \ No newline at end of file +} diff --git a/frontend/app/framework/services/analytics.service.ts b/frontend/app/framework/services/analytics.service.ts index 292b93619..bb50d7470 100644 --- a/frontend/app/framework/services/analytics.service.ts +++ b/frontend/app/framework/services/analytics.service.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: only-arrow-functions - import { Injectable } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { filter } from 'rxjs/operators'; @@ -22,11 +20,13 @@ export class AnalyticsService { constructor( private readonly uiOptions?: UIOptions, private readonly router?: Router, - private readonly resourceLoader?: ResourceLoaderService + private readonly resourceLoader?: ResourceLoaderService, ) { window['dataLayer'] = window['dataLayer'] || []; + // eslint-disable-next-line func-names this.gtag = function () { + // eslint-disable-next-line prefer-rest-params window['dataLayer'].push(arguments); }; @@ -42,7 +42,7 @@ export class AnalyticsService { event_category: category, event_action: action, event_label: label, - value + value, }); } @@ -65,4 +65,4 @@ export class AnalyticsService { this.resourceLoader.loadScript(`https://www.googletagmanager.com/gtag/js?id=${this.analyticsId}`); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/clipboard.service.ts b/frontend/app/framework/services/clipboard.service.ts index 30194b11a..1d9e5739c 100644 --- a/frontend/app/framework/services/clipboard.service.ts +++ b/frontend/app/framework/services/clipboard.service.ts @@ -29,4 +29,4 @@ export class ClipboardService { public setText(text: any) { this.text$.next(text); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/dialog.service.spec.ts b/frontend/app/framework/services/dialog.service.spec.ts index 24f63f3b0..63d1b0ceb 100644 --- a/frontend/app/framework/services/dialog.service.spec.ts +++ b/frontend/app/framework/services/dialog.service.spec.ts @@ -38,7 +38,7 @@ describe('DialogService', () => { expect(notification.messageType).toBe('info'); }); - [true, false].map(confirmed => { + [true, false].forEach(confirmed => { it(`should confirm dialog with ${confirmed}`, () => { const dialogService = new DialogService(localStore.object); @@ -55,7 +55,7 @@ describe('DialogService', () => { }, complete: () => { isCompleted = true; - } + }, }); expect(isCompleted).toBeTruthy(); @@ -65,7 +65,7 @@ describe('DialogService', () => { }); }); - [true, false].map(confirmed => { + [true, false].forEach(confirmed => { it(`should confirm dialog with '${confirmed}' but not remember`, () => { const dialogService = new DialogService(localStore.object); @@ -82,7 +82,7 @@ describe('DialogService', () => { }, complete: () => { isCompleted = true; - } + }, }); expect(isCompleted).toBeTruthy(); @@ -93,9 +93,9 @@ describe('DialogService', () => { }); [ - { confirmed: true, saved: 1 }, - { confirmed: false, saved: 0 } - ].map(({ confirmed, saved }) => { + { confirmed: true, saved: 1 }, + { confirmed: false, saved: 0 }, + ].forEach(({ confirmed, saved }) => { it(`should confirm dialog with '${confirmed}' and remember if remembered and confirmed`, () => { const dialogService = new DialogService(localStore.object); @@ -113,24 +113,24 @@ describe('DialogService', () => { }, complete: () => { isCompleted = true; - } + }, }); expect(isCompleted).toBeTruthy(); expect(isNext!).toEqual(confirmed); - localStore.verify(x => x.setBoolean(`dialogs.confirm.MyKey`, It.isAny()), Times.exactly(saved)); + localStore.verify(x => x.setBoolean('dialogs.confirm.MyKey', It.isAny()), Times.exactly(saved)); }); }); [ - { confirmed: true, saved: true, render: 0 }, - { confirmed: false, saved: false, render: 1 } - ].map(({ confirmed, saved, render }) => { + { confirmed: true, saved: true, render: 0 }, + { confirmed: false, saved: false, render: 1 }, + ].forEach(({ confirmed, saved, render }) => { it(`should confirm dialog with '${confirmed}' from local store if saved`, () => { const dialogService = new DialogService(localStore.object); - localStore.setup(x => x.getBoolean(`dialogs.confirm.MyKey`)) + localStore.setup(x => x.getBoolean('dialogs.confirm.MyKey')) .returns(() => saved); let requestCount = 0; @@ -148,7 +148,7 @@ describe('DialogService', () => { }, complete: () => { isCompleted = true; - } + }, }); expect(isCompleted).toEqual(confirmed); diff --git a/frontend/app/framework/services/dialog.service.ts b/frontend/app/framework/services/dialog.service.ts index f5e705f29..eacfc35b6 100644 --- a/frontend/app/framework/services/dialog.service.ts +++ b/frontend/app/framework/services/dialog.service.ts @@ -32,7 +32,7 @@ export class DialogRequest { public readonly title: string, public readonly text: string, private readonly rememberKey: string | undefined, - private readonly localStore: LocalStoreService + private readonly localStore: LocalStoreService, ) { if (rememberKey) { this.rememberKey = `dialogs.confirm.${rememberKey}`; @@ -60,7 +60,7 @@ export class Tooltip { constructor( public readonly target: any, public readonly text: string | null, - public readonly position: string + public readonly position: string, ) { } } @@ -69,7 +69,7 @@ export class Notification { constructor( public readonly message: string | ErrorDto, public readonly messageType: string, - public readonly displayTime: number = 10000 + public readonly displayTime: number = 10000, ) { } @@ -101,7 +101,7 @@ export class DialogService { } constructor( - private readonly localStore: LocalStoreService + private readonly localStore: LocalStoreService, ) { } @@ -138,4 +138,4 @@ export class DialogService { return request.result; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/loading.service.spec.ts b/frontend/app/framework/services/loading.service.spec.ts index 4234429b1..9d19dacce 100644 --- a/frontend/app/framework/services/loading.service.spec.ts +++ b/frontend/app/framework/services/loading.service.spec.ts @@ -25,7 +25,9 @@ describe('LoadingService', () => { let state = false; - loadingService.loading.subscribe(v => state = v); + loadingService.loading.subscribe(v => { + state = v; + }); loadingService.startLoading('1'); expect(state).toBeTruthy(); @@ -36,7 +38,9 @@ describe('LoadingService', () => { let state = false; - loadingService.loading.subscribe(v => state = v); + loadingService.loading.subscribe(v => { + state = v; + }); events.next(new NavigationStart(0, '')); @@ -48,7 +52,9 @@ describe('LoadingService', () => { let state = false; - loadingService.loading.subscribe(v => state = v); + loadingService.loading.subscribe(v => { + state = v; + }); loadingService.startLoading('1'); loadingService.completeLoading('1'); @@ -60,7 +66,9 @@ describe('LoadingService', () => { let state = false; - loadingService.loading.subscribe(v => state = v); + loadingService.loading.subscribe(v => { + state = v; + }); loadingService.startLoading('1'); loadingService.completeLoading('1'); @@ -76,7 +84,9 @@ describe('LoadingService', () => { let state = false; - loadingService.loading.subscribe(v => state = v); + loadingService.loading.subscribe(v => { + state = v; + }); events.next(new NavigationStart(0, '')); events.next(new NavigationError(0, '', 0)); @@ -92,7 +102,9 @@ describe('LoadingService', () => { let state = false; - loadingService.loading.subscribe(v => state = v); + loadingService.loading.subscribe(v => { + state = v; + }); loadingService.startLoading('1'); loadingService.completeLoading('1'); loadingService.completeLoading('1'); diff --git a/frontend/app/framework/services/loading.service.ts b/frontend/app/framework/services/loading.service.ts index a825a8c68..bf31c31f4 100644 --- a/frontend/app/framework/services/loading.service.ts +++ b/frontend/app/framework/services/loading.service.ts @@ -62,4 +62,4 @@ export class LoadingService implements OnDestroy { }, 250); } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/local-store.service.spec.ts b/frontend/app/framework/services/local-store.service.spec.ts index 1fd645dd5..3e9f428f7 100644 --- a/frontend/app/framework/services/local-store.service.spec.ts +++ b/frontend/app/framework/services/local-store.service.spec.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -17,13 +17,14 @@ describe('LocalStore', () => { it('should call local store for set function', () => { const localStoreService = new LocalStoreService(); - let passedKey = '', passedVal = ''; + let passedKey = ''; + let passedVal = ''; localStoreService.configureStore({ setItem: (k: string, v: string) => { passedKey = k; passedVal = v; - } + }, }); localStoreService.set('mykey', 'myval'); @@ -42,7 +43,7 @@ describe('LocalStore', () => { passedKey = key; return 'myval'; - } + }, }); const returnedVal = localStoreService.get('mykey'); @@ -56,11 +57,11 @@ describe('LocalStore', () => { localStoreService.configureStore({ setItem: () => { - throw 'Not supported'; + throw new Error('Not supported'); }, getItem: () => { - throw 'Not supported'; - } + throw new Error('Not supported'); + }, }); localStoreService.set('mykey', 'myval'); diff --git a/frontend/app/framework/services/local-store.service.ts b/frontend/app/framework/services/local-store.service.ts index 1eaf5c208..4345eae1b 100644 --- a/frontend/app/framework/services/local-store.service.ts +++ b/frontend/app/framework/services/local-store.service.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -74,4 +74,4 @@ export class LocalStoreService { delete this.fallback[key]; } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/localizer.service.spec.ts b/frontend/app/framework/services/localizer.service.spec.ts index 7ff0af583..44793973b 100644 --- a/frontend/app/framework/services/localizer.service.spec.ts +++ b/frontend/app/framework/services/localizer.service.spec.ts @@ -13,7 +13,7 @@ describe('LocalizerService', () => { withLowerVar: 'Var: {var|lower}.', withUpperVar: 'Var: {var|upper}.', withMultiple: 'Text1: {text1}, Text2: {Text2}.', - withVar: 'Var: {var}.' + withVar: 'Var: {var}.', }; it('should instantiate', () => { @@ -85,4 +85,4 @@ describe('LocalizerService', () => { expect(result).toEqual('Text1: Hello, Text2: World.'); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/services/localizer.service.ts b/frontend/app/framework/services/localizer.service.ts index ec0a13702..490dcad95 100644 --- a/frontend/app/framework/services/localizer.service.ts +++ b/frontend/app/framework/services/localizer.service.ts @@ -13,7 +13,7 @@ export class LocalizerService { private shouldLog = false; constructor( - private readonly translations: Object + private readonly translations: Object, ) { } @@ -23,11 +23,11 @@ export class LocalizerService { return this; } - public getOrKey(key: string | undefined, args?: any): string { + public getOrKey(key: string | undefined, args?: any): string { return this.get(key, args) || key || ''; } - public get(key: string | undefined, args?: any): string | null { + public get(key: string | undefined, args?: any): string | null { if (!key) { return null; } @@ -40,6 +40,7 @@ export class LocalizerService { if (!text) { if (this.shouldLog && !key.indexOf(' ')) { + // eslint-disable-next-line no-console console.warn(`Missing i18n key: ${key}`); } @@ -111,4 +112,4 @@ export class LocalizerService { return value; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/message-bus.service.spec.ts b/frontend/app/framework/services/message-bus.service.spec.ts index cb702ec58..af78a26df 100644 --- a/frontend/app/framework/services/message-bus.service.spec.ts +++ b/frontend/app/framework/services/message-bus.service.spec.ts @@ -33,4 +33,4 @@ describe('MessageBus', () => { expect(lastEvent).toBe(event1); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/services/message-bus.service.ts b/frontend/app/framework/services/message-bus.service.ts index d2841050d..22d1aad41 100644 --- a/frontend/app/framework/services/message-bus.service.ts +++ b/frontend/app/framework/services/message-bus.service.ts @@ -32,4 +32,4 @@ export class MessageBus { return this.message$.pipe(filter(m => m.channel === channel), map(m => m.data)); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/onboarding.service.spec.ts b/frontend/app/framework/services/onboarding.service.spec.ts index e5f5efed8..0c9b1face 100644 --- a/frontend/app/framework/services/onboarding.service.spec.ts +++ b/frontend/app/framework/services/onboarding.service.spec.ts @@ -70,4 +70,4 @@ describe('OnboardingService', () => { expect(onboardingService.shouldShow('feature-d1')).toBeFalsy(); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/services/onboarding.service.ts b/frontend/app/framework/services/onboarding.service.ts index 1aad67b4f..3e4cdde57 100644 --- a/frontend/app/framework/services/onboarding.service.ts +++ b/frontend/app/framework/services/onboarding.service.ts @@ -14,7 +14,7 @@ export class OnboardingService { private readonly disabled: boolean; constructor(uiOptions: UIOptions, - private readonly localStore: LocalStoreService + private readonly localStore: LocalStoreService, ) { this.disabled = uiOptions.get('hideOnboarding'); } @@ -38,4 +38,4 @@ export class OnboardingService { private getConfigKey(key: string): string { return `squidex.onboarding.disable.${key}`; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/resize.service.ts b/frontend/app/framework/services/resize.service.ts index c60d39930..82921a164 100644 --- a/frontend/app/framework/services/resize.service.ts +++ b/frontend/app/framework/services/resize.service.ts @@ -50,4 +50,4 @@ export class ResizeService implements OnDestroy { public unlisten(target: Element) { this.observer.unobserve(target); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/resource-loader.service.ts b/frontend/app/framework/services/resource-loader.service.ts index b4b663427..f6fc5ee04 100644 --- a/frontend/app/framework/services/resource-loader.service.ts +++ b/frontend/app/framework/services/resource-loader.service.ts @@ -71,4 +71,4 @@ export class ResourceLoaderService { this.loadStyle(`https://localhost:3000/${url}`) : this.loadStyle(`build/${url}`); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/shortcut.service.ts b/frontend/app/framework/services/shortcut.service.ts index ffc097c43..103a9ebc7 100644 --- a/frontend/app/framework/services/shortcut.service.ts +++ b/frontend/app/framework/services/shortcut.service.ts @@ -23,4 +23,4 @@ export class ShortcutService { public trigger(keys: string) { Mousetrap.trigger(keys); } -} \ No newline at end of file +} diff --git a/frontend/app/framework/services/temp.service.ts b/frontend/app/framework/services/temp.service.ts index 9853b1e3e..8987cd5bc 100644 --- a/frontend/app/framework/services/temp.service.ts +++ b/frontend/app/framework/services/temp.service.ts @@ -9,17 +9,17 @@ import { Injectable } from '@angular/core'; @Injectable() export class TempService { - private value: any = null; + private value: any = null; - public put(value: any) { - this.value = value; - } + public put(value: any) { + this.value = value; + } - public fetch() { - const result = this.value; + public fetch() { + const result = this.value; - this.value = null; + this.value = null; - return result; - } -} \ No newline at end of file + return result; + } +} diff --git a/frontend/app/framework/services/title.service.spec.ts b/frontend/app/framework/services/title.service.spec.ts index 7911299fe..dc5233a3e 100644 --- a/frontend/app/framework/services/title.service.spec.ts +++ b/frontend/app/framework/services/title.service.spec.ts @@ -72,7 +72,7 @@ describe('TitleService', () => { }); it('should append suffix to title', () => { - const titleService = new TitleService(new TitlesConfig( undefined, 'i18n:suffix'), localizer.object); + const titleService = new TitleService(new TitlesConfig(undefined, 'i18n:suffix'), localizer.object); titleService.push('i18n:my-title'); diff --git a/frontend/app/framework/services/title.service.ts b/frontend/app/framework/services/title.service.ts index 5c808ab67..271b0e628 100644 --- a/frontend/app/framework/services/title.service.ts +++ b/frontend/app/framework/services/title.service.ts @@ -1,12 +1,10 @@ -/* +/* * Squidex Headless CMS * * @license * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { Injectable } from '@angular/core'; import { LocalizerService } from './localizer.service'; @@ -14,7 +12,7 @@ export class TitlesConfig { constructor( public readonly prefix?: string, public readonly suffix?: string, - public readonly separator?: string + public readonly separator?: string, ) { } } @@ -25,12 +23,12 @@ export class TitleService { constructor( private readonly titles: TitlesConfig, - private readonly localizer: LocalizerService + private readonly localizer: LocalizerService, ) { this.titles = new TitlesConfig( this.localizer.getOrKey(titles.prefix), this.localizer.getOrKey(titles.suffix), - this.titles.separator + this.titles.separator, ); this.updateTitle(); @@ -81,4 +79,4 @@ export class TitleService { document.title = title; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/state.spec.ts b/frontend/app/framework/state.spec.ts index 33bb69501..0283e56a1 100644 --- a/frontend/app/framework/state.spec.ts +++ b/frontend/app/framework/state.spec.ts @@ -69,4 +69,4 @@ describe('State', () => { expect(updateCount).toEqual(2); expect(updated).toBeFalsy(); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/state.ts b/frontend/app/framework/state.ts index 3a7afbbd0..094cbeabc 100644 --- a/frontend/app/framework/state.ts +++ b/frontend/app/framework/state.ts @@ -23,7 +23,7 @@ export class Model { let values: Partial; if (Types.isFunction(update)) { - values = update(this); + values = update(this as any); } else { values = update; } @@ -54,7 +54,7 @@ export class ResultSet { constructor( public readonly total: number, public readonly items: ReadonlyArray, - links?: ResourceLinks + links?: ResourceLinks, ) { this._links = links || {}; } @@ -131,7 +131,7 @@ export class State { constructor( private readonly initialState: Readonly, - private readonly debugName?: string + private readonly debugName?: string, ) { this.state = new BehaviorSubject(initialState); @@ -193,4 +193,4 @@ export class State { return isChanged; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/array-extensions.spec.ts b/frontend/app/framework/utils/array-extensions.spec.ts index 9a91a0d37..77adb0e64 100644 --- a/frontend/app/framework/utils/array-extensions.spec.ts +++ b/frontend/app/framework/utils/array-extensions.spec.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable @typescript-eslint/naming-convention */ + import './array-extensions'; describe('ArrayExtensions', () => { @@ -125,7 +127,7 @@ describe('ArrayExtensions', () => { expect(map).toEqual({ A: { id: 'A', value: 1 }, - B: { id: 'B', value: 3 } + B: { id: 'B', value: 3 }, }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/utils/array-extensions.ts b/frontend/app/framework/utils/array-extensions.ts index d19e54077..f6bf7d2f1 100644 --- a/frontend/app/framework/utils/array-extensions.ts +++ b/frontend/app/framework/utils/array-extensions.ts @@ -5,7 +5,7 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array +/* eslint-disable */ interface ReadonlyArray { replacedBy(field: keyof T, value: T): ReadonlyArray; @@ -173,4 +173,4 @@ Array.prototype.toMap = function(selector: (value: T) => string) { } return result; -}; \ No newline at end of file +}; diff --git a/frontend/app/framework/utils/array-helper.ts b/frontend/app/framework/utils/array-helper.ts index 4e4a24315..cf4fa7222 100644 --- a/frontend/app/framework/utils/array-helper.ts +++ b/frontend/app/framework/utils/array-helper.ts @@ -7,4 +7,4 @@ export function compareStrings(a: string, b: string) { return a.localeCompare(b, undefined, { sensitivity: 'base' }); -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/cookies.ts b/frontend/app/framework/utils/cookies.ts index 26bb64096..e1681a508 100644 --- a/frontend/app/framework/utils/cookies.ts +++ b/frontend/app/framework/utils/cookies.ts @@ -23,4 +23,4 @@ export module Cookies { export function remove(name: string) { document.cookie = `${name}=; Max-Age=-99999999;`; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/date-helper.spec.ts b/frontend/app/framework/utils/date-helper.spec.ts index 5ded4476c..fdaadc1d6 100644 --- a/frontend/app/framework/utils/date-helper.spec.ts +++ b/frontend/app/framework/utils/date-helper.spec.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/framework/utils/date-helper.ts b/frontend/app/framework/utils/date-helper.ts index 5481a0ecb..64a0c72c2 100644 --- a/frontend/app/framework/utils/date-helper.ts +++ b/frontend/app/framework/utils/date-helper.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -31,4 +31,4 @@ export module DateHelper { export function getFnsLocale(): Locale { return DateHelper.FNSLOCALES[DateHelper.getLocale()] || enUS; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/date-time.spec.ts b/frontend/app/framework/utils/date-time.spec.ts index 19779873f..a135a4db9 100644 --- a/frontend/app/framework/utils/date-time.spec.ts +++ b/frontend/app/framework/utils/date-time.spec.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/framework/utils/date-time.ts b/frontend/app/framework/utils/date-time.ts index ba9079009..962460b74 100644 --- a/frontend/app/framework/utils/date-time.ts +++ b/frontend/app/framework/utils/date-time.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -98,7 +98,7 @@ export class DateTime { date = parseISO(value); } - if (isNaN(date.getTime())) { + if (Number.isNaN(date.getTime())) { return null; } @@ -202,5 +202,4 @@ export class DateTime { return result; } - -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/duration.spec.ts b/frontend/app/framework/utils/duration.spec.ts index 33a541c33..2085fbfbc 100644 --- a/frontend/app/framework/utils/duration.spec.ts +++ b/frontend/app/framework/utils/duration.spec.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/framework/utils/duration.ts b/frontend/app/framework/utils/duration.ts index 33d77b6c7..ae5a66c0d 100644 --- a/frontend/app/framework/utils/duration.ts +++ b/frontend/app/framework/utils/duration.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -31,7 +31,7 @@ export class Duration { hoursString = `0${hoursString}`; } - seconds = seconds % 3600; + seconds %= 3600; const minutes = Math.floor(seconds / 60); @@ -41,7 +41,7 @@ export class Duration { minutesString = `0${minutesString}`; } - seconds = seconds % 60; + seconds %= 60; let secondsString = seconds.toString(); @@ -51,4 +51,4 @@ export class Duration { return `${hoursString}:${minutesString}:${secondsString}`; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/error.spec.ts b/frontend/app/framework/utils/error.spec.ts index 56f49a6a5..208db6740 100644 --- a/frontend/app/framework/utils/error.spec.ts +++ b/frontend/app/framework/utils/error.spec.ts @@ -65,4 +65,4 @@ describe('ErrorDto', () => { expect(result).toBe('error.\n\n * detail1.\n * detail2.\n'); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/utils/error.ts b/frontend/app/framework/utils/error.ts index aee971d47..f7fee77a8 100644 --- a/frontend/app/framework/utils/error.ts +++ b/frontend/app/framework/utils/error.ts @@ -14,7 +14,7 @@ export class ErrorDetailsDto { public readonly properties: ReadonlyArray = []; constructor( - public readonly originalMessage: string + public readonly originalMessage: string, ) { const propertySeparator = originalMessage.indexOf(': '); @@ -29,7 +29,6 @@ export class ErrorDetailsDto { } else { this.message = originalMessage; } - } } @@ -41,7 +40,7 @@ export class ErrorDto { public readonly message: string, public readonly errorCode?: string | null, details?: ReadonlyArray | ReadonlyArray, - public readonly inner?: any + public readonly inner?: any, ) { if (Types.isArrayOfString(details)) { this.details = details.map(x => new ErrorDetailsDto(x)); @@ -69,4 +68,4 @@ export class ErrorDto { public toString() { return `ErrorDto(${JSON.stringify(this)})`; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/hateos.ts b/frontend/app/framework/utils/hateos.ts index 09578404f..9f77a5794 100644 --- a/frontend/app/framework/utils/hateos.ts +++ b/frontend/app/framework/utils/hateos.ts @@ -12,11 +12,11 @@ export interface Resource { } export type ResourceLinks = { [rel: string]: ResourceLink }; -export type ResourceLink = { href: string; method: ResourceMethod; metadata?: string; }; +export type ResourceLink = { href: string; method: ResourceMethod; metadata?: string }; export type Metadata = { [rel: string]: string }; -export function getLinkUrl(value: Resource | ResourceLinks, ...rels: ReadonlyArray) { +export function getLinkUrl(value: Resource | ResourceLinks, ...rels: ReadonlyArray) { if (!value) { return false; } @@ -34,7 +34,7 @@ export function getLinkUrl(value: Resource | ResourceLinks, ...rels: ReadonlyAr return undefined; } -export function hasAnyLink(value: Resource | ResourceLinks, ...rels: ReadonlyArray) { +export function hasAnyLink(value: Resource | ResourceLinks, ...rels: ReadonlyArray) { return !!getLinkUrl(value, ...rels); } @@ -43,4 +43,4 @@ export type ResourceMethod = 'DELETE' | 'PATCH' | 'POST' | - 'PUT'; \ No newline at end of file + 'PUT'; diff --git a/frontend/app/framework/utils/interpolator.spec.ts b/frontend/app/framework/utils/interpolator.spec.ts index 23c12bd36..62550bbab 100644 --- a/frontend/app/framework/utils/interpolator.spec.ts +++ b/frontend/app/framework/utils/interpolator.spec.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable no-template-curly-in-string */ + import { DateTime } from './date-time'; import { interpolate } from './interpolator'; @@ -88,4 +90,4 @@ describe('interpolate', () => { expect(result).toEqual(`hello ${now.toISOString()}`); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/utils/interpolator.ts b/frontend/app/framework/utils/interpolator.ts index 4851c3b93..311c6d989 100644 --- a/frontend/app/framework/utils/interpolator.ts +++ b/frontend/app/framework/utils/interpolator.ts @@ -42,4 +42,4 @@ export function interpolate(pattern: string, value?: any, shortcut?: string, fal }); return result; -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/keys.ts b/frontend/app/framework/utils/keys.ts index 916abe6c6..115ed0154 100644 --- a/frontend/app/framework/utils/keys.ts +++ b/frontend/app/framework/utils/keys.ts @@ -48,4 +48,4 @@ export module Keys { return key === 'ESCAPE' || key === 'ESC' || key === ESCAPE; } - } \ No newline at end of file + } diff --git a/frontend/app/framework/utils/math-helper.spec.ts b/frontend/app/framework/utils/math-helper.spec.ts index 4d584cb3f..fda59057d 100644 --- a/frontend/app/framework/utils/math-helper.spec.ts +++ b/frontend/app/framework/utils/math-helper.spec.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/framework/utils/math-helper.ts b/frontend/app/framework/utils/math-helper.ts index 585126a40..0627efbad 100644 --- a/frontend/app/framework/utils/math-helper.ts +++ b/frontend/app/framework/utils/math-helper.ts @@ -1,11 +1,12 @@ -/* +/* * Squidex Headless CMS * * @license * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -/* tslint:disable: no-bitwise */ +/* eslint-disable no-useless-escape */ +/* eslint-disable no-bitwise */ import { Types } from './types'; @@ -31,7 +32,7 @@ const ColorDefinitions: ReadonlyArray = [ parseInt(bits[2], 10) / 255, parseInt(bits[3], 10) / 255, parseFloat(bits[4])); - } + }, }, { regex: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, process: (bits) => { @@ -39,7 +40,7 @@ const ColorDefinitions: ReadonlyArray = [ parseInt(bits[1], 10) / 255, parseInt(bits[2], 10) / 255, parseInt(bits[3], 10) / 255); - } + }, }, { regex: /^(\w{2})(\w{2})(\w{2})$/, process: (bits) => { @@ -47,7 +48,7 @@ const ColorDefinitions: ReadonlyArray = [ parseInt(bits[1], 16) / 255, parseInt(bits[2], 16) / 255, parseInt(bits[3], 16) / 255); - } + }, }, { regex: /^(\w{1})(\w{1})(\w{1})$/, process: (bits) => { @@ -55,8 +56,8 @@ const ColorDefinitions: ReadonlyArray = [ parseInt(bits[1] + bits[1], 16) / 255, parseInt(bits[2] + bits[2], 16) / 255, parseInt(bits[3] + bits[3], 16) / 255); - } - } + }, + }, ]; export module MathHelper { @@ -64,6 +65,7 @@ export module MathHelper { const CRC32_TABLE: ReadonlyArray = createCrc32Table(); + // eslint-disable-next-line no-inner-declarations function createCrc32Table() { const crc: number[] = []; @@ -161,7 +163,7 @@ export module MathHelper { } export function randomColor() { - return colorToString(colorFromHsv(Math.random() * 360, .9, .9)); + return colorToString(colorFromHsv(Math.random() * 360, 0.9, 0.9)); } export function colorToString(color: Color): string { @@ -218,4 +220,4 @@ export module MathHelper { export function createColor(r: number, g: number, b: number, a = 1) { return { r, g, b, a }; -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/modal-positioner.spec.ts b/frontend/app/framework/utils/modal-positioner.spec.ts index 5ccd5c733..79bb4cc0c 100644 --- a/frontend/app/framework/utils/modal-positioner.spec.ts +++ b/frontend/app/framework/utils/modal-positioner.spec.ts @@ -15,7 +15,7 @@ describe('position', () => { right: x + w, width: w, height: h, - bottom: y + h + bottom: y + h, }; } @@ -33,19 +33,19 @@ describe('position', () => { { position: 'left-bottom', x: 160, y: 270 }, { position: 'right', x: 310, y: 235 }, { position: 'right-top', x: 310, y: 200 }, - { position: 'right-bottom', x: 310, y: 270 } + { position: 'right-bottom', x: 310, y: 270 }, ]; - for (const test of tests) { - const modalRect = buildRect(0, 0, 30, 30); - + tests.forEach(test => { it(`should calculate modal position for ${test.position}`, () => { + const modalRect = buildRect(0, 0, 30, 30); + const result = positionModal(targetRect, modalRect, test.position, 10, false, 0, 0); expect(result.x).toBe(test.x); expect(result.y).toBe(test.y); }); - } + }); it('should calculate modal position for vertical top fix', () => { const modalRect = buildRect(0, 0, 30, 200); @@ -82,4 +82,4 @@ describe('position', () => { expect(result.x).toBe(120); expect(result.y).toBe(200); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/utils/modal-positioner.ts b/frontend/app/framework/utils/modal-positioner.ts index e81ba3edc..762a20c31 100644 --- a/frontend/app/framework/utils/modal-positioner.ts +++ b/frontend/app/framework/utils/modal-positioner.ts @@ -18,7 +18,7 @@ const POSITION_RIGHT_CENTER = 'right'; const POSITION_RIGHT_TOP = 'right-top'; const POSITION_RIGHT_BOTTOM = 'right-bottom'; -export function positionModal(targetRect: ClientRect, modalRect: ClientRect, relativePosition: string, offset: number, fix: boolean, viewportWidth: number, viewportHeight: number): { x: number, y: number } { +export function positionModal(targetRect: ClientRect, modalRect: ClientRect, relativePosition: string, offset: number, fix: boolean, viewportWidth: number, viewportHeight: number): { x: number; y: number } { let y = 0; let x = 0; @@ -113,4 +113,4 @@ export function positionModal(targetRect: ClientRect, modalRect: ClientRect, rel } return { x, y }; -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/modal-view.spec.ts b/frontend/app/framework/utils/modal-view.spec.ts index 84f160057..f2dbc7838 100644 --- a/frontend/app/framework/utils/modal-view.spec.ts +++ b/frontend/app/framework/utils/modal-view.spec.ts @@ -116,4 +116,4 @@ function checkValue(modal: Openable, expected: boolean) { expect(result!).toBe(expected); expect(modal.isOpen).toBe(expected); -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/modal-view.ts b/frontend/app/framework/utils/modal-view.ts index 267bed8ef..faa18de77 100644 --- a/frontend/app/framework/utils/modal-view.ts +++ b/frontend/app/framework/utils/modal-view.ts @@ -99,4 +99,4 @@ export class ModalModel implements Openable { } } -let openModal: ModalModel | null = null; \ No newline at end of file +let openModal: ModalModel | null = null; diff --git a/frontend/app/framework/utils/picasso.ts b/frontend/app/framework/utils/picasso.ts index d3e444995..48bd15d84 100644 --- a/frontend/app/framework/utils/picasso.ts +++ b/frontend/app/framework/utils/picasso.ts @@ -5,7 +5,7 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ - import MersenneTwister from 'mersenne-twister'; +import MersenneTwister from 'mersenne-twister'; const ALL_COLORS: ReadonlyArray = [ 'rgb(226,27,12)', @@ -22,7 +22,7 @@ const ALL_COLORS: ReadonlyArray = [ 'rgb(174,188,33)', 'rgb(210,157,0)', 'rgb(204,122,0)', - 'rgb(231,55,0)' + 'rgb(231,55,0)', ]; const LAYERS = 3; @@ -41,7 +41,7 @@ function hash(str: string) { for (let i = 0; i < str.length; i++) { result = result * 31 + str.charCodeAt(i); - result = result % (2 ** 32); + result %= (2 ** 32); } return result; @@ -75,4 +75,4 @@ export function picasso(content: string) { } return `${background}${shape}`; -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/rxjs-extensions.ts b/frontend/app/framework/utils/rxjs-extensions.ts index a8124d054..c4cae19df 100644 --- a/frontend/app/framework/utils/rxjs-extensions.ts +++ b/frontend/app/framework/utils/rxjs-extensions.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: only-arrow-functions - import { EMPTY, Observable, throwError } from 'rxjs'; import { catchError, distinctUntilChanged, filter, map, onErrorResumeNext, publishReplay, refCount, switchMap } from 'rxjs/operators'; import { DialogService } from './../services/dialog.service'; @@ -20,7 +18,7 @@ export function mapVersioned(project: (value: T, version: Vers }; } -type Options = { silent?: boolean, throw?: boolean }; +type Options = { silent?: boolean; throw?: boolean }; export function shareSubscribed(dialogs: DialogService, options?: Options) { return shareMapSubscribed(dialogs, x => x, options); @@ -66,4 +64,4 @@ export function ofForever(...values: ReadonlyArray) { s.next(value); } }); -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/string-helper.spec.ts b/frontend/app/framework/utils/string-helper.spec.ts index f5ea88380..5d9077fd6 100644 --- a/frontend/app/framework/utils/string-helper.spec.ts +++ b/frontend/app/framework/utils/string-helper.spec.ts @@ -9,7 +9,6 @@ import { StringHelper } from './string-helper'; describe('StringHelper', () => { it('should return empty text if value is null or undefined', () => { - expect(StringHelper.firstNonEmpty(null!)).toBe(''); expect(StringHelper.firstNonEmpty(undefined!)).toBe(''); }); @@ -58,4 +57,4 @@ describe('StringHelper', () => { expect(url).toEqual('http://squidex.io?other=1'); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/utils/string-helper.ts b/frontend/app/framework/utils/string-helper.ts index d55019b01..db9f8cd1d 100644 --- a/frontend/app/framework/utils/string-helper.ts +++ b/frontend/app/framework/utils/string-helper.ts @@ -45,4 +45,4 @@ export module StringHelper { return row; } } -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/tag-values.spec.ts b/frontend/app/framework/utils/tag-values.spec.ts index 69b29ec39..d860c9814 100644 --- a/frontend/app/framework/utils/tag-values.spec.ts +++ b/frontend/app/framework/utils/tag-values.spec.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/object-curly-spacing */ /* * Squidex Headless CMS * @@ -23,7 +24,7 @@ describe('TagValue', () => { const input = [ '2', '1', - '0' + '0', ]; const result = getTagValues(input); @@ -31,7 +32,7 @@ describe('TagValue', () => { expect(result).toEqual([ new TagValue('0', '0', '0'), new TagValue('1', '1', '1'), - new TagValue('2', '2', '2') + new TagValue('2', '2', '2'), ]); }); @@ -39,7 +40,7 @@ describe('TagValue', () => { const input = [ new TagValue(2, '2', 2), new TagValue(1, '1', 1), - new TagValue(0, '0', 0) + new TagValue(0, '0', 0), ]; const result = getTagValues(input); @@ -47,25 +48,24 @@ describe('TagValue', () => { expect(result).toEqual([ new TagValue(0, '0', 0), new TagValue(1, '1', 1), - new TagValue(2, '2', 2) + new TagValue(2, '2', 2), ]); }); - [null, undefined, []].map(input => { + [null, undefined, []].forEach(input => { it(`should get tags as empty array if input is <${input}>`, () => { const result = getTagValues(input); expect(result).toEqual([]); }); - }); describe('IntConverter', () => { [ { input: '7.5', result: new TagValue(7, '7.5', 7) }, - { input: '7', result: new TagValue(7, '7', 7) }, - { input: '0', result: new TagValue(0, '0', 0) } - ].map(x => { + { input: '7', result: new TagValue(7, '7', 7) }, + { input: '0', result: new TagValue(0, '0', 0) }, + ].forEach(x => { it(`should return tag value if input is <${x.input}>`, () => { const result = IntConverter.INSTANCE.convertInput(x.input); @@ -77,8 +77,8 @@ describe('TagValue', () => { { input: undefined }, { input: null }, { input: 'text' }, - { input: '' } - ].map(x => { + { input: '' }, + ].forEach(x => { it(`should not return tag value if input is <${x.input}>`, () => { const result = IntConverter.INSTANCE.convertInput(x.input!); @@ -88,8 +88,8 @@ describe('TagValue', () => { [ { input: 7, result: new TagValue(7, '7', 7) }, - { input: 0, result: new TagValue(0, '0', 0) } - ].map(x => { + { input: 0, result: new TagValue(0, '0', 0) }, + ].forEach(x => { it(`should return tag value if value is <${x.input}>`, () => { const result = IntConverter.INSTANCE.convertValue(x.input); @@ -101,8 +101,8 @@ describe('TagValue', () => { { input: undefined }, { input: null }, { input: 'text' }, - { input: '' } - ].map(x => { + { input: '' }, + ].forEach(x => { it(`should not return tag value if value is <${x.input}>`, () => { const result = IntConverter.INSTANCE.convertValue(x.input!); @@ -115,8 +115,8 @@ describe('TagValue', () => { [ { input: '7.5', result: new TagValue(7.5, '7.5', 7.5) }, { input: '0.0', result: new TagValue(0, '0.0', 0) }, - { input: '0', result: new TagValue(0, '0', 0) } - ].map(x => { + { input: '0', result: new TagValue(0, '0', 0) }, + ].forEach(x => { it(`should return tag value if input is <${x.input}>`, () => { const result = FloatConverter.INSTANCE.convertInput(x.input); @@ -128,8 +128,8 @@ describe('TagValue', () => { { input: undefined }, { input: null }, { input: 'text' }, - { input: '' } - ].map(x => { + { input: '' }, + ].forEach(x => { it(`should not return tag value if input is <${x.input}>`, () => { const result = FloatConverter.INSTANCE.convertInput(x.input!); @@ -139,9 +139,9 @@ describe('TagValue', () => { [ { input: 7.5, result: new TagValue(7.5, '7.5', 7.5) }, - { input: 7, result: new TagValue(7, '7', 7) }, - { input: 0, result: new TagValue(0, '0', 0) } - ].map(x => { + { input: 7, result: new TagValue(7, '7', 7) }, + { input: 0, result: new TagValue(0, '0', 0) }, + ].forEach(x => { it(`should return tag value if value is <${x.input}>`, () => { const result = FloatConverter.INSTANCE.convertValue(x.input); @@ -153,8 +153,8 @@ describe('TagValue', () => { { input: undefined }, { input: null }, { input: 'text' }, - { input: '' } - ].map(x => { + { input: '' }, + ].forEach(x => { it(`should not return tag value if value is <${x.input}>`, () => { const result = FloatConverter.INSTANCE.convertValue(x.input!); @@ -165,9 +165,9 @@ describe('TagValue', () => { describe('StringConverter', () => { [ - { input: 'text', result: new TagValue('text', 'text', 'text') }, - { input: 'text ', result: new TagValue('text', 'text', 'text') } - ].map(x => { + { input: 'text', result: new TagValue('text', 'text', 'text') }, + { input: 'text ', result: new TagValue('text', 'text', 'text') }, + ].forEach(x => { it(`should return tag value if input is <${x.input}>`, () => { const result = StringConverter.INSTANCE.convertInput(x.input); @@ -178,8 +178,8 @@ describe('TagValue', () => { [ { input: undefined }, { input: null }, - { input: ''} - ].map(x => { + { input: '' }, + ].forEach(x => { it(`should not return tag value if input is <${x.input}>`, () => { const result = FloatConverter.INSTANCE.convertInput(x.input!); @@ -188,9 +188,9 @@ describe('TagValue', () => { }); [ - { input: 'text', result: new TagValue('text', 'text', 'text') }, - { input: 'text ', result: new TagValue('text', 'text', 'text') } - ].map(x => { + { input: 'text', result: new TagValue('text', 'text', 'text') }, + { input: 'text ', result: new TagValue('text', 'text', 'text') }, + ].forEach(x => { it(`should return tag value if value is <${x.input}>`, () => { const result = StringConverter.INSTANCE.convertValue(x.input); @@ -201,8 +201,8 @@ describe('TagValue', () => { [ { input: undefined }, { input: null }, - { input: ''} - ].map(x => { + { input: ''}, + ].forEach(x => { it(`should not return tag value if value is <${x.input}>`, () => { const result = FloatConverter.INSTANCE.convertValue(x.input!); @@ -210,4 +210,4 @@ describe('TagValue', () => { }); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/utils/tag-values.ts b/frontend/app/framework/utils/tag-values.ts index 675fc99d5..c821d516b 100644 --- a/frontend/app/framework/utils/tag-values.ts +++ b/frontend/app/framework/utils/tag-values.ts @@ -13,7 +13,7 @@ export class TagValue { constructor( public readonly id: any, public readonly name: string, - public readonly value: T + public readonly value: T, ) { this.lowerCaseName = name.toLowerCase(); } @@ -34,7 +34,9 @@ export class IntConverter implements TagConverter { public static readonly INSTANCE: TagConverter = new IntConverter(); - private constructor() {} + private constructor() { + /* NOOP */ + } public convertInput(input: string) { if (input === '0') { @@ -64,7 +66,9 @@ export class FloatConverter implements TagConverter { public static readonly INSTANCE: TagConverter = new FloatConverter(); - private constructor() {} + private constructor() { + /* NOOP */ + } public convertInput(input: string) { if (input === '0') { @@ -92,7 +96,9 @@ export class FloatConverter implements TagConverter { export class StringConverter implements TagConverter { public static readonly INSTANCE: TagConverter = new StringConverter(); - private constructor() {} + private constructor() { + /* NOOP */ + } public convertInput(input: string) { if (input) { @@ -133,4 +139,4 @@ export function getTagValues(values: ReadonlyArray | undefine } return result.sortByString(x => x.lowerCaseName); -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/types.spec.ts b/frontend/app/framework/utils/types.spec.ts index 4d8a95240..a360c53e6 100644 --- a/frontend/app/framework/utils/types.spec.ts +++ b/frontend/app/framework/utils/types.spec.ts @@ -183,8 +183,8 @@ describe('Types', () => { expect(Types.equals(undefined, '', false)).toBeFalsy(); }); - FalsyValues.map(x => { - it(`should compare empty string with {x}`, () => { + FalsyValues.forEach(x => { + it('should compare empty string with {x}', () => { expect(Types.equals('', x, true)).toBeFalsy(); expect(Types.equals('', x, false)).toBeFalsy(); @@ -240,18 +240,18 @@ describe('Types', () => { rootShared: 1, rootA: 2, nested: { - a: 3 + a: 3, }, - array: [4] + array: [4], }); Types.mergeInto(source, { rootShared: 5, rootB: 6, nested: { - b: 7 + b: 7, }, - array: [8] + array: [8], }); expect(source).toEqual({ @@ -260,16 +260,16 @@ describe('Types', () => { rootB: 6, nested: { a: 3, - b: 7 + b: 7, }, - array: [4, 8] + array: [4, 8], }); }); }); class MyClass { constructor( - public readonly value: number + public readonly value: number, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/types.ts b/frontend/app/framework/utils/types.ts index efe7ae9c7..03b30d930 100644 --- a/frontend/app/framework/utils/types.ts +++ b/frontend/app/framework/utils/types.ts @@ -5,15 +5,13 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - export module Types { export function isString(value: any): value is string { return typeof value === 'string' || value instanceof String; } export function isNumber(value: any): value is number { - return typeof value === 'number' && isFinite(value); + return typeof value === 'number' && Number.isFinite(value); } export function isArray(value: any): value is Array { @@ -101,6 +99,7 @@ export module Types { return true; } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare return Types.isUndefined(value) === true || Types.isNull(value) === true; } @@ -131,6 +130,7 @@ export module Types { } export function equals(lhs: any, rhs: any, lazyString = false) { + // eslint-disable-next-line no-self-compare if (lhs === rhs || (lhs !== lhs && rhs !== rhs)) { return true; } @@ -200,4 +200,4 @@ export module Types { return target; } -} \ No newline at end of file +} diff --git a/frontend/app/framework/utils/version.spec.ts b/frontend/app/framework/utils/version.spec.ts index 1e69d63b8..7ca6f002f 100644 --- a/frontend/app/framework/utils/version.spec.ts +++ b/frontend/app/framework/utils/version.spec.ts @@ -20,4 +20,4 @@ describe('Version', () => { expect(new Version('W/2').eq(new Version('2'))).toBeTruthy(); expect(new Version('W/2').eq(new Version('W/2'))).toBeTruthy(); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/framework/utils/version.ts b/frontend/app/framework/utils/version.ts index f4f939aa1..7a8808d4c 100644 --- a/frontend/app/framework/utils/version.ts +++ b/frontend/app/framework/utils/version.ts @@ -9,7 +9,7 @@ export class Version { public static readonly EMPTY = new Version(''); constructor( - public readonly value: string + public readonly value: string, ) { } @@ -34,4 +34,4 @@ export function versioned(version: Version, payload: T = undefined!): V return { version, payload }; } -export type Versioned = Readonly<{ version: Version, payload: T }>; \ No newline at end of file +export type Versioned = Readonly<{ version: Version; payload: T }>; diff --git a/frontend/app/shared/components/app-form.component.ts b/frontend/app/shared/components/app-form.component.ts index e5cd23f28..1b552fa84 100644 --- a/frontend/app/shared/components/app-form.component.ts +++ b/frontend/app/shared/components/app-form.component.ts @@ -13,7 +13,7 @@ import { ApiUrlConfig, AppsState, CreateAppForm } from '@app/shared/internal'; selector: 'sqx-app-form', styleUrls: ['./app-form.component.scss'], templateUrl: './app-form.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppFormComponent { @Output() @@ -27,7 +27,7 @@ export class AppFormComponent { constructor( public readonly apiUrl: ApiUrlConfig, private readonly appsStore: AppsState, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } @@ -49,4 +49,4 @@ export class AppFormComponent { }); } } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/assets/asset-dialog.component.ts b/frontend/app/shared/components/assets/asset-dialog.component.ts index 723c04ebe..35edde105 100644 --- a/frontend/app/shared/components/assets/asset-dialog.component.ts +++ b/frontend/app/shared/components/assets/asset-dialog.component.ts @@ -19,7 +19,7 @@ import { ImageFocusPointComponent } from './image-focus-point.component'; @Component({ selector: 'sqx-asset-dialog', styleUrls: ['./asset-dialog.component.scss'], - templateUrl: './asset-dialog.component.html' + templateUrl: './asset-dialog.component.html', }) export class AssetDialogComponent implements OnChanges { @Output() @@ -75,7 +75,7 @@ export class AssetDialogComponent implements OnChanges { private readonly changeDetector: ChangeDetectorRef, private readonly dialogs: DialogService, private readonly formBuilder: FormBuilder, - public readonly authService: AuthService + public readonly authService: AuthService, ) { } @@ -188,4 +188,4 @@ export class AssetDialogComponent implements OnChanges { this.changeDetector.markForCheck(); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/assets/asset-folder-dialog.component.ts b/frontend/app/shared/components/assets/asset-folder-dialog.component.ts index 2866df8d4..8792c8d93 100644 --- a/frontend/app/shared/components/assets/asset-folder-dialog.component.ts +++ b/frontend/app/shared/components/assets/asset-folder-dialog.component.ts @@ -12,7 +12,7 @@ import { AssetFolderDto, AssetsState, RenameAssetFolderForm } from '@app/shared/ @Component({ selector: 'sqx-asset-folder-dialog', styleUrls: ['./asset-folder-dialog.component.scss'], - templateUrl: './asset-folder-dialog.component.html' + templateUrl: './asset-folder-dialog.component.html', }) export class AssetFolderDialogComponent implements OnInit { @Output() @@ -25,7 +25,7 @@ export class AssetFolderDialogComponent implements OnInit { constructor( private readonly assetsState: AssetsState, - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } @@ -60,4 +60,4 @@ export class AssetFolderDialogComponent implements OnInit { } } } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/assets/asset-folder-dropdown.component.ts b/frontend/app/shared/components/assets/asset-folder-dropdown.component.ts index e790517d7..1041ca305 100644 --- a/frontend/app/shared/components/assets/asset-folder-dropdown.component.ts +++ b/frontend/app/shared/components/assets/asset-folder-dropdown.component.ts @@ -13,7 +13,7 @@ import { AppsState } from '@app/shared/state/apps.state'; import { ROOT_ITEM } from '@app/shared/state/assets.state'; export const SQX_ASSETS_FOLDER_DROPDOWN_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AssetFolderDropdownComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AssetFolderDropdownComponent), multi: true, }; interface State { @@ -26,11 +26,11 @@ interface State { styleUrls: ['./asset-folder-dropdown.component.scss'], templateUrl: './asset-folder-dropdown.component.html', providers: [ - SQX_ASSETS_FOLDER_DROPDOWN_CONTROL_VALUE_ACCESSOR + SQX_ASSETS_FOLDER_DROPDOWN_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class AssetFolderDropdownComponent extends StatefulControlComponent implements OnInit { +export class AssetFolderDropdownComponent extends StatefulControlComponent implements OnInit { @Input() public set disabled(value: boolean | null | undefined) { this.setDisabledState(value === true); @@ -40,10 +40,10 @@ export class AssetFolderDropdownComponent extends StatefulControlComponent { return new Promise(resolve => { const blob = new Blob([this.text || ''], { - type: this.mimeType + type: this.mimeType, }); resolve(blob); }); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/assets/asset-uploader.component.ts b/frontend/app/shared/components/assets/asset-uploader.component.ts index 15062c818..3f809908b 100644 --- a/frontend/app/shared/components/assets/asset-uploader.component.ts +++ b/frontend/app/shared/components/assets/asset-uploader.component.ts @@ -13,9 +13,9 @@ import { AppsState, AssetsState, AssetUploaderState, fadeAnimation, ModalModel, styleUrls: ['./asset-uploader.component.scss'], templateUrl: './asset-uploader.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetUploaderComponent { public modalMenu = new ModalModel(); @@ -23,7 +23,7 @@ export class AssetUploaderComponent { constructor( public readonly appsState: AppsState, public readonly assetUploader: AssetUploaderState, - public readonly assetsState: AssetsState + public readonly assetsState: AssetsState, ) { } @@ -42,4 +42,4 @@ export class AssetUploaderComponent { public trackByUpload(_index: number, upload: Upload) { return upload.id; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/assets/asset.component.ts b/frontend/app/shared/components/assets/asset.component.ts index c0c914873..bac7fd1ea 100644 --- a/frontend/app/shared/components/assets/asset.component.ts +++ b/frontend/app/shared/components/assets/asset.component.ts @@ -17,7 +17,7 @@ interface State { selector: 'sqx-asset', styleUrls: ['./asset.component.scss'], templateUrl: './asset.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetComponent extends StatefulComponent implements OnInit { @Output() @@ -75,10 +75,10 @@ export class AssetComponent extends StatefulComponent implements OnInit { constructor(changeDetector: ChangeDetectorRef, private readonly assetUploader: AssetUploaderState, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super(changeDetector, { - progress: 0 + progress: 0, }); } @@ -155,4 +155,4 @@ export class AssetComponent extends StatefulComponent implements OnInit { public setProgress(progress: number) { this.next({ progress }); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/assets/assets-list.component.ts b/frontend/app/shared/components/assets/assets-list.component.ts index eecc719a7..9aef384b4 100644 --- a/frontend/app/shared/components/assets/assets-list.component.ts +++ b/frontend/app/shared/components/assets/assets-list.component.ts @@ -18,7 +18,7 @@ interface State { selector: 'sqx-assets-list', styleUrls: ['./assets-list.component.scss'], templateUrl: './assets-list.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetsListComponent extends StatefulComponent { @Output() @@ -44,7 +44,7 @@ export class AssetsListComponent extends StatefulComponent { constructor(changeDetector: ChangeDetectorRef) { super(changeDetector, { - newFiles: [] + newFiles: [], }); } @@ -91,7 +91,7 @@ export class AssetsListComponent extends StatefulComponent { public remove(file: File) { this.next(s => ({ ...s, - newFiles: s.newFiles.removed(file) + newFiles: s.newFiles.removed(file), })); return true; @@ -100,7 +100,7 @@ export class AssetsListComponent extends StatefulComponent { public addFiles(files: ReadonlyArray) { this.next(s => ({ ...s, - newFiles: [...getFiles(files), ...s.newFiles] + newFiles: [...getFiles(files), ...s.newFiles], })); return true; diff --git a/frontend/app/shared/components/assets/assets-selector.component.ts b/frontend/app/shared/components/assets/assets-selector.component.ts index b937113b8..4e9e4b585 100644 --- a/frontend/app/shared/components/assets/assets-selector.component.ts +++ b/frontend/app/shared/components/assets/assets-selector.component.ts @@ -24,9 +24,9 @@ interface State { styleUrls: ['./assets-selector.component.scss'], templateUrl: './assets-selector.component.html', providers: [ - ComponentAssetsState + ComponentAssetsState, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssetsSelectorComponent extends StatefulComponent implements OnInit { @Output() @@ -34,12 +34,12 @@ export class AssetsSelectorComponent extends StatefulComponent implements constructor(changeDector: ChangeDetectorRef, public readonly assetsState: ComponentAssetsState, - public readonly localStore: LocalStoreService + public readonly localStore: LocalStoreService, ) { super(changeDector, { selectedAssets: {}, selectionCount: 0, - isListView: localStore.getBoolean(Settings.Local.ASSETS_MODE) + isListView: localStore.getBoolean(Settings.Local.ASSETS_MODE), }); } @@ -88,4 +88,4 @@ export class AssetsSelectorComponent extends StatefulComponent implements this.localStore.setBoolean(Settings.Local.ASSETS_MODE, isListView); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/assets/image-cropper.component.ts b/frontend/app/shared/components/assets/image-cropper.component.ts index 83120036b..96ecd00a7 100644 --- a/frontend/app/shared/components/assets/image-cropper.component.ts +++ b/frontend/app/shared/components/assets/image-cropper.component.ts @@ -13,7 +13,7 @@ import Cropper from 'cropperjs'; selector: 'sqx-image-editor', styleUrls: ['./image-cropper.component.scss'], templateUrl: './image-cropper.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ImageCropperComponent implements AfterViewInit, OnDestroy, OnChanges { private cropper: Cropper | null = null; @@ -51,7 +51,7 @@ export class ImageCropperComponent implements AfterViewInit, OnDestroy, OnChange movable: false, zoomOnTouch: false, zoomOnWheel: false, - viewMode: 0 + viewMode: 0, }); this.cropper.replace(this.imageSource); @@ -69,7 +69,7 @@ export class ImageCropperComponent implements AfterViewInit, OnDestroy, OnChange this.cropper.zoomTo(Math.min(dx, dy), { x: containerData.width / 2, - y: containerData.height / 2 + y: containerData.height / 2, }); } } @@ -92,13 +92,13 @@ export class ImageCropperComponent implements AfterViewInit, OnDestroy, OnChange public zoomIn() { if (this.cropper) { - this.cropper.zoom(.1); + this.cropper.zoom(0.1); } } public zoomOut() { if (this.cropper) { - this.cropper.zoom(-.1); + this.cropper.zoom(-0.1); } } @@ -128,6 +128,8 @@ export class ImageCropperComponent implements AfterViewInit, OnDestroy, OnChange }); } } + + return undefined; }); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/assets/image-focus-point.component.ts b/frontend/app/shared/components/assets/image-focus-point.component.ts index 84a3e0381..387c6af86 100644 --- a/frontend/app/shared/components/assets/image-focus-point.component.ts +++ b/frontend/app/shared/components/assets/image-focus-point.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, OnChanges, OnDestroy, ViewChild } from '@angular/core'; import { Types } from '@app/framework'; import { AnnotateAssetDto, AssetDto } from '@app/shared/services/assets.service'; @@ -16,7 +14,7 @@ import { FocusedImage, FocusPicker } from 'image-focus'; selector: 'sqx-image-focus-point', styleUrls: ['./image-focus-point.component.scss'], templateUrl: './image-focus-point.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ImageFocusPointComponent implements AfterViewInit, OnDestroy, OnChanges { private readonly previewImages: FocusedImage[] = []; @@ -73,7 +71,7 @@ export class ImageFocusPointComponent implements AfterViewInit, OnDestroy, OnCha for (const preview of this.previewImages) { preview.setFocus(newFocus); } - } + }, }); } @@ -90,7 +88,7 @@ export class ImageFocusPointComponent implements AfterViewInit, OnDestroy, OnCha } } -function getFocusPoint(value: any): { x: number, y: number } { +function getFocusPoint(value: any): { x: number; y: number } { let x = 0; let y = 0; @@ -103,4 +101,4 @@ function getFocusPoint(value: any): { x: number, y: number } { } return { x, y }; -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/assets/pipes.ts b/frontend/app/shared/components/assets/pipes.ts index 8df1ae0e8..0bffe2554 100644 --- a/frontend/app/shared/components/assets/pipes.ts +++ b/frontend/app/shared/components/assets/pipes.ts @@ -11,11 +11,11 @@ import { ApiUrlConfig, AssetDto, AuthService, MathHelper, StringHelper, Types } @Pipe({ name: 'sqxAssetUrl', - pure: true + pure: true, }) export class AssetUrlPipe implements PipeTransform { constructor( - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -38,17 +38,17 @@ export class AssetUrlPipe implements PipeTransform { @Pipe({ name: 'sqxAssetPreviewUrl', - pure: true + pure: true, }) export class AssetPreviewUrlPipe implements PipeTransform { constructor( private readonly apiUrl: ApiUrlConfig, - private readonly authService: AuthService + private readonly authService: AuthService, ) { } public transform(asset: AssetDto): string { - let url = asset.fullUrl(this.apiUrl, this.authService); + let url = asset.fullUrl(this.apiUrl, this.authService); url = StringHelper.appendToUrl(url, 'version', asset.version); @@ -58,10 +58,10 @@ export class AssetPreviewUrlPipe implements PipeTransform { @Pipe({ name: 'sqxFileIcon', - pure: true + pure: true, }) export class FileIconPipe implements PipeTransform { - public transform(asset: { mimeType: string, fileType: string }): string { + public transform(asset: { mimeType: string; fileType: string }): string { let mimeIcon: string; const mimeParts = asset.mimeType.split('/'); @@ -78,10 +78,10 @@ export class FileIconPipe implements PipeTransform { @Pipe({ name: 'sqxPreviewable', - pure: true + pure: true, }) export class PreviewableType implements PipeTransform { - public transform(asset: { fileSize: number, fileType: string }): boolean { + public transform(asset: { fileSize: number; fileType: string }): boolean { return PREVIEW_TYPES.indexOf(asset.fileType) >= 0 && asset.fileSize < 25_000_000; } } @@ -94,7 +94,7 @@ const KNOWN_TYPES: ReadonlyArray = [ 'pptx', 'video', 'xls', - 'xlsx' + 'xlsx', ]; const PREVIEW_TYPES: ReadonlyArray = [ @@ -116,5 +116,5 @@ const PREVIEW_TYPES: ReadonlyArray = [ 'xls', 'xlsx', 'xps', - 'zip' -]; \ No newline at end of file + 'zip', +]; diff --git a/frontend/app/shared/components/comments/comment.component.ts b/frontend/app/shared/components/comments/comment.component.ts index a91c5f59d..29895e20b 100644 --- a/frontend/app/shared/components/comments/comment.component.ts +++ b/frontend/app/shared/components/comments/comment.component.ts @@ -17,7 +17,7 @@ interface State { selector: 'sqx-comment', styleUrls: ['./comment.component.scss'], templateUrl: './comment.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class CommentComponent extends StatefulComponent implements OnChanges { @Input() @@ -52,10 +52,10 @@ export class CommentComponent extends StatefulComponent implements OnChan public editingText: string; constructor(changeDetector: ChangeDetectorRef, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super(changeDetector, { - isEditing: false + isEditing: false, }); } @@ -114,4 +114,4 @@ export class CommentComponent extends StatefulComponent implements OnChan this.cancelEdit(); } } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/comments/comments.component.ts b/frontend/app/shared/components/comments/comments.component.ts index 2758bebe9..dc226cd13 100644 --- a/frontend/app/shared/components/comments/comments.component.ts +++ b/frontend/app/shared/components/comments/comments.component.ts @@ -17,7 +17,7 @@ import { CommentComponent } from './comment.component'; @Component({ selector: 'sqx-comments', styleUrls: ['./comments.component.scss'], - templateUrl: './comments.component.html' + templateUrl: './comments.component.html', }) export class CommentsComponent extends ResourceOwner implements OnChanges { @ViewChild('commentsList', { static: false }) @@ -45,7 +45,7 @@ export class CommentsComponent extends ResourceOwner implements OnChanges { private readonly changeDetector: ChangeDetectorRef, private readonly dialogs: DialogService, private readonly formBuilder: FormBuilder, - private readonly router: Router + private readonly router: Router, ) { super(); @@ -92,4 +92,4 @@ export class CommentsComponent extends ResourceOwner implements OnChanges { public trackByComment(_index: number, comment: CommentDto) { return comment.id; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/forms/geolocation-editor.component.ts b/frontend/app/shared/components/forms/geolocation-editor.component.ts index 2e8c187e7..c7037eaf3 100644 --- a/frontend/app/shared/components/forms/geolocation-editor.component.ts +++ b/frontend/app/shared/components/forms/geolocation-editor.component.ts @@ -9,14 +9,14 @@ import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, E import { FormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms'; import { LocalStoreService, ResourceLoaderService, Settings, StatefulControlComponent, Types, UIOptions, ValidatorsEx } from '@app/shared/internal'; -declare var L: any; -declare var google: any; +declare const L: any; +declare const google: any; export const SQX_GEOLOCATION_EDITOR_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => GeolocationEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => GeolocationEditorComponent), multi: true, }; -type Geolocation = { latitude: number; longitude: number; }; +type Geolocation = { latitude: number; longitude: number }; interface State { // True when the map should be hidden. @@ -33,9 +33,9 @@ type UpdateOptions = { reset?: boolean; pan?: true; fire?: boolean }; styleUrls: ['./geolocation-editor.component.scss'], templateUrl: './geolocation-editor.component.html', providers: [ - SQX_GEOLOCATION_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_GEOLOCATION_EDITOR_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class GeolocationEditorComponent extends StatefulControlComponent implements AfterViewInit { private marker: any; @@ -58,15 +58,15 @@ export class GeolocationEditorComponent extends StatefulControlComponent { - this.map = L.map(this.editor.nativeElement).fitWorld(); + this.map = L.map(this.editor.nativeElement).fitWorld(); - L.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png', - { - attribution: '© OpenStreetMap contributors' - }).addTo(this.map); - - this.resourceLoader.loadScript('https://cdnjs.cloudflare.com/ajax/libs/perliedman-leaflet-control-geocoder/1.9.0/Control.Geocoder.min.js') - .then(() => { - L.Control.geocoder({ - defaultMarkGeocode: false - }) - .on('markgeocode', (event: any) => { - const center = event.geocode.center; - - if (!this.snapshot.isDisabled) { - this.updateValue(center.lat, center.lng); - this.updateMarker({ reset: true, fire: true }); - } - }) - .addTo(this.map); - }); + L.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png', + { + attribution: '© OpenStreetMap contributors', + }).addTo(this.map); - this.map.on('click', (event: any) => { - if (!this.snapshot.isDisabled) { - const latlng = event.latlng.wrap(); + this.resourceLoader.loadScript('https://cdnjs.cloudflare.com/ajax/libs/perliedman-leaflet-control-geocoder/1.9.0/Control.Geocoder.min.js') + .then(() => { + L.Control.geocoder({ + defaultMarkGeocode: false, + }) + .on('markgeocode', (event: any) => { + const center = event.geocode.center; - this.updateValue(latlng.lat, latlng.lng); - this.updateMarker({ fire: true }); - } + if (!this.snapshot.isDisabled) { + this.updateValue(center.lat, center.lng); + this.updateMarker({ reset: true, fire: true }); + } + }) + .addTo(this.map); }); - this.updateMarker({ reset: true }); - - if (this.snapshot.isDisabled) { - this.map.zoomControl.disable(); + this.map.on('click', (event: any) => { + if (!this.snapshot.isDisabled) { + const latlng = event.latlng.wrap(); - this.map._handlers.forEach((handler: any) => { - handler.disable(); - }); + this.updateValue(latlng.lat, latlng.lng); + this.updateMarker({ fire: true }); } }); + + this.updateMarker({ reset: true }); + + if (this.snapshot.isDisabled) { + this.map.zoomControl.disable(); + + this.map._handlers.forEach((handler: any) => { + handler.disable(); + }); + } + }); } private ngAfterViewInitGoogle(apiKey: string) { @@ -235,7 +235,7 @@ export class GeolocationEditorComponent extends StatefulControlComponent { @@ -378,11 +376,9 @@ export class GeolocationEditorComponent extends StatefulControlComponent MarkdownEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MarkdownEditorComponent), multi: true, }; interface State { @@ -26,9 +26,9 @@ interface State { styleUrls: ['./markdown-editor.component.scss'], templateUrl: './markdown-editor.component.html', providers: [ - SQX_MARKDOWN_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_MARKDOWN_EDITOR_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class MarkdownEditorComponent extends StatefulControlComponent implements AfterViewInit { private simplemde: any; @@ -57,10 +57,10 @@ export class MarkdownEditorComponent extends StatefulControlComponent { this.simplemde = new SimpleMDE({ previewRender: (text: string) => { @@ -104,78 +104,78 @@ export class MarkdownEditorComponent extends StatefulControlComponent ReferencesCheckboxesComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ReferencesCheckboxesComponent), multi: true, }; interface State { @@ -26,9 +26,9 @@ const NO_EMIT = { emitEvent: false }; styleUrls: ['./references-checkboxes.component.scss'], templateUrl: './references-checkboxes.component.html', providers: [ - SQX_REFERENCES_CHECKBOXES_CONTROL_VALUE_ACCESSOR + SQX_REFERENCES_CHECKBOXES_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ReferencesCheckboxesComponent extends StatefulControlComponent> implements OnChanges { private readonly itemCount: number; @@ -54,10 +54,10 @@ export class ReferencesCheckboxesComponent extends StatefulControlComponent ReferencesDropdownComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ReferencesDropdownComponent), multi: true, }; interface State { @@ -24,7 +24,7 @@ interface State { selectedItem?: ContentName; } -type ContentName = { name: string, id?: string }; +type ContentName = { name: string; id?: string }; const NO_EMIT = { emitEvent: false }; @@ -33,9 +33,9 @@ const NO_EMIT = { emitEvent: false }; styleUrls: ['./references-dropdown.component.scss'], templateUrl: './references-dropdown.component.html', providers: [ - SQX_REFERENCES_DROPDOWN_CONTROL_VALUE_ACCESSOR + SQX_REFERENCES_DROPDOWN_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ReferencesDropdownComponent extends StatefulControlComponent | string> implements OnChanges { private readonly itemCount: number; @@ -59,7 +59,7 @@ export class ReferencesDropdownComponent extends StatefulControlComponent ({ ...s, - contentNames: this.createContentNames(s.contents) + contentNames: this.createContentNames(s.contents), })); } @@ -72,11 +72,11 @@ export class ReferencesDropdownComponent extends StatefulControlComponent = []; constructor(language: LanguageDto, contents: ReadonlyArray, - private readonly localizer: LocalizerService + private readonly localizer: LocalizerService, ) { this.suggestions = this.createTags(language, contents); } @@ -46,4 +46,4 @@ export class ReferencesTagsConverter implements TagConverter { return values; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/forms/references-tags.component.ts b/frontend/app/shared/components/forms/references-tags.component.ts index 814fb200f..35dfbc7b5 100644 --- a/frontend/app/shared/components/forms/references-tags.component.ts +++ b/frontend/app/shared/components/forms/references-tags.component.ts @@ -11,7 +11,7 @@ import { AppsState, ContentDto, ContentsService, LanguageDto, LocalizerService, import { ReferencesTagsConverter } from './references-tag-converter'; export const SQX_REFERENCES_TAGS_CONTROL_VALUE_ACCESSOR: any = { - provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ReferencesTagsComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ReferencesTagsComponent), multi: true, }; interface State { @@ -26,9 +26,9 @@ const NO_EMIT = { emitEvent: false }; styleUrls: ['./references-tags.component.scss'], templateUrl: './references-tags.component.html', providers: [ - SQX_REFERENCES_TAGS_CONTROL_VALUE_ACCESSOR + SQX_REFERENCES_TAGS_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ReferencesTagsComponent extends StatefulControlComponent> implements OnChanges { private readonly itemCount: number; @@ -54,10 +54,10 @@ export class ReferencesTagsComponent extends StatefulControlComponent RichEditorComponent), multi: true + provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RichEditorComponent), multi: true, }; @Component({ @@ -22,9 +20,9 @@ export const SQX_RICH_EDITOR_CONTROL_VALUE_ACCESSOR: any = { styleUrls: ['./rich-editor.component.scss'], templateUrl: './rich-editor.component.html', providers: [ - SQX_RICH_EDITOR_CONTROL_VALUE_ACCESSOR + SQX_RICH_EDITOR_CONTROL_VALUE_ACCESSOR, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class RichEditorComponent extends StatefulControlComponent<{}, string> implements AfterViewInit, OnDestroy { private tinyEditor: any; @@ -50,7 +48,7 @@ export class RichEditorComponent extends StatefulControlComponent<{}, string> im private readonly apiUrl: ApiUrlConfig, private readonly assetUploader: AssetUploaderState, private readonly resourceLoader: ResourceLoaderService, - private readonly localizer: LocalizerService + private readonly localizer: LocalizerService, ) { super(changeDetector, {}); } @@ -90,9 +88,10 @@ export class RichEditorComponent extends StatefulControlComponent<{}, string> im } this.assetsDialog.show(); - } + }; private getEditorOptions(target: any): any { + // eslint-disable-next-line @typescript-eslint/no-this-alias const self = this; return { @@ -118,7 +117,7 @@ export class RichEditorComponent extends StatefulControlComponent<{}, string> im onAction: self.showSelector, icon: 'gallery', text: '', - tooltip: this.localizer.getOrKey('assets.insertAssets') + tooltip: this.localizer.getOrKey('assets.insertAssets'), }); editor.on('init', () => { @@ -152,6 +151,8 @@ export class RichEditorComponent extends StatefulControlComponent<{}, string> im } else { return false; } + + return undefined; }); editor.on('drop', (event: DragEvent) => { @@ -181,7 +182,7 @@ export class RichEditorComponent extends StatefulControlComponent<{}, string> im }); }, - target + target, }; } @@ -239,7 +240,7 @@ export class RichEditorComponent extends StatefulControlComponent<{}, string> im this.tinyEditor.execCommand('mceInsertContent', false, uploadText); const replaceText = (replacement: string) => { - const content = this.tinyEditor.getContent().replace(uploadText, replacement); + const content = this.tinyEditor.getContent().replace(uploadText, replacement); this.tinyEditor.setContent(content); }; @@ -247,7 +248,7 @@ export class RichEditorComponent extends StatefulControlComponent<{}, string> im this.assetUploader.uploadFile(file, undefined, this.folderId) .subscribe(asset => { if (Types.is(asset, AssetDto)) { - replaceText(this.buildMarkup(asset)); + replaceText(this.buildMarkup(asset)); } }, error => { if (!Types.is(error, UploadCanceled)) { @@ -288,5 +289,5 @@ const DEFAULT_PROPS = { max_height: 800, removed_menuitems: 'newdocument', resize: true, - toolbar: 'undo redo | styleselect | bold italic | alignleft aligncenter | bullist numlist outdent indent | link image media | assets' -}; \ No newline at end of file + toolbar: 'undo redo | styleselect | bold italic | alignleft aligncenter | bullist numlist outdent indent | link image media | assets', +}; diff --git a/frontend/app/shared/components/help/help-markdown.pipe.spec.ts b/frontend/app/shared/components/help/help-markdown.pipe.spec.ts index 0ee5e8c19..0a19e29b5 100644 --- a/frontend/app/shared/components/help/help-markdown.pipe.spec.ts +++ b/frontend/app/shared/components/help/help-markdown.pipe.spec.ts @@ -26,11 +26,11 @@ describe('MarkdownPipe', () => { expect(actual).toBe('

bold

\n'); }); - [null, undefined, ''].map(x => { + [null, undefined, ''].forEach(x => { it('should return empty string for invalid value', () => { const actual = new HelpMarkdownPipe().transform(x); expect(actual).toBe(''); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/components/help/help-markdown.pipe.ts b/frontend/app/shared/components/help/help-markdown.pipe.ts index 51f40ab77..bef9eddc7 100644 --- a/frontend/app/shared/components/help/help-markdown.pipe.ts +++ b/frontend/app/shared/components/help/help-markdown.pipe.ts @@ -20,7 +20,7 @@ renderer.link = (href, _, text) => { @Pipe({ name: 'sqxHelpMarkdown', - pure: true + pure: true, }) export class HelpMarkdownPipe implements PipeTransform { public transform(text: string | undefined | null): string { @@ -30,4 +30,4 @@ export class HelpMarkdownPipe implements PipeTransform { return ''; } } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/help/help.component.ts b/frontend/app/shared/components/help/help.component.ts index 8731d13ba..b6ac72442 100644 --- a/frontend/app/shared/components/help/help.component.ts +++ b/frontend/app/shared/components/help/help.component.ts @@ -13,14 +13,14 @@ import { HelpService } from '@app/shared/internal'; selector: 'sqx-help', styleUrls: ['./help.component.scss'], templateUrl: './help.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class HelpComponent { public helpMarkdown = this.helpService.getHelp(this.route.snapshot.data.helpPage); constructor( private readonly helpService: HelpService, - private readonly route: ActivatedRoute + private readonly route: ActivatedRoute, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/history/history-list.component.ts b/frontend/app/shared/components/history/history-list.component.ts index cc5d7f6eb..655dd2bd1 100644 --- a/frontend/app/shared/components/history/history-list.component.ts +++ b/frontend/app/shared/components/history/history-list.component.ts @@ -12,7 +12,7 @@ import { HistoryEventDto } from '@app/shared/internal'; selector: 'sqx-history-list', styleUrls: ['./history-list.component.scss'], templateUrl: './history-list.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class HistoryListComponent { @Input() @@ -21,4 +21,4 @@ export class HistoryListComponent { public trackByEvent(_index: number, event: HistoryEventDto) { return event.eventId; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/history/history.component.ts b/frontend/app/shared/components/history/history.component.ts index 97bcf74c1..7a075efb9 100644 --- a/frontend/app/shared/components/history/history.component.ts +++ b/frontend/app/shared/components/history/history.component.ts @@ -15,7 +15,7 @@ import { delay } from 'rxjs/operators'; selector: 'sqx-history', styleUrls: ['./history.component.scss'], templateUrl: './history.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class HistoryComponent { private readonly channel = this.calculateChannel(); @@ -23,7 +23,7 @@ export class HistoryComponent { public events: Observable> = merge( timer(0, 10000), - this.messageBus.of(HistoryChannelUpdated).pipe(delay(1000)) + this.messageBus.of(HistoryChannelUpdated).pipe(delay(1000)), ).pipe( switchSafe(() => this.historyService.getHistory(this.appsState.appName, this.channel))); @@ -31,7 +31,7 @@ export class HistoryComponent { private readonly appsState: AppsState, private readonly historyService: HistoryService, private readonly messageBus: MessageBus, - private readonly route: ActivatedRoute + private readonly route: ActivatedRoute, ) { } @@ -52,4 +52,4 @@ export class HistoryComponent { return channel; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/history/pipes.ts b/frontend/app/shared/components/history/pipes.ts index 95f1818d4..68cc8a390 100644 --- a/frontend/app/shared/components/history/pipes.ts +++ b/frontend/app/shared/components/history/pipes.ts @@ -5,15 +5,13 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: no-pipe-impure - import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform } from '@angular/core'; import { formatHistoryMessage, HistoryEventDto, UsersProviderService } from '@app/shared/internal'; import { Subscription } from 'rxjs'; @Pipe({ name: 'sqxHistoryMessage', - pure: false + pure: false, }) export class HistoryMessagePipe implements OnDestroy, PipeTransform { private subscription: Subscription; @@ -22,7 +20,7 @@ export class HistoryMessagePipe implements OnDestroy, PipeTransform { constructor( private readonly changeDetector: ChangeDetectorRef, - private readonly users: UsersProviderService + private readonly users: UsersProviderService, ) { } @@ -44,7 +42,7 @@ export class HistoryMessagePipe implements OnDestroy, PipeTransform { this.subscription.unsubscribe(); } - this.subscription = formatHistoryMessage(event.message, this.users).subscribe(value => { + this.subscription = formatHistoryMessage(event.message, this.users).subscribe(value => { this.lastValue = value; this.changeDetector.markForCheck(); @@ -53,4 +51,4 @@ export class HistoryMessagePipe implements OnDestroy, PipeTransform { return this.lastValue; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/notifo.component.ts b/frontend/app/shared/components/notifo.component.ts index c8e2b9ee1..954db3002 100644 --- a/frontend/app/shared/components/notifo.component.ts +++ b/frontend/app/shared/components/notifo.component.ts @@ -13,7 +13,7 @@ import { AuthService } from '@app/shared/internal'; selector: 'sqx-notifo', styleUrls: ['./notifo.component.scss'], templateUrl: './notifo.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class NotifoComponent implements AfterViewInit, OnChanges, OnDestroy { private readonly notifoApiUrl: string; @@ -34,14 +34,14 @@ export class NotifoComponent implements AfterViewInit, OnChanges, OnDestroy { } constructor(resourceLoader: ResourceLoaderService, uiOptions: UIOptions, authService: AuthService, - private readonly renderer: Renderer2 + private readonly renderer: Renderer2, ) { this.notifoApiKey = authService.user?.notifoToken; this.notifoApiUrl = uiOptions.get('more.notifoApi'); if (this.isConfigured) { if (this.notifoApiUrl.indexOf('localhost:5002') >= 0) { - resourceLoader.loadScript(`https://localhost:3002/notifo-sdk.js`); + resourceLoader.loadScript('https://localhost:3002/notifo-sdk.js'); } else { resourceLoader.loadScript(`${this.notifoApiUrl}/build/notifo-sdk.js`); } @@ -101,4 +101,4 @@ export class NotifoComponent implements AfterViewInit, OnChanges, OnDestroy { notifo.push(['hide-topic', element]); } } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/pipes.ts b/frontend/app/shared/components/pipes.ts index ebd838a5b..44cf8bc17 100644 --- a/frontend/app/shared/components/pipes.ts +++ b/frontend/app/shared/components/pipes.ts @@ -5,9 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: no-pipe-impure -// tslint:disable: directive-class-suffix - import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform } from '@angular/core'; import { ApiUrlConfig, UserDto, UsersProviderService } from '@app/shared/internal'; import { Observable, of, Subscription } from 'rxjs'; @@ -21,7 +18,7 @@ class UserAsyncPipe { constructor(loading: string, private readonly users: UsersProviderService, - private readonly changeDetector: ChangeDetectorRef + private readonly changeDetector: ChangeDetectorRef, ) { this.lastValue = loading; } @@ -59,7 +56,7 @@ class UserAsyncPipe { @Pipe({ name: 'sqxUserName', - pure: false + pure: false, }) export class UserNamePipe extends UserAsyncPipe implements OnDestroy, PipeTransform { constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef) { @@ -77,7 +74,7 @@ export class UserNamePipe extends UserAsyncPipe implements OnDestroy, PipeTransf @Pipe({ name: 'sqxUserNameRef', - pure: false + pure: false, }) export class UserNameRefPipe extends UserAsyncPipe implements OnDestroy, PipeTransform { constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef) { @@ -94,12 +91,10 @@ export class UserNameRefPipe extends UserAsyncPipe implements OnDestroy, PipeTra if (type === 'subject') { return users.getUser(id, placeholder).pipe(map(u => u.displayName)); + } else if (id.endsWith('client')) { + return of(id); } else { - if (id.endsWith('client')) { - return of(id); - } else { - return of(`${id} client`); - } + return of(`${id} client`); } }); } @@ -107,11 +102,11 @@ export class UserNameRefPipe extends UserAsyncPipe implements OnDestroy, PipeTra @Pipe({ name: 'sqxUserDtoPicture', - pure: false + pure: false, }) export class UserDtoPicture implements PipeTransform { constructor( - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -122,11 +117,11 @@ export class UserDtoPicture implements PipeTransform { @Pipe({ name: 'sqxUserIdPicture', - pure: false + pure: false, }) export class UserIdPicturePipe implements PipeTransform { constructor( - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -137,11 +132,11 @@ export class UserIdPicturePipe implements PipeTransform { @Pipe({ name: 'sqxUserPicture', - pure: false + pure: false, }) export class UserPicturePipe extends UserAsyncPipe implements OnDestroy, PipeTransform { constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { super('', users, changeDetector); } @@ -157,11 +152,11 @@ export class UserPicturePipe extends UserAsyncPipe implements OnDestroy, PipeTra @Pipe({ name: 'sqxUserPictureRef', - pure: false + pure: false, }) export class UserPictureRefPipe extends UserAsyncPipe implements OnDestroy, PipeTransform { constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { super('', users, changeDetector); } @@ -194,4 +189,4 @@ function split(token: string) { } return { type: token, id: token }; -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/schema-category.component.ts b/frontend/app/shared/components/schema-category.component.ts index 62400628f..ffafd0af8 100644 --- a/frontend/app/shared/components/schema-category.component.ts +++ b/frontend/app/shared/components/schema-category.component.ts @@ -1,4 +1,3 @@ - /* * Squidex Headless CMS * @@ -19,9 +18,9 @@ const ITEM_HEIGHT = 3.125; styleUrls: ['./schema-category.component.scss'], templateUrl: './schema-category.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SchemaCategoryComponent implements OnChanges { @Output() @@ -43,7 +42,7 @@ export class SchemaCategoryComponent implements OnChanges { constructor( private readonly appsState: AppsState, private readonly localStore: LocalStoreService, - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { } diff --git a/frontend/app/shared/components/search/queries/filter-comparison.component.ts b/frontend/app/shared/components/search/queries/filter-comparison.component.ts index b1c176f05..8ed433af0 100644 --- a/frontend/app/shared/components/search/queries/filter-comparison.component.ts +++ b/frontend/app/shared/components/search/queries/filter-comparison.component.ts @@ -9,11 +9,11 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Out import { FilterComparison, LanguageDto, QueryFieldModel, QueryModel } from '@app/shared/internal'; import { ContributorsState } from '@app/shared/state/contributors.state'; - @Component({ +@Component({ selector: 'sqx-filter-comparison', styleUrls: ['./filter-comparison.component.scss'], templateUrl: './filter-comparison.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class FilterComparisonComponent implements OnChanges { @Output() @@ -36,7 +36,7 @@ export class FilterComparisonComponent implements OnChanges { public noValue = false; constructor( - public readonly contributorsState: ContributorsState + public readonly contributorsState: ContributorsState, ) { } @@ -94,4 +94,4 @@ export class FilterComparisonComponent implements OnChanges { public emitChange() { this.change.emit(); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/search/queries/filter-logical.component.ts b/frontend/app/shared/components/search/queries/filter-logical.component.ts index fc8835ce5..04ddc152f 100644 --- a/frontend/app/shared/components/search/queries/filter-logical.component.ts +++ b/frontend/app/shared/components/search/queries/filter-logical.component.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ - // tslint:disable: readonly-array - import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { FilterLogical, FilterNode, LanguageDto, QueryModel } from '@app/shared/internal'; @@ -14,7 +12,7 @@ import { FilterLogical, FilterNode, LanguageDto, QueryModel } from '@app/shared/ selector: 'sqx-filter-logical', styleUrls: ['./filter-logical.component.scss'], templateUrl: './filter-logical.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class FilterLogicalComponent { private filterValue: FilterLogical; @@ -105,4 +103,4 @@ export class FilterLogicalComponent { public emitChange() { this.change.emit(); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/search/queries/filter-node.component.ts b/frontend/app/shared/components/search/queries/filter-node.component.ts index 9ebd686b7..b4fbc6f51 100644 --- a/frontend/app/shared/components/search/queries/filter-node.component.ts +++ b/frontend/app/shared/components/search/queries/filter-node.component.ts @@ -12,7 +12,7 @@ import { FilterComparison, FilterLogical, FilterNode, LanguageDto, QueryModel } selector: 'sqx-filter-node', styleUrls: ['./filter-node.component.scss'], templateUrl: './filter-node.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class FilterNodeComponent { public comparison: FilterComparison; @@ -42,4 +42,4 @@ export class FilterNodeComponent { } public logical: FilterLogical; -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/search/queries/query-path.component.ts b/frontend/app/shared/components/search/queries/query-path.component.ts index e50015613..cc3adaa2e 100644 --- a/frontend/app/shared/components/search/queries/query-path.component.ts +++ b/frontend/app/shared/components/search/queries/query-path.component.ts @@ -12,7 +12,7 @@ import { QueryModel } from '@app/shared/internal'; selector: 'sqx-query-path', styleUrls: ['./query-path.component.scss'], templateUrl: './query-path.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class QueryPathComponent { @Output() @@ -23,4 +23,4 @@ export class QueryPathComponent { @Input() public model: QueryModel; -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/search/queries/query.component.ts b/frontend/app/shared/components/search/queries/query.component.ts index bb26d34d3..73c36b9c6 100644 --- a/frontend/app/shared/components/search/queries/query.component.ts +++ b/frontend/app/shared/components/search/queries/query.component.ts @@ -12,7 +12,7 @@ import { LanguageDto, Query, QueryModel } from '@app/shared/internal'; selector: 'sqx-query', styleUrls: ['./query.component.scss'], templateUrl: './query.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class QueryComponent { @Output() @@ -64,4 +64,4 @@ export class QueryComponent { public emitQueryChange() { this.queryChange.emit(this.queryValue); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/search/queries/sorting.component.ts b/frontend/app/shared/components/search/queries/sorting.component.ts index 919235d45..0de8f55df 100644 --- a/frontend/app/shared/components/search/queries/sorting.component.ts +++ b/frontend/app/shared/components/search/queries/sorting.component.ts @@ -12,7 +12,7 @@ import { QueryModel, QuerySorting, SORT_MODES } from '@app/shared/internal'; selector: 'sqx-sorting', styleUrls: ['./sorting.component.scss'], templateUrl: './sorting.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SortingComponent { @Output() @@ -44,4 +44,4 @@ export class SortingComponent { private emitChange() { this.change.emit(); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/search/query-list.component.ts b/frontend/app/shared/components/search/query-list.component.ts index 69ca21b15..9424530fe 100644 --- a/frontend/app/shared/components/search/query-list.component.ts +++ b/frontend/app/shared/components/search/query-list.component.ts @@ -12,7 +12,7 @@ import { equalsQuery, Query, SavedQuery } from '@app/shared/internal'; selector: 'sqx-query-list', styleUrls: ['./query-list.component.scss'], templateUrl: './query-list.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class QueryListComponent { @Output() @@ -40,4 +40,4 @@ export class QueryListComponent { public trackByQuery(_index: number, query: SavedQuery) { return query.name; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/search/search-form.component.ts b/frontend/app/shared/components/search/search-form.component.ts index a3fb8e151..2d942dca0 100644 --- a/frontend/app/shared/components/search/search-form.component.ts +++ b/frontend/app/shared/components/search/search-form.component.ts @@ -14,7 +14,7 @@ import { Observable } from 'rxjs'; selector: 'sqx-search-form', styleUrls: ['./search-form.component.scss'], templateUrl: './search-form.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SearchFormComponent implements OnChanges { private previousQuery?: Query | null; @@ -57,7 +57,7 @@ export class SearchFormComponent implements OnChanges { public hasFilter: boolean; constructor( - private readonly formBuilder: FormBuilder + private readonly formBuilder: FormBuilder, ) { } diff --git a/frontend/app/shared/components/search/shared-queries.component.ts b/frontend/app/shared/components/search/shared-queries.component.ts index 9908265f6..2b6365746 100644 --- a/frontend/app/shared/components/search/shared-queries.component.ts +++ b/frontend/app/shared/components/search/shared-queries.component.ts @@ -12,7 +12,7 @@ import { Queries, Query } from '@app/shared/internal'; selector: 'sqx-shared-queries', styleUrls: ['./shared-queries.component.scss'], templateUrl: './shared-queries.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SavedQueriesComponent { @Output() @@ -26,4 +26,4 @@ export class SavedQueriesComponent { @Input() public types: string; -} \ No newline at end of file +} diff --git a/frontend/app/shared/components/table-header.component.ts b/frontend/app/shared/components/table-header.component.ts index 2957e7228..494da279d 100644 --- a/frontend/app/shared/components/table-header.component.ts +++ b/frontend/app/shared/components/table-header.component.ts @@ -12,7 +12,7 @@ import { LanguageDto, Query, SortMode, Types } from '@app/shared/internal'; selector: 'sqx-table-header', styleUrls: ['./table-header.component.scss'], templateUrl: './table-header.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class TableHeaderComponent implements OnChanges { @Output() @@ -62,10 +62,10 @@ export class TableHeaderComponent implements OnChanges { const newQuery = Types.clone(this.query || {}); newQuery.sort = [ - { path: this.fieldPath, order: this.order! } + { path: this.fieldPath, order: this.order! }, ]; this.queryChange.emit(newQuery); } } -} \ No newline at end of file +} diff --git a/frontend/app/shared/declarations.ts b/frontend/app/shared/declarations.ts index 77065e55f..80e644ebc 100644 --- a/frontend/app/shared/declarations.ts +++ b/frontend/app/shared/declarations.ts @@ -47,7 +47,6 @@ export * from './components/search/search-form.component'; export * from './components/search/shared-queries.component'; export * from './components/table-header.component'; export * from './guards/app-must-exist.guard'; -export * from './guards/app-must-exist.guard'; export * from './guards/content-must-exist.guard'; export * from './guards/load-apps.guard'; export * from './guards/load-languages.guard'; @@ -59,4 +58,4 @@ export * from './guards/schema-must-exist-published.guard'; export * from './guards/schema-must-exist.guard'; export * from './guards/schema-must-not-be-singleton.guard'; export * from './guards/unset-app.guard'; -export * from './internal'; \ No newline at end of file +export * from './internal'; diff --git a/frontend/app/shared/guards/app-must-exist.guard.spec.ts b/frontend/app/shared/guards/app-must-exist.guard.spec.ts index 48a41b6d7..6798b837f 100644 --- a/frontend/app/shared/guards/app-must-exist.guard.spec.ts +++ b/frontend/app/shared/guards/app-must-exist.guard.spec.ts @@ -14,8 +14,8 @@ import { AppMustExistGuard } from './app-must-exist.guard'; describe('AppMustExistGuard', () => { const route: any = { params: { - appName: 'my-app' - } + appName: 'my-app', + }, }; let router: IMock; @@ -59,4 +59,4 @@ describe('AppMustExistGuard', () => { // router.verify(x => x.navigate(['/404']), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/app-must-exist.guard.ts b/frontend/app/shared/guards/app-must-exist.guard.ts index ff568f3a4..cfd2580cc 100644 --- a/frontend/app/shared/guards/app-must-exist.guard.ts +++ b/frontend/app/shared/guards/app-must-exist.guard.ts @@ -15,7 +15,7 @@ import { AppsState } from './../state/apps.state'; export class AppMustExistGuard implements CanActivate { constructor( private readonly appsState: AppsState, - private readonly router: Router + private readonly router: Router, ) { } @@ -33,4 +33,4 @@ export class AppMustExistGuard implements CanActivate { return result; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/content-must-exist.guard.spec.ts b/frontend/app/shared/guards/content-must-exist.guard.spec.ts index 9890733d2..407a5773a 100644 --- a/frontend/app/shared/guards/content-must-exist.guard.spec.ts +++ b/frontend/app/shared/guards/content-must-exist.guard.spec.ts @@ -30,8 +30,8 @@ describe('ContentMustExistGuard', () => { const route: any = { params: { - contentId: '123' - } + contentId: '123', + }, }; contentGuard.canActivate(route).subscribe(x => { @@ -51,8 +51,8 @@ describe('ContentMustExistGuard', () => { const route: any = { params: { - contentId: '123' - } + contentId: '123', + }, }; contentGuard.canActivate(route).subscribe(x => { @@ -72,8 +72,8 @@ describe('ContentMustExistGuard', () => { const route: any = { params: { - contentId: undefined - } + contentId: undefined, + }, }; contentGuard.canActivate(route).subscribe(x => { @@ -93,8 +93,8 @@ describe('ContentMustExistGuard', () => { const route: any = { params: { - contentId: 'new' - } + contentId: 'new', + }, }; contentGuard.canActivate(route).subscribe(x => { @@ -105,4 +105,4 @@ describe('ContentMustExistGuard', () => { contentsState.verify(x => x.select(null), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/content-must-exist.guard.ts b/frontend/app/shared/guards/content-must-exist.guard.ts index 637fdedb5..cec896726 100644 --- a/frontend/app/shared/guards/content-must-exist.guard.ts +++ b/frontend/app/shared/guards/content-must-exist.guard.ts @@ -16,7 +16,7 @@ import { ContentsState } from './../state/contents.state'; export class ContentMustExistGuard implements CanActivate { constructor( private readonly contentsState: ContentsState, - private readonly router: Router + private readonly router: Router, ) { } @@ -38,4 +38,4 @@ export class ContentMustExistGuard implements CanActivate { return result; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/load-apps.guard.spec.ts b/frontend/app/shared/guards/load-apps.guard.spec.ts index 9646209e3..a24eb8c84 100644 --- a/frontend/app/shared/guards/load-apps.guard.spec.ts +++ b/frontend/app/shared/guards/load-apps.guard.spec.ts @@ -33,4 +33,4 @@ describe('LoadAppsGuard', () => { appsState.verify(x => x.load(), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/load-apps.guard.ts b/frontend/app/shared/guards/load-apps.guard.ts index 7712803c3..628dc025d 100644 --- a/frontend/app/shared/guards/load-apps.guard.ts +++ b/frontend/app/shared/guards/load-apps.guard.ts @@ -14,11 +14,11 @@ import { AppsState } from './../state/apps.state'; @Injectable() export class LoadAppsGuard implements CanActivate { constructor( - private readonly appsState: AppsState + private readonly appsState: AppsState, ) { } public canActivate(): Observable { - return this.appsState.load().pipe(map(_ => true)); + return this.appsState.load().pipe(map(() => true)); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/load-languages.guard.spec.ts b/frontend/app/shared/guards/load-languages.guard.spec.ts index 98abc6e86..3b751faee 100644 --- a/frontend/app/shared/guards/load-languages.guard.spec.ts +++ b/frontend/app/shared/guards/load-languages.guard.spec.ts @@ -33,4 +33,4 @@ describe('LoadLanguagesGuard', () => { languagesState.verify(x => x.load(), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/load-languages.guard.ts b/frontend/app/shared/guards/load-languages.guard.ts index c6c18e2be..02114f099 100644 --- a/frontend/app/shared/guards/load-languages.guard.ts +++ b/frontend/app/shared/guards/load-languages.guard.ts @@ -14,11 +14,11 @@ import { LanguagesState } from './../state/languages.state'; @Injectable() export class LoadLanguagesGuard implements CanActivate { constructor( - private readonly languagesState: LanguagesState + private readonly languagesState: LanguagesState, ) { } public canActivate(): Observable { return this.languagesState.load().pipe(map(_ => true)); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/load-schemas.guard.spec.ts b/frontend/app/shared/guards/load-schemas.guard.spec.ts index 5168c79b0..f4ef7b135 100644 --- a/frontend/app/shared/guards/load-schemas.guard.spec.ts +++ b/frontend/app/shared/guards/load-schemas.guard.spec.ts @@ -33,4 +33,4 @@ describe('LoadSchemasGuard', () => { schemasState.verify(x => x.load(), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/load-schemas.guard.ts b/frontend/app/shared/guards/load-schemas.guard.ts index d06eef3ff..bbf4d9b38 100644 --- a/frontend/app/shared/guards/load-schemas.guard.ts +++ b/frontend/app/shared/guards/load-schemas.guard.ts @@ -14,11 +14,11 @@ import { SchemasState } from './../state/schemas.state'; @Injectable() export class LoadSchemasGuard implements CanActivate { constructor( - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { } public canActivate(): Observable { return this.schemasState.load().pipe(map(_ => true)); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/must-be-authenticated.guard.spec.ts b/frontend/app/shared/guards/must-be-authenticated.guard.spec.ts index 00de8b102..f347695dc 100644 --- a/frontend/app/shared/guards/must-be-authenticated.guard.spec.ts +++ b/frontend/app/shared/guards/must-be-authenticated.guard.spec.ts @@ -73,4 +73,4 @@ describe('MustBeAuthenticatedGuard', () => { authService.verify(x => x.loginRedirect(), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/must-be-authenticated.guard.ts b/frontend/app/shared/guards/must-be-authenticated.guard.ts index 068c7a482..88ef3fd7e 100644 --- a/frontend/app/shared/guards/must-be-authenticated.guard.ts +++ b/frontend/app/shared/guards/must-be-authenticated.guard.ts @@ -18,7 +18,7 @@ export class MustBeAuthenticatedGuard implements CanActivate { constructor(uiOptions: UIOptions, private readonly authService: AuthService, - private readonly router: Router + private readonly router: Router, ) { this.redirect = uiOptions.get('redirectToLogin'); } @@ -37,4 +37,4 @@ export class MustBeAuthenticatedGuard implements CanActivate { }), map(user => !!user)); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/must-be-not-authenticated.guard.spec.ts b/frontend/app/shared/guards/must-be-not-authenticated.guard.spec.ts index 33abe1fd5..85062c741 100644 --- a/frontend/app/shared/guards/must-be-not-authenticated.guard.spec.ts +++ b/frontend/app/shared/guards/must-be-not-authenticated.guard.spec.ts @@ -73,4 +73,4 @@ describe('MustBeNotAuthenticatedGuard', () => { authService.verify(x => x.loginRedirect(), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/must-be-not-authenticated.guard.ts b/frontend/app/shared/guards/must-be-not-authenticated.guard.ts index c3089a528..9bc692906 100644 --- a/frontend/app/shared/guards/must-be-not-authenticated.guard.ts +++ b/frontend/app/shared/guards/must-be-not-authenticated.guard.ts @@ -18,7 +18,7 @@ export class MustBeNotAuthenticatedGuard implements CanActivate { constructor(uiOptions: UIOptions, private readonly authService: AuthService, - private readonly router: Router + private readonly router: Router, ) { this.redirect = uiOptions.get('redirectToLogin'); } @@ -35,4 +35,4 @@ export class MustBeNotAuthenticatedGuard implements CanActivate { }), map(user => !user && !this.redirect)); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/rule-must-exist.guard.spec.ts b/frontend/app/shared/guards/rule-must-exist.guard.spec.ts index 602a247b2..7f5494416 100644 --- a/frontend/app/shared/guards/rule-must-exist.guard.spec.ts +++ b/frontend/app/shared/guards/rule-must-exist.guard.spec.ts @@ -30,8 +30,8 @@ describe('RuleMustExistGuard', () => { const route: any = { params: { - ruleId: '123' - } + ruleId: '123', + }, }; ruleGuard.canActivate(route).subscribe(x => { @@ -51,8 +51,8 @@ describe('RuleMustExistGuard', () => { const route: any = { params: { - ruleId: '123' - } + ruleId: '123', + }, }; ruleGuard.canActivate(route).subscribe(x => { @@ -72,8 +72,8 @@ describe('RuleMustExistGuard', () => { const route: any = { params: { - ruleId: undefined - } + ruleId: undefined, + }, }; ruleGuard.canActivate(route).subscribe(x => { @@ -93,8 +93,8 @@ describe('RuleMustExistGuard', () => { const route: any = { params: { - ruleId: 'new' - } + ruleId: 'new', + }, }; ruleGuard.canActivate(route).subscribe(x => { @@ -105,4 +105,4 @@ describe('RuleMustExistGuard', () => { rulesState.verify(x => x.select(null), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/rule-must-exist.guard.ts b/frontend/app/shared/guards/rule-must-exist.guard.ts index 56b230a7d..eaeccfa5a 100644 --- a/frontend/app/shared/guards/rule-must-exist.guard.ts +++ b/frontend/app/shared/guards/rule-must-exist.guard.ts @@ -16,7 +16,7 @@ import { RulesState } from './../state/rules.state'; export class RuleMustExistGuard implements CanActivate { constructor( private readonly rulesState: RulesState, - private readonly router: Router + private readonly router: Router, ) { } @@ -38,4 +38,4 @@ export class RuleMustExistGuard implements CanActivate { return result; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/schema-must-exist-published.guard.spec.ts b/frontend/app/shared/guards/schema-must-exist-published.guard.spec.ts index e76b537d5..ab783869b 100644 --- a/frontend/app/shared/guards/schema-must-exist-published.guard.spec.ts +++ b/frontend/app/shared/guards/schema-must-exist-published.guard.spec.ts @@ -14,8 +14,8 @@ import { SchemaMustExistPublishedGuard } from './schema-must-exist-published.gua describe('SchemaMustExistPublishedGuard', () => { const route: any = { params: { - schemaName: '123' - } + schemaName: '123', + }, }; let schemasState: IMock; @@ -87,4 +87,4 @@ describe('SchemaMustExistPublishedGuard', () => { router.verify(x => x.navigate(['/404']), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/schema-must-exist-published.guard.ts b/frontend/app/shared/guards/schema-must-exist-published.guard.ts index 0d8f2bf23..0b2ce9348 100644 --- a/frontend/app/shared/guards/schema-must-exist-published.guard.ts +++ b/frontend/app/shared/guards/schema-must-exist-published.guard.ts @@ -16,7 +16,7 @@ import { SchemasState } from './../state/schemas.state'; export class SchemaMustExistPublishedGuard implements CanActivate { constructor( private readonly schemasState: SchemasState, - private readonly router: Router + private readonly router: Router, ) { } @@ -34,4 +34,4 @@ export class SchemaMustExistPublishedGuard implements CanActivate { return result; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/schema-must-exist.guard.spec.ts b/frontend/app/shared/guards/schema-must-exist.guard.spec.ts index b4d223e52..0eb4e4b49 100644 --- a/frontend/app/shared/guards/schema-must-exist.guard.spec.ts +++ b/frontend/app/shared/guards/schema-must-exist.guard.spec.ts @@ -14,8 +14,8 @@ import { SchemaMustExistGuard } from './schema-must-exist.guard'; describe('SchemaMustExistGuard', () => { const route: any = { params: { - schemaName: '123' - } + schemaName: '123', + }, }; let schemasState: IMock; @@ -55,4 +55,4 @@ describe('SchemaMustExistGuard', () => { router.verify(x => x.navigate(['/404']), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/schema-must-exist.guard.ts b/frontend/app/shared/guards/schema-must-exist.guard.ts index b727380f6..598732649 100644 --- a/frontend/app/shared/guards/schema-must-exist.guard.ts +++ b/frontend/app/shared/guards/schema-must-exist.guard.ts @@ -16,7 +16,7 @@ import { SchemasState } from './../state/schemas.state'; export class SchemaMustExistGuard implements CanActivate { constructor( private readonly schemasState: SchemasState, - private readonly router: Router + private readonly router: Router, ) { } @@ -34,4 +34,4 @@ export class SchemaMustExistGuard implements CanActivate { return result; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/schema-must-not-be-singleton.guard.spec.ts b/frontend/app/shared/guards/schema-must-not-be-singleton.guard.spec.ts index 74adbb825..e3321615b 100644 --- a/frontend/app/shared/guards/schema-must-not-be-singleton.guard.spec.ts +++ b/frontend/app/shared/guards/schema-must-not-be-singleton.guard.spec.ts @@ -14,13 +14,13 @@ import { SchemaMustNotBeSingletonGuard } from './schema-must-not-be-singleton.gu describe('SchemaMustNotBeSingletonGuard', () => { const route: any = { params: { - schemaName: '123' + schemaName: '123', }, url: [ new UrlSegment('schemas', {}), new UrlSegment('name', {}), - new UrlSegment('new', {}) - ] + new UrlSegment('new', {}), + ], }; let schemasState: IMock; @@ -83,4 +83,4 @@ describe('SchemaMustNotBeSingletonGuard', () => { router.verify(x => x.navigate(['schemas/name/', '123']), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/schema-must-not-be-singleton.guard.ts b/frontend/app/shared/guards/schema-must-not-be-singleton.guard.ts index c6487d5ad..909a7aeb8 100644 --- a/frontend/app/shared/guards/schema-must-not-be-singleton.guard.ts +++ b/frontend/app/shared/guards/schema-must-not-be-singleton.guard.ts @@ -16,7 +16,7 @@ import { SchemasState } from './../state/schemas.state'; export class SchemaMustNotBeSingletonGuard implements CanActivate { constructor( private readonly schemasState: SchemasState, - private readonly router: Router + private readonly router: Router, ) { } @@ -40,4 +40,4 @@ export class SchemaMustNotBeSingletonGuard implements CanActivate { return result; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/guards/unset-app.guard.spec.ts b/frontend/app/shared/guards/unset-app.guard.spec.ts index c6ce32d29..f9264441c 100644 --- a/frontend/app/shared/guards/unset-app.guard.spec.ts +++ b/frontend/app/shared/guards/unset-app.guard.spec.ts @@ -33,4 +33,4 @@ describe('UnsetAppGuard', () => { appsState.verify(x => x.select(null), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/guards/unset-app.guard.ts b/frontend/app/shared/guards/unset-app.guard.ts index c1dfb30c5..e9614fdf6 100644 --- a/frontend/app/shared/guards/unset-app.guard.ts +++ b/frontend/app/shared/guards/unset-app.guard.ts @@ -14,11 +14,11 @@ import { AppsState } from './../state/apps.state'; @Injectable() export class UnsetAppGuard implements CanActivate { constructor( - private readonly appsState: AppsState + private readonly appsState: AppsState, ) { } public canActivate(): Observable { return this.appsState.select(null).pipe(map(a => a === null)); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/index.ts b/frontend/app/shared/index.ts index da0f82225..898be9a7c 100644 --- a/frontend/app/shared/index.ts +++ b/frontend/app/shared/index.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/shared/interceptors/auth.interceptor.spec.ts b/frontend/app/shared/interceptors/auth.interceptor.spec.ts index cfce4c241..d6c63d691 100644 --- a/frontend/app/shared/interceptors/auth.interceptor.spec.ts +++ b/frontend/app/shared/interceptors/auth.interceptor.spec.ts @@ -26,7 +26,7 @@ describe('AuthInterceptor', () => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ { provide: Router, useFactory: () => router.object }, @@ -35,9 +35,9 @@ describe('AuthInterceptor', () => { { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, - multi: true - } - ] + multi: true, + }, + ], }); }); @@ -47,101 +47,95 @@ describe('AuthInterceptor', () => { it('should append headers to request', inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => { + authService.setup(x => x.userChanges).returns(() => of({ authorization: 'letmein' })); - authService.setup(x => x.userChanges).returns(() => of({ authorization: 'letmein' })); - - http.get('http://service/p/apps').subscribe(); + http.get('http://service/p/apps').subscribe(); - const req = httpMock.expectOne('http://service/p/apps'); + const req = httpMock.expectOne('http://service/p/apps'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('Authorization')).toEqual('letmein'); - expect(req.request.headers.get('Pragma')).toEqual('no-cache'); - })); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('Authorization')).toEqual('letmein'); + expect(req.request.headers.get('Pragma')).toEqual('no-cache'); + })); it('should not append headers for no auth headers', inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => { + authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); - authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); - - http.get('http://service/p/apps', { headers: new HttpHeaders().set('NoAuth', '') }).subscribe(); + http.get('http://service/p/apps', { headers: new HttpHeaders().set('NoAuth', '') }).subscribe(); - const req = httpMock.expectOne('http://service/p/apps'); + const req = httpMock.expectOne('http://service/p/apps'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('Authorization')).toBeNull(); - expect(req.request.headers.get('Accept-Language')).toBeNull(); - expect(req.request.headers.get('Pragma')).toBeNull(); - })); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('Authorization')).toBeNull(); + expect(req.request.headers.get('Accept-Language')).toBeNull(); + expect(req.request.headers.get('Pragma')).toBeNull(); + })); it('should not append headers for other requests', inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => { + authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); - authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); - - http.get('http://cloud/p/apps').subscribe(); + http.get('http://cloud/p/apps').subscribe(); - const req = httpMock.expectOne('http://cloud/p/apps'); + const req = httpMock.expectOne('http://cloud/p/apps'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('Authorization')).toBeNull(); - expect(req.request.headers.get('Accept-Language')).toBeNull(); - expect(req.request.headers.get('Pragma')).toBeNull(); - })); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('Authorization')).toBeNull(); + expect(req.request.headers.get('Accept-Language')).toBeNull(); + expect(req.request.headers.get('Pragma')).toBeNull(); + })); - it(`should logout for 401 status code`, + it('should logout for 401 status code', inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => { + authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); + authService.setup(x => x.loginSilent()).returns(() => of({ authToken: 'letmereallyin' })); - authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); - authService.setup(x => x.loginSilent()).returns(() => of({ authToken: 'letmereallyin' })); - - http.get('http://service/p/apps').pipe(onErrorResumeNext()).subscribe(); + http.get('http://service/p/apps').pipe(onErrorResumeNext()).subscribe(); - httpMock.expectOne('http://service/p/apps').error({}, { status: 401 }); - httpMock.expectOne('http://service/p/apps').error({}, { status: 401 }); + httpMock.expectOne('http://service/p/apps').error({}, { status: 401 }); + httpMock.expectOne('http://service/p/apps').error({}, { status: 401 }); - expect().nothing(); + expect().nothing(); - authService.verify(x => x.logoutRedirect(), Times.once()); - })); + authService.verify(x => x.logoutRedirect(), Times.once()); + })); const AUTH_ERRORS = [403]; - AUTH_ERRORS.map(statusCode => { + AUTH_ERRORS.forEach(statusCode => { it(`should redirect for ${statusCode} status code`, inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => { + authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); - authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); - - http.get('http://service/p/apps').pipe(onErrorResumeNext()).subscribe(); + http.get('http://service/p/apps').pipe(onErrorResumeNext()).subscribe(); - const req = httpMock.expectOne('http://service/p/apps'); + const req = httpMock.expectOne('http://service/p/apps'); - req.error({}, { status: statusCode }); + req.error({}, { status: statusCode }); - expect().nothing(); + expect().nothing(); - router.verify(x => x.navigate(['/forbidden'], { replaceUrl: true }), Times.once()); - })); + router.verify(x => x.navigate(['/forbidden'], { replaceUrl: true }), Times.once()); + })); }); const SERVER_ERRORS = [500, 404, 405]; - SERVER_ERRORS.map(statusCode => { + SERVER_ERRORS.forEach(statusCode => { it(`should not logout for ${statusCode} status code`, inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => { + authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); - authService.setup(x => x.userChanges).returns(() => of({ authToken: 'letmein' })); - - http.get('http://service/p/apps').pipe(onErrorResumeNext()).subscribe(); + http.get('http://service/p/apps').pipe(onErrorResumeNext()).subscribe(); - const req = httpMock.expectOne('http://service/p/apps'); + const req = httpMock.expectOne('http://service/p/apps'); - req.error({}, { status: statusCode }); + req.error({}, { status: statusCode }); - expect().nothing(); + expect().nothing(); - authService.verify(x => x.logoutRedirect(), Times.never()); - })); + authService.verify(x => x.logoutRedirect(), Times.never()); + })); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/interceptors/auth.interceptor.ts b/frontend/app/shared/interceptors/auth.interceptor.ts index 50009ec90..db1fb8621 100644 --- a/frontend/app/shared/interceptors/auth.interceptor.ts +++ b/frontend/app/shared/interceptors/auth.interceptor.ts @@ -19,7 +19,7 @@ export class AuthInterceptor implements HttpInterceptor { constructor(apiUrlConfig: ApiUrlConfig, private readonly authService: AuthService, - private readonly router: Router + private readonly router: Router, ) { this.baseUrl = apiUrlConfig.buildUrl(''); } @@ -42,7 +42,7 @@ export class AuthInterceptor implements HttpInterceptor { req = req.clone({ headers: req.headers .set('Authorization', token) - .set('Pragma', 'no-cache') + .set('Pragma', 'no-cache'), }); return next.handle(req).pipe( diff --git a/frontend/app/shared/internal.ts b/frontend/app/shared/internal.ts index a0c79f2bb..7413bebb5 100644 --- a/frontend/app/shared/internal.ts +++ b/frontend/app/shared/internal.ts @@ -73,4 +73,4 @@ export * from './state/ui.state'; export * from './state/workflows.forms'; export * from './state/workflows.state'; export * from './utils/editor-utils'; -export * from './utils/messages'; \ No newline at end of file +export * from './utils/messages'; diff --git a/frontend/app/shared/module.ts b/frontend/app/shared/module.ts index ffec3fc80..c7037c01c 100644 --- a/frontend/app/shared/module.ts +++ b/frontend/app/shared/module.ts @@ -1,12 +1,10 @@ -/* +/* * Squidex Headless CMS * * @license * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { DragDropModule } from '@angular/cdk/drag-drop'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { ModuleWithProviders, NgModule } from '@angular/core'; @@ -22,7 +20,7 @@ import { AppFormComponent, AppLanguagesService, AppMustExistGuard, AppsService, MentionModule, NgxDocViewerModule, RouterModule, - SqxFrameworkModule + SqxFrameworkModule, ], declarations: [ AppFormComponent, @@ -73,7 +71,7 @@ import { AppFormComponent, AppLanguagesService, AppMustExistGuard, AppsService, UserNamePipe, UserNameRefPipe, UserPicturePipe, - UserPictureRefPipe + UserPictureRefPipe, ], exports: [ AppFormComponent, @@ -116,8 +114,8 @@ import { AppFormComponent, AppLanguagesService, AppMustExistGuard, AppsService, UserNamePipe, UserNameRefPipe, UserPicturePipe, - UserPictureRefPipe - ] + UserPictureRefPipe, + ], }) export class SqxSharedModule { public static forRoot(): ModuleWithProviders { @@ -183,9 +181,9 @@ export class SqxSharedModule { { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, - multi: true - } - ] + multi: true, + }, + ], }; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/app-languages.service.spec.ts b/frontend/app/shared/services/app-languages.service.spec.ts index 899476ca1..6cc7107db 100644 --- a/frontend/app/shared/services/app-languages.service.spec.ts +++ b/frontend/app/shared/services/app-languages.service.spec.ts @@ -15,13 +15,13 @@ describe('AppLanguagesService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ AppLanguagesService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -31,111 +31,107 @@ describe('AppLanguagesService', () => { it('should make get request to get app languages', inject([AppLanguagesService, HttpTestingController], (appLanguagesService: AppLanguagesService, httpMock: HttpTestingController) => { + let languages: AppLanguagesDto; - let languages: AppLanguagesDto; - - appLanguagesService.getLanguages('my-app').subscribe(result => { - languages = result; - }); + appLanguagesService.getLanguages('my-app').subscribe(result => { + languages = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/languages'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/languages'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(languagesResponse('en', 'de', 'it'), { - headers: { - etag: '2' - } - }); + req.flush(languagesResponse('en', 'de', 'it'), { + headers: { + etag: '2', + }, + }); - expect(languages!).toEqual({payload: createLanguages('en', 'de', 'it'), version: new Version('2') }); - })); + expect(languages!).toEqual({ payload: createLanguages('en', 'de', 'it'), version: new Version('2') }); + })); it('should make post request to add language', inject([AppLanguagesService, HttpTestingController], (appLanguagesService: AppLanguagesService, httpMock: HttpTestingController) => { + const dto = { language: 'de' }; - const dto = { language: 'de' }; - - let languages: AppLanguagesDto; + let languages: AppLanguagesDto; - appLanguagesService.postLanguage('my-app', dto, version).subscribe(result => { - languages = result; - }); + appLanguagesService.postLanguage('my-app', dto, version).subscribe(result => { + languages = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/languages'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/languages'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(languagesResponse('en', 'de', 'it'), { - headers: { - etag: '2' - } - }); + req.flush(languagesResponse('en', 'de', 'it'), { + headers: { + etag: '2', + }, + }); - expect(languages!).toEqual({payload: createLanguages('en', 'de', 'it'), version: new Version('2') }); - })); + expect(languages!).toEqual({ payload: createLanguages('en', 'de', 'it'), version: new Version('2') }); + })); it('should make put request to make master language', inject([AppLanguagesService, HttpTestingController], (appLanguagesService: AppLanguagesService, httpMock: HttpTestingController) => { + const dto = { isMaster: true }; - const dto = { isMaster: true }; - - const resource: Resource = { - _links: { - update: { method: 'PUT', href: 'api/apps/my-app/languages/de' } - } - }; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: 'api/apps/my-app/languages/de' }, + }, + }; - let languages: AppLanguagesDto; + let languages: AppLanguagesDto; - appLanguagesService.putLanguage('my-app', resource, dto, version).subscribe(result => { - languages = result; - }); + appLanguagesService.putLanguage('my-app', resource, dto, version).subscribe(result => { + languages = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/languages/de'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/languages/de'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(languagesResponse('en', 'de', 'it'), { - headers: { - etag: '2' - } - }); + req.flush(languagesResponse('en', 'de', 'it'), { + headers: { + etag: '2', + }, + }); - expect(languages!).toEqual({payload: createLanguages('en', 'de', 'it'), version: new Version('2') }); - })); + expect(languages!).toEqual({ payload: createLanguages('en', 'de', 'it'), version: new Version('2') }); + })); it('should make delete request to remove language', inject([AppLanguagesService, HttpTestingController], (appLanguagesService: AppLanguagesService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: 'api/apps/my-app/languages/de' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: 'api/apps/my-app/languages/de' } - } - }; - - let languages: AppLanguagesDto; + let languages: AppLanguagesDto; - appLanguagesService.deleteLanguage('my-app', resource, version).subscribe(result => { - languages = result; - }); + appLanguagesService.deleteLanguage('my-app', resource, version).subscribe(result => { + languages = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/languages/de'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/languages/de'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(languagesResponse('en', 'de', 'it'), { - headers: { - etag: '2' - } - }); + req.flush(languagesResponse('en', 'de', 'it'), { + headers: { + etag: '2', + }, + }); - expect(languages!).toEqual({payload: createLanguages('en', 'de', 'it'), version: new Version('2') }); - })); + expect(languages!).toEqual({ payload: createLanguages('en', 'de', 'it'), version: new Version('2') }); + })); function languagesResponse(...codes: string[]) { return { @@ -146,12 +142,12 @@ describe('AppLanguagesService', () => { isOptional: i % 2 === 1, fallback: codes.removed(code), _links: { - update: { method: 'PUT', href: `/languages/${code}` } - } + update: { method: 'PUT', href: `/languages/${code}` }, + }, })), _links: { - create: { method: 'POST', href: '/languages' } - } + create: { method: 'POST', href: '/languages' }, + }, }; } }); @@ -160,15 +156,15 @@ export function createLanguages(...codes: ReadonlyArray): AppLanguagesPa return { items: codes.map((code, i) => createLanguage(code, codes, i)), _links: { - create: { method: 'POST', href: '/languages' } + create: { method: 'POST', href: '/languages' }, }, - canCreate: true + canCreate: true, }; } function createLanguage(code: string, codes: ReadonlyArray, i: number) { const links: ResourceLinks = { - update: { method: 'PUT', href: `/languages/${code}` } + update: { method: 'PUT', href: `/languages/${code}` }, }; return new AppLanguageDto(links, code, code, i === 0, i % 2 === 1, codes.removed(code)); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/app-languages.service.ts b/frontend/app/shared/services/app-languages.service.ts index 2f469b4bf..110aa5b4d 100644 --- a/frontend/app/shared/services/app-languages.service.ts +++ b/frontend/app/shared/services/app-languages.service.ts @@ -23,7 +23,7 @@ export class AppLanguageDto { public readonly englishName: string, public readonly isMaster: boolean, public readonly isOptional: boolean, - public readonly fallback: ReadonlyArray + public readonly fallback: ReadonlyArray, ) { this._links = links; @@ -36,20 +36,20 @@ export type AppLanguagesDto = Versioned; export type AppLanguagesPayload = - Readonly<{ items: ReadonlyArray, canCreate: boolean } & Resource>; + Readonly<{ items: ReadonlyArray; canCreate: boolean } & Resource>; export type AddAppLanguageDto = Readonly<{ language: string }>; export type UpdateAppLanguageDto = - Readonly<{ isMaster?: boolean, isOptional?: boolean, falback?: ReadonlyArray }>; + Readonly<{ isMaster?: boolean; isOptional?: boolean; falback?: ReadonlyArray }>; @Injectable() export class AppLanguagesService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -121,4 +121,4 @@ function parseLanguages(response: any) { const _links = response._links; return { items, _links, canCreate: hasAnyLink(_links, 'create') }; -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/apps.service.spec.ts b/frontend/app/shared/services/apps.service.spec.ts index 43c639e31..a28b8d2dc 100644 --- a/frontend/app/shared/services/apps.service.spec.ts +++ b/frontend/app/shared/services/apps.service.spec.ts @@ -16,13 +16,13 @@ describe('AppsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ AppsService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -32,251 +32,240 @@ describe('AppsService', () => { it('should make get request to get apps', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + let apps: ReadonlyArray; - let apps: ReadonlyArray; - - appsService.getApps().subscribe(result => { - apps = result; - }); + appsService.getApps().subscribe(result => { + apps = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps'); + const req = httpMock.expectOne('http://service/p/api/apps'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush([ - appResponse(12), - appResponse(13) - ]); + req.flush([ + appResponse(12), + appResponse(13), + ]); - expect(apps!).toEqual([createApp(12), createApp(13)]); - })); + expect(apps!).toEqual([createApp(12), createApp(13)]); + })); it('should make get request to get app', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + let app: AppDto; - let app: AppDto; - - appsService.getApp('my-app').subscribe(result => { - app = result; - }); + appsService.getApp('my-app').subscribe(result => { + app = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(appResponse(12)); + req.flush(appResponse(12)); - expect(app!).toEqual(createApp(12)); - })); + expect(app!).toEqual(createApp(12)); + })); it('should make get request to get app settings', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + let app: AppSettingsDto; - let app: AppSettingsDto; - - appsService.getSettings('my-app').subscribe(result => { - app = result; - }); + appsService.getSettings('my-app').subscribe(result => { + app = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/settings'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/settings'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(appSettingsResponse(12)); + req.flush(appSettingsResponse(12)); - expect(app!).toEqual(createAppSettings(12)); - })); + expect(app!).toEqual(createAppSettings(12)); + })); it('should make put request to update app settings', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/apps/my-app/settings' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/apps/my-app/settings' } - } - }; - - let app: AppSettingsDto; + let app: AppSettingsDto; - appsService.putSettings(resource, {} as any, version).subscribe(result => { - app = result; - }); + appsService.putSettings(resource, {} as any, version).subscribe(result => { + app = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/settings'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/settings'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(appSettingsResponse(12)); + req.flush(appSettingsResponse(12)); - expect(app!).toEqual(createAppSettings(12)); - })); + expect(app!).toEqual(createAppSettings(12)); + })); it('should make post request to create app', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + const dto = { name: 'new-app' }; - const dto = { name: 'new-app' }; + let app: AppDto; - let app: AppDto; + appsService.postApp(dto).subscribe(result => { + app = result; + }); - appsService.postApp(dto).subscribe(result => { - app = result; - }); - - const req = httpMock.expectOne('http://service/p/api/apps'); + const req = httpMock.expectOne('http://service/p/api/apps'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(appResponse(12)); + req.flush(appResponse(12)); - expect(app!).toEqual(createApp(12)); - })); + expect(app!).toEqual(createApp(12)); + })); it('should make put request to update app', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/apps/my-app' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/apps/my-app' } - } - }; - - let app: AppDto; + let app: AppDto; - appsService.putApp(resource, { }, version).subscribe(result => { - app = result; - }); + appsService.putApp(resource, { }, version).subscribe(result => { + app = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(appResponse(12)); + req.flush(appResponse(12)); - expect(app!).toEqual(createApp(12)); - })); + expect(app!).toEqual(createApp(12)); + })); it('should make post request to upload app image', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + 'image/upload': { method: 'POST', href: '/api/apps/my-app/image' }, + }, + }; - const resource: Resource = { - _links: { - ['image/upload']: { method: 'POST', href: '/api/apps/my-app/image' } - } - }; - - let app: AppDto; + let app: AppDto; - appsService.postAppImage(resource, null!, version).subscribe(result => { - app = result; - }); + appsService.postAppImage(resource, null!, version).subscribe(result => { + app = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/image'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/image'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(appResponse(12)); + req.flush(appResponse(12)); - expect(app!).toEqual(createApp(12)); - })); + expect(app!).toEqual(createApp(12)); + })); it('should return proper error if uploading app image failed with 413', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + 'image/upload': { method: 'POST', href: '/api/apps/my-app/image' }, + }, + }; - const resource: Resource = { - _links: { - ['image/upload']: { method: 'POST', href: '/api/apps/my-app/image' } - } - }; - - let app: AppDto; - let error: ErrorDto; + let app: AppDto; + let error: ErrorDto; - appsService.postAppImage(resource, null!, version).subscribe(result => { - app = result; - }, e => { - error = e; - }); + appsService.postAppImage(resource, null!, version).subscribe(result => { + app = result; + }, e => { + error = e; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/image'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/image'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush({}, { status: 413, statusText: 'Payload too large' }); + req.flush({}, { status: 413, statusText: 'Payload too large' }); - expect(app!).toBeUndefined(); - expect(error!).toEqual(new ErrorDto(413, 'i18n:apps.uploadImageTooBig')); - })); + expect(app!).toBeUndefined(); + expect(error!).toEqual(new ErrorDto(413, 'i18n:apps.uploadImageTooBig')); + })); it('should make delete request to remove app image', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + 'image/delete': { method: 'DELETE', href: '/api/apps/my-app/image' }, + }, + }; - const resource: Resource = { - _links: { - ['image/delete']: { method: 'DELETE', href: '/api/apps/my-app/image' } - } - }; + let app: AppDto; - let app: AppDto; + appsService.deleteAppImage(resource, version).subscribe(result => { + app = result; + }); - appsService.deleteAppImage(resource, version).subscribe(result => { - app = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/image'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/image'); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + req.flush(appResponse(12)); - req.flush(appResponse(12)); - - expect(app!).toEqual(createApp(12)); - })); + expect(app!).toEqual(createApp(12)); + })); it('should make delete request to leave app', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/contributors/me' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/contributors/me' } - } - }; - - appsService.deleteApp(resource).subscribe(); + appsService.deleteApp(resource).subscribe(); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/contributors/me'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/contributors/me'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}); - })); + req.flush({}); + })); it('should make delete request to archive app', inject([AppsService, HttpTestingController], (appsService: AppsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app' } - } - }; + appsService.deleteApp(resource).subscribe(); - appsService.deleteApp(resource).subscribe(); + const req = httpMock.expectOne('http://service/p/api/apps/my-app'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app'); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({}); - })); + req.flush({}); + })); function appResponse(id: number, suffix = '') { const key = `${id}${suffix}`; @@ -298,8 +287,8 @@ describe('AppsService', () => { planUpgrade: 'Basic', roleProperties: createProperties(id), _links: { - update: { method: 'PUT', href: `apps/${id}` } - } + update: { method: 'PUT', href: `apps/${id}` }, + }, }; } @@ -320,15 +309,15 @@ describe('AppsService', () => { }), version: key, _links: { - update: { method: 'PUT', href: `apps/${id}/settings` } - } + update: { method: 'PUT', href: `apps/${id}/settings` }, + }, }; } }); export function createApp(id: number, suffix = '') { const links: ResourceLinks = { - update: { method: 'PUT', href: `apps/${id}` } + update: { method: 'PUT', href: `apps/${id}` }, }; const key = `${id}${suffix}`; @@ -350,7 +339,7 @@ export function createApp(id: number, suffix = '') { export function createAppSettings(id: number, suffix = '') { const links: ResourceLinks = { - update: { method: 'PUT', href: `apps/${id}/settings` } + update: { method: 'PUT', href: `apps/${id}/settings` }, }; const key = `${id}${suffix}`; @@ -376,4 +365,4 @@ function createProperties(id: number) { result[`property${id}`] = true; return result; -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/apps.service.ts b/frontend/app/shared/services/apps.service.ts index 69073b871..27bc0fee9 100644 --- a/frontend/app/shared/services/apps.service.ts +++ b/frontend/app/shared/services/apps.service.ts @@ -49,7 +49,7 @@ export class AppDto { public readonly canAccessContent: boolean, public readonly planName: string | undefined, public readonly planUpgrade: string | undefined, - public readonly roleProperties: {} + public readonly roleProperties: {}, ) { this._links = links; @@ -85,7 +85,7 @@ export class AppSettingsDto { public readonly hideScheduler: boolean, public readonly patterns: ReadonlyArray, public readonly editors: ReadonlyArray, - public readonly version: Version + public readonly version: Version, ) { this._links = links; @@ -97,7 +97,7 @@ export class PatternDto { constructor( public readonly name: string, public readonly regex: string, - public readonly message?: string + public readonly message?: string, ) { } } @@ -105,26 +105,26 @@ export class PatternDto { export class EditorDto { constructor( public readonly name: string, - public readonly url: string + public readonly url: string, ) { } } export type UpdateAppSettingsDto = - Readonly<{ patterns: ReadonlyArray, editors: ReadonlyArray, hideScheduler?: boolean }>; + Readonly<{ patterns: ReadonlyArray; editors: ReadonlyArray; hideScheduler?: boolean }>; export type CreateAppDto = - Readonly<{ name: string; template?: string; }>; + Readonly<{ name: string; template?: string }>; export type UpdateAppDto = - Readonly<{ label?: string, description?: string }>; + Readonly<{ label?: string; description?: string }>; @Injectable() export class AppsService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -224,7 +224,7 @@ export class AppsService { } else if (Types.is(event, HttpResponse)) { return parseApp(event.body); } else { - throw 'Invalid'; + throw new Error('Invalid'); } }), catchError(error => { diff --git a/frontend/app/shared/services/assets.service.spec.ts b/frontend/app/shared/services/assets.service.spec.ts index 733c60925..2f80e3661 100644 --- a/frontend/app/shared/services/assets.service.spec.ts +++ b/frontend/app/shared/services/assets.service.spec.ts @@ -15,13 +15,13 @@ describe('AssetsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ AssetsService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -31,427 +31,408 @@ describe('AssetsService', () => { it('should make get request to get asset tags', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + let tags: any; - let tags: any; - - assetsService.getTags('my-app').subscribe(result => { - tags = result; - }); + assetsService.getTags('my-app').subscribe(result => { + tags = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/tags'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/tags'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ - tag1: 1, - tag2: 4 - }); + req.flush({ + tag1: 1, + tag2: 4, + }); - expect(tags!).toEqual({ - tag1: 1, - tag2: 4 - }); - })); + expect(tags!).toEqual({ + tag1: 1, + tag2: 4, + }); + })); it('should make get request to get assets', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { - - let assets: AssetsDto; - - assetsService.getAssets('my-app', { take: 17, skip: 13 }).subscribe(result => { - assets = result; - }); - - const query = { take: 17, skip: 13 }; - - const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets?q=${encodeQuery(query)}`); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({ - total: 10, - items: [ - assetResponse(12), - assetResponse(13) - ], - folders: [ - assetFolderResponse(22), - assetFolderResponse(23) - ] - }); - - expect(assets!).toEqual( - new AssetsDto(10, [ - createAsset(12), - createAsset(13) - ])); - })); + let assets: AssetsDto; + + assetsService.getAssets('my-app', { take: 17, skip: 13 }).subscribe(result => { + assets = result; + }); + + const query = { take: 17, skip: 13 }; + + const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets?q=${encodeQuery(query)}`); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush({ + total: 10, + items: [ + assetResponse(12), + assetResponse(13), + ], + folders: [ + assetFolderResponse(22), + assetFolderResponse(23), + ], + }); + + expect(assets!).toEqual( + new AssetsDto(10, [ + createAsset(12), + createAsset(13), + ])); + })); it('should make get request to get asset folders', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { - - let assets: AssetFoldersDto; - - assetsService.getAssetFolders('my-app', 'parent1').subscribe(result => { - assets = result; - }); - - const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets/folders?parentId=parent1`); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({ - total: 10, - items: [ - assetFolderResponse(22), - assetFolderResponse(23) - ], - path: [ - assetFolderResponse(44) - ] - }); - - expect(assets!).toEqual( - new AssetFoldersDto(10, [ - createAssetFolder(22), - createAssetFolder(23) - ], [ - createAssetFolder(44) - ])); - })); + let assets: AssetFoldersDto; + + assetsService.getAssetFolders('my-app', 'parent1').subscribe(result => { + assets = result; + }); + + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/folders?parentId=parent1'); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush({ + total: 10, + items: [ + assetFolderResponse(22), + assetFolderResponse(23), + ], + path: [ + assetFolderResponse(44), + ], + }); + + expect(assets!).toEqual( + new AssetFoldersDto(10, [ + createAssetFolder(22), + createAssetFolder(23), + ], [ + createAssetFolder(44), + ])); + })); it('should make get request to get asset', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + let asset: AssetDto; - let asset: AssetDto; + assetsService.getAsset('my-app', '123').subscribe(result => { + asset = result; + }); - assetsService.getAsset('my-app', '123').subscribe(result => { - asset = result; - }); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(assetResponse(12)); + req.flush(assetResponse(12)); - expect(asset!).toEqual(createAsset(12)); - })); + expect(asset!).toEqual(createAsset(12)); + })); it('should make get request to get assets by name', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const query = { fullText: 'my-query' }; - const query = { fullText: 'my-query' }; + assetsService.getAssets('my-app', { take: 17, skip: 13, query }).subscribe(); - assetsService.getAssets('my-app', { take: 17, skip: 13, query }).subscribe(); + const expectedQuery = { filter: { and: [{ path: 'fileName', op: 'contains', value: 'my-query' }] }, take: 17, skip: 13 }; - const expectedQuery = { filter: { and: [{ path: 'fileName', op: 'contains', value: 'my-query' }] }, take: 17, skip: 13 }; + const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets?q=${encodeQuery(expectedQuery)}`); - const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets?q=${encodeQuery(expectedQuery)}`); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make post request to get assets by name if request limit reached', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const query = { fullText: 'my-query' }; - const query = { fullText: 'my-query' }; + assetsService.getAssets('my-app', { take: 17, skip: 13, query, maxLength: 5 }).subscribe(); - assetsService.getAssets('my-app', { take: 17, skip: 13, query, maxLength: 5 }).subscribe(); + const expectedQuery = { filter: { and: [{ path: 'fileName', op: 'contains', value: 'my-query' }] }, take: 17, skip: 13 }; - const expectedQuery = { filter: { and: [{ path: 'fileName', op: 'contains', value: 'my-query' }] }, take: 17, skip: 13 }; + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/query'); - const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets/query`); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.body).toEqual({ q: sanitize(expectedQuery) }); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.body).toEqual({ q: sanitize(expectedQuery) }); - - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make get request to get assets by tag', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + assetsService.getAssets('my-app', { take: 17, skip: 13, tags: ['tag1'] }).subscribe(); - assetsService.getAssets('my-app', { take: 17, skip: 13, tags: ['tag1'] }).subscribe(); + const expectedQuery = { filter: { and: [{ path: 'tags', op: 'eq', value: 'tag1' }] }, take: 17, skip: 13 }; - const expectedQuery = { filter: { and: [{ path: 'tags', op: 'eq', value: 'tag1' }] }, take: 17, skip: 13 }; + const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets?q=${encodeQuery(expectedQuery)}`); - const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets?q=${encodeQuery(expectedQuery)}`); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make get request to get assets by tag if request limit reached', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + assetsService.getAssets('my-app', { take: 17, skip: 13, tags: ['tag1'], maxLength: 5 }).subscribe(); - assetsService.getAssets('my-app', { take: 17, skip: 13, tags: ['tag1'], maxLength: 5 }).subscribe(); - - const expectedQuery = { filter: { and: [{ path: 'tags', op: 'eq', value: 'tag1' }] }, take: 17, skip: 13 }; + const expectedQuery = { filter: { and: [{ path: 'tags', op: 'eq', value: 'tag1' }] }, take: 17, skip: 13 }; - const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets/query`); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/query'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.body).toEqual({ q: sanitize(expectedQuery) }); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.body).toEqual({ q: sanitize(expectedQuery) }); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make get request to get assets by ids', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const ids = ['1', '2']; - const ids = ['1', '2']; - - assetsService.getAssets('my-app', { ids }).subscribe(); + assetsService.getAssets('my-app', { ids }).subscribe(); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets?ids=1,2'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets?ids=1,2'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make post request to create asset', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + let asset: AssetDto; - let asset: AssetDto; - - assetsService.postAssetFile('my-app', null!).subscribe(result => { - asset = result; - }); + assetsService.postAssetFile('my-app', null!).subscribe(result => { + asset = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(assetResponse(12)); + req.flush(assetResponse(12)); - expect(asset!).toEqual(createAsset(12)); - })); + expect(asset!).toEqual(createAsset(12)); + })); it('should make post with parent id to create asset', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + let asset: AssetDto; - let asset: AssetDto; - - assetsService.postAssetFile('my-app', null!, 'parent1').subscribe(result => { - asset = result; - }); + assetsService.postAssetFile('my-app', null!, 'parent1').subscribe(result => { + asset = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets?parentId=parent1'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets?parentId=parent1'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(assetResponse(12)); + req.flush(assetResponse(12)); - expect(asset!).toEqual(createAsset(12)); - })); + expect(asset!).toEqual(createAsset(12)); + })); it('should return proper error if upload failed with 413', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + let asset: AssetDto; + let error: ErrorDto; - let asset: AssetDto; - let error: ErrorDto; + assetsService.postAssetFile('my-app', null!).subscribe(result => { + asset = result; + }, e => { + error = e; + }); - assetsService.postAssetFile('my-app', null!).subscribe(result => { - asset = result; - }, e => { - error = e; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets'); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush({}, { status: 413, statusText: 'Payload too large' }); - req.flush({}, { status: 413, statusText: 'Payload too large' }); - - expect(asset!).toBeUndefined(); - expect(error!).toEqual(new ErrorDto(413, 'i18n:assets.fileTooBig')); - })); + expect(asset!).toBeUndefined(); + expect(error!).toEqual(new ErrorDto(413, 'i18n:assets.fileTooBig')); + })); it('should make put request to replace asset content', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + upload: { method: 'PUT', href: 'api/apps/my-app/assets/123/content' }, + }, + }; - const resource: Resource = { - _links: { - upload: { method: 'PUT', href: 'api/apps/my-app/assets/123/content' } - } - }; + let asset: AssetDto; - let asset: AssetDto; + assetsService.putAssetFile('my-app', resource, null!, version).subscribe(result => { + asset = result; + }); - assetsService.putAssetFile('my-app', resource, null!, version).subscribe(result => { - asset = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123/content'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123/content'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + req.flush(assetResponse(123)); - req.flush(assetResponse(123)); - - expect(asset!).toEqual(createAsset(123)); - })); + expect(asset!).toEqual(createAsset(123)); + })); it('should return proper error if replacing asset content failed with 413', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + upload: { method: 'PUT', href: 'api/apps/my-app/assets/123/content' }, + }, + }; - const resource: Resource = { - _links: { - upload: { method: 'PUT', href: 'api/apps/my-app/assets/123/content' } - } - }; + let asset: AssetDto; + let error: ErrorDto; - let asset: AssetDto; - let error: ErrorDto; - - assetsService.putAssetFile('my-app', resource, null!, version).subscribe(result => { - asset = result; - }, e => { - error = e; - }); + assetsService.putAssetFile('my-app', resource, null!, version).subscribe(result => { + asset = result; + }, e => { + error = e; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123/content'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123/content'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush({}, { status: 413, statusText: 'Payload too large' }); + req.flush({}, { status: 413, statusText: 'Payload too large' }); - expect(asset!).toBeUndefined(); - expect(error!).toEqual(new ErrorDto(413, 'i18n:assets.fileTooBig')); - })); + expect(asset!).toBeUndefined(); + expect(error!).toEqual(new ErrorDto(413, 'i18n:assets.fileTooBig')); + })); it('should make put request to annotate asset', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const dto = { fileName: 'New-Name.png' }; - const dto = { fileName: 'New-Name.png' }; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: 'api/apps/my-app/assets/123' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: 'api/apps/my-app/assets/123' } - } - }; + let asset: AssetDto; - let asset: AssetDto; - - assetsService.putAsset('my-app', resource, dto, version).subscribe(result => { - asset = result; - }); + assetsService.putAsset('my-app', resource, dto, version).subscribe(result => { + asset = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(assetResponse(123)); + req.flush(assetResponse(123)); - expect(asset!).toEqual(createAsset(123)); - })); + expect(asset!).toEqual(createAsset(123)); + })); it('should make delete request to move asset item', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + move: { method: 'DELETE', href: 'api/apps/my-app/assets/123/parent' }, + }, + }; - const resource: Resource = { - _links: { - move: { method: 'DELETE', href: 'api/apps/my-app/assets/123/parent' } - } - }; - - const dto = { parentId: 'parent1' }; + const dto = { parentId: 'parent1' }; - assetsService.putAssetItemParent('my-app', resource, dto, version).subscribe(); + assetsService.putAssetItemParent('my-app', resource, dto, version).subscribe(); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123/parent'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123/parent'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush({}); - })); + req.flush({}); + })); it('should make delete request to delete asset item', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: 'api/apps/my-app/assets/123' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: 'api/apps/my-app/assets/123' } - } - }; - - assetsService.deleteAssetItem('my-app', resource, true, version).subscribe(); + assetsService.deleteAssetItem('my-app', resource, true, version).subscribe(); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123?checkReferrers=true'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/123?checkReferrers=true'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush({}); - })); + req.flush({}); + })); it('should make post request to create asset folder', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const dto = { folderName: 'My Folder' }; - const dto = { folderName: 'My Folder' }; + let assetFolder: AssetFolderDto; - let assetFolder: AssetFolderDto; + assetsService.postAssetFolder('my-app', dto).subscribe(result => { + assetFolder = result; + }); - assetsService.postAssetFolder('my-app', dto).subscribe(result => { - assetFolder = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/folders'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/folders'); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(assetFolderResponse(22)); - req.flush(assetFolderResponse(22)); - - expect(assetFolder!).toEqual(createAssetFolder(22)); - })); + expect(assetFolder!).toEqual(createAssetFolder(22)); + })); it('should make put request to update asset folder', inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { + const dto = { folderName: 'My Folder' }; - const dto = { folderName: 'My Folder' }; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: 'api/apps/my-app/assets/folders/123' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: 'api/apps/my-app/assets/folders/123' } - } - }; + let assetFolder: AssetFolderDto; - let assetFolder: AssetFolderDto; - - assetsService.putAssetFolder('my-app', resource, dto, version).subscribe(result => { - assetFolder = result; - }); + assetsService.putAssetFolder('my-app', resource, dto, version).subscribe(result => { + assetFolder = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/folders/123'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets/folders/123'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(assetFolderResponse(22)); + req.flush(assetFolderResponse(22)); - expect(assetFolder!).toEqual(createAssetFolder(22)); - })); + expect(assetFolder!).toEqual(createAssetFolder(22)); + })); function assetResponse(id: number, suffix = '', parentId?: string) { parentId = parentId || MathHelper.EMPTY_GUID; @@ -476,20 +457,20 @@ describe('AssetsService', () => { metadataText: `my-metadata${key}`, metadata: { pixelWidth: id * 3, - pixelHeight: id * 5 + pixelHeight: id * 5, }, slug: `my-name${key}.png`, tags: [ 'tag1', - 'tag2' + 'tag2', ], version: id, _links: { - update: { method: 'PUT', href: `/assets/${id}` } + update: { method: 'PUT', href: `/assets/${id}` }, }, _meta: { - isDuplicate: 'true' - } + isDuplicate: 'true', + }, }; } @@ -504,22 +485,21 @@ describe('AssetsService', () => { parentId, version: id, _links: { - update: { method: 'PUT', href: `/assets/folders/${id}` } - } + update: { method: 'PUT', href: `/assets/folders/${id}` }, + }, }; - } }); export function createAsset(id: number, tags?: ReadonlyArray, suffix = '', parentId?: string) { const links: ResourceLinks = { - update: { method: 'PUT', href: `/assets/${id}` } + update: { method: 'PUT', href: `/assets/${id}` }, }; const key = `${id}${suffix}`; const meta = { - isDuplicate: 'true' + isDuplicate: 'true', }; parentId = parentId || MathHelper.EMPTY_GUID; @@ -541,12 +521,12 @@ export function createAsset(id: number, tags?: ReadonlyArray, suffix = ' `my-metadata${key}`, { pixelWidth: id * 3, - pixelHeight: id * 5 + pixelHeight: id * 5, }, `my-name${key}.png`, tags || [ 'tag1', - 'tag2' + 'tag2', ]); } @@ -556,8 +536,8 @@ export function createAssetFolder(id: number, suffix = '', parentId?: string) { const key = `${id}${suffix}`; const links: ResourceLinks = { - update: { method: 'PUT', href: `/assets/folders/${id}` } + update: { method: 'PUT', href: `/assets/folders/${id}` }, }; return new AssetFolderDto(links, `id${id}`, `My Folder${key}`, parentId, new Version(`${id}`)); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/assets.service.ts b/frontend/app/shared/services/assets.service.ts index 5470dd2c2..8e369f51d 100644 --- a/frontend/app/shared/services/assets.service.ts +++ b/frontend/app/shared/services/assets.service.ts @@ -72,7 +72,7 @@ export class AssetDto { public readonly metadataText: string, public readonly metadata: any, public readonly slug: string, - public readonly tags: ReadonlyArray + public readonly tags: ReadonlyArray, ) { this.canPreview = (this.mimeType !== MIME_TIFF && this.type === 'Image') || @@ -102,7 +102,7 @@ export class AssetDto { export class AssetFoldersDto extends ResultSet { constructor(total: number, items: ReadonlyArray, public readonly path: ReadonlyArray, - links?: ResourceLinks + links?: ResourceLinks, ) { super(total, items, links); } @@ -123,7 +123,7 @@ export class AssetFolderDto { public readonly id: string, public readonly folderName: string, public readonly parentId: string, - public readonly version: Version + public readonly version: Version, ) { this._links = links; @@ -150,14 +150,14 @@ export type MoveAssetItemDto = Readonly<{ parentId?: string }>; export type AssetQueryDto = - Readonly<{ ids?: Tags; maxLength?: number; parentId?: string; query?: Query; skip?: number; tags?: Tags; take?: number; }>; + Readonly<{ ids?: Tags; maxLength?: number; parentId?: string; query?: Query; skip?: number; tags?: Tags; take?: number }>; @Injectable() export class AssetsService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -172,7 +172,7 @@ export class AssetsService { let fullQuery: string; - let queryObj: Query | undefined = undefined; + let queryObj: Query | undefined; if (ids && ids.length > 0) { fullQuery = `ids=${ids.join(',')}`; @@ -227,7 +227,7 @@ export class AssetsService { const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/query`); - return this.http.post<{ total: number, items: any[], folders: any[] } & Resource>(url, body).pipe( + return this.http.post<{ total: number; items: any[]; folders: any[] } & Resource>(url, body).pipe( map(({ total, items, _links }) => { const assets = items.map(parseAsset); @@ -237,7 +237,7 @@ export class AssetsService { } else { const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets?${fullQuery}`); - return this.http.get<{ total: number, items: any[], folders: any[] } & Resource>(url).pipe( + return this.http.get<{ total: number; items: any[]; folders: any[] } & Resource>(url).pipe( map(({ total, items, _links }) => { const assets = items.map(parseAsset); @@ -250,7 +250,7 @@ export class AssetsService { public getAssetFolders(appName: string, parentId: string): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/folders?parentId=${parentId}`); - return this.http.get<{ total: number, items: any[], folders: any[], path: any[] } & Resource>(url).pipe( + return this.http.get<{ total: number; items: any[]; folders: any[]; path: any[] } & Resource>(url).pipe( map(({ total, items, path, _links }) => { const assetFolders = items.map(parseAssetFolder); const assetPath = path.map(parseAssetFolder); @@ -291,7 +291,7 @@ export class AssetsService { } else if (Types.is(event, HttpResponse)) { return parseAsset(event.body); } else { - throw 'Invalid'; + throw new Error('Invalid'); } }), catchError((error: any) => { @@ -326,7 +326,7 @@ export class AssetsService { } else if (Types.is(event, HttpResponse)) { return parseAsset(event.body); } else { - throw 'Invalid'; + throw new Error('Invalid'); } }), catchError(error => { @@ -439,4 +439,4 @@ function parseAssetFolder(response: any) { response.folderName, response.parentId, new Version(response.version.toString())); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/auth.service.ts b/frontend/app/shared/services/auth.service.ts index 100d54d99..f2ce3e2fa 100644 --- a/frontend/app/shared/services/auth.service.ts +++ b/frontend/app/shared/services/auth.service.ts @@ -49,7 +49,7 @@ export class Profile { } constructor( - public readonly user: User + public readonly user: User, ) { } } @@ -85,7 +85,7 @@ export class AuthService { popup_redirect_uri: apiUrl.buildUrl('client-callback-popup'), authority: apiUrl.buildUrl('identity-server/'), userStore: new WebStorageStateStore({ store: window.localStorage || window.sessionStorage }), - automaticSilentRenew: true + automaticSilentRenew: true, }); this.userManager.events.addUserLoaded(user => { @@ -168,12 +168,12 @@ export class AuthService { retryWhen(errors => concat( errors.pipe( - mergeMap(e => Types.is(e, TimeoutError) ? of(e) : throwError(e)), + mergeMap(e => (Types.is(e, TimeoutError) ? of(e) : throwError(e))), delay(500), take(5)), - throwError(new Error('Retry limit exceeded.')) - ) - ) + throwError(new Error('Retry limit exceeded.')), + ), + ), ); } @@ -196,4 +196,4 @@ export class AuthService { return false; }); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/autosave.service.spec.ts b/frontend/app/shared/services/autosave.service.spec.ts index 0434e9b05..d72094050 100644 --- a/frontend/app/shared/services/autosave.service.spec.ts +++ b/frontend/app/shared/services/autosave.service.spec.ts @@ -110,4 +110,4 @@ describe('AutoSaveService', () => { localStore.verify(x => x.get(It.isAnyString()), Times.never()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/services/autosave.service.ts b/frontend/app/shared/services/autosave.service.ts index 316f20a63..b4179689d 100644 --- a/frontend/app/shared/services/autosave.service.ts +++ b/frontend/app/shared/services/autosave.service.ts @@ -8,12 +8,12 @@ import { Injectable } from '@angular/core'; import { LocalStoreService, Version } from '@app/framework'; -export declare type AutoSaveKey = { schemaId: string, schemaVersion: Version, contentId?: string }; +export declare type AutoSaveKey = { schemaId: string; schemaVersion: Version; contentId?: string }; @Injectable() export class AutoSaveService { constructor( - private readonly localStore: LocalStoreService + private readonly localStore: LocalStoreService, ) { } @@ -64,4 +64,4 @@ function getKey(key: AutoSaveKey) { } return `autosave.${schemaId}-${schemaVersion.value}${contentId}`; -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/backups.service.spec.ts b/frontend/app/shared/services/backups.service.spec.ts index c5e514dbc..d4a0cce07 100644 --- a/frontend/app/shared/services/backups.service.spec.ts +++ b/frontend/app/shared/services/backups.service.spec.ts @@ -13,13 +13,13 @@ describe('BackupsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ BackupsService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -29,156 +29,149 @@ describe('BackupsService', () => { it('should make get request to get backups', inject([BackupsService, HttpTestingController], (backupsService: BackupsService, httpMock: HttpTestingController) => { + let backups: BackupsDto; - let backups: BackupsDto; - - backupsService.getBackups('my-app').subscribe(result => { - backups = result; - }); + backupsService.getBackups('my-app').subscribe(result => { + backups = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/backups'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/backups'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ - items: [ - backupResponse(12), - backupResponse(13) - ] - }); + req.flush({ + items: [ + backupResponse(12), + backupResponse(13), + ], + }); - expect(backups!).toEqual( - new BackupsDto(2, [ - createBackup(12), - createBackup(13) - ], {})); - })); + expect(backups!).toEqual( + new BackupsDto(2, [ + createBackup(12), + createBackup(13), + ], {})); + })); it('should make get request to get restore', inject([BackupsService, HttpTestingController], (backupsService: BackupsService, httpMock: HttpTestingController) => { + let restore: RestoreDto; - let restore: RestoreDto; - - backupsService.getRestore().subscribe(result => { - restore = result!; - }); - - const req = httpMock.expectOne('http://service/p/api/apps/restore'); + backupsService.getRestore().subscribe(result => { + restore = result!; + }); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + const req = httpMock.expectOne('http://service/p/api/apps/restore'); - req.flush({ - url: 'http://url', - started: '2017-02-03', - stopped: '2017-02-04', - status: 'Failed', - log: [ - 'log1', - 'log2' - ] - }); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(restore!).toEqual( - new RestoreDto('http://url', - DateTime.parseISO('2017-02-03'), - DateTime.parseISO('2017-02-04'), - 'Failed', - [ + req.flush({ + url: 'http://url', + started: '2017-02-03', + stopped: '2017-02-04', + status: 'Failed', + log: [ 'log1', - 'log2' - ])); - })); + 'log2', + ], + }); + + expect(restore!).toEqual( + new RestoreDto('http://url', + DateTime.parseISO('2017-02-03'), + DateTime.parseISO('2017-02-04'), + 'Failed', + [ + 'log1', + 'log2', + ])); + })); it('should return null if get restore return 404', inject([BackupsService, HttpTestingController], (backupsService: BackupsService, httpMock: HttpTestingController) => { + let restore: RestoreDto | null; - let restore: RestoreDto | null; - - backupsService.getRestore().subscribe(result => { - restore = result; - }); + backupsService.getRestore().subscribe(result => { + restore = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/restore'); + const req = httpMock.expectOne('http://service/p/api/apps/restore'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}, { status: 404, statusText: '404' }); + req.flush({}, { status: 404, statusText: '404' }); - expect(restore!).toBeNull(); - })); + expect(restore!).toBeNull(); + })); it('should throw error if get restore return non 404', inject([BackupsService, HttpTestingController], (backupsService: BackupsService, httpMock: HttpTestingController) => { + let restore: RestoreDto | null; + let error: any; - let restore: RestoreDto | null; - let error: any; - - backupsService.getRestore().subscribe(result => { - restore = result; - }, err => { - error = err; - }); + backupsService.getRestore().subscribe(result => { + restore = result; + }, err => { + error = err; + }); - const req = httpMock.expectOne('http://service/p/api/apps/restore'); + const req = httpMock.expectOne('http://service/p/api/apps/restore'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}, { status: 500, statusText: '500' }); + req.flush({}, { status: 500, statusText: '500' }); - expect(restore!).toBeUndefined(); - expect(error)!.toBeDefined(); - })); + expect(restore!).toBeUndefined(); + expect(error)!.toBeDefined(); + })); it('should make post request to start backup', inject([BackupsService, HttpTestingController], (backupsService: BackupsService, httpMock: HttpTestingController) => { + backupsService.postBackup('my-app').subscribe(); - backupsService.postBackup('my-app').subscribe(); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/backups'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/backups'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}); - })); + req.flush({}); + })); it('should make post request to start restore', inject([BackupsService, HttpTestingController], (backupsService: BackupsService, httpMock: HttpTestingController) => { + const dto = { url: 'http://url' }; - const dto = { url: 'http://url' }; + backupsService.postRestore(dto).subscribe(); - backupsService.postRestore(dto).subscribe(); + const req = httpMock.expectOne('http://service/p/api/apps/restore'); - const req = httpMock.expectOne('http://service/p/api/apps/restore'); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({}); - })); + req.flush({}); + })); it('should make delete request to remove language', inject([BackupsService, HttpTestingController], (backupsService: BackupsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/backups/1' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/backups/1' } - } - }; - - backupsService.deleteBackup('my-app', resource).subscribe(); + backupsService.deleteBackup('my-app', resource).subscribe(); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/backups/1'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/backups/1'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}); - })); + req.flush({}); + })); function backupResponse(id: number) { return { @@ -189,15 +182,15 @@ describe('BackupsService', () => { handledAssets: id * 23, status: id % 2 === 0 ? 'Success' : 'Failed', _links: { - download: { method: 'GET', href: '/api/backups/1' } - } + download: { method: 'GET', href: '/api/backups/1' }, + }, }; } }); export function createBackup(id: number) { const links: ResourceLinks = { - download: { method: 'GET', href: '/api/backups/1' } + download: { method: 'GET', href: '/api/backups/1' }, }; return new BackupDto(links, @@ -207,4 +200,4 @@ export function createBackup(id: number) { id * 17, id * 23, id % 2 === 0 ? 'Success' : 'Failed'); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/backups.service.ts b/frontend/app/shared/services/backups.service.ts index f79788811..492be2280 100644 --- a/frontend/app/shared/services/backups.service.ts +++ b/frontend/app/shared/services/backups.service.ts @@ -36,7 +36,7 @@ export class BackupDto { public readonly stopped: DateTime | null, public readonly handledEvents: number, public readonly handledAssets: number, - public readonly status: 'Started' | 'Failed' | 'Success' | 'Completed' | 'Pending' + public readonly status: 'Started' | 'Failed' | 'Success' | 'Completed' | 'Pending', ) { this._links = links; @@ -53,27 +53,27 @@ export class RestoreDto { public readonly started: DateTime, public readonly stopped: DateTime | null, public readonly status: string, - public readonly log: ReadonlyArray + public readonly log: ReadonlyArray, ) { } } export type StartRestoreDto = - Readonly<{ url: string, newAppName?: string }>; + Readonly<{ url: string; newAppName?: string }>; @Injectable() export class BackupsService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } public getBackups(appName: string): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/backups`); - return this.http.get<{ items: any[], _links: {} } & Resource>(url).pipe( + return this.http.get<{ items: any[]; _links: {} } & Resource>(url).pipe( map(({ items, _links }) => { const backups = items.map(parseBackup); @@ -83,7 +83,7 @@ export class BackupsService { } public getRestore(): Observable { - const url = this.apiUrl.buildUrl(`api/apps/restore`); + const url = this.apiUrl.buildUrl('api/apps/restore'); return this.http.get(url).pipe( map(body => { @@ -112,7 +112,7 @@ export class BackupsService { } public postRestore(dto: StartRestoreDto): Observable { - const url = this.apiUrl.buildUrl(`api/apps/restore`); + const url = this.apiUrl.buildUrl('api/apps/restore'); return this.http.post(url, dto).pipe( tap(() => { @@ -151,4 +151,4 @@ function parseBackup(response: any) { response.handledEvents, response.handledAssets, response.status); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/clients.service.spec.ts b/frontend/app/shared/services/clients.service.spec.ts index 28e6c4235..58ab97a96 100644 --- a/frontend/app/shared/services/clients.service.spec.ts +++ b/frontend/app/shared/services/clients.service.spec.ts @@ -15,13 +15,13 @@ describe('ClientsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ ClientsService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -31,136 +31,131 @@ describe('ClientsService', () => { it('should make get request to get app clients', inject([ClientsService, HttpTestingController], (clientsService: ClientsService, httpMock: HttpTestingController) => { + let clients: ClientsDto; - let clients: ClientsDto; + clientsService.getClients('my-app').subscribe(result => { + clients = result; + }); - clientsService.getClients('my-app').subscribe(result => { - clients = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/clients'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/clients'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(clientsResponse(1, 2), { + headers: { + etag: '2', + }, + }); - req.flush(clientsResponse(1, 2), { - headers: { - etag: '2' - } - }); - - expect(clients!).toEqual({ payload: createClients(1, 2), version: new Version('2') }); - })); + expect(clients!).toEqual({ payload: createClients(1, 2), version: new Version('2') }); + })); it('should make post request to create client', inject([ClientsService, HttpTestingController], (clientsService: ClientsService, httpMock: HttpTestingController) => { + const dto = { id: 'client1' }; - const dto = { id: 'client1' }; - - let clients: ClientsDto; + let clients: ClientsDto; - clientsService.postClient('my-app', dto, version).subscribe(result => { - clients = result; - }); + clientsService.postClient('my-app', dto, version).subscribe(result => { + clients = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/clients'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/clients'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(clientsResponse(1, 2), { - headers: { - etag: '2' - } - }); + req.flush(clientsResponse(1, 2), { + headers: { + etag: '2', + }, + }); - expect(clients!).toEqual({ payload: createClients(1, 2), version: new Version('2') }); - })); + expect(clients!).toEqual({ payload: createClients(1, 2), version: new Version('2') }); + })); it('should make put request to rename client', inject([ClientsService, HttpTestingController], (clientsService: ClientsService, httpMock: HttpTestingController) => { + const dto = { name: 'New Name' }; - const dto = { name: 'New Name' }; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/apps/my-app/clients/client1' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/apps/my-app/clients/client1' } - } - }; + let clients: ClientsDto; - let clients: ClientsDto; + clientsService.putClient('my-app', resource, dto, version).subscribe(result => { + clients = result; + }); - clientsService.putClient('my-app', resource, dto, version).subscribe(result => { - clients = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/clients/client1'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/clients/client1'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + req.flush(clientsResponse(1, 2), { + headers: { + etag: '2', + }, + }); - req.flush(clientsResponse(1, 2), { - headers: { - etag: '2' - } - }); - - expect(clients!).toEqual({ payload: createClients(1, 2), version: new Version('2') }); - })); + expect(clients!).toEqual({ payload: createClients(1, 2), version: new Version('2') }); + })); it('should make delete request to remove client', inject([ClientsService, HttpTestingController], (clientsService: ClientsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/clients/client1' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/clients/client1' } - } - }; + let clients: ClientsDto; - let clients: ClientsDto; + clientsService.deleteClient('my-app', resource, version).subscribe(result => { + clients = result; + }); - clientsService.deleteClient('my-app', resource, version).subscribe(result => { - clients = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/clients/client1'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/clients/client1'); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + req.flush(clientsResponse(1, 2), { + headers: { + etag: '2', + }, + }); - req.flush(clientsResponse(1, 2), { - headers: { - etag: '2' - } - }); - - expect(clients!).toEqual({ payload: createClients(1, 2), version: new Version('2') }); - })); + expect(clients!).toEqual({ payload: createClients(1, 2), version: new Version('2') }); + })); it('should make form request to create token', inject([ClientsService, HttpTestingController], (clientsService: ClientsService, httpMock: HttpTestingController) => { + let accessTokenDto: AccessTokenDto; - let accessTokenDto: AccessTokenDto; - - clientsService.createToken('my-app', createClient(13)).subscribe(result => { - accessTokenDto = result; - }); + clientsService.createToken('my-app', createClient(13)).subscribe(result => { + accessTokenDto = result; + }); - const body = 'grant_type=client_credentials&scope=squidex-api&client_id=my-app:id13&client_secret=secret13'; + const body = 'grant_type=client_credentials&scope=squidex-api&client_id=my-app:id13&client_secret=secret13'; - const req = httpMock.expectOne('http://service/p/identity-server/connect/token'); + const req = httpMock.expectOne('http://service/p/identity-server/connect/token'); - expect(req.request.method).toEqual('POST'); - expect(req.request.body).toEqual(body); + expect(req.request.method).toEqual('POST'); + expect(req.request.body).toEqual(body); - req.flush({ access_token: 'token1', token_type: 'type1' }); + req.flush({ access_token: 'token1', token_type: 'type1' }); - expect(accessTokenDto!).toEqual(new AccessTokenDto('token1', 'type1')); - })); + expect(accessTokenDto!).toEqual(new AccessTokenDto('token1', 'type1')); + })); function clientsResponse(...ids: number[]) { return { - items: ids.map(id => ({ + items: ids.map(id => ({ id: `id${id}`, name: `Client ${id}`, role: `Role${id}`, @@ -169,12 +164,12 @@ describe('ClientsService', () => { apiTrafficLimit: id * 5120, allowAnonymous: true, _links: { - update: { method: 'PUT', href: `/clients/id${id}` } - } + update: { method: 'PUT', href: `/clients/id${id}` }, + }, })), _links: { - create: { method: 'POST', href: '/clients' } - } + create: { method: 'POST', href: '/clients' }, + }, }; } }); @@ -183,16 +178,16 @@ export function createClients(...ids: ReadonlyArray): ClientsPayload { return { items: ids.map(createClient), _links: { - create: { method: 'POST', href: '/clients' } + create: { method: 'POST', href: '/clients' }, }, - canCreate: true + canCreate: true, }; } export function createClient(id: number) { const links: ResourceLinks = { - update: { method: 'PUT', href: `/clients/id${id}` } + update: { method: 'PUT', href: `/clients/id${id}` }, }; - return new ClientDto(links, `id${id}`, `Client ${id}`, `secret${id}`, `Role${id}`, id * 512, id * 5120, true); -} \ No newline at end of file + return new ClientDto(links, `id${id}`, `Client ${id}`, `secret${id}`, `Role${id}`, id * 512, id * 5120, true); +} diff --git a/frontend/app/shared/services/clients.service.ts b/frontend/app/shared/services/clients.service.ts index a60c97183..03563ac65 100644 --- a/frontend/app/shared/services/clients.service.ts +++ b/frontend/app/shared/services/clients.service.ts @@ -25,7 +25,7 @@ export class ClientDto { public readonly role: string, public readonly apiCallsLimit: number, public readonly apiTrafficLimit: number, - public readonly allowAnonymous: boolean + public readonly allowAnonymous: boolean, ) { this._links = links; @@ -37,7 +37,7 @@ export class ClientDto { export class AccessTokenDto { constructor( public readonly accessToken: string, - public readonly tokenType: string + public readonly tokenType: string, ) { } } @@ -46,20 +46,20 @@ export type ClientsDto = Versioned; export type ClientsPayload = - Readonly<{ items: ReadonlyArray, canCreate: boolean } & Resource>; + Readonly<{ items: ReadonlyArray; canCreate: boolean } & Resource>; export type CreateClientDto = Readonly<{ id: string }>; export type UpdateClientDto = - Readonly<{ name?: string; role?: string; allowAnonymous?: boolean; apiCallsLimit?: number; }>; + Readonly<{ name?: string; role?: string; allowAnonymous?: boolean; apiCallsLimit?: number }>; @Injectable() export class ClientsService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -119,8 +119,8 @@ export class ClientsService { public createToken(appName: string, client: ClientDto): Observable { const options = { headers: new HttpHeaders({ - 'Content-Type': 'application/x-www-form-urlencoded', 'NoAuth': 'true' - }) + 'Content-Type': 'application/x-www-form-urlencoded', NoAuth: 'true', + }), }; const body = `grant_type=client_credentials&scope=squidex-api&client_id=${appName}:${client.id}&client_secret=${client.secret}`; @@ -151,4 +151,4 @@ function parseClients(response: any): ClientsPayload { const _links = response._links; return { items, _links, canCreate: hasAnyLink(_links, 'create') }; -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/comments.service.spec.ts b/frontend/app/shared/services/comments.service.spec.ts index d1468ec29..5e2577b8f 100644 --- a/frontend/app/shared/services/comments.service.spec.ts +++ b/frontend/app/shared/services/comments.service.spec.ts @@ -15,12 +15,12 @@ describe('CommentsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ CommentsService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -30,100 +30,96 @@ describe('CommentsService', () => { it('should make get request to get comments', inject([CommentsService, HttpTestingController], (commentsService: CommentsService, httpMock: HttpTestingController) => { - - let comments: CommentsDto; - - commentsService.getComments('my-comments', new Version('123')).subscribe(result => { - comments = result; - }); - - const req = httpMock.expectOne('http://service/p/api/my-comments?version=123'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.headers.get('X-Silent')).toBe('1'); - - req.flush({ - createdComments: [{ - id: '123', - text: 'text1', - time: '2016-10-12T10:10', - user - }], - updatedComments: [{ - id: '456', - text: 'text2', - time: '2017-11-12T12:12', - user - }], - deletedComments: ['789'], - version: '9' - }); - - expect(comments!).toEqual( - new CommentsDto( - [ - new CommentDto('123', DateTime.parseISO('2016-10-12T10:10Z'), 'text1', undefined, user) - ], [ - new CommentDto('456', DateTime.parseISO('2017-11-12T12:12Z'), 'text2', undefined, user) - ], [ - '789' - ], - new Version('9')) - ); - })); + let comments: CommentsDto; + + commentsService.getComments('my-comments', new Version('123')).subscribe(result => { + comments = result; + }); + + const req = httpMock.expectOne('http://service/p/api/my-comments?version=123'); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.headers.get('X-Silent')).toBe('1'); + + req.flush({ + createdComments: [{ + id: '123', + text: 'text1', + time: '2016-10-12T10:10', + user, + }], + updatedComments: [{ + id: '456', + text: 'text2', + time: '2017-11-12T12:12', + user, + }], + deletedComments: ['789'], + version: '9', + }); + + expect(comments!).toEqual( + new CommentsDto( + [ + new CommentDto('123', DateTime.parseISO('2016-10-12T10:10Z'), 'text1', undefined, user), + ], [ + new CommentDto('456', DateTime.parseISO('2017-11-12T12:12Z'), 'text2', undefined, user), + ], [ + '789', + ], + new Version('9')), + ); + })); it('should make post request to create comment', inject([CommentsService, HttpTestingController], (commentsService: CommentsService, httpMock: HttpTestingController) => { + const dto = { text: 'text1' }; - const dto = { text: 'text1' }; - - let comment: CommentDto; + let comment: CommentDto; - commentsService.postComment('my-comments', dto).subscribe(result => { - comment = result; - }); + commentsService.postComment('my-comments', dto).subscribe(result => { + comment = result; + }); - const req = httpMock.expectOne('http://service/p/api/my-comments'); + const req = httpMock.expectOne('http://service/p/api/my-comments'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ - id: '123', - text: 'text1', - time: '2016-10-12T10:10', - user - }); + req.flush({ + id: '123', + text: 'text1', + time: '2016-10-12T10:10', + user, + }); - expect(comment!).toEqual(new CommentDto('123', DateTime.parseISO('2016-10-12T10:10Z'), 'text1', undefined, user)); - })); + expect(comment!).toEqual(new CommentDto('123', DateTime.parseISO('2016-10-12T10:10Z'), 'text1', undefined, user)); + })); it('should make put request to replace comment content', inject([CommentsService, HttpTestingController], (commentsService: CommentsService, httpMock: HttpTestingController) => { + const dto = { text: 'text1' }; - const dto = { text: 'text1' }; - - commentsService.putComment('my-comments', '123', dto).subscribe(); + commentsService.putComment('my-comments', '123', dto).subscribe(); - const req = httpMock.expectOne('http://service/p/api/my-comments/123'); + const req = httpMock.expectOne('http://service/p/api/my-comments/123'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}); - })); + req.flush({}); + })); it('should make delete request to delete comment', inject([CommentsService, HttpTestingController], (commentsService: CommentsService, httpMock: HttpTestingController) => { + commentsService.deleteComment('my-comments', '123').subscribe(); - commentsService.deleteComment('my-comments', '123').subscribe(); - - const req = httpMock.expectOne('http://service/p/api/my-comments/123'); + const req = httpMock.expectOne('http://service/p/api/my-comments/123'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}); - })); -}); \ No newline at end of file + req.flush({}); + })); +}); diff --git a/frontend/app/shared/services/comments.service.ts b/frontend/app/shared/services/comments.service.ts index 876028b8f..49724cca3 100644 --- a/frontend/app/shared/services/comments.service.ts +++ b/frontend/app/shared/services/comments.service.ts @@ -16,7 +16,7 @@ export class CommentsDto extends Model { public readonly createdComments: ReadonlyArray, public readonly updatedComments: ReadonlyArray, public readonly deletedComments: ReadonlyArray, - public readonly version: Version + public readonly version: Version, ) { super(); } @@ -28,20 +28,20 @@ export class CommentDto extends Model { public readonly time: DateTime, public readonly text: string, public readonly url: string | undefined, - public readonly user: string + public readonly user: string, ) { super(); } } export type UpsertCommentDto = - Readonly<{ text: string, url?: string }>; + Readonly<{ text: string; url?: string }>; @Injectable() export class CommentsService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -50,8 +50,8 @@ export class CommentsService { const options = { headers: new HttpHeaders({ - 'X-Silent': '1' - }) + 'X-Silent': '1', + }), }; return this.http.get(url, options).pipe( @@ -74,7 +74,7 @@ export class CommentsService { item.user); }), body.deletedComments, - new Version(body.version) + new Version(body.version), ); return comments; @@ -112,4 +112,4 @@ export class CommentsService { return this.http.delete(url).pipe( pretifyError('i18n:comments.deleteFailed')); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/contents.service.spec.ts b/frontend/app/shared/services/contents.service.spec.ts index 7255b8881..91b35089f 100644 --- a/frontend/app/shared/services/contents.service.spec.ts +++ b/frontend/app/shared/services/contents.service.spec.ts @@ -18,13 +18,13 @@ describe('ContentsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ ContentsService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -34,368 +34,351 @@ describe('ContentsService', () => { it('should make get request to get contents', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { - - let contents: ContentsDto; - - contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13 }).subscribe(result => { - contents = result; - }); - - const req = httpMock.expectOne(`http://service/p/api/content/my-app/my-schema?q=${encodeQuery({ take: 17, skip: 13 })}`); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({ - total: 10, - items: [ - contentResponse(12), - contentResponse(13) - ], - statuses: [{ - status: 'Draft', color: 'Gray' - }] - }); - - expect(contents!).toEqual( - new ContentsDto([{ status: 'Draft', color: 'Gray' }], 10, [ - createContent(12), - createContent(13) - ])); - })); + let contents: ContentsDto; + + contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13 }).subscribe(result => { + contents = result; + }); + + const req = httpMock.expectOne(`http://service/p/api/content/my-app/my-schema?q=${encodeQuery({ take: 17, skip: 13 })}`); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush({ + total: 10, + items: [ + contentResponse(12), + contentResponse(13), + ], + statuses: [{ + status: 'Draft', color: 'Gray', + }], + }); + + expect(contents!).toEqual( + new ContentsDto([{ status: 'Draft', color: 'Gray' }], 10, [ + createContent(12), + createContent(13), + ])); + })); it('should make get request to get contents with json query', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const query = { fullText: 'my-query' }; - const query = { fullText: 'my-query' }; - - contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, query }).subscribe(); + contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, query }).subscribe(); - const expectedQuery = { ...query, take: 17, skip: 13 }; + const expectedQuery = { ...query, take: 17, skip: 13 }; - const req = httpMock.expectOne(`http://service/p/api/content/my-app/my-schema?q=${encodeQuery(expectedQuery)}`); + const req = httpMock.expectOne(`http://service/p/api/content/my-app/my-schema?q=${encodeQuery(expectedQuery)}`); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make post request to get contents with json query if request limit reached', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const query = { fullText: 'my-query' }; - const query = { fullText: 'my-query' }; - - contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, query, maxLength: 5 }).subscribe(); + contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, query, maxLength: 5 }).subscribe(); - const expectedQuery = { ...query, take: 17, skip: 13 }; + const expectedQuery = { ...query, take: 17, skip: 13 }; - const req = httpMock.expectOne(`http://service/p/api/content/my-app/my-schema/query`); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/query'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.body).toEqual({ q: sanitize(expectedQuery) }); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.body).toEqual({ q: sanitize(expectedQuery) }); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make get request to get contents with ids', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const ids = ['1', '2']; - const ids = ['1', '2']; - - contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, ids }).subscribe(); + contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, ids }).subscribe(); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema?ids=1,2'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema?ids=1,2'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make post request to get contents with ids if request limit reached', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const ids = ['1', '2']; - const ids = ['1', '2']; - - contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, ids, maxLength: 5 }).subscribe(); + contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, ids, maxLength: 5 }).subscribe(); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/query'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/query'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.body).toEqual({ ids }); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.body).toEqual({ ids }); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make get request to get contents with odata filter', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const query = { fullText: '$filter=my-filter' }; - const query = { fullText: '$filter=my-filter' }; - - contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, query }).subscribe(); + contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, query }).subscribe(); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema?$filter=my-filter&$top=17&$skip=13'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema?$filter=my-filter&$top=17&$skip=13'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make post request to get contents with odata filter if request limit reached', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const query = { fullText: '$filter=my-filter' }; - const query = { fullText: '$filter=my-filter' }; - - contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, query, maxLength: 5 }).subscribe(); + contentsService.getContents('my-app', 'my-schema', { take: 17, skip: 13, query, maxLength: 5 }).subscribe(); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/query'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/query'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.body).toEqual({ odataQuery: '$filter=my-filter&$top=17&$skip=13' }); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.body).toEqual({ odataQuery: '$filter=my-filter&$top=17&$skip=13' }); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make get request to get contents by ids', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const ids = ['1', '2', '3']; - const ids = ['1', '2', '3']; - - contentsService.getContentsByIds('my-app', ids).subscribe(); + contentsService.getContentsByIds('my-app', ids).subscribe(); - const req = httpMock.expectOne(`http://service/p/api/content/my-app?ids=1,2,3`); + const req = httpMock.expectOne('http://service/p/api/content/my-app?ids=1,2,3'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make post request to get contents by ids if request limit reached', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const ids = ['1', '2', '3']; - const ids = ['1', '2', '3']; - - contentsService.getContentsByIds('my-app', ids, 5).subscribe(); + contentsService.getContentsByIds('my-app', ids, 5).subscribe(); - const req = httpMock.expectOne(`http://service/p/api/content/my-app`); + const req = httpMock.expectOne('http://service/p/api/content/my-app'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.body).toEqual({ ids }); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.body).toEqual({ ids }); - req.flush({ total: 10, items: [] }); - })); + req.flush({ total: 10, items: [] }); + })); it('should make get request to get content', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + let content: ContentDto; - let content: ContentDto; - - contentsService.getContent('my-app', 'my-schema', '1').subscribe(result => { - content = result; - }); + contentsService.getContent('my-app', 'my-schema', '1').subscribe(result => { + content = result; + }); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/1'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/1'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(contentResponse(12)); + req.flush(contentResponse(12)); - expect(content!).toEqual(createContent(12)); - })); + expect(content!).toEqual(createContent(12)); + })); it('should make post request to create content', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const dto = {}; - const dto = {}; + let content: ContentDto; - let content: ContentDto; + contentsService.postContent('my-app', 'my-schema', dto, true).subscribe(result => { + content = result; + }); - contentsService.postContent('my-app', 'my-schema', dto, true).subscribe(result => { - content = result; - }); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema?publish=true'); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema?publish=true'); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(contentResponse(12)); - req.flush(contentResponse(12)); - - expect(content!).toEqual(createContent(12)); - })); + expect(content!).toEqual(createContent(12)); + })); it('should make get request to get versioned content data', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const response = {}; - const response = {}; - - let data: Versioned; + let data: Versioned; - contentsService.getVersionData('my-app', 'my-schema', 'content1', version).subscribe(result => { - data = result; - }); + contentsService.getVersionData('my-app', 'my-schema', 'content1', version).subscribe(result => { + data = result; + }); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1/1'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1/1'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(response); + req.flush(response); - expect(data!.payload).toBe(response); - })); + expect(data!.payload).toBe(response); + })); it('should make put request to update content', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const dto = {}; - const dto = {}; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/content/my-app/my-schema/content1?asDraft=true' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/content/my-app/my-schema/content1?asDraft=true' } - } - }; + let content: ContentDto; - let content: ContentDto; - - contentsService.putContent('my-app', resource, dto, version).subscribe(result => { - content = result; - }); + contentsService.putContent('my-app', resource, dto, version).subscribe(result => { + content = result; + }); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1?asDraft=true'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1?asDraft=true'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(contentResponse(12)); + req.flush(contentResponse(12)); - expect(content!).toEqual(createContent(12)); - })); + expect(content!).toEqual(createContent(12)); + })); it('should make patch request to update content', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const dto = {}; - const dto = {}; - - const resource: Resource = { - _links: { - patch: { method: 'PATCH', href: '/api/content/my-app/my-schema/content1' } - } - }; + const resource: Resource = { + _links: { + patch: { method: 'PATCH', href: '/api/content/my-app/my-schema/content1' }, + }, + }; - let content: ContentDto; + let content: ContentDto; - contentsService.patchContent('my-app', resource, dto, version).subscribe(result => { - content = result; - }); + contentsService.patchContent('my-app', resource, dto, version).subscribe(result => { + content = result; + }); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1'); - expect(req.request.method).toEqual('PATCH'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PATCH'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(contentResponse(12)); + req.flush(contentResponse(12)); - expect(content!).toEqual(createContent(12)); - })); + expect(content!).toEqual(createContent(12)); + })); it('should make post request to create draft', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + 'draft/create': { method: 'POST', href: '/api/content/my-app/my-schema/content1/draft' }, + }, + }; - const resource: Resource = { - _links: { - ['draft/create']: { method: 'POST', href: '/api/content/my-app/my-schema/content1/draft' } - } - }; + let content: ContentDto; - let content: ContentDto; + contentsService.createVersion('my-app', resource, version).subscribe(result => { + content = result; + }); - contentsService.createVersion('my-app', resource, version).subscribe(result => { - content = result; - }); - - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1/draft'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1/draft'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(contentResponse(12)); + req.flush(contentResponse(12)); - expect(content!).toEqual(createContent(12)); - })); + expect(content!).toEqual(createContent(12)); + })); it('should make delete request to delete draft', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + 'draft/delete': { method: 'DELETE', href: '/api/content/my-app/my-schema/content1/draft' }, + }, + }; - const resource: Resource = { - _links: { - ['draft/delete']: { method: 'DELETE', href: '/api/content/my-app/my-schema/content1/draft' } - } - }; - - let content: ContentDto; + let content: ContentDto; - contentsService.deleteVersion('my-app', resource, version).subscribe(result => { - content = result; - }); + contentsService.deleteVersion('my-app', resource, version).subscribe(result => { + content = result; + }); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1/draft'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/content1/draft'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(contentResponse(12)); + req.flush(contentResponse(12)); - expect(content!).toEqual(createContent(12)); - })); + expect(content!).toEqual(createContent(12)); + })); it('should make post request to for bulk update', inject([ContentsService, HttpTestingController], (contentsService: ContentsService, httpMock: HttpTestingController) => { + const dto: BulkUpdateDto = { + jobs: [{ + id: '123', + type: 'Delete', + }, { + id: '456', + type: 'Delete', + }], + }; - const dto: BulkUpdateDto = { - jobs: [{ - id: '123', - type: 'Delete' - }, { - id: '456', - type: 'Delete' - }] - }; + let results: ReadonlyArray; - let results: ReadonlyArray; + contentsService.bulkUpdate('my-app', 'my-schema', dto).subscribe(result => { + results = result; + }); - contentsService.bulkUpdate('my-app', 'my-schema', dto).subscribe(result => { - results = result; - }); + const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/bulk'); - const req = httpMock.expectOne('http://service/p/api/content/my-app/my-schema/bulk'); - - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush([{ - contentId: '123' - }, { - contentId: '456', - error: { - statusCode: 400, - message: 'Invalid' - } - }]); - - expect(results!).toEqual([ - new BulkResultDto('123'), - new BulkResultDto('456', new ErrorDto(400, 'Invalid')) - ]); - })); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush([{ + contentId: '123', + }, { + contentId: '456', + error: { + statusCode: 400, + message: 'Invalid', + }, + }]); + + expect(results!).toEqual([ + new BulkResultDto('123'), + new BulkResultDto('456', new ErrorDto(400, 'Invalid')), + ]); + })); function contentResponse(id: number, suffix = '') { const key = `${id}${suffix}`; @@ -414,7 +397,7 @@ describe('ContentsService', () => { status: 'Draft', scheduledBy: `Scheduler${id}`, color: 'red', - dueTime: `${id % 1000 + 2000}-11-11T10:10:00Z` + dueTime: `${id % 1000 + 2000}-11-11T10:10:00Z`, }, data: {}, schemaName: 'my-schema', @@ -423,15 +406,15 @@ describe('ContentsService', () => { referenceFields: [], version: key, _links: { - update: { method: 'PUT', href: `/contents/id${id}` } - } + update: { method: 'PUT', href: `/contents/id${id}` }, + }, }; } }); export function createContent(id: number, suffix = '') { const links: ResourceLinks = { - update: { method: 'PUT', href: `/contents/id${id}` } + update: { method: 'PUT', href: `/contents/id${id}` }, }; const key = `${id}${suffix}`; @@ -451,4 +434,4 @@ export function createContent(id: number, suffix = '') { 'MySchema', {}, []); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/contents.service.ts b/frontend/app/shared/services/contents.service.ts index 5c3f702bd..254d25bc8 100644 --- a/frontend/app/shared/services/contents.service.ts +++ b/frontend/app/shared/services/contents.service.ts @@ -5,14 +5,12 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: no-shadowed-variable - import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { AnalyticsService, ApiUrlConfig, DateTime, ErrorDto, hasAnyLink, HTTP, mapVersioned, pretifyError, Resource, ResourceLinks, ResultSet, Version, Versioned } from '@app/framework'; import { Observable } from 'rxjs'; import { map, tap } from 'rxjs/operators'; -import { encodeQuery, Query } from './../state/query'; +import { encodeQuery, Query, StatusInfo } from './../state/query'; import { parseField, RootFieldDto } from './schemas.service'; export class ScheduleDto { @@ -20,7 +18,7 @@ export class ScheduleDto { public readonly status: string, public readonly scheduledBy: string, public readonly color: string, - public readonly dueTime: DateTime + public readonly dueTime: DateTime, ) { } } @@ -30,7 +28,7 @@ export class ContentsDto extends ResultSet { public readonly statuses: ReadonlyArray, total: number, items: ReadonlyArray, - links?: ResourceLinks + links?: ResourceLinks, ) { super(total, items, links); } @@ -74,7 +72,7 @@ export class ContentDto { public readonly schemaName: string, public readonly schemaDisplayName: string, public readonly referenceData: ContentReferences, - public readonly referenceFields: ReadonlyArray + public readonly referenceFields: ReadonlyArray, ) { this._links = links; @@ -100,16 +98,13 @@ export class ContentDto { export class BulkResultDto { constructor( public readonly contentId: string, - public readonly error?: ErrorDto + public readonly error?: ErrorDto, ) { } } export type BulkUpdateType = 'Upsert' | 'ChangeStatus' | 'Delete' | 'Validate'; -export type StatusInfo = - Readonly<{ status: string; color: string; }>; - export type ContentReferencesValue = Readonly<{ [partition: string]: string }> | string; @@ -123,20 +118,20 @@ export type ContentData = Readonly<{ [fieldName: string ]: ContentFieldData }>; export type BulkUpdateDto = - Readonly<{ jobs: ReadonlyArray, doNotScript?: boolean, checkReferrers?: boolean }>; + Readonly<{ jobs: ReadonlyArray; doNotScript?: boolean; checkReferrers?: boolean }>; export type BulkUpdateJobDto = Readonly<{ id: string; type: BulkUpdateType; status?: string; schema?: string; dueTime?: string | null; expectedVersion?: number }>; export type ContentQueryDto = - Readonly<{ ids?: ReadonlyArray; maxLength?: number; query?: Query; skip?: number; take?: number; }>; + Readonly<{ ids?: ReadonlyArray; maxLength?: number; query?: Query; skip?: number; take?: number }>; @Injectable() export class ContentsService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -150,17 +145,15 @@ export class ContentsService { if (ids && ids.length > 0) { body.ids = ids; - } else { - if (queryOdataParts.length > 0) { - body.odataQuery = queryOdataParts.join('&'); - } else if (queryObj) { - body.q = queryObj; - } + } else if (queryOdataParts.length > 0) { + body.odataQuery = queryOdataParts.join('&'); + } else if (queryObj) { + body.q = queryObj; } const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/query`); - return this.http.post<{ total: number, items: [], statuses: StatusInfo[] } & Resource>(url, body).pipe( + return this.http.post<{ total: number; items: []; statuses: StatusInfo[] } & Resource>(url, body).pipe( map(({ total, items, statuses, _links }) => { const contents = items.map(parseContent); @@ -170,7 +163,7 @@ export class ContentsService { } else { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}?${fullQuery}`); - return this.http.get<{ total: number, items: [], statuses: StatusInfo[] } & Resource>(url).pipe( + return this.http.get<{ total: number; items: []; statuses: StatusInfo[] } & Resource>(url).pipe( map(({ total, items, statuses, _links }) => { const contents = items.map(parseContent); @@ -188,18 +181,17 @@ export class ContentsService { const url = this.apiUrl.buildUrl(`/api/content/${appName}`); - return this.http.post<{ total: number, items: [], statuses: StatusInfo[] } & Resource>(url, body).pipe( + return this.http.post<{ total: number; items: []; statuses: StatusInfo[] } & Resource>(url, body).pipe( map(({ total, items, statuses, _links }) => { const contents = items.map(parseContent); return new ContentsDto(statuses, total, contents, _links); }), pretifyError('i18n:contents.loadFailed')); - } else { const url = this.apiUrl.buildUrl(`/api/content/${appName}?${fullQuery}`); - return this.http.get<{ total: number, items: [], statuses: StatusInfo[] } & Resource>(url).pipe( + return this.http.get<{ total: number; items: []; statuses: StatusInfo[] } & Resource>(url).pipe( map(({ total, items, statuses, _links }) => { const contents = items.map(parseContent); @@ -224,7 +216,7 @@ export class ContentsService { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}/references?${fullQuery}`); - return this.http.get<{ total: number, items: [], statuses: StatusInfo[] } & Resource>(url).pipe( + return this.http.get<{ total: number; items: []; statuses: StatusInfo[] } & Resource>(url).pipe( map(({ total, items, statuses, _links }) => { const contents = items.map(parseContent); @@ -238,7 +230,7 @@ export class ContentsService { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}/referencing?${fullQuery}`); - return this.http.get<{ total: number, items: [], statuses: StatusInfo[] } & Resource>(url).pipe( + return this.http.get<{ total: number; items: []; statuses: StatusInfo[] } & Resource>(url).pipe( map(({ total, items, statuses, _links }) => { const contents = items.map(parseContent); @@ -354,31 +346,28 @@ function buildQuery(q?: ContentQueryDto) { if (ids && ids.length > 0) { queryParts.push(`ids=${ids.join(',')}`); - } else { - - if (query && query.fullText && query.fullText.indexOf('$') >= 0) { - odataParts.push(`${query.fullText.trim()}`); + } else if (query && query.fullText && query.fullText.indexOf('$') >= 0) { + odataParts.push(`${query.fullText.trim()}`); - if (take && take > 0) { - odataParts.push(`$top=${take}`); - } - - if (skip && skip > 0) { - odataParts.push(`$skip=${skip}`); - } - } else { - queryObj = { ...query }; + if (take && take > 0) { + odataParts.push(`$top=${take}`); + } - if (take && take > 0) { - queryObj.take = take; - } + if (skip && skip > 0) { + odataParts.push(`$skip=${skip}`); + } + } else { + queryObj = { ...query }; - if (skip && skip > 0) { - queryObj.skip = skip; - } + if (take && take > 0) { + queryObj.take = take; + } - queryParts.push(`q=${encodeQuery(queryObj)}`); + if (skip && skip > 0) { + queryObj.skip = skip; } + + queryParts.push(`q=${encodeQuery(queryObj)}`); } const fullQuery = [...queryParts, ...odataParts].join('&'); @@ -426,4 +415,4 @@ function parseError(response: any) { response.message, response.errorCode, response.details); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/contributors.service.spec.ts b/frontend/app/shared/services/contributors.service.spec.ts index eaad71ba1..c529e21b9 100644 --- a/frontend/app/shared/services/contributors.service.spec.ts +++ b/frontend/app/shared/services/contributors.service.spec.ts @@ -15,13 +15,13 @@ describe('ContributorsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ ContributorsService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -31,80 +31,77 @@ describe('ContributorsService', () => { it('should make get request to get app contributors', inject([ContributorsService, HttpTestingController], (contributorsService: ContributorsService, httpMock: HttpTestingController) => { + let contributors: ContributorsDto; - let contributors: ContributorsDto; + contributorsService.getContributors('my-app').subscribe(result => { + contributors = result; + }); - contributorsService.getContributors('my-app').subscribe(result => { - contributors = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/contributors'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/contributors'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(contributorsResponse(1, 2, 3), { + headers: { + etag: '2', + }, + }); - req.flush(contributorsResponse(1, 2, 3), { - headers: { - etag: '2' - } - }); - - expect(contributors!).toEqual({ payload: createContributors(1, 2, 3), version: new Version('2') }); - })); + expect(contributors!).toEqual({ payload: createContributors(1, 2, 3), version: new Version('2') }); + })); it('should make post request to assign contributor', inject([ContributorsService, HttpTestingController], (contributorsService: ContributorsService, httpMock: HttpTestingController) => { + const dto = { contributorId: '123', role: 'Owner' }; - const dto = { contributorId: '123', role: 'Owner' }; + let contributors: ContributorsDto; - let contributors: ContributorsDto; + contributorsService.postContributor('my-app', dto, version).subscribe(result => { + contributors = result; + }); - contributorsService.postContributor('my-app', dto, version).subscribe(result => { - contributors = result; - }); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/contributors'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/contributors'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(contributorsResponse(1, 2, 3), { - headers: { - etag: '2' - } - }); + req.flush(contributorsResponse(1, 2, 3), { + headers: { + etag: '2', + }, + }); - expect(contributors!).toEqual({ payload: createContributors(1, 2, 3), version: new Version('2') }); - })); + expect(contributors!).toEqual({ payload: createContributors(1, 2, 3), version: new Version('2') }); + })); it('should make delete request to remove contributor', inject([ContributorsService, HttpTestingController], (contributorsService: ContributorsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/contributors/123' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/contributors/123' } - } - }; + let contributors: ContributorsDto; - let contributors: ContributorsDto; + contributorsService.deleteContributor('my-app', resource, version).subscribe(result => { + contributors = result; + }); - contributorsService.deleteContributor('my-app', resource, version).subscribe(result => { - contributors = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/contributors/123'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/contributors/123'); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + req.flush(contributorsResponse(1, 2, 3), { + headers: { + etag: '2', + }, + }); - req.flush(contributorsResponse(1, 2, 3), { - headers: { - etag: '2' - } - }); - - expect(contributors!).toEqual({ payload: createContributors(1, 2, 3), version: new Version('2') }); - })); + expect(contributors!).toEqual({ payload: createContributors(1, 2, 3), version: new Version('2') }); + })); function contributorsResponse(...ids: number[]) { return { @@ -114,16 +111,16 @@ describe('ContributorsService', () => { contributorEmail: `mail${id}@squidex.io`, role: id % 2 === 0 ? 'Owner' : 'Developer', _links: { - update: { method: 'PUT', href: `/contributors/id${id}` } - } + update: { method: 'PUT', href: `/contributors/id${id}` }, + }, })), maxContributors: ids.length * 13, _links: { - create: { method: 'POST', href: '/contributors' } + create: { method: 'POST', href: '/contributors' }, }, _meta: { - isInvited: 'true' - } + isInvited: 'true', + }, }; } }); @@ -133,19 +130,19 @@ export function createContributors(...ids: ReadonlyArray): ContributorsP items: ids.map(createContributor), maxContributors: ids.length * 13, _links: { - create: { method: 'POST', href: '/contributors' } + create: { method: 'POST', href: '/contributors' }, }, _meta: { - isInvited: 'true' + isInvited: 'true', }, - canCreate: true + canCreate: true, }; } export function createContributor(id: number) { const links: ResourceLinks = { - update: { method: 'PUT', href: `/contributors/id${id}` } + update: { method: 'PUT', href: `/contributors/id${id}` }, }; return new ContributorDto(links, `id${id}`, `name${id}`, `mail${id}@squidex.io`, id % 2 === 0 ? 'Owner' : 'Developer'); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/contributors.service.ts b/frontend/app/shared/services/contributors.service.ts index 06b3932e1..79ebde218 100644 --- a/frontend/app/shared/services/contributors.service.ts +++ b/frontend/app/shared/services/contributors.service.ts @@ -26,7 +26,7 @@ export class ContributorDto { public readonly contributorId: string, public readonly contributorName: string, public readonly contributorEmail: string, - public readonly role: string + public readonly role: string, ) { this._links = links; @@ -39,17 +39,17 @@ export type ContributorsDto = Versioned; export type ContributorsPayload = - Readonly<{ items: ReadonlyArray; maxContributors: number; canCreate: boolean; } & Resource>; + Readonly<{ items: ReadonlyArray; maxContributors: number; canCreate: boolean } & Resource>; export type AssignContributorDto = - Readonly<{ contributorId: string; role: string; invite?: boolean; }>; + Readonly<{ contributorId: string; role: string; invite?: boolean }>; @Injectable() export class ContributorsService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -107,4 +107,4 @@ function parseContributors(response: any) { const { maxContributors, _links, _meta } = response; return { items, maxContributors, _links, _meta, canCreate: hasAnyLink(_links, 'create') }; -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/graphql.service.spec.ts b/frontend/app/shared/services/graphql.service.spec.ts index 78b27c785..b2fbdfbde 100644 --- a/frontend/app/shared/services/graphql.service.spec.ts +++ b/frontend/app/shared/services/graphql.service.spec.ts @@ -13,12 +13,12 @@ describe('GraphQlService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ GraphQlService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -28,20 +28,19 @@ describe('GraphQlService', () => { it('should make get request to get history events', inject([GraphQlService, HttpTestingController], (graphQlService: GraphQlService, httpMock: HttpTestingController) => { + let graphQlResult: any = null; - let graphQlResult: any = null; - - graphQlService.query('my-app', {}).subscribe(result => { - graphQlResult = result; - }); + graphQlService.query('my-app', {}).subscribe(result => { + graphQlResult = result; + }); - const req = httpMock.expectOne('http://service/p/api/content/my-app/graphql'); + const req = httpMock.expectOne('http://service/p/api/content/my-app/graphql'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ result: true }); + req.flush({ result: true }); - expect(graphQlResult).toEqual({ result: true }); - })); -}); \ No newline at end of file + expect(graphQlResult).toEqual({ result: true }); + })); +}); diff --git a/frontend/app/shared/services/graphql.service.ts b/frontend/app/shared/services/graphql.service.ts index 32ce17859..b069d5aca 100644 --- a/frontend/app/shared/services/graphql.service.ts +++ b/frontend/app/shared/services/graphql.service.ts @@ -14,7 +14,7 @@ import { Observable } from 'rxjs'; export class GraphQlService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -23,4 +23,4 @@ export class GraphQlService { return this.http.post(url, params); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/help.service.spec.ts b/frontend/app/shared/services/help.service.spec.ts index cc347d16f..9f07cb038 100644 --- a/frontend/app/shared/services/help.service.spec.ts +++ b/frontend/app/shared/services/help.service.spec.ts @@ -13,11 +13,11 @@ describe('HelpService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ - HelpService - ] + HelpService, + ], }); }); @@ -27,39 +27,37 @@ describe('HelpService', () => { it('should make get request to get help sections', inject([HelpService, HttpTestingController], (helpService: HelpService, httpMock: HttpTestingController) => { + let helpSections: string; - let helpSections: string; - - helpService.getHelp('01-chapter/02-article').subscribe(result => { - helpSections = result; - }); + helpService.getHelp('01-chapter/02-article').subscribe(result => { + helpSections = result; + }); - const req = httpMock.expectOne('https://raw.githubusercontent.com/squidex/squidex-docs2/master/01-chapter/02-article.md'); + const req = httpMock.expectOne('https://raw.githubusercontent.com/squidex/squidex-docs2/master/01-chapter/02-article.md'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush('Markdown'); + req.flush('Markdown'); - expect(helpSections!).toEqual('Markdown'); - })); + expect(helpSections!).toEqual('Markdown'); + })); it('should return empty sections if get request fails', inject([HelpService, HttpTestingController], (helpService: HelpService, httpMock: HttpTestingController) => { + let helpSections: string; - let helpSections: string; + helpService.getHelp('01-chapter/02-article').subscribe(result => { + helpSections = result; + }); - helpService.getHelp('01-chapter/02-article').subscribe(result => { - helpSections = result; - }); - - const req = httpMock.expectOne('https://raw.githubusercontent.com/squidex/squidex-docs2/master/01-chapter/02-article.md'); + const req = httpMock.expectOne('https://raw.githubusercontent.com/squidex/squidex-docs2/master/01-chapter/02-article.md'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.error({}); + req.error({}); - expect(helpSections!).toEqual(''); - })); -}); \ No newline at end of file + expect(helpSections!).toEqual(''); + })); +}); diff --git a/frontend/app/shared/services/help.service.ts b/frontend/app/shared/services/help.service.ts index 1cd8a0a21..c42cb6c9b 100644 --- a/frontend/app/shared/services/help.service.ts +++ b/frontend/app/shared/services/help.service.ts @@ -13,7 +13,7 @@ import { catchError } from 'rxjs/operators'; @Injectable() export class HelpService { constructor( - private readonly http: HttpClient + private readonly http: HttpClient, ) { } @@ -23,4 +23,4 @@ export class HelpService { return this.http.get(url, { responseType: 'text' }).pipe( catchError(() => of(''))); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/history.service.spec.ts b/frontend/app/shared/services/history.service.spec.ts index 8d4b42ef9..c93fcf71e 100644 --- a/frontend/app/shared/services/history.service.spec.ts +++ b/frontend/app/shared/services/history.service.spec.ts @@ -13,12 +13,12 @@ describe('HistoryService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ HistoryService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -28,41 +28,40 @@ describe('HistoryService', () => { it('should make get request to get history events', inject([HistoryService, HttpTestingController], (historyService: HistoryService, httpMock: HttpTestingController) => { + let events: ReadonlyArray; - let events: ReadonlyArray; - - historyService.getHistory('my-app', 'settings.contributors').subscribe(result => { - events = result; - }); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/history?channel=settings.contributors'); + historyService.getHistory('my-app', 'settings.contributors').subscribe(result => { + events = result; + }); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/history?channel=settings.contributors'); - req.flush([ - { - actor: 'User1', - eventId: '1', - eventType: 'Type 1', - message: 'Message 1', - version: 2, - created: '2016-12-12T10:10' - }, - { - actor: 'User2', - eventId: '2', - eventType: 'Type 2', - message: 'Message 2', - version: 3, - created: '2016-12-13T10:10' - } - ]); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(events!).toEqual( - [ - new HistoryEventDto('1', 'User1', 'Type 1', 'Message 1', DateTime.parseISO('2016-12-12T10:10Z'), new Version('2')), - new HistoryEventDto('2', 'User2', 'Type 2', 'Message 2', DateTime.parseISO('2016-12-13T10:10Z'), new Version('3')) + req.flush([ + { + actor: 'User1', + eventId: '1', + eventType: 'Type 1', + message: 'Message 1', + version: 2, + created: '2016-12-12T10:10', + }, + { + actor: 'User2', + eventId: '2', + eventType: 'Type 2', + message: 'Message 2', + version: 3, + created: '2016-12-13T10:10', + }, ]); - })); -}); \ No newline at end of file + + expect(events!).toEqual( + [ + new HistoryEventDto('1', 'User1', 'Type 1', 'Message 1', DateTime.parseISO('2016-12-12T10:10Z'), new Version('2')), + new HistoryEventDto('2', 'User2', 'Type 2', 'Message 2', DateTime.parseISO('2016-12-13T10:10Z'), new Version('3')), + ]); + })); +}); diff --git a/frontend/app/shared/services/history.service.ts b/frontend/app/shared/services/history.service.ts index acdd3b617..28586f27a 100644 --- a/frontend/app/shared/services/history.service.ts +++ b/frontend/app/shared/services/history.service.ts @@ -19,7 +19,7 @@ export class HistoryEventDto { public readonly eventType: string, public readonly message: string, public readonly created: DateTime, - public readonly version: Version + public readonly version: Version, ) { } } @@ -34,12 +34,10 @@ export function formatHistoryMessage(message: string, users: UsersProviderServic return users.getUser(parts[0], null).pipe(map(u => u.displayName)); } else if (parts[0] === 'subject') { return users.getUser(parts[1], null).pipe(map(u => u.displayName)); + } else if (parts[1].endsWith('client')) { + return of(parts[1]); } else { - if (parts[1].endsWith('client')) { - return of(parts[1]); - } else { - return of(`${parts[1]}-client`); - } + return of(`${parts[1]}-client`); } }; @@ -69,7 +67,7 @@ export function formatHistoryMessage(message: string, users: UsersProviderServic export class HistoryService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -78,8 +76,8 @@ export class HistoryService { const options = { headers: new HttpHeaders({ - 'X-Silent': '1' - }) + 'X-Silent': '1', + }), }; return this.http.get(url, options).pipe( @@ -97,4 +95,4 @@ export class HistoryService { }), pretifyError('i18n:history.loadFailed')); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/languages.service.spec.ts b/frontend/app/shared/services/languages.service.spec.ts index 40b03f96a..76bf8cd08 100644 --- a/frontend/app/shared/services/languages.service.spec.ts +++ b/frontend/app/shared/services/languages.service.spec.ts @@ -13,12 +13,12 @@ describe('LanguageService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ LanguagesService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -28,33 +28,32 @@ describe('LanguageService', () => { it('should make get request to get languages', inject([LanguagesService, HttpTestingController], (languagesService: LanguagesService, httpMock: HttpTestingController) => { - - let languages: ReadonlyArray; - - languagesService.getLanguages().subscribe(result => { - languages = result; - }); - - const req = httpMock.expectOne('http://service/p/api/languages'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush([ - { - iso2Code: 'de', - englishName: 'German' - }, - { - iso2Code: 'en', - englishName: 'English' - } - ]); - - expect(languages!).toEqual( - [ - new LanguageDto('de', 'German'), - new LanguageDto('en', 'English') + let languages: ReadonlyArray; + + languagesService.getLanguages().subscribe(result => { + languages = result; + }); + + const req = httpMock.expectOne('http://service/p/api/languages'); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush([ + { + iso2Code: 'de', + englishName: 'German', + }, + { + iso2Code: 'en', + englishName: 'English', + }, ]); - })); -}); \ No newline at end of file + + expect(languages!).toEqual( + [ + new LanguageDto('de', 'German'), + new LanguageDto('en', 'English'), + ]); + })); +}); diff --git a/frontend/app/shared/services/languages.service.ts b/frontend/app/shared/services/languages.service.ts index 21ccf18b3..7bbfb31a3 100644 --- a/frontend/app/shared/services/languages.service.ts +++ b/frontend/app/shared/services/languages.service.ts @@ -14,7 +14,7 @@ import { map } from 'rxjs/operators'; export class LanguageDto { constructor( public readonly iso2Code: string, - public readonly englishName: string + public readonly englishName: string, ) { } } @@ -23,7 +23,7 @@ export class LanguageDto { export class LanguagesService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -41,4 +41,4 @@ export class LanguagesService { }), pretifyError('i18n:languages.loadFailed')); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/news.service.spec.ts b/frontend/app/shared/services/news.service.spec.ts index 1d40f5cd6..dfd4583a9 100644 --- a/frontend/app/shared/services/news.service.spec.ts +++ b/frontend/app/shared/services/news.service.spec.ts @@ -13,12 +13,12 @@ describe('NewsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ NewsService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -28,33 +28,32 @@ describe('NewsService', () => { it('should make get request to get features', inject([NewsService, HttpTestingController], (newsService: NewsService, httpMock: HttpTestingController) => { - - let features: FeaturesDto; - - newsService.getFeatures(13).subscribe(result => { - features = result; - }); - - const req = httpMock.expectOne('http://service/p/api/news/features?version=13'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({ - version: 13, - features: [{ - name: 'Feature1', - text: 'Feature Text1' - }, { - name: 'Feature2', - text: 'Feature Text2' - }] - }); - - expect(features!).toEqual( - new FeaturesDto([ - new FeatureDto('Feature1', 'Feature Text1'), - new FeatureDto('Feature2', 'Feature Text2') - ], 13)); - })); -}); \ No newline at end of file + let features: FeaturesDto; + + newsService.getFeatures(13).subscribe(result => { + features = result; + }); + + const req = httpMock.expectOne('http://service/p/api/news/features?version=13'); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush({ + version: 13, + features: [{ + name: 'Feature1', + text: 'Feature Text1', + }, { + name: 'Feature2', + text: 'Feature Text2', + }], + }); + + expect(features!).toEqual( + new FeaturesDto([ + new FeatureDto('Feature1', 'Feature Text1'), + new FeatureDto('Feature2', 'Feature Text2'), + ], 13)); + })); +}); diff --git a/frontend/app/shared/services/news.service.ts b/frontend/app/shared/services/news.service.ts index a84cd4a0a..ff3743ef5 100644 --- a/frontend/app/shared/services/news.service.ts +++ b/frontend/app/shared/services/news.service.ts @@ -14,7 +14,7 @@ import { map } from 'rxjs/operators'; export class FeatureDto { constructor( public readonly name: string, - public readonly text: string + public readonly text: string, ) { } } @@ -22,7 +22,7 @@ export class FeatureDto { export class FeaturesDto { constructor( public readonly features: ReadonlyArray, - public readonly version: number + public readonly version: number, ) { } } @@ -31,7 +31,7 @@ export class FeaturesDto { export class NewsService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -46,7 +46,7 @@ export class NewsService { items.map(item => new FeatureDto( item.name, - item.text) + item.text), ), body.version); @@ -54,4 +54,4 @@ export class NewsService { }), pretifyError('i18n:features.loadFailed')); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/plans.service.spec.ts b/frontend/app/shared/services/plans.service.spec.ts index c4af8d602..bc2e07f2d 100644 --- a/frontend/app/shared/services/plans.service.spec.ts +++ b/frontend/app/shared/services/plans.service.spec.ts @@ -15,13 +15,13 @@ describe('PlansService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ PlansService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -31,98 +31,96 @@ describe('PlansService', () => { it('should make get request to get app plans', inject([PlansService, HttpTestingController], (plansService: PlansService, httpMock: HttpTestingController) => { + let plans: PlansDto; - let plans: PlansDto; + plansService.getPlans('my-app').subscribe(result => { + plans = result; + }); - plansService.getPlans('my-app').subscribe(result => { - plans = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/plans'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/plans'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({ - currentPlanId: '123', - planOwner: '456', - plans: [ - { - id: 'free', - name: 'Free', - costs: '14 €', - confirmText: 'Change for 14 € per month?', - yearlyId: 'free_yearly', - yearlyCosts: '120 €', - yearlyConfirmText: 'Change for 120 € per year?', - maxApiBytes: 128, - maxApiCalls: 1000, - maxAssetSize: 1500, - maxContributors: 2500 - }, - { - id: 'professional', - name: 'Professional', - costs: '18 €', - confirmText: 'Change for 18 € per month?', - yearlyId: 'professional_yearly', - yearlyCosts: '160 €', - yearlyConfirmText: 'Change for 160 € per year?', - maxApiBytes: 512, - maxApiCalls: 4000, - maxAssetSize: 5500, - maxContributors: 6500 - } - ], - hasPortal: true - }, { - headers: { - etag: '2' - } - }); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(plans!).toEqual({ - payload: { + req.flush({ currentPlanId: '123', planOwner: '456', plans: [ - new PlanDto( - 'free', 'Free', '14 €', - 'Change for 14 € per month?', - 'free_yearly', '120 €', - 'Change for 120 € per year?', - 128, 1000, 1500, 2500), - new PlanDto( - 'professional', 'Professional', '18 €', - 'Change for 18 € per month?', - 'professional_yearly', '160 €', - 'Change for 160 € per year?', - 512, 4000, 5500, 6500) + { + id: 'free', + name: 'Free', + costs: '14 €', + confirmText: 'Change for 14 € per month?', + yearlyId: 'free_yearly', + yearlyCosts: '120 €', + yearlyConfirmText: 'Change for 120 € per year?', + maxApiBytes: 128, + maxApiCalls: 1000, + maxAssetSize: 1500, + maxContributors: 2500, + }, + { + id: 'professional', + name: 'Professional', + costs: '18 €', + confirmText: 'Change for 18 € per month?', + yearlyId: 'professional_yearly', + yearlyCosts: '160 €', + yearlyConfirmText: 'Change for 160 € per year?', + maxApiBytes: 512, + maxApiCalls: 4000, + maxAssetSize: 5500, + maxContributors: 6500, + }, ], - hasPortal: true - }, - version: new Version('2') - }); - })); + hasPortal: true, + }, { + headers: { + etag: '2', + }, + }); + + expect(plans!).toEqual({ + payload: { + currentPlanId: '123', + planOwner: '456', + plans: [ + new PlanDto( + 'free', 'Free', '14 €', + 'Change for 14 € per month?', + 'free_yearly', '120 €', + 'Change for 120 € per year?', + 128, 1000, 1500, 2500), + new PlanDto( + 'professional', 'Professional', '18 €', + 'Change for 18 € per month?', + 'professional_yearly', '160 €', + 'Change for 160 € per year?', + 512, 4000, 5500, 6500), + ], + hasPortal: true, + }, + version: new Version('2'), + }); + })); it('should make put request to change plan', inject([PlansService, HttpTestingController], (plansService: PlansService, httpMock: HttpTestingController) => { + const dto = { planId: 'enterprise' }; - const dto = { planId: 'enterprise' }; + let planChanged: PlanChangedDto; - let planChanged: PlanChangedDto; + plansService.putPlan('my-app', dto, version).subscribe(result => { + planChanged = result.payload; + }); - plansService.putPlan('my-app', dto, version).subscribe(result => { - planChanged = result.payload; - }); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/plan'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/plan'); - req.flush({ redirectUri: 'http://url' }); + req.flush({ redirectUri: 'http://url' }); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - expect(planChanged!).toEqual({ redirectUri: 'http://url' }); - })); -}); \ No newline at end of file + expect(planChanged!).toEqual({ redirectUri: 'http://url' }); + })); +}); diff --git a/frontend/app/shared/services/plans.service.ts b/frontend/app/shared/services/plans.service.ts index 4803ec3ee..b3ab1ea8f 100644 --- a/frontend/app/shared/services/plans.service.ts +++ b/frontend/app/shared/services/plans.service.ts @@ -23,13 +23,13 @@ export class PlanDto { public readonly maxApiBytes: number, public readonly maxApiCalls: number, public readonly maxAssetSize: number, - public readonly maxContributors: number + public readonly maxContributors: number, ) { } } export type PlansDto = - Versioned; }>>; + Versioned }>>; export type PlanChangedDto = Readonly<{ redirectUri?: string }>; @@ -42,7 +42,7 @@ export class PlansService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -71,7 +71,7 @@ export class PlansService { item.maxApiCalls, item.maxAssetSize, item.maxContributors)), - hasPortal + hasPortal, }; return plans; @@ -91,4 +91,4 @@ export class PlansService { }), pretifyError('i18n:plans.changeFailed')); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/roles.service.spec.ts b/frontend/app/shared/services/roles.service.spec.ts index ecc11d14a..67e0acf65 100644 --- a/frontend/app/shared/services/roles.service.spec.ts +++ b/frontend/app/shared/services/roles.service.spec.ts @@ -15,13 +15,13 @@ describe('RolesService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ RolesService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -31,134 +31,129 @@ describe('RolesService', () => { it('should make get request to get all permissions', inject([RolesService, HttpTestingController], (roleService: RolesService, httpMock: HttpTestingController) => { + let permissions: ReadonlyArray; - let permissions: ReadonlyArray; - - roleService.getPermissions('my-app').subscribe(result => { - permissions = result; - }); + roleService.getPermissions('my-app').subscribe(result => { + permissions = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles/permissions'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles/permissions'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(['P1', 'P2']); + req.flush(['P1', 'P2']); - expect(permissions!).toEqual(['P1', 'P2']); - })); + expect(permissions!).toEqual(['P1', 'P2']); + })); it('should make get request to get roles', inject([RolesService, HttpTestingController], (roleService: RolesService, httpMock: HttpTestingController) => { + let roles: RolesDto; - let roles: RolesDto; + roleService.getRoles('my-app').subscribe(result => { + roles = result; + }); - roleService.getRoles('my-app').subscribe(result => { - roles = result; - }); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(rolesResponse(2, 4), { - headers: { - etag: '2' - } - }); + req.flush(rolesResponse(2, 4), { + headers: { + etag: '2', + }, + }); - expect(roles!).toEqual({ payload: createRoles(2, 4), version: new Version('2') }); - })); + expect(roles!).toEqual({ payload: createRoles(2, 4), version: new Version('2') }); + })); it('should make post request to add role', inject([RolesService, HttpTestingController], (roleService: RolesService, httpMock: HttpTestingController) => { + const dto = { name: 'Role3' }; - const dto = { name: 'Role3' }; + let roles: RolesDto; - let roles: RolesDto; + roleService.postRole('my-app', dto, version).subscribe(result => { + roles = result; + }); - roleService.postRole('my-app', dto, version).subscribe(result => { - roles = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles'); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + req.flush(rolesResponse(2, 4), { + headers: { + etag: '2', + }, + }); - req.flush(rolesResponse(2, 4), { - headers: { - etag: '2' - } - }); - - expect(roles!).toEqual({ payload: createRoles(2, 4), version: new Version('2') }); - })); + expect(roles!).toEqual({ payload: createRoles(2, 4), version: new Version('2') }); + })); it('should make put request to update role', inject([RolesService, HttpTestingController], (roleService: RolesService, httpMock: HttpTestingController) => { + const dto = { permissions: ['P4', 'P5'], properties: createProperties(1) }; - const dto = { permissions: ['P4', 'P5'], properties: createProperties(1) }; - - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/apps/my-app/roles/role1' } - } - }; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/apps/my-app/roles/role1' }, + }, + }; - let roles: RolesDto; + let roles: RolesDto; - roleService.putRole('my-app', resource, dto, version).subscribe(result => { - roles = result; - }); + roleService.putRole('my-app', resource, dto, version).subscribe(result => { + roles = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles/role1'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles/role1'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(rolesResponse(2, 4), { - headers: { - etag: '2' - } - }); + req.flush(rolesResponse(2, 4), { + headers: { + etag: '2', + }, + }); - expect(roles!).toEqual({ payload: createRoles(2, 4), version: new Version('2') }); - })); + expect(roles!).toEqual({ payload: createRoles(2, 4), version: new Version('2') }); + })); it('should make delete request to remove role', inject([RolesService, HttpTestingController], (roleService: RolesService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/roles/role1' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/roles/role1' } - } - }; - - let roles: RolesDto; + let roles: RolesDto; - roleService.deleteRole('my-app', resource, version).subscribe(result => { - roles = result; - }); + roleService.deleteRole('my-app', resource, version).subscribe(result => { + roles = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles/role1'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/roles/role1'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(rolesResponse(2, 4), { - headers: { - etag: '2' - } - }); + req.flush(rolesResponse(2, 4), { + headers: { + etag: '2', + }, + }); - expect(roles!).toEqual({ payload: createRoles(2, 4), version: new Version('2') }); - })); + expect(roles!).toEqual({ payload: createRoles(2, 4), version: new Version('2') }); + })); function rolesResponse(...ids: number[]) { return { - items: ids.map(id => ({ + items: ids.map(id => ({ name: `name${id}`, numClients: id * 2, numContributors: id * 3, @@ -166,12 +161,12 @@ describe('RolesService', () => { properties: createProperties(id), isDefaultRole: id % 2 === 0, _links: { - update: { method: 'PUT', href: `/roles/id${id}` } - } + update: { method: 'PUT', href: `/roles/id${id}` }, + }, })), _links: { - create: { method: 'POST', href: '/roles' } - } + create: { method: 'POST', href: '/roles' }, + }, }; } }); @@ -180,15 +175,15 @@ export function createRoles(...ids: ReadonlyArray): RolesPayload { return { items: ids.map(createRole), _links: { - create: { method: 'POST', href: '/roles' } + create: { method: 'POST', href: '/roles' }, }, - canCreate: true + canCreate: true, }; } export function createRole(id: number) { const links: ResourceLinks = { - update: { method: 'PUT', href: `/roles/id${id}` } + update: { method: 'PUT', href: `/roles/id${id}` }, }; return new RoleDto(links, `name${id}`, id * 2, id * 3, @@ -211,4 +206,4 @@ function createProperties(id: number) { result[`property${id}`] = true; return result; -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/roles.service.ts b/frontend/app/shared/services/roles.service.ts index a51ec94e1..cd2f8d11b 100644 --- a/frontend/app/shared/services/roles.service.ts +++ b/frontend/app/shared/services/roles.service.ts @@ -24,7 +24,7 @@ export class RoleDto { public readonly numContributors: number, public readonly permissions: ReadonlyArray, public readonly properties: {}, - public readonly isDefaultRole: boolean + public readonly isDefaultRole: boolean, ) { this._links = links; @@ -39,20 +39,20 @@ export type RolesDto = Versioned; export type RolesPayload = - Readonly<{ items: ReadonlyArray; canCreate: boolean; } & Resource>; + Readonly<{ items: ReadonlyArray; canCreate: boolean } & Resource>; export type CreateRoleDto = - Readonly<{ name: string; }>; + Readonly<{ name: string }>; export type UpdateRoleDto = - Readonly<{ permissions: Permissions; properties: {}; }>; + Readonly<{ permissions: Permissions; properties: {} }>; @Injectable() export class RolesService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -132,4 +132,4 @@ export function parseRoles(response: any) { const _links = response._links; return { items, _links, canCreate: hasAnyLink(_links, 'create') }; -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/rules.service.spec.ts b/frontend/app/shared/services/rules.service.spec.ts index 4c4360b4f..8b5f9b49f 100644 --- a/frontend/app/shared/services/rules.service.spec.ts +++ b/frontend/app/shared/services/rules.service.spec.ts @@ -16,13 +16,13 @@ describe('RulesService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ RulesService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -32,347 +32,334 @@ describe('RulesService', () => { it('should make get request to get actions', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { - - let actions: { [ name: string ]: RuleElementDto }; - - rulesService.getActions().subscribe(result => { - actions = result; - }); - - const req = httpMock.expectOne('http://service/p/api/rules/actions'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({ - action2: { - title: 'title2', - display: 'display2', - description: 'description2', - iconColor: '#222', - iconImage: '', - readMore: 'link2', - properties: [{ - name: 'property1', - editor: 'Editor1', - display: 'Display1', - description: 'Description1', - isRequired: true, - isFormattable: false - }, { - name: 'property2', - editor: 'Editor2', - display: 'Display2', - description: 'Description2', - isRequired: false, - isFormattable: true, - options: [ - 'Yes', - 'No' - ] - }] - }, - action1: { - title: 'title1', - display: 'display1', - description: 'description1', - iconColor: '#111', - iconImage: '', - readMore: 'link1', - properties: [] - } - }); - - const action1 = new RuleElementDto('title1', 'display1', 'description1', '#111', '', null, 'link1', []); - - const action2 = new RuleElementDto('title2', 'display2', 'description2', '#222', '', null, 'link2', [ - new RuleElementPropertyDto('property1', 'Editor1', 'Display1', 'Description1', false, true), - new RuleElementPropertyDto('property2', 'Editor2', 'Display2', 'Description2', true, false, ['Yes', 'No']) - ]); - - expect(actions!).toEqual({ - action1, - action2 - }); - })); + let actions: { [ name: string ]: RuleElementDto }; + + rulesService.getActions().subscribe(result => { + actions = result; + }); + + const req = httpMock.expectOne('http://service/p/api/rules/actions'); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush({ + action2: { + title: 'title2', + display: 'display2', + description: 'description2', + iconColor: '#222', + iconImage: '', + readMore: 'link2', + properties: [{ + name: 'property1', + editor: 'Editor1', + display: 'Display1', + description: 'Description1', + isRequired: true, + isFormattable: false, + }, { + name: 'property2', + editor: 'Editor2', + display: 'Display2', + description: 'Description2', + isRequired: false, + isFormattable: true, + options: [ + 'Yes', + 'No', + ], + }], + }, + action1: { + title: 'title1', + display: 'display1', + description: 'description1', + iconColor: '#111', + iconImage: '', + readMore: 'link1', + properties: [], + }, + }); + + const action1 = new RuleElementDto('title1', 'display1', 'description1', '#111', '', null, 'link1', []); + + const action2 = new RuleElementDto('title2', 'display2', 'description2', '#222', '', null, 'link2', [ + new RuleElementPropertyDto('property1', 'Editor1', 'Display1', 'Description1', false, true), + new RuleElementPropertyDto('property2', 'Editor2', 'Display2', 'Description2', true, false, ['Yes', 'No']), + ]); + + expect(actions!).toEqual({ + action1, + action2, + }); + })); it('should make get request to get app rules', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + let rules: RulesDto; - let rules: RulesDto; + rulesService.getRules('my-app').subscribe(result => { + rules = result; + }); - rulesService.getRules('my-app').subscribe(result => { - rules = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush({ + items: [ + ruleResponse(12), + ruleResponse(13), + ], + runningRuleId: '12', + }); - req.flush({ - items: [ - ruleResponse(12), - ruleResponse(13) - ], - runningRuleId: '12' - }); - - expect(rules!).toEqual( - new RulesDto([ - createRule(12), - createRule(13) - ], {}, '12')); - })); + expect(rules!).toEqual( + new RulesDto([ + createRule(12), + createRule(13), + ], {}, '12')); + })); it('should make post request to create rule', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + const dto = { + trigger: { + param1: 1, + param2: 2, + triggerType: 'ContentChanged', + }, + action: { + param3: 3, + param4: 4, + actionType: 'Webhook', + }, + }; - const dto = { - trigger: { - param1: 1, - param2: 2, - triggerType: 'ContentChanged' - }, - action: { - param3: 3, - param4: 4, - actionType: 'Webhook' - } - }; - - let rule: RuleDto; + let rule: RuleDto; - rulesService.postRule('my-app', dto).subscribe(result => { - rule = result; - }); + rulesService.postRule('my-app', dto).subscribe(result => { + rule = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(ruleResponse(12)); + req.flush(ruleResponse(12)); - expect(rule!).toEqual(createRule(12)); - })); + expect(rule!).toEqual(createRule(12)); + })); it('should make put request to update rule', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + const dto: any = { + trigger: { + param1: 1, + }, + action: { + param3: 2, + }, + }; - const dto: any = { - trigger: { - param1: 1 - }, - action: { - param3: 2 - } - }; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/apps/my-app/rules/123' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/apps/my-app/rules/123' } - } - }; - - let rule: RuleDto; + let rule: RuleDto; - rulesService.putRule('my-app', resource, dto, version).subscribe(result => { - rule = result; - }); + rulesService.putRule('my-app', resource, dto, version).subscribe(result => { + rule = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(ruleResponse(123)); + req.flush(ruleResponse(123)); - expect(rule!).toEqual(createRule(123)); - })); + expect(rule!).toEqual(createRule(123)); + })); it('should make delete request to delete rule', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/rules/123' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/rules/123' } - } - }; + rulesService.deleteRule('my-app', resource, version).subscribe(); - rulesService.deleteRule('my-app', resource, version).subscribe(); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123'); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); - - req.flush({}); - })); + req.flush({}); + })); it('should make put request to trigger rule', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + trigger: { method: 'PUT', href: '/api/apps/my-app/rules/123/trigger' }, + }, + }; - const resource: Resource = { - _links: { - trigger: { method: 'PUT', href: '/api/apps/my-app/rules/123/trigger' } - } - }; - - rulesService.triggerRule('my-app', resource).subscribe(); + rulesService.triggerRule('my-app', resource).subscribe(); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123/trigger'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123/trigger'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}); - })); + req.flush({}); + })); it('should make put request to run rule', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + run: { method: 'PUT', href: '/api/apps/my-app/rules/123/run' }, + }, + }; - const resource: Resource = { - _links: { - run: { method: 'PUT', href: '/api/apps/my-app/rules/123/run' } - } - }; + rulesService.runRule('my-app', resource).subscribe(); - rulesService.runRule('my-app', resource).subscribe(); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123/run'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123/run'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({}); - })); + req.flush({}); + })); it('should make put request to run rule from snapshots', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + 'run/snapshots': { method: 'PUT', href: '/api/apps/my-app/rules/123/run?fromSnapshots=true' }, + }, + }; - const resource: Resource = { - _links: { - ['run/snapshots']: { method: 'PUT', href: '/api/apps/my-app/rules/123/run?fromSnapshots=true' } - } - }; + rulesService.runRuleFromSnapshots('my-app', resource).subscribe(); - rulesService.runRuleFromSnapshots('my-app', resource).subscribe(); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123/run?fromSnapshots=true'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/123/run?fromSnapshots=true'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({}); - })); + req.flush({}); + })); it('should make delete request to cancel run rule', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + rulesService.runCancel('my-app').subscribe(); - rulesService.runCancel('my-app').subscribe(); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/run'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/run'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}); - })); + req.flush({}); + })); it('should make get request to get rule events', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + let rules: RuleEventsDto; - let rules: RuleEventsDto; + rulesService.getEvents('my-app', 10, 20, '12').subscribe(result => { + rules = result; + }); - rulesService.getEvents('my-app', 10, 20, '12').subscribe(result => { - rules = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/events?take=10&skip=20&ruleId=12'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/events?take=10&skip=20&ruleId=12'); + expect(req.request.method).toEqual('GET'); - expect(req.request.method).toEqual('GET'); + req.flush({ + total: 20, + items: [ + ruleEventResponse(1), + ruleEventResponse(2), + ], + }); - req.flush({ - total: 20, - items: [ - ruleEventResponse(1), - ruleEventResponse(2) - ] - }); - - expect(rules!).toEqual( - new RuleEventsDto(20, [ - createRuleEvent(1), - createRuleEvent(2) - ])); - })); + expect(rules!).toEqual( + new RuleEventsDto(20, [ + createRuleEvent(1), + createRuleEvent(2), + ])); + })); it('should make get request to get simulated rule events', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + let rules: SimulatedRuleEventsDto; - let rules: SimulatedRuleEventsDto; + rulesService.getSimulatedEvents('my-app', '12').subscribe(result => { + rules = result; + }); - rulesService.getSimulatedEvents('my-app', '12').subscribe(result => { - rules = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/12/simulate'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/12/simulate'); + expect(req.request.method).toEqual('GET'); - expect(req.request.method).toEqual('GET'); + req.flush({ + total: 20, + items: [ + simulatedRuleEventResponse(1), + simulatedRuleEventResponse(2), + ], + }); - req.flush({ - total: 20, - items: [ - simulatedRuleEventResponse(1), - simulatedRuleEventResponse(2) - ] - }); - - expect(rules!).toEqual( - new SimulatedRuleEventsDto(20, [ - createSimulatedRuleEvent(1), - createSimulatedRuleEvent(2) - ])); - })); + expect(rules!).toEqual( + new SimulatedRuleEventsDto(20, [ + createSimulatedRuleEvent(1), + createSimulatedRuleEvent(2), + ])); + })); it('should make put request to enqueue rule event', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/apps/my-app/rules/events/123' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/apps/my-app/rules/events/123' } - } - }; - - rulesService.enqueueEvent('my-app', resource).subscribe(); + rulesService.enqueueEvent('my-app', resource).subscribe(); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/events/123'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/events/123'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({}); - })); + req.flush({}); + })); it('should make delete request to cancel rule event', inject([RulesService, HttpTestingController], (rulesService: RulesService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/rules/events/123' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/rules/events/123' } - } - }; + rulesService.cancelEvent('my-app', resource).subscribe(); - rulesService.cancelEvent('my-app', resource).subscribe(); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/events/123'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/rules/events/123'); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({}); - })); + req.flush({}); + })); function ruleResponse(id: number, suffix = '') { const key = `${id}${suffix}`; @@ -391,17 +378,17 @@ describe('RulesService', () => { trigger: { param1: 1, param2: 2, - triggerType: `rule-trigger${key}` + triggerType: `rule-trigger${key}`, }, action: { param3: 3, param4: 4, - actionType: `rule-action${key}` + actionType: `rule-action${key}`, }, version: id, _links: { - update: { method: 'PUT', href: `/rules/${id}` } - } + update: { method: 'PUT', href: `/rules/${id}` }, + }, }; } @@ -419,8 +406,8 @@ describe('RulesService', () => { description: `event-url${key}`, result: `Failed${key}`, _links: { - update: { method: 'PUT', href: `/rules/events/${id}` } - } + update: { method: 'PUT', href: `/rules/events/${id}` }, + }, }; } @@ -433,14 +420,14 @@ describe('RulesService', () => { actionData: `action-data${key}`, error: `error${key}`, skipReason: `reason${key}`, - _links: {} + _links: {}, }; } }); export function createRule(id: number, suffix = '') { const links: ResourceLinks = { - update: { method: 'PUT', href: `/rules/${id}` } + update: { method: 'PUT', href: `/rules/${id}` }, }; const key = `${id}${suffix}`; @@ -454,13 +441,13 @@ export function createRule(id: number, suffix = '') { { param1: 1, param2: 2, - triggerType: `rule-trigger${key}` + triggerType: `rule-trigger${key}`, }, `rule-trigger${key}`, { param3: 3, param4: 4, - actionType: `rule-action${key}` + actionType: `rule-action${key}`, }, `rule-action${key}`, `rule-name${key}`, @@ -471,7 +458,7 @@ export function createRule(id: number, suffix = '') { export function createRuleEvent(id: number, suffix = '') { const links: ResourceLinks = { - update: { method: 'PUT', href: `/rules/events/${id}` } + update: { method: 'PUT', href: `/rules/events/${id}` }, }; const key = `${id}${suffix}`; @@ -496,4 +483,4 @@ export function createSimulatedRuleEvent(id: number, suffix = '') { `action-data${key}`, `error${key}`, `reason${key}`); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/rules.service.ts b/frontend/app/shared/services/rules.service.ts index b7ab00a3b..f9493cdc5 100644 --- a/frontend/app/shared/services/rules.service.ts +++ b/frontend/app/shared/services/rules.service.ts @@ -35,43 +35,43 @@ export const ALL_TRIGGERS: TriggersDto = { display: 'Asset changed', iconColor: '#3389ff', iconCode: 'assets', - title: 'Asset changed' + title: 'Asset changed', }, Comment: { description: 'When a user is mentioned in any comment...', display: 'User mentioned', iconColor: '#3389ff', iconCode: 'comments', - title: 'User mentioned' + title: 'User mentioned', }, ContentChanged: { description: 'For content changes like created, updated, published, unpublished...', display: 'Content changed', iconColor: '#3389ff', iconCode: 'contents', - title: 'Content changed' + title: 'Content changed', }, Manual: { description: 'To invoke processes manually, for example to update your static site...', display: 'Manually triggered', iconColor: '#3389ff', iconCode: 'play-line', - title: 'Manually triggered' + title: 'Manually triggered', }, SchemaChanged: { description: 'When a schema definition has been created, updated, published or deleted...', display: 'Schema changed', iconColor: '#3389ff', iconCode: 'schemas', - title: 'Schema changed' + title: 'Schema changed', }, Usage: { description: 'When monthly API calls exceed a specified limit for one time a month...', display: 'Usage exceeded', iconColor: '#3389ff', iconCode: 'dashboard', - title: 'Usage' - } + title: 'Usage', + }, }; export class RuleElementDto { @@ -83,7 +83,7 @@ export class RuleElementDto { public readonly iconImage: string, public readonly iconCode: string | null, public readonly readMore: string, - public readonly properties: ReadonlyArray + public readonly properties: ReadonlyArray, ) { } } @@ -96,7 +96,7 @@ export class RuleElementPropertyDto { public readonly description: string, public readonly isFormattable: boolean, public readonly isRequired: boolean, - public readonly options?: ReadonlyArray + public readonly options?: ReadonlyArray, ) { } } @@ -115,7 +115,7 @@ export class RulesDto extends ResultSet { } constructor(items: ReadonlyArray, links?: {}, - public readonly runningRuleId?: string + public readonly runningRuleId?: string, ) { super(items.length, items, links); } @@ -148,7 +148,7 @@ export class RuleDto { public readonly name: string, public readonly numSucceeded: number, public readonly numFailed: number, - public readonly lastExecuted?: DateTime + public readonly lastExecuted?: DateTime, ) { this._links = links; @@ -180,7 +180,7 @@ export class RuleEventDto extends Model { public readonly lastDump: string, public readonly result: string, public readonly jobResult: string, - public readonly numCalls: number + public readonly numCalls: number, ) { super(); @@ -202,7 +202,7 @@ export class SimulatedRuleEventDto { public readonly actionName: string | undefined, public readonly actionData: string | undefined, public readonly error: string | undefined, - public readonly skipReason: string + public readonly skipReason: string, ) { this._links = links; } @@ -212,20 +212,20 @@ export type ActionsDto = Readonly<{ [name: string]: RuleElementDto }>; export type UpsertRuleDto = - Readonly<{ trigger?: RuleTrigger; action?: RuleAction; name?: string; isEnabled?: boolean; }>; + Readonly<{ trigger?: RuleTrigger; action?: RuleAction; name?: string; isEnabled?: boolean }>; export type RuleAction = - Readonly<{ actionType: string; [key: string]: any; }>; + Readonly<{ actionType: string; [key: string]: any }>; export type RuleTrigger = - Readonly<{ triggerType: string; [key: string]: any; }>; + Readonly<{ triggerType: string; [key: string]: any }>; @Injectable() export class RulesService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -342,7 +342,7 @@ export class RulesService { public getEvents(appName: string, take: number, skip: number, ruleId?: string): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/rules/events?take=${take}&skip=${skip}&ruleId=${ruleId || ''}`); - return this.http.get<{ items: any[], total: number } & Resource>(url).pipe( + return this.http.get<{ items: any[]; total: number } & Resource>(url).pipe( map(({ items, total, _links }) => { const ruleEvents = items.map(parseRuleEvent); @@ -354,7 +354,7 @@ export class RulesService { public getSimulatedEvents(appName: string, ruleId: string): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/rules/${ruleId}/simulate`); - return this.http.get<{ items: any[], total: number } & Resource>(url).pipe( + return this.http.get<{ items: any[]; total: number } & Resource>(url).pipe( map(({ items, total, _links }) => { const simulatedRuleEvents = items.map(parseSimulatedRuleEvent); @@ -402,7 +402,7 @@ function parseActions(response: any) { property.description, property.isFormattable, property.isRequired, - property.options + property.options, )); actions[key] = new RuleElementDto( @@ -455,4 +455,4 @@ function parseSimulatedRuleEvent(response: any) { response.actionData, response.error, response.skipReason); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/schemas.service.spec.ts b/frontend/app/shared/services/schemas.service.spec.ts index 74cf48098..49e9bbbd9 100644 --- a/frontend/app/shared/services/schemas.service.spec.ts +++ b/frontend/app/shared/services/schemas.service.spec.ts @@ -15,13 +15,13 @@ describe('SchemasService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ SchemasService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -37,568 +37,546 @@ describe('SchemasService', () => { it('should make get request to get schemas', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + let schemas: SchemasDto; - let schemas: SchemasDto; - - schemasService.getSchemas('my-app').subscribe(result => { - schemas = result; - }); + schemasService.getSchemas('my-app').subscribe(result => { + schemas = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ - items: [ - schemaResponse(12), - schemaResponse(13) - ], - _links: { - create: { method: 'POST', href: '/schemas' } - } - }); - - expect(schemas!).toEqual({ - canCreate: true, - items: [ - createSchema(12), - createSchema(13) - ], - _links: { - create: { method: 'POST', href: '/schemas' } - } - }); - })); + req.flush({ + items: [ + schemaResponse(12), + schemaResponse(13), + ], + _links: { + create: { method: 'POST', href: '/schemas' }, + }, + }); + + expect(schemas!).toEqual({ + canCreate: true, + items: [ + createSchema(12), + createSchema(13), + ], + _links: { + create: { method: 'POST', href: '/schemas' }, + }, + }); + })); it('should make get request to get schema', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + let schema: SchemaDto; - let schema: SchemaDto; + schemasService.getSchema('my-app', 'my-schema').subscribe(result => { + schema = result; + }); - schemasService.getSchema('my-app', 'my-schema').subscribe(result => { - schema = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(schemaResponse(12)); - req.flush(schemaResponse(12)); - - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make post request to create schema', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = { name: 'name' }; - const dto = { name: 'name' }; + let schema: SchemaDto; - let schema: SchemaDto; + schemasService.postSchema('my-app', dto).subscribe(result => { + schema = result; + }); - schemasService.postSchema('my-app', dto).subscribe(result => { - schema = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas'); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(schemaResponse(12)); - req.flush(schemaResponse(12)); - - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to update schema', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = { label: 'label1' }; - const dto = { label: 'label1' }; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema' } - } - }; + let schema: SchemaDto; - let schema: SchemaDto; + schemasService.putSchema('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - schemasService.putSchema('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + req.flush(schemaResponse(12)); - req.flush(schemaResponse(12)); - - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to update schema scripts', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = {}; - const dto = {}; - - const resource: Resource = { - _links: { - ['update/scripts']: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/scripts' } - } - }; + const resource: Resource = { + _links: { + 'update/scripts': { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/scripts' }, + }, + }; - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.putScripts('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + schemasService.putScripts('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/scripts'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/scripts'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to update field rules', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto: FieldRule[] = [{ field: 'field1', action: 'Disable', condition: 'a === b' }]; - const dto: FieldRule[] = [{ field: 'field1', action: 'Disable', condition: 'a === b' }]; + const resource: Resource = { + _links: { + 'update/rules': { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/rules' }, + }, + }; - const resource: Resource = { - _links: { - ['update/rules']: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/rules' } - } - }; + let schema: SchemaDto; - let schema: SchemaDto; + schemasService.putFieldRules('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - schemasService.putFieldRules('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/rules'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/rules'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + req.flush(schemaResponse(12)); - req.flush(schemaResponse(12)); - - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to synchronize schema', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = {}; - const dto = {}; - - const resource: Resource = { - _links: { - ['update/sync']: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/sync' } - } - }; + const resource: Resource = { + _links: { + 'update/sync': { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/sync' }, + }, + }; - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.putSchemaSync('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + schemasService.putSchemaSync('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/sync'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/sync'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to update category', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = {}; - const dto = {}; - - const resource: Resource = { - _links: { - ['update/category']: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/category' } - } - }; + const resource: Resource = { + _links: { + 'update/category': { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/category' }, + }, + }; - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.putCategory('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + schemasService.putCategory('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/category'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/category'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to update preview urls', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = {}; - const dto = {}; - - const resource: Resource = { - _links: { - ['update/urls']: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/preview-urls' } - } - }; + const resource: Resource = { + _links: { + 'update/urls': { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/preview-urls' }, + }, + }; - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.putPreviewUrls('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + schemasService.putPreviewUrls('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/preview-urls'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/preview-urls'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make post request to add field', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = { name: 'name', partitioning: 'invariant', properties: createProperties('Number') }; - const dto = { name: 'name', partitioning: 'invariant', properties: createProperties('Number') }; - - const resource: Resource = { - _links: { - ['fields/add']: { method: 'POST', href: '/api/apps/my-app/schemas/my-schema/fields' } - } - }; + const resource: Resource = { + _links: { + 'fields/add': { method: 'POST', href: '/api/apps/my-app/schemas/my-schema/fields' }, + }, + }; - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.postField('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + schemasService.postField('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to publish schema', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + publish: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/publish' }, + }, + }; - const resource: Resource = { - _links: { - publish: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/publish' } - } - }; - - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.publishSchema('my-app', resource, version).subscribe(result => { - schema = result; - }); + schemasService.publishSchema('my-app', resource, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/publish'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/publish'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to unpublish schema', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + unpublish: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/unpublish' }, + }, + }; - const resource: Resource = { - _links: { - unpublish: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/unpublish' } - } - }; - - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.unpublishSchema('my-app', resource, version).subscribe(result => { - schema = result; - }); + schemasService.unpublishSchema('my-app', resource, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/unpublish'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/unpublish'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to update field', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = { properties: createProperties('Number') }; - const dto = { properties: createProperties('Number') }; + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1' } - } - }; + let schema: SchemaDto; - let schema: SchemaDto; + schemasService.putField('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - schemasService.putField('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + req.flush(schemaResponse(12)); - req.flush(schemaResponse(12)); - - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to update ui fields', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = { fieldsInReferences: ['field1'] }; - const dto = { fieldsInReferences: ['field1'] }; - - const resource: Resource = { - _links: { - ['fields/ui']: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/ui' } - } - }; + const resource: Resource = { + _links: { + 'fields/ui': { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/ui' }, + }, + }; - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.putUIFields('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + schemasService.putUIFields('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/ui'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/ui'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to update field ordering', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const dto = [1, 2, 3]; - const dto = [1, 2, 3]; - - const resource: Resource = { - _links: { - ['fields/order']: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/ordering' } - } - }; + const resource: Resource = { + _links: { + 'fields/order': { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/ordering' }, + }, + }; - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.putFieldOrdering('my-app', resource, dto, version).subscribe(result => { - schema = result; - }); + schemasService.putFieldOrdering('my-app', resource, dto, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/ordering'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/ordering'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to lock field', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + lock: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/lock' }, + }, + }; - const resource: Resource = { - _links: { - lock: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/lock' } - } - }; + let schema: SchemaDto; - let schema: SchemaDto; + schemasService.lockField('my-app', resource, version).subscribe(result => { + schema = result; + }); - schemasService.lockField('my-app', resource, version).subscribe(result => { - schema = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/lock'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/lock'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + req.flush(schemaResponse(12)); - req.flush(schemaResponse(12)); - - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to enable field', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + enable: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/enable' }, + }, + }; - const resource: Resource = { - _links: { - enable: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/enable' } - } - }; - - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.enableField('my-app', resource, version).subscribe(result => { - schema = result; - }); + schemasService.enableField('my-app', resource, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/enable'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/enable'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to disable field', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + disable: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/disable' }, + }, + }; - const resource: Resource = { - _links: { - disable: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/disable' } - } - }; + let schema: SchemaDto; - let schema: SchemaDto; + schemasService.disableField('my-app', resource, version).subscribe(result => { + schema = result; + }); - schemasService.disableField('my-app', resource, version).subscribe(result => { - schema = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/disable'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/disable'); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + req.flush(schemaResponse(12)); - req.flush(schemaResponse(12)); - - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to show field', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + show: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/show' }, + }, + }; - const resource: Resource = { - _links: { - show: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/show' } - } - }; - - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.showField('my-app', resource, version).subscribe(result => { - schema = result; - }); + schemasService.showField('my-app', resource, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/show'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/show'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make put request to hide field', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + hide: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/hide' }, + }, + }; - const resource: Resource = { - _links: { - hide: { method: 'PUT', href: '/api/apps/my-app/schemas/my-schema/fields/1/hide' } - } - }; - - let schema: SchemaDto; + let schema: SchemaDto; - schemasService.hideField('my-app', resource, version).subscribe(result => { - schema = result; - }); + schemasService.hideField('my-app', resource, version).subscribe(result => { + schema = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/hide'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1/hide'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush(schemaResponse(12)); + req.flush(schemaResponse(12)); - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make delete request to delete field', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/schemas/my-schema/fields/1' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/schemas/my-schema/fields/1' } - } - }; + let schema: SchemaDto; - let schema: SchemaDto; + schemasService.deleteField('my-app', resource, version).subscribe(result => { + schema = result; + }); - schemasService.deleteField('my-app', resource, version).subscribe(result => { - schema = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema/fields/1'); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + req.flush(schemaResponse(12)); - req.flush(schemaResponse(12)); - - expect(schema!).toEqual(createSchema(12)); - })); + expect(schema!).toEqual(createSchema(12)); + })); it('should make delete request to delete schema', inject([SchemasService, HttpTestingController], (schemasService: SchemasService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/schemas/my-schema' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/schemas/my-schema' } - } - }; - - schemasService.deleteSchema('my-app', resource, version).subscribe(); + schemasService.deleteSchema('my-app', resource, version).subscribe(); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/schemas/my-schema'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBe(version.value); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBe(version.value); - req.flush({}); - })); + req.flush({}); + })); function schemaPropertiesResponse(id: number, suffix = '') { const key = `${id}${suffix}`; @@ -609,10 +587,10 @@ describe('SchemasService', () => { contentSidebarUrl: `url/to/content/${key}`, contentEditorUrl: `url/to/editor/${key}`, tags: [ - `tags${key}` + `tags${key}`, ], validateOnPublish: id % 2 === 1, - hints: `hints${key}` + hints: `hints${key}`, }; } @@ -632,7 +610,7 @@ describe('SchemasService', () => { isPublished: id % 3 === 0, properties: schemaPropertiesResponse(id, suffix), previewUrls: { - Default: 'url' + Default: 'url', }, fields: [ { @@ -643,7 +621,7 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'Array' + fieldType: 'Array', }, nested: [ { @@ -653,9 +631,9 @@ describe('SchemasService', () => { isHidden: true, isDisabled: true, properties: { - fieldType: 'String' + fieldType: 'String', }, - _links: {} + _links: {}, }, { fieldId: 102, @@ -664,12 +642,12 @@ describe('SchemasService', () => { isHidden: true, isDisabled: true, properties: { - fieldType: 'Number' + fieldType: 'Number', }, - _links: {} - } + _links: {}, + }, ], - _links: {} + _links: {}, }, { fieldId: 12, @@ -679,9 +657,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'Assets' + fieldType: 'Assets', }, - _links: {} + _links: {}, }, { fieldId: 13, @@ -691,9 +669,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'Boolean' + fieldType: 'Boolean', }, - _links: {} + _links: {}, }, { fieldId: 14, @@ -703,9 +681,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'Component' + fieldType: 'Component', }, - _links: {} + _links: {}, }, { fieldId: 15, @@ -715,9 +693,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'Components' + fieldType: 'Components', }, - _links: {} + _links: {}, }, { fieldId: 16, @@ -727,9 +705,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'DateTime' + fieldType: 'DateTime', }, - _links: {} + _links: {}, }, { fieldId: 17, @@ -739,9 +717,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'Geolocation' + fieldType: 'Geolocation', }, - _links: {} + _links: {}, }, { fieldId: 18, @@ -751,9 +729,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'Json' + fieldType: 'Json', }, - _links: {} + _links: {}, }, { fieldId: 19, @@ -763,9 +741,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'Number' + fieldType: 'Number', }, - _links: {} + _links: {}, }, { fieldId: 20, @@ -775,9 +753,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'References' + fieldType: 'References', }, - _links: {} + _links: {}, }, { fieldId: 21, @@ -787,9 +765,9 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'String' + fieldType: 'String', }, - _links: {} + _links: {}, }, { fieldId: 22, @@ -799,27 +777,27 @@ describe('SchemasService', () => { isDisabled: true, partitioning: 'language', properties: { - fieldType: 'Tags' + fieldType: 'Tags', }, - _links: {} - } + _links: {}, + }, ], fieldsInLists: ['field1'], fieldsInReferences: ['field1'], fieldRules: [{ - field: 'field1', action: 'Hide', condition: 'a === 2' + field: 'field1', action: 'Hide', condition: 'a === 2', }], scripts: { query: '', create: '', change: '', delete: '', - update: '' + update: '', }, _links: { - update: { method: 'PUT', href: `/schemas/${id}` } - } + update: { method: 'PUT', href: `/schemas/${id}` }, + }, }; } }); @@ -835,14 +813,14 @@ function createSchemaProperties(id: number, suffix = '') { `url/to/editor/${key}`, id % 2 === 1, [ - `tags${key}` - ] + `tags${key}`, + ], ); } export function createSchema(id: number, suffix = '') { const links: ResourceLinks = { - update: { method: 'PUT', href: `/schemas/${id}` } + update: { method: 'PUT', href: `/schemas/${id}` }, }; const key = `${id}${suffix}`; @@ -860,7 +838,7 @@ export function createSchema(id: number, suffix = '') { [ new RootFieldDto({}, 11, 'field11', createProperties('Array'), 'language', true, true, true, [ new NestedFieldDto({}, 101, 'field101', createProperties('String'), 11, true, true, true), - new NestedFieldDto({}, 102, 'field102', createProperties('Number'), 11, true, true, true) + new NestedFieldDto({}, 102, 'field102', createProperties('Number'), 11, true, true, true), ]), new RootFieldDto({}, 12, 'field12', createProperties('Assets'), 'language', true, true, true), new RootFieldDto({}, 13, 'field13', createProperties('Boolean'), 'language', true, true, true), @@ -872,21 +850,21 @@ export function createSchema(id: number, suffix = '') { new RootFieldDto({}, 19, 'field19', createProperties('Number'), 'language', true, true, true), new RootFieldDto({}, 20, 'field20', createProperties('References'), 'language', true, true, true), new RootFieldDto({}, 21, 'field21', createProperties('String'), 'language', true, true, true), - new RootFieldDto({}, 22, 'field22', createProperties('Tags'), 'language', true, true, true) + new RootFieldDto({}, 22, 'field22', createProperties('Tags'), 'language', true, true, true), ], ['field1'], ['field1'], [{ - field: 'field1', action: 'Hide', condition: 'a === 2' + field: 'field1', action: 'Hide', condition: 'a === 2', }], { - Default: 'url' + Default: 'url', }, { query: '', create: '', change: '', delete: '', - update: '' + update: '', }); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/schemas.service.ts b/frontend/app/shared/services/schemas.service.ts index 70702f88c..0f3893e45 100644 --- a/frontend/app/shared/services/schemas.service.ts +++ b/frontend/app/shared/services/schemas.service.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ - // tslint:disable: readonly-array - import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { AnalyticsService, ApiUrlConfig, DateTime, hasAnyLink, HTTP, pretifyError, Resource, ResourceLinks, StringHelper, Types, Version, Versioned } from '@app/framework'; @@ -25,7 +23,7 @@ export const MetaFields = { status: 'meta.status', statusColor: 'meta.status.color', statusNext: 'meta.status.next', - version: 'meta.version' + version: 'meta.version', }; export type SchemaType = 'Default' | 'Singleton' | 'Component'; @@ -74,7 +72,7 @@ export class SchemaDto { public readonly fieldsInReferences: Tags = [], public readonly fieldRules: ReadonlyArray = [], public readonly previewUrls = {}, - public readonly scripts = {} + public readonly scripts = {}, ) { this._links = links; @@ -134,7 +132,7 @@ export class SchemaDto { 'fieldId', 'parentId', 'parentFieldId', - '_links' + '_links', ]; const cleanup = (source: any, ...exclude: string[]): any => { @@ -180,7 +178,7 @@ export class SchemaDto { return copy; }), - type: this.type + type: this.type, }; return result; @@ -240,7 +238,7 @@ export class FieldDto { public readonly properties: FieldPropertiesDto, public readonly isLocked: boolean = false, public readonly isHidden: boolean = false, - public readonly isDisabled: boolean = false + public readonly isDisabled: boolean = false, ) { this._links = links; @@ -266,7 +264,7 @@ export class RootFieldDto extends FieldDto { isLocked: boolean = false, isHidden: boolean = false, isDisabled: boolean = false, - public readonly nested: ReadonlyArray = [] + public readonly nested: ReadonlyArray = [], ) { super(links, fieldId, name, properties, isLocked, isHidden, isDisabled); } @@ -277,7 +275,7 @@ export class NestedFieldDto extends FieldDto { public readonly parentId: number, isLocked: boolean = false, isHidden: boolean = false, - isDisabled: boolean = false + isDisabled: boolean = false, ) { super(links, fieldId, name, properties, isLocked, isHidden, isDisabled); } @@ -291,7 +289,7 @@ export class SchemaPropertiesDto { public readonly contentSidebarUrl?: string, public readonly contentEditorUrl?: string, public readonly validateOnPublish?: boolean, - public readonly tags?: ReadonlyArray + public readonly tags?: ReadonlyArray, ) { } } @@ -299,7 +297,7 @@ export class SchemaPropertiesDto { export const FIELD_RULE_ACTIONS: ReadonlyArray = [ 'Disable', 'Hide', - 'Require' + 'Require', ]; type Tags = readonly string[]; @@ -307,8 +305,8 @@ type Tags = readonly string[]; export type TableField = RootFieldDto | string; export type FieldRuleAction = 'Disable' | 'Hide' | 'Require'; -export type FieldRule = { field: string, action: FieldRuleAction, condition: string }; -export type SchemaCompletions = ReadonlyArray<{ name: string, description: string }>; +export type FieldRule = { field: string; action: FieldRuleAction; condition: string }; +export type SchemaCompletions = ReadonlyArray<{ name: string; description: string }>; export type SchemasDto = Readonly<{ items: ReadonlyArray; canCreate: boolean } & Resource>; @@ -317,29 +315,29 @@ export type AddFieldDto = Readonly<{ name: string; partitioning?: string; properties: FieldPropertiesDto }>; export type UpdateUIFields = - Readonly<{ fieldsInLists?: Tags; fieldsInReferences?: Tags; }>; + Readonly<{ fieldsInLists?: Tags; fieldsInReferences?: Tags }>; export type CreateSchemaDto = - Readonly<{ name: string; fields?: ReadonlyArray; category?: string; type?: string; isPublished?: boolean; properties?: SchemaPropertiesDto; }>; + Readonly<{ name: string; fields?: ReadonlyArray; category?: string; type?: string; isPublished?: boolean; properties?: SchemaPropertiesDto }>; export type UpdateSchemaCategoryDto = - Readonly<{ name?: string; }>; + Readonly<{ name?: string }>; export type UpdateFieldDto = - Readonly<{ properties: FieldPropertiesDto; }>; + Readonly<{ properties: FieldPropertiesDto }>; export type SynchronizeSchemaDto = - Readonly<{ noFieldDeletiong?: boolean; noFieldRecreation?: boolean; [key: string]: any; }>; + Readonly<{ noFieldDeletiong?: boolean; noFieldRecreation?: boolean; [key: string]: any }>; export type UpdateSchemaDto = - Readonly<{ label?: string; hints?: string; contentsSidebarUrl?: string; contentSidebarUrl?: string; contentEditorUrl?: string; validateOnPublish?: boolean; tags?: Tags; }>; + Readonly<{ label?: string; hints?: string; contentsSidebarUrl?: string; contentSidebarUrl?: string; contentEditorUrl?: string; validateOnPublish?: boolean; tags?: Tags }>; @Injectable() export class SchemasService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -742,4 +740,4 @@ export function parseField(item: any) { item.isHidden, item.isDisabled, nested || []); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/schemas.spec.ts b/frontend/app/shared/services/schemas.spec.ts index cd1716888..cf994537d 100644 --- a/frontend/app/shared/services/schemas.spec.ts +++ b/frontend/app/shared/services/schemas.spec.ts @@ -1,18 +1,16 @@ - /* +/* * Squidex Headless CMS * * @license * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { createProperties, MetaFields, SchemaPropertiesDto } from '@app/shared/internal'; import { TestValues } from './../state/_test-helpers'; const { createField, - createSchema + createSchema, } = TestValues; describe('SchemaDto', () => { @@ -117,4 +115,4 @@ describe('FieldDto', () => { expect(field.isLocalizable).toBeFalsy(); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/services/schemas.types.ts b/frontend/app/shared/services/schemas.types.ts index 3f00a62e6..ffff1579f 100644 --- a/frontend/app/shared/services/schemas.types.ts +++ b/frontend/app/shared/services/schemas.types.ts @@ -20,47 +20,47 @@ export type FieldType = 'Tags' | 'UI'; -export const fieldTypes: ReadonlyArray<{ type: FieldType, description: string }> = [ +export const fieldTypes: ReadonlyArray<{ type: FieldType; description: string }> = [ { type: 'String', - description: 'i18n:schemas.fieldTypes.string.description' + description: 'i18n:schemas.fieldTypes.string.description', }, { type: 'Assets', - description: 'i18n:schemas.fieldTypes.assets.description' + description: 'i18n:schemas.fieldTypes.assets.description', }, { type: 'Boolean', - description: 'i18n:schemas.fieldTypes.boolean.description' + description: 'i18n:schemas.fieldTypes.boolean.description', }, { type: 'Component', - description: 'i18n:schemas.fieldTypes.component.description' + description: 'i18n:schemas.fieldTypes.component.description', }, { type: 'Components', - description: 'i18n:schemas.fieldTypes.components.description' + description: 'i18n:schemas.fieldTypes.components.description', }, { type: 'DateTime', - description: 'i18n:schemas.fieldTypes.dateTime.description' + description: 'i18n:schemas.fieldTypes.dateTime.description', }, { type: 'Geolocation', - description: 'i18n:schemas.fieldTypes.geolocation.description' + description: 'i18n:schemas.fieldTypes.geolocation.description', }, { type: 'Json', - description: 'i18n:schemas.fieldTypes.json.description' + description: 'i18n:schemas.fieldTypes.json.description', }, { type: 'Number', - description: 'i18n:schemas.fieldTypes.number.description' + description: 'i18n:schemas.fieldTypes.number.description', }, { type: 'References', - description: 'i18n:schemas.fieldTypes.references.description' + description: 'i18n:schemas.fieldTypes.references.description', }, { type: 'Tags', - description: 'i18n:schemas.fieldTypes.tags.description' + description: 'i18n:schemas.fieldTypes.tags.description', }, { type: 'Array', - description: 'i18n:schemas.fieldTypes.array.description' + description: 'i18n:schemas.fieldTypes.array.description', }, { type: 'UI', - description: 'i18n:schemas.fieldTypes.ui.description' - } + description: 'i18n:schemas.fieldTypes.ui.description', + }, ]; export const fieldInvariant = 'iv'; @@ -108,8 +108,6 @@ export function createProperties(fieldType: FieldType, values?: any): FieldPrope case 'UI': properties = new UIFieldPropertiesDto(); break; - default: - throw 'Invalid properties type'; } if (values) { @@ -192,7 +190,7 @@ export type AssetPreviewMode = 'ImageAndFileName' | 'Image' | 'FileName'; export const ASSET_PREVIEW_MODES: ReadonlyArray = [ 'ImageAndFileName', 'Image', - 'FileName' + 'FileName', ]; export class AssetsFieldPropertiesDto extends FieldPropertiesDto { @@ -230,7 +228,7 @@ export type BooleanFieldEditor = 'Checkbox' | 'Toggle'; export const BOOLEAN_FIELD_EDITORS: ReadonlyArray = [ 'Checkbox', - 'Toggle' + 'Toggle', ]; export class BooleanFieldPropertiesDto extends FieldPropertiesDto { @@ -284,7 +282,7 @@ export type DateTimeFieldEditor = 'DateTime' | 'Date'; export const DATETIME_FIELD_EDITORS: ReadonlyArray = [ 'DateTime', - 'Date' + 'Date', ]; export class DateTimeFieldPropertiesDto extends FieldPropertiesDto { @@ -340,7 +338,7 @@ export const NUMBER_FIELD_EDITORS: ReadonlyArray = [ 'Input', 'Radio', 'Dropdown', - 'Stars' + 'Stars', ]; export class NumberFieldPropertiesDto extends FieldPropertiesDto { @@ -370,7 +368,7 @@ export const REFERENCES_FIELD_EDITORS: ReadonlyArray = [ 'List', 'Dropdown', 'Checkboxes', - 'Tags' + 'Tags', ]; export class ReferencesFieldPropertiesDto extends FieldPropertiesDto { @@ -412,13 +410,13 @@ export const STRING_FIELD_EDITORS: ReadonlyArray = [ 'Radio', 'Html', 'StockPhoto', - 'Color' + 'Color', ]; export const STRING_CONTENT_TYPES: ReadonlyArray = [ 'Unspecified', 'Markdown', - 'Html' + 'Html', ]; export class StringFieldPropertiesDto extends FieldPropertiesDto { @@ -455,7 +453,7 @@ export type TagsFieldEditor = 'Tags' | 'Checkboxes' | 'Dropdown'; export const TAGS_FIELD_EDITORS: ReadonlyArray = [ 'Tags', 'Checkboxes', - 'Dropdown' + 'Dropdown', ]; export class TagsFieldPropertiesDto extends FieldPropertiesDto { @@ -501,4 +499,4 @@ export class UIFieldPropertiesDto extends FieldPropertiesDto { public accept(visitor: FieldPropertiesVisitor): T { return visitor.visitUI(this); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/search.service.spec.ts b/frontend/app/shared/services/search.service.spec.ts index 4e80186ec..9548616d5 100644 --- a/frontend/app/shared/services/search.service.spec.ts +++ b/frontend/app/shared/services/search.service.spec.ts @@ -13,12 +13,12 @@ describe('SearchService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ SearchService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -28,28 +28,27 @@ describe('SearchService', () => { it('should make get request to get search results', inject([SearchService, HttpTestingController], (searchService: SearchService, httpMock: HttpTestingController) => { + let results: ReadonlyArray; - let results: ReadonlyArray; - - searchService.getResults('my-app', 'my-query').subscribe(result => { - results = result; - }); + searchService.getResults('my-app', 'my-query').subscribe(result => { + results = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/search/?query=my-query'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/search/?query=my-query'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush([ - searchResultResponse(1), - searchResultResponse(2) - ]); + req.flush([ + searchResultResponse(1), + searchResultResponse(2), + ]); - expect(results!).toEqual([ - createSearchResult(1), - createSearchResult(2) - ]); - })); + expect(results!).toEqual([ + createSearchResult(1), + createSearchResult(2), + ]); + })); function searchResultResponse(id: number) { return { @@ -57,19 +56,19 @@ describe('SearchService', () => { type: `Search Type ${id}`, label: `Label ${id}`, _links: { - url: { method: 'GET', href: `/url${id}` } - } + url: { method: 'GET', href: `/url${id}` }, + }, }; } }); export function createSearchResult(id: number) { const links: ResourceLinks = { - url: { method: 'GET', href: `/url${id}` } + url: { method: 'GET', href: `/url${id}` }, }; return new SearchResultDto(links, `Search Result ${id}`, `Search Type ${id}`, `Label ${id}`); -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/search.service.ts b/frontend/app/shared/services/search.service.ts index bdc8b7ba5..588a42518 100644 --- a/frontend/app/shared/services/search.service.ts +++ b/frontend/app/shared/services/search.service.ts @@ -19,7 +19,7 @@ export class SearchResultDto { constructor(links: ResourceLinks, public readonly name: string, public readonly type: string, - public readonly label?: string + public readonly label?: string, ) { this._links = links; @@ -31,7 +31,7 @@ export class SearchResultDto { export class SearchService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -51,4 +51,4 @@ export class SearchService { }), pretifyError('i18n:search.searchFailed')); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/stock-photo.service.spec.ts b/frontend/app/shared/services/stock-photo.service.spec.ts index 3a333a31d..e49a89696 100644 --- a/frontend/app/shared/services/stock-photo.service.spec.ts +++ b/frontend/app/shared/services/stock-photo.service.spec.ts @@ -13,11 +13,11 @@ describe('StockPhotoService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ - StockPhotoService - ] + StockPhotoService, + ], }); }); @@ -27,52 +27,50 @@ describe('StockPhotoService', () => { it('should make get request to get stock photos', inject([StockPhotoService, HttpTestingController], (stockPhotoService: StockPhotoService, httpMock: HttpTestingController) => { - - let images: ReadonlyArray; - - stockPhotoService.getImages('my-query').subscribe(result => { - images = result; - }); - - const req = httpMock.expectOne('https://stockphoto.squidex.io/?query=my-query&pageSize=100'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush([{ - url: 'url1', - thumbUrl: 'thumb1', - user: 'user1', - userProfileUrl: 'user1-url' - }, { - url: 'url2', - thumbUrl: 'thumb2', - user: 'user2', - userProfileUrl: 'user2-url' - }]); - - expect(images!).toEqual([ - new StockPhotoDto('url1', 'thumb1', 'user1', 'user1-url'), - new StockPhotoDto('url2', 'thumb2', 'user2', 'user2-url') - ]); - })); + let images: ReadonlyArray; + + stockPhotoService.getImages('my-query').subscribe(result => { + images = result; + }); + + const req = httpMock.expectOne('https://stockphoto.squidex.io/?query=my-query&pageSize=100'); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush([{ + url: 'url1', + thumbUrl: 'thumb1', + user: 'user1', + userProfileUrl: 'user1-url', + }, { + url: 'url2', + thumbUrl: 'thumb2', + user: 'user2', + userProfileUrl: 'user2-url', + }]); + + expect(images!).toEqual([ + new StockPhotoDto('url1', 'thumb1', 'user1', 'user1-url'), + new StockPhotoDto('url2', 'thumb2', 'user2', 'user2-url'), + ]); + })); it('should return empty stock photos if get request fails', inject([StockPhotoService, HttpTestingController], (stockPhotoService: StockPhotoService, httpMock: HttpTestingController) => { + let images: ReadonlyArray; - let images: ReadonlyArray; + stockPhotoService.getImages('my-query').subscribe(result => { + images = result; + }); - stockPhotoService.getImages('my-query').subscribe(result => { - images = result; - }); - - const req = httpMock.expectOne('https://stockphoto.squidex.io/?query=my-query&pageSize=100'); + const req = httpMock.expectOne('https://stockphoto.squidex.io/?query=my-query&pageSize=100'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.error({}); + req.error({}); - expect(images!).toEqual([]); - })); -}); \ No newline at end of file + expect(images!).toEqual([]); + })); +}); diff --git a/frontend/app/shared/services/stock-photo.service.ts b/frontend/app/shared/services/stock-photo.service.ts index d20fd383f..e9cec8b83 100644 --- a/frontend/app/shared/services/stock-photo.service.ts +++ b/frontend/app/shared/services/stock-photo.service.ts @@ -11,11 +11,11 @@ import { Observable, of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; export class StockPhotoDto { - constructor ( + constructor( public readonly url: string, public readonly thumbUrl: string, public readonly user: string, - public readonly userProfileUrl: string + public readonly userProfileUrl: string, ) { } } @@ -23,7 +23,7 @@ export class StockPhotoDto { @Injectable() export class StockPhotoService { constructor( - private readonly http: HttpClient + private readonly http: HttpClient, ) { } @@ -37,9 +37,9 @@ export class StockPhotoService { x.url, x.thumbUrl, x.user, - x.userProfileUrl + x.userProfileUrl, )); }), catchError(() => of([]))); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/translations.service.spec.ts b/frontend/app/shared/services/translations.service.spec.ts index b218b2a85..6736b22fc 100644 --- a/frontend/app/shared/services/translations.service.spec.ts +++ b/frontend/app/shared/services/translations.service.spec.ts @@ -13,12 +13,12 @@ describe('TranslationsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ TranslationsService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -28,24 +28,23 @@ describe('TranslationsService', () => { it('should make post request to translate text', inject([TranslationsService, HttpTestingController], (translationsService: TranslationsService, httpMock: HttpTestingController) => { + const dto = { text: 'Hello', sourceLanguage: 'en', targetLanguage: 'de' }; - const dto = { text: 'Hello', sourceLanguage: 'en', targetLanguage: 'de' }; + let translation: TranslationDto; - let translation: TranslationDto; + translationsService.translate('my-app', dto).subscribe(result => { + translation = result; + }); - translationsService.translate('my-app', dto).subscribe(result => { - translation = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/translations'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/translations'); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush({ + text: 'Hallo', result: 'Translated', + }); - req.flush({ - text: 'Hallo', result: 'Translated' - }); - - expect(translation!).toEqual(new TranslationDto('Translated', 'Hallo')); - })); -}); \ No newline at end of file + expect(translation!).toEqual(new TranslationDto('Translated', 'Hallo')); + })); +}); diff --git a/frontend/app/shared/services/translations.service.ts b/frontend/app/shared/services/translations.service.ts index fda1e355c..0ad3c97bb 100644 --- a/frontend/app/shared/services/translations.service.ts +++ b/frontend/app/shared/services/translations.service.ts @@ -14,19 +14,19 @@ import { map } from 'rxjs/operators'; export class TranslationDto { constructor( public readonly result: string, - public readonly text: string + public readonly text: string, ) { } } export type TranslateDto = - Readonly<{ text: string; sourceLanguage: string; targetLanguage: string; }>; + Readonly<{ text: string; sourceLanguage: string; targetLanguage: string }>; @Injectable() export class TranslationsService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -39,4 +39,4 @@ export class TranslationsService { }), pretifyError('i18n:translate.translateFailed')); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/ui.service.spec.ts b/frontend/app/shared/services/ui.service.spec.ts index 4dcf519bd..42940d296 100644 --- a/frontend/app/shared/services/ui.service.spec.ts +++ b/frontend/app/shared/services/ui.service.spec.ts @@ -13,12 +13,12 @@ describe('UIService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ UIService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -28,165 +28,155 @@ describe('UIService', () => { it('should make get request to get common settings', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + let settings: UISettingsDto; - let settings: UISettingsDto; - - uiService.getCommonSettings().subscribe(result => { - settings = result; - }); + uiService.getCommonSettings().subscribe(result => { + settings = result; + }); - const response: UISettingsDto = { canCreateApps: true }; + const response: UISettingsDto = { canCreateApps: true }; - const req = httpMock.expectOne('http://service/p/api/ui/settings'); + const req = httpMock.expectOne('http://service/p/api/ui/settings'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(response); + req.flush(response); - expect(settings!).toEqual(response); - })); + expect(settings!).toEqual(response); + })); it('should return default common settings if error occurs', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + let settings: {}; - let settings: {}; + uiService.getCommonSettings().subscribe(result => { + settings = result; + }); - uiService.getCommonSettings().subscribe(result => { - settings = result; - }); - - const req = httpMock.expectOne('http://service/p/api/ui/settings'); + const req = httpMock.expectOne('http://service/p/api/ui/settings'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.error(new ErrorEvent('500')); + req.error(new ErrorEvent('500')); - expect(settings!).toEqual({ mapType: 'OSM', mapKey: '', canCreateApps: true }); - })); + expect(settings!).toEqual({ mapType: 'OSM', mapKey: '', canCreateApps: true }); + })); it('should make get request to get shared settings', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + let settings: {}; - let settings: {}; + uiService.getSharedSettings('my-app').subscribe(result => { + settings = result; + }); - uiService.getSharedSettings('my-app').subscribe(result => { - settings = result; - }); - - const response = { mapType: 'OSM', mapKey: '' }; + const response = { mapType: 'OSM', mapKey: '' }; - const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(response); + req.flush(response); - expect(settings!).toEqual(response); - })); + expect(settings!).toEqual(response); + })); it('should return default shared settings if error occurs', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + let settings: {}; - let settings: {}; + uiService.getSharedSettings('my-app').subscribe(result => { + settings = result; + }); - uiService.getSharedSettings('my-app').subscribe(result => { - settings = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.error(new ErrorEvent('500')); - req.error(new ErrorEvent('500')); - - expect(settings!).toBeDefined(); - })); + expect(settings!).toBeDefined(); + })); it('should make get request to get user settings', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + let settings: {}; - let settings: {}; + uiService.getUserSettings('my-app').subscribe(result => { + settings = result; + }); - uiService.getUserSettings('my-app').subscribe(result => { - settings = result; - }); + const response = { mapType: 'OSM', mapKey: '' }; - const response = { mapType: 'OSM', mapKey: '' }; + const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/me'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/me'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush(response); - req.flush(response); - - expect(settings!).toEqual(response); - })); + expect(settings!).toEqual(response); + })); it('should return default user settings if error occurs', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + let settings: {}; - let settings: {}; + uiService.getUserSettings('my-app').subscribe(result => { + settings = result; + }); - uiService.getUserSettings('my-app').subscribe(result => { - settings = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/me'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/me'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.error(new ErrorEvent('500')); - req.error(new ErrorEvent('500')); - - expect(settings!).toBeDefined(); - })); + expect(settings!).toBeDefined(); + })); it('should make put request to set shared value', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + uiService.putSharedSetting('my-app', 'root.nested', 123).subscribe(); - uiService.putSharedSetting('my-app', 'root.nested', 123).subscribe(); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/root.nested'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/root.nested'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); - })); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); + })); it('should make put request to set user value', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + uiService.putUserSetting('my-app', 'root.nested', 123).subscribe(); - uiService.putUserSetting('my-app', 'root.nested', 123).subscribe(); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/me/root.nested'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/me/root.nested'); - - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toBeNull(); - })); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toBeNull(); + })); it('should make delete request to remove shared value', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + uiService.deleteSharedSetting('my-app', 'root.nested').subscribe(); - uiService.deleteSharedSetting('my-app', 'root.nested').subscribe(); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/root.nested'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/root.nested'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBeNull(); - })); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBeNull(); + })); it('should make delete request to remove user value', inject([UIService, HttpTestingController], (uiService: UIService, httpMock: HttpTestingController) => { + uiService.deleteUserSetting('my-app', 'root.nested').subscribe(); - uiService.deleteUserSetting('my-app', 'root.nested').subscribe(); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/me/root.nested'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/ui/settings/me/root.nested'); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toBeNull(); - })); -}); \ No newline at end of file + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toBeNull(); + })); +}); diff --git a/frontend/app/shared/services/ui.service.ts b/frontend/app/shared/services/ui.service.ts index 79e45f4ed..a73655e83 100644 --- a/frontend/app/shared/services/ui.service.ts +++ b/frontend/app/shared/services/ui.service.ts @@ -18,12 +18,12 @@ export type UISettingsDto = export class UIService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } public getCommonSettings(): Observable { - const url = this.apiUrl.buildUrl(`api/ui/settings`); + const url = this.apiUrl.buildUrl('api/ui/settings'); return this.http.get(url).pipe( catchError(() => { @@ -72,4 +72,4 @@ export class UIService { return this.http.delete(url); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/usages.service.spec.ts b/frontend/app/shared/services/usages.service.spec.ts index 9025b9455..37ba0aacd 100644 --- a/frontend/app/shared/services/usages.service.spec.ts +++ b/frontend/app/shared/services/usages.service.spec.ts @@ -13,12 +13,12 @@ describe('UsagesService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ UsagesService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -28,124 +28,120 @@ describe('UsagesService', () => { it('should make get request to get calls usages', inject([UsagesService, HttpTestingController], (usagesService: UsagesService, httpMock: HttpTestingController) => { - - let usages: CallsUsageDto; - - usagesService.getCallsUsages('my-app', '2017-10-12', '2017-10-13').subscribe(result => { - usages = result; - }); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/usages/calls/2017-10-12/2017-10-13'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush({ - allowedBytes: 512, - allowedCalls: 100, - blockingCalls: 200, - totalBytes: 1024, - totalCalls: 40, - monthCalls: 5120, - monthBytes: 256, - averageElapsedMs: 12.4, - details: { - category1: [ - { - date: '2017-10-12', - totalBytes: 10, - totalCalls: 130, - averageElapsedMs: 12.3 - }, - { - date: '2017-10-13', - totalBytes: 13, - totalCalls: 170, - averageElapsedMs: 33.3 - } - ] - } - }); - - expect(usages!).toEqual( - new CallsUsageDto(512, 100, 200, 1024, 40, 256, 5120, 12.4, { - category1: [ - new CallsUsagePerDateDto(DateTime.parseISO('2017-10-12'), 10, 130, 12.3), - new CallsUsagePerDateDto(DateTime.parseISO('2017-10-13'), 13, 170, 33.3) - ] - }) - ); - })); + let usages: CallsUsageDto; + + usagesService.getCallsUsages('my-app', '2017-10-12', '2017-10-13').subscribe(result => { + usages = result; + }); + + const req = httpMock.expectOne('http://service/p/api/apps/my-app/usages/calls/2017-10-12/2017-10-13'); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush({ + allowedBytes: 512, + allowedCalls: 100, + blockingCalls: 200, + totalBytes: 1024, + totalCalls: 40, + monthCalls: 5120, + monthBytes: 256, + averageElapsedMs: 12.4, + details: { + category1: [ + { + date: '2017-10-12', + totalBytes: 10, + totalCalls: 130, + averageElapsedMs: 12.3, + }, + { + date: '2017-10-13', + totalBytes: 13, + totalCalls: 170, + averageElapsedMs: 33.3, + }, + ], + }, + }); + + expect(usages!).toEqual( + new CallsUsageDto(512, 100, 200, 1024, 40, 256, 5120, 12.4, { + category1: [ + new CallsUsagePerDateDto(DateTime.parseISO('2017-10-12'), 10, 130, 12.3), + new CallsUsagePerDateDto(DateTime.parseISO('2017-10-13'), 13, 170, 33.3), + ], + }), + ); + })); it('should make get request to get storage usages', inject([UsagesService, HttpTestingController], (usagesService: UsagesService, httpMock: HttpTestingController) => { - - let usages: ReadonlyArray; - - usagesService.getStorageUsages('my-app', '2017-10-12', '2017-10-13').subscribe(result => { - usages = result; - }); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/usages/storage/2017-10-12/2017-10-13'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush([ - { - date: '2017-10-12', - totalCount: 10, - totalSize: 130 - }, - { - date: '2017-10-13', - totalCount: 13, - totalSize: 170 - } - ]); - - expect(usages!).toEqual( - [ - new StorageUsagePerDateDto(DateTime.parseISO('2017-10-12'), 10, 130), - new StorageUsagePerDateDto(DateTime.parseISO('2017-10-13'), 13, 170) + let usages: ReadonlyArray; + + usagesService.getStorageUsages('my-app', '2017-10-12', '2017-10-13').subscribe(result => { + usages = result; + }); + + const req = httpMock.expectOne('http://service/p/api/apps/my-app/usages/storage/2017-10-12/2017-10-13'); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush([ + { + date: '2017-10-12', + totalCount: 10, + totalSize: 130, + }, + { + date: '2017-10-13', + totalCount: 13, + totalSize: 170, + }, ]); - })); + + expect(usages!).toEqual( + [ + new StorageUsagePerDateDto(DateTime.parseISO('2017-10-12'), 10, 130), + new StorageUsagePerDateDto(DateTime.parseISO('2017-10-13'), 13, 170), + ]); + })); it('should make get request to get today storage', inject([UsagesService, HttpTestingController], (usagesService: UsagesService, httpMock: HttpTestingController) => { + let usages: CurrentStorageDto; - let usages: CurrentStorageDto; - - usagesService.getTodayStorage('my-app').subscribe(result => { - usages = result; - }); + usagesService.getTodayStorage('my-app').subscribe(result => { + usages = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/usages/storage/today'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/usages/storage/today'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush({ size: 130, maxAllowed: 150 }); + req.flush({ size: 130, maxAllowed: 150 }); - expect(usages!).toEqual(new CurrentStorageDto(130, 150)); - })); + expect(usages!).toEqual(new CurrentStorageDto(130, 150)); + })); it('should make get request to get log', inject([UsagesService, HttpTestingController], (usagesService: UsagesService, httpMock: HttpTestingController) => { + let url: string; - let url: string; + usagesService.getLog('my-app').subscribe(result => { + url = result; + }); - usagesService.getLog('my-app').subscribe(result => { - url = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/usages/log'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/usages/log'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush({ downloadUrl: 'download/url' }); - req.flush({ downloadUrl: 'download/url' }); - - expect(url!).toEqual('download/url'); - })); -}); \ No newline at end of file + expect(url!).toEqual('download/url'); + })); +}); diff --git a/frontend/app/shared/services/usages.service.ts b/frontend/app/shared/services/usages.service.ts index b0e98e4bc..ab8764493 100644 --- a/frontend/app/shared/services/usages.service.ts +++ b/frontend/app/shared/services/usages.service.ts @@ -21,7 +21,7 @@ export class CallsUsageDto { public readonly monthBytes: number, public readonly monthCalls: number, public readonly averageElapsedMs: number, - public readonly details: { [category: string]: ReadonlyArray } + public readonly details: { [category: string]: ReadonlyArray }, ) { } } @@ -31,7 +31,7 @@ export class CallsUsagePerDateDto { public readonly date: DateTime, public readonly totalBytes: number, public readonly totalCalls: number, - public readonly averageElapsedMs: number + public readonly averageElapsedMs: number, ) { } } @@ -40,7 +40,7 @@ export class StorageUsagePerDateDto { constructor( public readonly date: DateTime, public readonly totalCount: number, - public readonly totalSize: number + public readonly totalSize: number, ) { } } @@ -48,7 +48,7 @@ export class StorageUsagePerDateDto { export class CurrentStorageDto { constructor( public readonly size: number, - public readonly maxAllowed: number + public readonly maxAllowed: number, ) { } } @@ -57,7 +57,7 @@ export class CurrentStorageDto { export class UsagesService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -129,4 +129,4 @@ export class UsagesService { }), pretifyError('i18n:usages.loadStorageFailed')); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/users-provider.service.spec.ts b/frontend/app/shared/services/users-provider.service.spec.ts index d2685929a..5d69c67fd 100644 --- a/frontend/app/shared/services/users-provider.service.spec.ts +++ b/frontend/app/shared/services/users-provider.service.spec.ts @@ -61,7 +61,7 @@ describe('UsersProviderService', () => { const user = new UserDto('123', 'User1'); authService.setup(x => x.user) - .returns(() => new Profile({ profile: { sub: '123'}})); + .returns(() => new Profile({ profile: { sub: '123' } })); usersService.setup(x => x.getUser('123')) .returns(() => of(user)).verifiable(Times.once()); @@ -79,7 +79,7 @@ describe('UsersProviderService', () => { it('should return invalid user if not found', () => { authService.setup(x => x.user) - .returns(() => new Profile({ profile: { sub: '123'}})); + .returns(() => new Profile({ profile: { sub: '123' } })); usersService.setup(x => x.getUser('123')) .returns(() => throwError('Service Error')).verifiable(Times.once()); @@ -94,4 +94,4 @@ describe('UsersProviderService', () => { usersService.verifyAll(); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/services/users-provider.service.ts b/frontend/app/shared/services/users-provider.service.ts index 87f29e36d..8df9e40fc 100644 --- a/frontend/app/shared/services/users-provider.service.ts +++ b/frontend/app/shared/services/users-provider.service.ts @@ -17,7 +17,7 @@ export class UsersProviderService { constructor( private readonly usersService: UsersService, - private readonly authService: AuthService + private readonly authService: AuthService, ) { } @@ -34,6 +34,7 @@ export class UsersProviderService { (>request).connect(); + // eslint-disable-next-line no-multi-assign result = this.caches[id] = request; } @@ -46,4 +47,4 @@ export class UsersProviderService { }), share()); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/users.service.spec.ts b/frontend/app/shared/services/users.service.spec.ts index e35cc7642..ddbf9d328 100644 --- a/frontend/app/shared/services/users.service.spec.ts +++ b/frontend/app/shared/services/users.service.spec.ts @@ -13,12 +13,12 @@ describe('UsersService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ UsersService, - { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') } - ] + { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, + ], }); }); @@ -28,111 +28,107 @@ describe('UsersService', () => { it('should make get request to get many users', inject([UsersService, HttpTestingController], (usersService: UsersService, httpMock: HttpTestingController) => { - - let users: ReadonlyArray; - - usersService.getUsers().subscribe(result => { - users = result; - }); - - const req = httpMock.expectOne('http://service/p/api/users?query='); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush([ - { - id: '123', - displayName: 'User1' - }, - { - id: '456', - displayName: 'User2' - } - ]); - - expect(users!).toEqual( - [ - new UserDto('123', 'User1'), - new UserDto('456', 'User2') + let users: ReadonlyArray; + + usersService.getUsers().subscribe(result => { + users = result; + }); + + const req = httpMock.expectOne('http://service/p/api/users?query='); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush([ + { + id: '123', + displayName: 'User1', + }, + { + id: '456', + displayName: 'User2', + }, ]); - })); + + expect(users!).toEqual( + [ + new UserDto('123', 'User1'), + new UserDto('456', 'User2'), + ]); + })); it('should make get request with query to get many users', inject([UsersService, HttpTestingController], (usersService: UsersService, httpMock: HttpTestingController) => { - - let users: ReadonlyArray; - - usersService.getUsers('my-query').subscribe(result => { - users = result; - }); - - const req = httpMock.expectOne('http://service/p/api/users?query=my-query'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); - - req.flush([ - { - id: '123', - displayName: 'User1' - }, - { - id: '456', - displayName: 'User2' - } - ]); - - expect(users!).toEqual( - [ - new UserDto('123', 'User1'), - new UserDto('456', 'User2') + let users: ReadonlyArray; + + usersService.getUsers('my-query').subscribe(result => { + users = result; + }); + + const req = httpMock.expectOne('http://service/p/api/users?query=my-query'); + + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); + + req.flush([ + { + id: '123', + displayName: 'User1', + }, + { + id: '456', + displayName: 'User2', + }, ]); - })); + + expect(users!).toEqual( + [ + new UserDto('123', 'User1'), + new UserDto('456', 'User2'), + ]); + })); it('should make get request to get single user', inject([UsersService, HttpTestingController], (usersService: UsersService, httpMock: HttpTestingController) => { + let user: UserDto; - let user: UserDto; + usersService.getUser('123').subscribe(result => { + user = result; + }); - usersService.getUser('123').subscribe(result => { - user = result; - }); + const req = httpMock.expectOne('http://service/p/api/users/123'); - const req = httpMock.expectOne('http://service/p/api/users/123'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush({ id: '123', displayName: 'User1' }); - req.flush({ id: '123', displayName: 'User1' }); - - expect(user!).toEqual(new UserDto('123', 'User1')); - })); + expect(user!).toEqual(new UserDto('123', 'User1')); + })); it('should make get request to get resources', inject([UsersService, HttpTestingController], (usersService: UsersService, httpMock: HttpTestingController) => { + let resources: ResourcesDto; - let resources: ResourcesDto; + usersService.getResources().subscribe(result => { + resources = result; + }); - usersService.getResources().subscribe(result => { - resources = result; - }); + const req = httpMock.expectOne('http://service/p/api'); - const req = httpMock.expectOne('http://service/p/api'); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + req.flush({ + _links: { + schemas: { method: 'GET', href: '/api/schemas' }, + }, + }); - req.flush({ - _links: { - schemas: { method: 'GET', href: '/api/schemas' } - } - }); + const expected = new ResourcesDto({ + schemas: { method: 'GET', href: '/api/schemas' }, + }); - const expected = new ResourcesDto({ - schemas: { method: 'GET', href: '/api/schemas' } - }); - - expect(resources!).toEqual(expected); - })); -}); \ No newline at end of file + expect(resources!).toEqual(expected); + })); +}); diff --git a/frontend/app/shared/services/users.service.ts b/frontend/app/shared/services/users.service.ts index d730aab97..2fc0203d3 100644 --- a/frontend/app/shared/services/users.service.ts +++ b/frontend/app/shared/services/users.service.ts @@ -14,7 +14,7 @@ import { map } from 'rxjs/operators'; export class UserDto { constructor( public readonly id: string, - public readonly displayName: string + public readonly displayName: string, ) { } } @@ -31,7 +31,7 @@ export class ResourcesDto { export class UsersService { constructor( private readonly http: HttpClient, - private readonly apiUrl: ApiUrlConfig + private readonly apiUrl: ApiUrlConfig, ) { } @@ -65,7 +65,7 @@ export class UsersService { } public getResources(): Observable { - const url = this.apiUrl.buildUrl(`api`); + const url = this.apiUrl.buildUrl('api'); return this.http.get<{ _links: {} }>(url).pipe( map(({ _links }) => { @@ -73,4 +73,4 @@ export class UsersService { }), pretifyError('i18n:users.loadUserFailed')); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/services/workflows.service.spec.ts b/frontend/app/shared/services/workflows.service.spec.ts index ea95939a3..f01c77722 100644 --- a/frontend/app/shared/services/workflows.service.spec.ts +++ b/frontend/app/shared/services/workflows.service.spec.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable object-property-newline */ + import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { inject, TestBed } from '@angular/core/testing'; import { AnalyticsService, ApiUrlConfig, Resource, Version, WorkflowDto, WorkflowsDto, WorkflowsPayload, WorkflowsService } from '@app/shared/internal'; @@ -15,13 +17,13 @@ describe('WorkflowsService', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ - HttpClientTestingModule + HttpClientTestingModule, ], providers: [ WorkflowsService, { provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }, - { provide: AnalyticsService, useValue: new AnalyticsService() } - ] + { provide: AnalyticsService, useValue: new AnalyticsService() }, + ], }); }); @@ -31,119 +33,115 @@ describe('WorkflowsService', () => { it('should make a get request to get app workflows', inject([WorkflowsService, HttpTestingController], (workflowsService: WorkflowsService, httpMock: HttpTestingController) => { + let workflows: WorkflowsDto; - let workflows: WorkflowsDto; - - workflowsService.getWorkflows('my-app').subscribe(result => { - workflows = result; - }); + workflowsService.getWorkflows('my-app').subscribe(result => { + workflows = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/workflows'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/workflows'); - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-Match')).toBeNull(); + expect(req.request.method).toEqual('GET'); + expect(req.request.headers.get('If-Match')).toBeNull(); - req.flush(workflowsResponse('1', '2'), - { - headers: { - etag: '2' - } - }); + req.flush(workflowsResponse('1', '2'), + { + headers: { + etag: '2', + }, + }); - expect(workflows!).toEqual({ payload: createWorkflows('1', '2'), version: new Version('2') }); - })); + expect(workflows!).toEqual({ payload: createWorkflows('1', '2'), version: new Version('2') }); + })); it('should make a post request to create a workflow', inject([WorkflowsService, HttpTestingController], (workflowsService: WorkflowsService, httpMock: HttpTestingController) => { + let workflows: WorkflowsDto; - let workflows: WorkflowsDto; - - workflowsService.postWorkflow('my-app', { name: 'New' }, version).subscribe(result => { - workflows = result; - }); + workflowsService.postWorkflow('my-app', { name: 'New' }, version).subscribe(result => { + workflows = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/workflows'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/workflows'); - expect(req.request.method).toEqual('POST'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('POST'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(workflowsResponse('1', '2'), { - headers: { - etag: '2' - } - }); + req.flush(workflowsResponse('1', '2'), { + headers: { + etag: '2', + }, + }); - expect(workflows!).toEqual({ payload: createWorkflows('1', '2'), version: new Version('2') }); - })); + expect(workflows!).toEqual({ payload: createWorkflows('1', '2'), version: new Version('2') }); + })); it('should make a put request to update a workflow', inject([WorkflowsService, HttpTestingController], (workflowsService: WorkflowsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + update: { method: 'PUT', href: '/api/apps/my-app/workflows/123' }, + }, + }; - const resource: Resource = { - _links: { - update: { method: 'PUT', href: '/api/apps/my-app/workflows/123' } - } - }; - - let workflows: WorkflowsDto; + let workflows: WorkflowsDto; - workflowsService.putWorkflow('my-app', resource, {}, version).subscribe(result => { - workflows = result; - }); + workflowsService.putWorkflow('my-app', resource, {}, version).subscribe(result => { + workflows = result; + }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/workflows/123'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/workflows/123'); - expect(req.request.method).toEqual('PUT'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + expect(req.request.method).toEqual('PUT'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - req.flush(workflowsResponse('1', '2'), { - headers: { - etag: '2' - } - }); + req.flush(workflowsResponse('1', '2'), { + headers: { + etag: '2', + }, + }); - expect(workflows!).toEqual({ payload: createWorkflows('1', '2'), version: new Version('2') }); - })); + expect(workflows!).toEqual({ payload: createWorkflows('1', '2'), version: new Version('2') }); + })); it('should make a delete request to delete a workflow', inject([WorkflowsService, HttpTestingController], (workflowsService: WorkflowsService, httpMock: HttpTestingController) => { + const resource: Resource = { + _links: { + delete: { method: 'DELETE', href: '/api/apps/my-app/workflows/123' }, + }, + }; - const resource: Resource = { - _links: { - delete: { method: 'DELETE', href: '/api/apps/my-app/workflows/123' } - } - }; + let workflows: WorkflowsDto; - let workflows: WorkflowsDto; + workflowsService.deleteWorkflow('my-app', resource, version).subscribe(result => { + workflows = result; + }); - workflowsService.deleteWorkflow('my-app', resource, version).subscribe(result => { - workflows = result; - }); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/workflows/123'); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/workflows/123'); + expect(req.request.method).toEqual('DELETE'); + expect(req.request.headers.get('If-Match')).toEqual(version.value); - expect(req.request.method).toEqual('DELETE'); - expect(req.request.headers.get('If-Match')).toEqual(version.value); + req.flush(workflowsResponse('1', '2'), { + headers: { + etag: '2', + }, + }); - req.flush(workflowsResponse('1', '2'), { - headers: { - etag: '2' - } - }); - - expect(workflows!).toEqual({ payload: createWorkflows('1', '2'), version: new Version('2') }); - })); + expect(workflows!).toEqual({ payload: createWorkflows('1', '2'), version: new Version('2') }); + })); function workflowsResponse(...names: string[]) { return { errors: [ 'Error1', - 'Error2' + 'Error2', ], items: names.map(workflowResponse), _links: { - create: { method: 'POST', href: '/workflows' } - } + create: { method: 'POST', href: '/workflows' }, + }, }; } @@ -157,23 +155,23 @@ describe('WorkflowsService', () => { [`${name}1`]: { transitions: { [`${name}2`]: { - expression: 'Expression1', roles: ['Role1'] - } + expression: 'Expression1', roles: ['Role1'], + }, }, - color: `${name}1`, noUpdate: true + color: `${name}1`, noUpdate: true, }, [`${name}2`]: { transitions: { [`${name}1`]: { - expression: 'Expression2', roles: ['Role2'] - } + expression: 'Expression2', roles: ['Role2'], + }, }, - color: `${name}2`, noUpdate: true - } + color: `${name}2`, noUpdate: true, + }, }, _links: { - update: { method: 'PUT', href: `/workflows/${name}` } - } + update: { method: 'PUT', href: `/workflows/${name}` }, + }, }; } }); @@ -182,32 +180,32 @@ export function createWorkflows(...names: ReadonlyArray): WorkflowsPaylo return { errors: [ 'Error1', - 'Error2' + 'Error2', ], items: names.map(createWorkflow), _links: { - create: { method: 'POST', href: '/workflows' } + create: { method: 'POST', href: '/workflows' }, }, - canCreate: true + canCreate: true, }; } export function createWorkflow(name: string): WorkflowDto { return new WorkflowDto( { - update: { method: 'PUT', href: `/workflows/${name}` } + update: { method: 'PUT', href: `/workflows/${name}` }, }, `id_${name}`, `name_${name}`, `${name}1`, [ - `schema_${name}` + `schema_${name}`, ], [ { name: `${name}1`, color: `${name}1`, noUpdate: true, isLocked: false }, - { name: `${name}2`, color: `${name}2`, noUpdate: true, isLocked: false } + { name: `${name}2`, color: `${name}2`, noUpdate: true, isLocked: false }, ], [ { from: `${name}1`, to: `${name}2`, expression: 'Expression1', roles: ['Role1'] }, - { from: `${name}2`, to: `${name}1`, expression: 'Expression2', roles: ['Role2'] } + { from: `${name}2`, to: `${name}1`, expression: 'Expression2', roles: ['Role2'] }, ]); } @@ -227,9 +225,9 @@ describe('Workflow', () => { name: null, schemaIds: [], steps: { - '1': { transitions: {}, color: '#00ff00' } + 1: { transitions: {}, color: '#00ff00' }, }, - initial: '1' + initial: '1', }); }); @@ -243,9 +241,9 @@ describe('Workflow', () => { name: null, schemaIds: [], steps: { - '1': { transitions: {}, color: 'red', noUpdate: true } + 1: { transitions: {}, color: 'red', noUpdate: true }, }, - initial: '1' + initial: '1', }); }); @@ -257,7 +255,7 @@ describe('Workflow', () => { expect(workflow.steps).toEqual([ { name: 'a' }, - { name: 'Z' } + { name: 'Z' }, ]); }); @@ -296,15 +294,15 @@ describe('Workflow', () => { name: null, schemaIds: [], steps: { - '2': { + 2: { transitions: { - '3': { expression: '2 === 3' } + 3: { expression: '2 === 3' }, }, - color: '#ff0000' + color: '#ff0000', }, - '3': { transitions: {}, color: '#0000ff' } + 3: { transitions: {}, color: '#0000ff' }, }, - initial: '2' + initial: '2', }); }); @@ -320,10 +318,10 @@ describe('Workflow', () => { name: null, schemaIds: [], steps: { - '2': { transitions: {}, isLocked: true }, - '3': { transitions: {} } + 2: { transitions: {}, isLocked: true }, + 3: { transitions: {} }, }, - initial: '3' + initial: '3', }); }); @@ -351,22 +349,22 @@ describe('Workflow', () => { name: null, schemaIds: [], steps: { - 'a': { + a: { transitions: { - '2': { expression: '1 === 2' } + 2: { expression: '1 === 2' }, }, - color: '#00ff00' + color: '#00ff00', }, - '2': { + 2: { transitions: { - 'a': { expression: '2 === 1' }, - '3': { expression: '2 === 3' } + a: { expression: '2 === 1' }, + 3: { expression: '2 === 3' }, }, - color: '#ff0000' + color: '#ff0000', }, - '3': { transitions: {}, color: '#0000ff' } + 3: { transitions: {}, color: '#0000ff' }, }, - initial: 'a' + initial: 'a', }); }); @@ -382,18 +380,18 @@ describe('Workflow', () => { name: null, schemaIds: [], steps: { - '1': { + 1: { transitions: { - '2': { expression: '1 === 2' } - } + 2: { expression: '1 === 2' }, + }, }, - '2': { + 2: { transitions: { - '1': { expression: '2 === 1' } - } - } + 1: { expression: '2 === 1' }, + }, + }, }, - initial: '1' + initial: '1', }); }); @@ -410,14 +408,14 @@ describe('Workflow', () => { name: null, schemaIds: [], steps: { - '1': { transitions: {}}, - '2': { + 1: { transitions: {} }, + 2: { transitions: { - '1': { expression: '2 === 1' } - } - } + 1: { expression: '2 === 1' }, + }, + }, }, - initial: '1' + initial: '1', }); }); @@ -433,14 +431,14 @@ describe('Workflow', () => { name: null, schemaIds: [], steps: { - '1': { transitions: {} }, - '2': { + 1: { transitions: {} }, + 2: { transitions: { - '1': { expression: '2 !== 1', roles: ['Role'] } - } - } + 1: { expression: '2 !== 1', roles: ['Role'] }, + }, + }, }, - initial: '1' + initial: '1', }); }); @@ -502,10 +500,10 @@ describe('Workflow', () => { name: null, schemaIds: [], steps: { - '1': { transitions: {} }, - '2': { transitions: {} } + 1: { transitions: {} }, + 2: { transitions: {} }, }, - initial: '2' + initial: '2', }); }); @@ -524,4 +522,4 @@ describe('Workflow', () => { expect(workflow.serialize()).toEqual({ name: null, schemaIds: ['1', '2'], steps: {}, initial: null }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/services/workflows.service.ts b/frontend/app/shared/services/workflows.service.ts index 4ed1a8c2a..920255734 100644 --- a/frontend/app/shared/services/workflows.service.ts +++ b/frontend/app/shared/services/workflows.service.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { AnalyticsService, ApiUrlConfig, compareStrings, hasAnyLink, HTTP, mapVersioned, Model, pretifyError, Resource, ResourceLinks, StringHelper, Version, Versioned } from '@app/framework'; @@ -28,7 +26,7 @@ export class WorkflowDto extends Model { public readonly initial: string | null = null, public readonly schemaIds: string[] = [], public readonly steps: WorkflowStep[] = [], - public readonly transitions: WorkflowTransition[] = [] + public readonly transitions: WorkflowTransition[] = [], ) { super(); @@ -175,7 +173,8 @@ export class WorkflowDto extends Model { const s = { ...values, transitions: {} }; for (const transition of this.getTransitions(step)) { - const { from, to, step: _, ...t } = transition; + // eslint-disable-next-line @typescript-eslint/naming-convention + const { to, step: _, from: __, ...t } = transition; s.transitions[to] = t; } @@ -194,7 +193,7 @@ export type WorkflowStep = Readonly<{ name: string } & WorkflowStepValues>; export type WorkflowTransitionValues = - Readonly<{ expression?: string; roles?: string[]; }>; + Readonly<{ expression?: string; roles?: string[] }>; export type WorkflowTransition = Readonly<{ from: string; to: string } & WorkflowTransitionValues>; @@ -206,7 +205,7 @@ export type WorkflowsDto = Versioned; export type WorkflowsPayload = - Readonly<{ items: WorkflowDto[]; errors: string[]; canCreate: boolean; } & Resource>; + Readonly<{ items: WorkflowDto[]; errors: string[]; canCreate: boolean } & Resource>; export type CreateWorkflowDto = Readonly<{ name: string }>; @@ -216,7 +215,7 @@ export class WorkflowsService { constructor( private readonly http: HttpClient, private readonly apiUrl: ApiUrlConfig, - private readonly analytics: AnalyticsService + private readonly analytics: AnalyticsService, ) { } @@ -307,4 +306,4 @@ function parseWorkflow(workflow: any) { } return new WorkflowDto(_links, id, name, initial, schemaIds, steps, transitions); -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/_test-helpers.ts b/frontend/app/shared/state/_test-helpers.ts index c2a4ede5f..444aa15a5 100644 --- a/frontend/app/shared/state/_test-helpers.ts +++ b/frontend/app/shared/state/_test-helpers.ts @@ -63,10 +63,10 @@ function createSchema({ properties, id, fields, fieldsInLists, fieldsInReference type FieldValues = { id?: number; properties: FieldPropertiesDto; - isDisabled?: boolean, - isHidden?: boolean, + isDisabled?: boolean; + isHidden?: boolean; partitioning?: string; - nested?: ReadonlyArray + nested?: ReadonlyArray; }; function createField({ properties, id, partitioning, isDisabled, nested }: FieldValues) { @@ -93,5 +93,5 @@ export const TestValues = { modified, modifier, newVersion, - version -}; \ No newline at end of file + version, +}; diff --git a/frontend/app/shared/state/apps.forms.ts b/frontend/app/shared/state/apps.forms.ts index 686062422..32a3b467d 100644 --- a/frontend/app/shared/state/apps.forms.ts +++ b/frontend/app/shared/state/apps.forms.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable no-useless-escape */ + import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Form, ValidatorsEx } from '@app/framework'; import { AppDto, AppSettingsDto, CreateAppDto, UpdateAppDto, UpdateAppSettingsDto } from './../services/apps.service'; @@ -16,9 +18,9 @@ export class CreateAppForm extends Form { [ Validators.required, Validators.maxLength(40), - ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'i18n:apps.appNameValidationMessage') - ] - ] + ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'i18n:apps.appNameValidationMessage'), + ], + ], })); } } @@ -28,10 +30,10 @@ export class UpdateAppForm extends Form { super(formBuilder.group({ label: ['', [ - Validators.maxLength(40) - ] + Validators.maxLength(40), + ], ], - description: '' + description: '', })); } } @@ -54,13 +56,13 @@ export class EditAppSettingsForm extends Form { it('should update selected app if reloaded', () => { const newApps = [ createApp(1, '_new'), - createApp(2, '_new') + createApp(2, '_new'), ]; appsService.setup(x => x.getApps()) @@ -238,4 +238,4 @@ describe('AppsState', () => { expect(appsState.snapshot.selectedApp).toBeNull(); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/apps.state.ts b/frontend/app/shared/state/apps.state.ts index 3e2b2bfa5..93ce2beb6 100644 --- a/frontend/app/shared/state/apps.state.ts +++ b/frontend/app/shared/state/apps.state.ts @@ -43,12 +43,13 @@ export class AppsState extends State { constructor( private readonly appsService: AppsService, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super({ apps: [], selectedApp: null, - selectedSettings: null}, 'Apps'); + selectedSettings: null, + }, 'Apps'); } public reloadApps() { @@ -215,4 +216,4 @@ export class AppsState extends State { return { ...s, apps, selectedApp }; }, 'Updated'); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/asset-uploader.state.spec.ts b/frontend/app/shared/state/asset-uploader.state.spec.ts index 8f246799c..adecb7d33 100644 --- a/frontend/app/shared/state/asset-uploader.state.spec.ts +++ b/frontend/app/shared/state/asset-uploader.state.spec.ts @@ -15,7 +15,7 @@ import { TestValues } from './_test-helpers'; describe('AssetUploaderState', () => { const { app, - appsState + appsState, } = TestValues; let assetsService: IMock; @@ -180,4 +180,4 @@ describe('AssetUploaderState', () => { expect(upload.progress).toBe(100); expect(uploadedAsset!).toEqual(updated); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/asset-uploader.state.ts b/frontend/app/shared/state/asset-uploader.state.ts index bb960c053..ef35dc15b 100644 --- a/frontend/app/shared/state/asset-uploader.state.ts +++ b/frontend/app/shared/state/asset-uploader.state.ts @@ -48,7 +48,7 @@ export class AssetUploaderState extends State { constructor( private readonly appsState: AppsState, private readonly assetsService: AssetsService, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super({ uploads: [] }, 'AssetUploader'); } @@ -66,7 +66,7 @@ export class AssetUploaderState extends State { public uploadFile(file: File, target?: AssetsState, parentId?: string): Observable { const stream = this.assetsService.postAssetFile(this.appName, file, parentId ?? target?.parentId); - return this.upload(stream, MathHelper.guid(), file.name, asset => { + return this.upload(stream, MathHelper.guid(), file.name, asset => { if (asset.isDuplicate) { this.dialogs.notifyError('i18n:assets.duplicateFile'); } else if (target) { @@ -92,12 +92,10 @@ export class AssetUploaderState extends State { map(event => { if (Types.isNumber(event)) { return event; + } else if (complete) { + return complete(event); } else { - if (complete) { - return complete(event); - } else { - return event; - } + return event; } }), publishReplay(), refCount()); @@ -124,7 +122,6 @@ export class AssetUploaderState extends State { return { ...s, uploads }; }, 'Upload Done'); - }, 10000); return upload; @@ -153,4 +150,4 @@ export class AssetUploaderState extends State { private get appName() { return this.appsState.appName; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/assets.forms.spec.ts b/frontend/app/shared/state/assets.forms.spec.ts index 8d795ab6f..07782dd3e 100644 --- a/frontend/app/shared/state/assets.forms.spec.ts +++ b/frontend/app/shared/state/assets.forms.spec.ts @@ -15,16 +15,16 @@ describe('AnnotateAssetForm', () => { slug: 'my-file.png', tags: [ 'Tag1', - 'Tag2' + 'Tag2', ], isProtected: false, metadata: { key1: null, key2: 'String', key3: 13, - key4: true + key4: true, }, - fileName: 'My File.png' + fileName: 'My File.png', }; beforeEach(() => { @@ -68,7 +68,7 @@ describe('AnnotateAssetForm', () => { { name: 'key1', value: '' }, { name: 'key2', value: 'String' }, { name: 'key3', value: '13' }, - { name: 'key4', value: 'true' } + { name: 'key4', value: 'true' }, ]); }); @@ -93,8 +93,8 @@ describe('AnnotateAssetForm', () => { it('should remove previous metadata if loaded', () => { const newAsset: any = { metadata: { - key1: 'Value' - } + key1: 'Value', + }, }; form.load(newAsset); @@ -102,7 +102,7 @@ describe('AnnotateAssetForm', () => { const metadata = form.metadata.value; expect(metadata).toEqual([ - { name: 'key1', value: 'Value' } + { name: 'key1', value: 'Value' }, ]); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/assets.forms.ts b/frontend/app/shared/state/assets.forms.ts index 06a29e294..b5e3beff8 100644 --- a/frontend/app/shared/state/assets.forms.ts +++ b/frontend/app/shared/state/assets.forms.ts @@ -19,30 +19,30 @@ export class AnnotateAssetForm extends Form { const { app, appsState, - newVersion + newVersion, } = TestValues; const asset1 = createAsset(1, ['tag1', 'shared']); @@ -374,4 +374,4 @@ describe('AssetsState', () => { expect(assetsState.snapshot.folders.length).toBe(1); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/assets.state.ts b/frontend/app/shared/state/assets.state.ts index b451096b7..eee71810b 100644 --- a/frontend/app/shared/state/assets.state.ts +++ b/frontend/app/shared/state/assets.state.ts @@ -13,11 +13,11 @@ import { AnnotateAssetDto, AssetDto, AssetFolderDto, AssetFoldersDto, AssetsServ import { AppsState } from './apps.state'; import { Query } from './query'; -export type AssetPathItem = { id: string, folderName: string }; +export type AssetPathItem = { id: string; folderName: string }; export type TagsAvailable = { [name: string]: number }; export type TagsSelected = { [name: string]: boolean }; -export type TagItem = { name: string, count: number; }; +export type TagItem = { name: string; count: number }; export const ROOT_ITEM: AssetPathItem = { id: MathHelper.EMPTY_GUID, folderName: 'i18n:assets.specialFolder.root' }; @@ -107,7 +107,7 @@ export abstract class AssetsStateBase extends State { protected constructor(name: string, private readonly appsState: AppsState, private readonly assetsService: AssetsService, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super({ folders: [], @@ -118,7 +118,7 @@ export abstract class AssetsStateBase extends State { path: [ROOT_ITEM], tagsAvailable: {}, tagsSelected: {}, - total: 0 + total: 0, }, name); } @@ -170,7 +170,7 @@ export abstract class AssetsStateBase extends State { isLoading: false, path, tagsAvailable, - total + total, }, 'Loading Success'); }), finalize(() => { @@ -290,7 +290,7 @@ export abstract class AssetsStateBase extends State { return this.dialogs.confirm( 'i18n:assets.deleteReferrerConfirmTitle', 'i18n:assets.deleteReferrerConfirmText', - 'deleteReferencedAsset' + 'deleteReferencedAsset', ).pipe( switchMap(confirmed => { if (confirmed) { @@ -298,7 +298,7 @@ export abstract class AssetsStateBase extends State { } else { return EMPTY; } - }) + }), ); } else { return throwError(error); @@ -336,7 +336,7 @@ export abstract class AssetsStateBase extends State { return this.loadInternal(false); } - public page(paging: { page: number, pageSize: number }) { + public page(paging: { page: number; pageSize: number }) { if (!this.next(paging, 'Loading Paged')) { return EMPTY; } @@ -442,8 +442,8 @@ function createQuery(snapshot: Snapshot) { page, pageSize, query, - tagsSelected - } = snapshot; + tagsSelected, + } = snapshot; const result: any = { take: pageSize, skip: pageSize * page }; @@ -481,7 +481,7 @@ function getSortedTags(tags: { [name: string]: number }) { @Injectable() export class AssetsState extends AssetsStateBase { constructor( - appsState: AppsState, assetsService: AssetsService, dialogs: DialogService + appsState: AppsState, assetsService: AssetsService, dialogs: DialogService, ) { super('Assets', appsState, assetsService, dialogs); } @@ -490,8 +490,8 @@ export class AssetsState extends AssetsStateBase { @Injectable() export class ComponentAssetsState extends AssetsStateBase { constructor( - appsState: AppsState, assetsService: AssetsService, dialogs: DialogService + appsState: AppsState, assetsService: AssetsService, dialogs: DialogService, ) { super('Component Assets', appsState, assetsService, dialogs); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/backups.forms.ts b/frontend/app/shared/state/backups.forms.ts index 61e599486..b2576eb39 100644 --- a/frontend/app/shared/state/backups.forms.ts +++ b/frontend/app/shared/state/backups.forms.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable no-useless-escape */ + import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Form, hasNoValue$, ValidatorsEx } from '@app/framework'; import { StartRestoreDto } from './../services/backups.service'; @@ -17,14 +19,14 @@ export class RestoreForm extends Form { name: ['', [ Validators.maxLength(40), - ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'i18n:apps.appNameValidationMessage') - ] + ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'i18n:apps.appNameValidationMessage'), + ], ], url: ['', [ - Validators.required - ] - ] + Validators.required, + ], + ], })); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/backups.state.spec.ts b/frontend/app/shared/state/backups.state.spec.ts index 940725443..4c23029e8 100644 --- a/frontend/app/shared/state/backups.state.spec.ts +++ b/frontend/app/shared/state/backups.state.spec.ts @@ -15,7 +15,7 @@ import { TestValues } from './_test-helpers'; describe('BackupsState', () => { const { app, - appsState + appsState, } = TestValues; const backup1 = createBackup(12); @@ -123,4 +123,4 @@ describe('BackupsState', () => { dialogs.verify(x => x.notifyInfo(It.isAnyString()), Times.once()); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/backups.state.ts b/frontend/app/shared/state/backups.state.ts index 1ae04a772..e9fbf7120 100644 --- a/frontend/app/shared/state/backups.state.ts +++ b/frontend/app/shared/state/backups.state.ts @@ -48,7 +48,7 @@ export class BackupsState extends State { constructor( private readonly appsState: AppsState, private readonly backupsService: BackupsService, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super({ backups: [] }, 'Backups'); } @@ -76,7 +76,7 @@ export class BackupsState extends State { backups, canCreate, isLoaded: true, - isLoading: false + isLoading: false, }, 'Loading Success'); }), finalize(() => { @@ -104,4 +104,4 @@ export class BackupsState extends State { private get appName() { return this.appsState.appName; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/clients.forms.ts b/frontend/app/shared/state/clients.forms.ts index 790ef653c..76296dd4a 100644 --- a/frontend/app/shared/state/clients.forms.ts +++ b/frontend/app/shared/state/clients.forms.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable no-useless-escape */ + import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Form, hasNoValue$, ValidatorsEx } from '@app/framework'; import { ClientDto, CreateClientDto, UpdateClientDto } from './../services/clients.service'; @@ -14,9 +16,9 @@ export class RenameClientForm extends Form { id: ['', [ Validators.maxLength(40), - ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'i18n:clients.clientIdValidationMessage') - ] - ] + ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'i18n:clients.clientIdValidationMessage'), + ], + ], })); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/clients.state.spec.ts b/frontend/app/shared/state/clients.state.spec.ts index 3497da945..55ef46e63 100644 --- a/frontend/app/shared/state/clients.state.spec.ts +++ b/frontend/app/shared/state/clients.state.spec.ts @@ -17,7 +17,7 @@ describe('ClientsState', () => { app, appsState, newVersion, - version + version, } = TestValues; const oldClients = createClients(1, 2); @@ -134,7 +134,6 @@ describe('ClientsState', () => { function expectNewClients(updated: ClientsPayload) { expect(clientsState.snapshot.clients).toEqual(updated.items); expect(clientsState.snapshot.version).toEqual(newVersion); - } }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/clients.state.ts b/frontend/app/shared/state/clients.state.ts index ea57cd051..4a83a5d9f 100644 --- a/frontend/app/shared/state/clients.state.ts +++ b/frontend/app/shared/state/clients.state.ts @@ -48,7 +48,7 @@ export class ClientsState extends State { constructor( private readonly appsState: AppsState, private readonly clientsService: ClientsService, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super({ clients: [], version: Version.EMPTY }); } @@ -110,7 +110,7 @@ export class ClientsState extends State { clients, isLoaded: true, isLoading: false, - version + version, }, 'Loading Success / Updated'); } @@ -121,4 +121,4 @@ export class ClientsState extends State { private get version() { return this.snapshot.version; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/comments.form.ts b/frontend/app/shared/state/comments.form.ts index d46042fa3..a21394628 100644 --- a/frontend/app/shared/state/comments.form.ts +++ b/frontend/app/shared/state/comments.form.ts @@ -12,7 +12,7 @@ import { UpsertCommentDto } from './../services/comments.service'; export class UpsertCommentForm extends Form { constructor(formBuilder: FormBuilder) { super(formBuilder.group({ - text: '' + text: '', })); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/comments.state.spec.ts b/frontend/app/shared/state/comments.state.spec.ts index 5dad29d20..ee0d29df6 100644 --- a/frontend/app/shared/state/comments.state.spec.ts +++ b/frontend/app/shared/state/comments.state.spec.ts @@ -13,14 +13,14 @@ import { TestValues } from './_test-helpers'; describe('CommentsState', () => { const { creator, - modified + modified, } = TestValues; const commentsUrl = 'my-comments'; const oldComments = new CommentsDto([ new CommentDto('1', modified, 'text1', undefined, creator), - new CommentDto('2', modified, 'text2', undefined, creator) + new CommentDto('2', modified, 'text2', undefined, creator), ], [], [], new Version('1')); let dialogs: IMock; @@ -41,10 +41,10 @@ describe('CommentsState', () => { describe('Loading', () => { it('should load and merge comments', () => { const newComments = new CommentsDto([ - new CommentDto('3', modified, 'text3', undefined, creator) - ], [ - new CommentDto('2', modified, 'text2_2', undefined, creator) - ], ['1'], new Version('2')); + new CommentDto('3', modified, 'text3', undefined, creator), + ], [ + new CommentDto('2', modified, 'text2_2', undefined, creator), + ], ['1'], new Version('2')); commentsService.setup(x => x.getComments(commentsUrl, new Version('-1'))) .returns(() => of(oldComments)).verifiable(); @@ -58,7 +58,7 @@ describe('CommentsState', () => { expect(commentsState.snapshot.isLoaded).toBeTruthy(); expect(commentsState.snapshot.comments).toEqual([ new CommentDto('2', modified, 'text2_2', undefined, creator), - new CommentDto('3', modified, 'text3', undefined, creator) + new CommentDto('3', modified, 'text3', undefined, creator), ]); }); }); @@ -84,7 +84,7 @@ describe('CommentsState', () => { expect(commentsState.snapshot.comments).toEqual([ new CommentDto('1', modified, 'text1', undefined, creator), new CommentDto('2', modified, 'text2', undefined, creator), - new CommentDto('3', modified, 'text3', undefined, creator) + new CommentDto('3', modified, 'text3', undefined, creator), ]); }); @@ -98,7 +98,7 @@ describe('CommentsState', () => { expect(commentsState.snapshot.comments).toEqual([ new CommentDto('1', modified, 'text1', undefined, creator), - new CommentDto('2', modified, 'text2_2', undefined, creator) + new CommentDto('2', modified, 'text2_2', undefined, creator), ]); }); @@ -109,8 +109,8 @@ describe('CommentsState', () => { commentsState.delete(oldComments.createdComments[1]).subscribe(); expect(commentsState.snapshot.comments).toEqual([ - new CommentDto('1', modified, 'text1', undefined, creator) + new CommentDto('1', modified, 'text1', undefined, creator), ]); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/comments.state.ts b/frontend/app/shared/state/comments.state.ts index 403b25c30..0348376ac 100644 --- a/frontend/app/shared/state/comments.state.ts +++ b/frontend/app/shared/state/comments.state.ts @@ -38,7 +38,7 @@ export class CommentsState extends State { private readonly commentsService: CommentsService, private readonly dialogs: DialogService, private readonly orderDescending = false, - initialVersion = -1 + initialVersion = -1, ) { super({ comments: [], version: new Version(initialVersion.toString()) }, 'Comments'); } @@ -116,4 +116,4 @@ export class CommentsState extends State { } const update = (comment: CommentDto, text: string, time: DateTime) => - comment.with({ text, time }); \ No newline at end of file + comment.with({ text, time }); diff --git a/frontend/app/shared/state/contents.forms-helpers.ts b/frontend/app/shared/state/contents.forms-helpers.ts index 44e72cb48..3d2763381 100644 --- a/frontend/app/shared/state/contents.forms-helpers.ts +++ b/frontend/app/shared/state/contents.forms-helpers.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable no-useless-return */ + import { AbstractControl, ValidatorFn } from '@angular/forms'; import { BehaviorSubject, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -37,7 +39,7 @@ export abstract class Hidden { export class FieldSection extends Hidden { constructor( public readonly separator: TSeparator | undefined, - public readonly fields: ReadonlyArray + public readonly fields: ReadonlyArray, ) { super(); } @@ -53,7 +55,7 @@ export class FieldSection extend } } -type Partition = { key: string, isOptional: boolean }; +type Partition = { key: string; isOptional: boolean }; export class PartitionConfig { private readonly invariant: ReadonlyArray = [{ key: fieldInvariant, isOptional: false }]; @@ -76,7 +78,7 @@ export class PartitionConfig { } } -type RuleContext = { data: any, itemData?: any, user?: any }; +type RuleContext = { data: any; itemData?: any; user?: any }; export class CompiledRule { private readonly function: Function; @@ -90,9 +92,10 @@ export class CompiledRule { } constructor( - private readonly rule: FieldRule + private readonly rule: FieldRule, ) { try { + // eslint-disable-next-line @typescript-eslint/no-implied-eval this.function = new Function(`return function(user, ctx, data, itemData) { return ${rule.condition} }`)(); } catch { this.function = () => false; @@ -111,10 +114,10 @@ export class CompiledRule { export type AbstractContentFormState = { isDisabled?: boolean; isHidden?: boolean; - isRequired?: boolean + isRequired?: boolean; }; -export interface FormStructure { +export interface FormGlobals { allRules: ReadonlyArray; partitions: PartitionConfig; schema: SchemaDto; @@ -135,11 +138,11 @@ export abstract class AbstractContentForm { @@ -30,9 +30,9 @@ describe('GetContentValue', () => { const content: any = { referenceData: { field1: { - en: ['url/to/13', 'file13'] - } - } + en: ['url/to/13', 'file13'], + }, + }, }; const assetWithImageAndFileName = createField({ properties: createProperties('Assets', { previewMode: 'ImageAndFileName' }) }); @@ -46,9 +46,9 @@ describe('GetContentValue', () => { const content: any = { referenceData: { field1: { - en: ['url/to/13', 'file13'] - } - } + en: ['url/to/13', 'file13'], + }, + }, }; const assetWithImage = createField({ properties: createProperties('Assets', { previewMode: 'Image' }) }); @@ -62,9 +62,9 @@ describe('GetContentValue', () => { const content: any = { referenceData: { field1: { - en: ['url/to/13', 'file13'] - } - } + en: ['url/to/13', 'file13'], + }, + }, }; const assetWithFileName = createField({ properties: createProperties('Assets', { previewMode: 'FileName' }) }); @@ -78,9 +78,9 @@ describe('GetContentValue', () => { const content: any = { referenceData: { field1: { - en: ['file13'] - } - } + en: ['file13'], + }, + }, }; const result = getContentValue(content, language, fieldAssets); @@ -92,9 +92,9 @@ describe('GetContentValue', () => { const content: any = { referenceData: { field1: { - en: null - } - } + en: null, + }, + }, }; const result = getContentValue(content, language, fieldAssets); @@ -106,9 +106,9 @@ describe('GetContentValue', () => { const content: any = { referenceData: { field1: { - iv: '13' - } - } + iv: '13', + }, + }, }; const result = getContentValue(content, language, fieldInvariant); @@ -121,10 +121,10 @@ describe('GetContentValue', () => { referenceData: { field1: { iv: { - en: '13' - } - } - } + en: '13', + }, + }, + }, }; const result = getContentValue(content, language, fieldInvariant); @@ -137,10 +137,10 @@ describe('GetContentValue', () => { referenceData: { field1: { en: { - en: '13' - } - } - } + en: '13', + }, + }, + }, }; const result = getContentValue(content, language, fieldLocalized); @@ -153,10 +153,10 @@ describe('GetContentValue', () => { referenceData: { field1: { iv: { - en: '13' - } - } - } + en: '13', + }, + }, + }, }; const result = getContentValue(content, language, fieldLocalized); @@ -168,9 +168,9 @@ describe('GetContentValue', () => { const content: any = { data: { field1: { - iv: 13 - } - } + iv: 13, + }, + }, }; const result = getContentValue(content, language, fieldInvariant); @@ -182,9 +182,9 @@ describe('GetContentValue', () => { const content: any = { data: { field1: { - en: 13 - } - } + en: 13, + }, + }, }; const result = getContentValue(content, language, fieldLocalized); @@ -196,9 +196,9 @@ describe('GetContentValue', () => { const content: any = { data: { other: { - en: 13 - } - } + en: 13, + }, + }, }; const result = getContentValue(content, language, fieldLocalized); @@ -210,18 +210,23 @@ describe('GetContentValue', () => { describe('ContentForm', () => { const languages = [ new AppLanguageDto({}, 'en', 'English', true, false, []), - new AppLanguageDto({}, 'de', 'English', false, true, []) + new AppLanguageDto({}, 'de', 'English', false, true, []), ]; const complexSchema = createSchema({ fields: [ createField({ id: 1, properties: createProperties('String'), partitioning: 'invariant' }), createField({ id: 2, properties: createProperties('String'), isDisabled: true }), createField({ id: 3, properties: createProperties('String', { isRequired: true }) }), - createField({ id: 4, properties: createProperties('Array'), partitioning: 'invariant', nested: [ - createNestedField({ id: 41, properties: createProperties('String') }), - createNestedField({ id: 42, properties: createProperties('String', { defaultValue: 'Default' }), isDisabled: true }) - ]}) - ]}); + createField({ + id: 4, + properties: createProperties('Array'), + partitioning: 'invariant', + nested: [ + createNestedField({ id: 41, properties: createProperties('String') }), + createNestedField({ id: 42, properties: createProperties('String', { defaultValue: 'Default' }), isDisabled: true }), + ], + }), + ] }); describe('should resolve partitions', () => { const partitions = new PartitionConfig(languages); @@ -230,7 +235,7 @@ describe('ContentForm', () => { const result = partitions.getAll(createField({ id: 3, properties: createProperties('String'), partitioning: 'invariant' })); expect(result).toEqual([ - { key: 'iv', isOptional: false } + { key: 'iv', isOptional: false }, ]); }); @@ -239,7 +244,7 @@ describe('ContentForm', () => { expect(result).toEqual([ { key: 'en', isOptional: false }, - { key: 'de', isOptional: true } + { key: 'de', isOptional: true }, ]); }); @@ -260,7 +265,7 @@ describe('ContentForm', () => { it('should not enabled disabled fields', () => { const contentForm = createForm([ createField({ id: 1, properties: createProperties('String') }), - createField({ id: 2, properties: createProperties('String'), isDisabled: true }) + createField({ id: 2, properties: createProperties('String'), isDisabled: true }), ]); expectForm(contentForm.form, 'field1', { disabled: false }); @@ -269,7 +274,7 @@ describe('ContentForm', () => { it('should not create required validator for optional language', () => { const contentForm = createForm([ - createField({ id: 3, properties: createProperties('String', { isRequired: true }) }) + createField({ id: 3, properties: createProperties('String', { isRequired: true }) }), ]); expectForm(contentForm.form, 'field3.en', { invalid: true }); @@ -279,9 +284,9 @@ describe('ContentForm', () => { it('should require field based on context condition', () => { const contentForm = createForm([ createField({ id: 1, properties: createProperties('Number'), partitioning: 'invariant' }), - createField({ id: 2, properties: createProperties('Number'), partitioning: 'invariant' }) + createField({ id: 2, properties: createProperties('Number'), partitioning: 'invariant' }), ], [{ - field: 'field1', action: 'Require', condition: 'ctx.value < 100' + field: 'field1', action: 'Require', condition: 'ctx.value < 100', }]); contentForm.setContext({ value: 50 }); @@ -298,9 +303,9 @@ describe('ContentForm', () => { it('should require field based on condition', () => { const contentForm = createForm([ createField({ id: 1, properties: createProperties('Number'), partitioning: 'invariant' }), - createField({ id: 2, properties: createProperties('Number'), partitioning: 'invariant' }) + createField({ id: 2, properties: createProperties('Number'), partitioning: 'invariant' }), ], [{ - field: 'field1', action: 'Require', condition: 'data.field2.iv < 100' + field: 'field1', action: 'Require', condition: 'data.field2.iv < 100', }]); const field1 = contentForm.get('field1')!.get('iv'); @@ -310,8 +315,8 @@ describe('ContentForm', () => { contentForm.load({ field2: { - iv: 120 - } + iv: 120, + }, }); expect(field1!.form.valid).toBeTruthy(); @@ -324,9 +329,9 @@ describe('ContentForm', () => { it('should disable field based on condition', () => { const contentForm = createForm([ createField({ id: 1, properties: createProperties('Number'), partitioning: 'invariant' }), - createField({ id: 2, properties: createProperties('Number'), partitioning: 'invariant' }) + createField({ id: 2, properties: createProperties('Number'), partitioning: 'invariant' }), ], [{ - field: 'field1', action: 'Disable', condition: 'data.field2.iv > 100' + field: 'field1', action: 'Disable', condition: 'data.field2.iv > 100', }]); const field1 = contentForm.get('field1'); @@ -338,11 +343,11 @@ describe('ContentForm', () => { contentForm.load({ field1: { - iv: 120 + iv: 120, }, field2: { - iv: 120 - } + iv: 120, + }, }); expect(field1!.form.disabled).toBeTruthy(); @@ -357,9 +362,9 @@ describe('ContentForm', () => { it('should hide field based on condition', () => { const contentForm = createForm([ createField({ id: 1, properties: createProperties('Number'), partitioning: 'invariant' }), - createField({ id: 2, properties: createProperties('Number'), partitioning: 'invariant' }) + createField({ id: 2, properties: createProperties('Number'), partitioning: 'invariant' }), ], [{ - field: 'field1', action: 'Hide', condition: 'data.field2.iv > 100' + field: 'field1', action: 'Hide', condition: 'data.field2.iv > 100', }]); const field1 = contentForm.get('field1'); @@ -371,11 +376,11 @@ describe('ContentForm', () => { contentForm.load({ field1: { - iv: 120 + iv: 120, }, field2: { - iv: 120 - } + iv: 120, + }, }); expect(field1!.hidden).toBeTruthy(); @@ -385,17 +390,21 @@ describe('ContentForm', () => { expect(field1!.hidden).toBeFalsy(); expect(field1_iv!.hidden).toBeFalsy(); - }); it('should disable nested fields based on condition', () => { const contentForm = createForm([ - createField({ id: 4, properties: createProperties('Array'), partitioning: 'invariant', nested: [ - createNestedField({ id: 41, properties: createProperties('Number') }), - createNestedField({ id: 42, properties: createProperties('Number') }) - ]}) + createField({ + id: 4, + properties: createProperties('Array'), + partitioning: 'invariant', + nested: [ + createNestedField({ id: 41, properties: createProperties('Number') }), + createNestedField({ id: 42, properties: createProperties('Number') }), + ], + }), ], [{ - field: 'field4.nested42', action: 'Disable', condition: 'itemData.nested41 > 100' + field: 'field4.nested42', action: 'Disable', condition: 'itemData.nested41 > 100', }]); const array = contentForm.get(complexSchema.fields[3])!.get(languages[0]) as FieldArrayForm; @@ -404,12 +413,12 @@ describe('ContentForm', () => { field4: { iv: [{ nested41: 120, - nested42: 120 + nested42: 120, }, { nested41: 99, - nested42: 99 - }] - } + nested42: 99, + }], + }, }); expect(array.get(0)!.get('nested42')!.form.disabled).toBeTruthy(); @@ -418,12 +427,17 @@ describe('ContentForm', () => { it('should hide nested fields based on condition', () => { const contentForm = createForm([ - createField({ id: 4, properties: createProperties('Array'), partitioning: 'invariant', nested: [ - createNestedField({ id: 41, properties: createProperties('Number') }), - createNestedField({ id: 42, properties: createProperties('Number') }) - ]}) + createField({ + id: 4, + properties: createProperties('Array'), + partitioning: 'invariant', + nested: [ + createNestedField({ id: 41, properties: createProperties('Number') }), + createNestedField({ id: 42, properties: createProperties('Number') }), + ], + }), ], [{ - field: 'field4.nested42', action: 'Hide', condition: 'itemData.nested41 > 100' + field: 'field4.nested42', action: 'Hide', condition: 'itemData.nested41 > 100', }]); const array = contentForm.get(complexSchema.fields[3])!.get(languages[0]) as FieldArrayForm; @@ -432,12 +446,12 @@ describe('ContentForm', () => { field4: { iv: [{ nested41: 120, - nested42: 120 + nested42: 120, }, { nested41: 99, - nested42: 99 - }] - } + nested42: 99, + }], + }, }); expect(array.get(0)!.get('nested42')!.hidden).toBeTruthy(); @@ -450,16 +464,16 @@ describe('ContentForm', () => { contentForm.load({ field4: { iv: [{ - nested41: 'Text' - }] - } + nested41: 'Text', + }], + }, }); const nestedItem = array.form.get([0])!; expectLength(array, 1); expectForm(nestedItem, 'nested41', { disabled: false, value: 'Text' }); - expectForm(nestedItem, 'nested42', { disabled: true, value: null }); + expectForm(nestedItem, 'nested42', { disabled: true, value: null }); }); it('should add array item', () => { @@ -471,7 +485,7 @@ describe('ContentForm', () => { expectLength(array, 3); expectForm(nestedItem, 'nested41', { disabled: false, value: null }); - expectForm(nestedItem, 'nested42', { disabled: true, value: 'Default' }); + expectForm(nestedItem, 'nested42', { disabled: true, value: 'Default' }); }); it('should sort array item', () => { @@ -512,7 +526,7 @@ describe('ContentForm', () => { it('should not array item if field has no nested fields', () => { const contentForm = createForm([ - createField({ id: 4, properties: createProperties('Array'), partitioning: 'invariant' }) + createField({ id: 4, properties: createProperties('Array'), partitioning: 'invariant' }), ]); const nestedForm = contentForm.form.get('field4.iv') as FormArray; @@ -522,10 +536,15 @@ describe('ContentForm', () => { function createArrayFormWith2Items() { const contentForm = createForm([ - createField({ id: 4, properties: createProperties('Array'), partitioning: 'invariant', nested: [ - createNestedField({ id: 41, properties: createProperties('String') }), - createNestedField({ id: 42, properties: createProperties('String', { defaultValue: 'Default' }), isDisabled: true }) - ]}) + createField({ + id: 4, + properties: createProperties('Array'), + partitioning: 'invariant', + nested: [ + createNestedField({ id: 41, properties: createProperties('String') }), + createNestedField({ id: 42, properties: createProperties('String', { defaultValue: 'Default' }), isDisabled: true }), + ], + }), ]); const array = contentForm.get('field4')!.get('iv') as FieldArrayForm; @@ -533,11 +552,11 @@ describe('ContentForm', () => { contentForm.load({ field4: { iv: [{ - nested41: 'Text1' + nested41: 'Text1', }, { - nested41: 'Text2' - }] - } + nested41: 'Text2', + }], + }, }); return { contentForm, array }; @@ -548,7 +567,7 @@ describe('ContentForm', () => { expect(array.items.length).toBe(length); } - function expectForm(parent: AbstractControl, path: string, test: { invalid?: boolean, disabled?: boolean, value?: any }) { + function expectForm(parent: AbstractControl, path: string, test: { invalid?: boolean; disabled?: boolean; value?: any }) { const form = parent.get(path); if (form) { @@ -568,20 +587,20 @@ describe('ContentForm', () => { it('should return true if new value is not equal to current value', () => { const simpleForm = createForm([ - createField({ id: 1, properties: createProperties('String'), partitioning: 'invariant' }) + createField({ id: 1, properties: createProperties('String'), partitioning: 'invariant' }), ]); - const hasChanged = simpleForm.hasChanges({ field1: { iv: 'other' }}); + const hasChanged = simpleForm.hasChanges({ field1: { iv: 'other' } }); expect(hasChanged).toBeTruthy(); }); it('should return false if new value is same as current value', () => { const simpleForm = createForm([ - createField({ id: 1, properties: createProperties('String'), partitioning: 'invariant' }) + createField({ id: 1, properties: createProperties('String'), partitioning: 'invariant' }), ]); - const hasChanged = simpleForm.hasChanges({ field1: { iv: null }}); + const hasChanged = simpleForm.hasChanges({ field1: { iv: null } }); expect(hasChanged).toBeFalsy(); }); @@ -591,7 +610,7 @@ describe('ContentForm', () => { beforeEach(() => { simpleForm = createForm([ - createField({ id: 1, properties: createProperties('String'), partitioning: 'invariant' }) + createField({ id: 1, properties: createProperties('String'), partitioning: 'invariant' }), ]); }); @@ -600,13 +619,13 @@ describe('ContentForm', () => { }); it('should be an unsaved change if value has changed but not saved', () => { - simpleForm.form.setValue({ field1: { iv: 'Change' }}); + simpleForm.form.setValue({ field1: { iv: 'Change' } }); expect(simpleForm.hasChanged()).toBeTruthy(); }); it('should not be an unsaved change if value has changed and saved', () => { - simpleForm.form.setValue({ field1: { iv: 'Change' }}); + simpleForm.form.setValue({ field1: { iv: 'Change' } }); simpleForm.submit(); simpleForm.submitCompleted(); @@ -614,7 +633,7 @@ describe('ContentForm', () => { }); it('should subscribe to values', () => { - simpleForm.form.setValue({ field1: { iv: 'Change' }}); + simpleForm.form.setValue({ field1: { iv: 'Change' } }); let value: any; @@ -622,7 +641,7 @@ describe('ContentForm', () => { value = v; }); - expect(value).toEqual({ field1: { iv: 'Change' }}); + expect(value).toEqual({ field1: { iv: 'Change' } }); }); }); @@ -631,7 +650,7 @@ describe('ContentForm', () => { beforeEach(() => { simpleForm = createForm([ - createField({ id: 1, properties: createProperties('String'), partitioning: 'invariant' }) + createField({ id: 1, properties: createProperties('String'), partitioning: 'invariant' }), ]); simpleForm.load({ field1: { iv: 'Initial' } }, true); }); @@ -643,7 +662,7 @@ describe('ContentForm', () => { }); it('should be an unsaved change if value has changed but not saved', () => { - simpleForm.form.setValue({ field1: { iv: 'Change' }}); + simpleForm.form.setValue({ field1: { iv: 'Change' } }); expect(simpleForm.hasChanged()).toBeTruthy(); }); @@ -655,7 +674,7 @@ describe('ContentForm', () => { }); it('should not be an unsaved change if value has changed and saved', () => { - simpleForm.form.setValue({ field1: { iv: 'Change' }}); + simpleForm.form.setValue({ field1: { iv: 'Change' } }); simpleForm.submit(); simpleForm.submitCompleted(); @@ -675,4 +694,4 @@ describe('ContentForm', () => { return new EditContentForm(languages, createSchema({ fields, fieldRules }), {}, {}, 0); } -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/contents.forms.ts b/frontend/app/shared/state/contents.forms.ts index de08d717f..9ae74214a 100644 --- a/frontend/app/shared/state/contents.forms.ts +++ b/frontend/app/shared/state/contents.forms.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { Form, getRawValue, Types, UndefinableFormArray, UndefinableFormGroup, valueAll$ } from '@app/framework'; import { BehaviorSubject, Observable } from 'rxjs'; @@ -15,22 +13,20 @@ import { AppLanguageDto } from './../services/app-languages.service'; import { LanguageDto } from './../services/languages.service'; import { FieldDto, RootFieldDto, SchemaDto, TableField } from './../services/schemas.service'; import { ComponentFieldPropertiesDto, fieldInvariant } from './../services/schemas.types'; -import { AbstractContentForm, AbstractContentFormState, CompiledRule, FieldSection, FormStructure as FormGlobals, PartitionConfig } from './contents.forms-helpers'; +import { AbstractContentForm, AbstractContentFormState, CompiledRule, FieldSection, FormGlobals, PartitionConfig } from './contents.forms-helpers'; import { FieldDefaultValue, FieldsValidators } from './contents.forms.visitors'; -export { FieldSection } from './contents.forms-helpers'; - -type SaveQueryFormType = { name: string, user: boolean }; +type SaveQueryFormType = { name: string; user: boolean }; export class SaveQueryForm extends Form { constructor(formBuilder: FormBuilder) { super(formBuilder.group({ name: ['', [ - Validators.required - ] + Validators.required, + ], ], - user: false + user: false, })); } } @@ -40,11 +36,11 @@ export class PatchContentForm extends Form { constructor( private readonly listFields: ReadonlyArray, - private readonly language: AppLanguageDto + private readonly language: AppLanguageDto, ) { super(new FormGroup({})); - this.editableFields = this.listFields.filter(x => Types.is(x, RootFieldDto) && x.isInlineEditable); + this.editableFields = this.listFields.filter(x => Types.is(x, RootFieldDto) && x.isInlineEditable) as any; for (const field of this.editableFields) { const validators = FieldsValidators.create(field, this.language.isOptional); @@ -92,7 +88,7 @@ export class EditContentForm extends Form { } constructor(languages: ReadonlyArray, schema: SchemaDto, schemas: { [id: string ]: SchemaDto }, - private context: any, debounce = 100 + private context: any, debounce = 100, ) { super(new FormGroup({})); @@ -101,12 +97,12 @@ export class EditContentForm extends Form { schema, schemas, partitions: new PartitionConfig(languages), - remoteValidator: this.remoteValidator + remoteValidator: this.remoteValidator, }; const sections: FieldSection[] = []; - let currentSeparator: RootFieldDto | undefined = undefined; + let currentSeparator: RootFieldDto | undefined; let currentFields: FieldForm[] = []; for (const field of schema.fields) { @@ -194,7 +190,7 @@ export class EditContentForm extends Form { this.updateState(this.value); } - public submitCompleted(options?: { newValue?: any, noReset?: boolean }) { + public submitCompleted(options?: { newValue?: any; noReset?: boolean }) { super.submitCompleted(options); this.updateInitialData(); @@ -311,11 +307,11 @@ export class FieldValueForm extends AbstractContentForm { private isRequired = false; constructor(globals: FormGlobals, path: string, field: FieldDto, - isOptional: boolean, partition: string + isOptional: boolean, partition: string, ) { super(globals, path, field, FieldValueForm.buildControl(field, isOptional, partition, globals), - isOptional + isOptional, ); this.isRequired = field.properties.isRequired && !isOptional; @@ -370,11 +366,11 @@ export class FieldArrayForm extends AbstractContentForm extends AbstractContentForm { +export class ObjectForm extends AbstractContentForm { private fields: { [key: string]: FieldItemForm } = {}; private fieldSections: FieldSection[] = []; @@ -497,7 +493,7 @@ export class ObjectForm extends AbstractCont } constructor(globals: FormGlobals, path: string, field: TField, isOptional: boolean, - private readonly partition: string + private readonly partition: string, ) { super(globals, path, field, ObjectForm.buildControl(field, isOptional, true), isOptional); } @@ -517,7 +513,7 @@ export class ObjectForm extends AbstractCont if (schema) { this.form.reset({}); - let currentSeparator: FieldDto | undefined = undefined; + let currentSeparator: FieldDto | undefined; let currentFields: FieldItemForm[] = []; for (const field of schema) { @@ -530,7 +526,6 @@ export class ObjectForm extends AbstractCont currentFields.push(childForm); this.fields[field.name] = childForm; - } else { this.fieldSections.push(new FieldSection(currentSeparator, currentFields)); @@ -649,4 +644,4 @@ function buildForm(globals: FormGlobals, path: string, field: FieldDto, isOption default: return new FieldValueForm(globals, path, field, isOptional, partition); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/contents.forms.visitors.spec.ts b/frontend/app/shared/state/contents.forms.visitors.spec.ts index c877ece58..98ba1b76a 100644 --- a/frontend/app/shared/state/contents.forms.visitors.spec.ts +++ b/frontend/app/shared/state/contents.forms.visitors.spec.ts @@ -5,14 +5,12 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { DateHelper } from '@app/framework'; import { createProperties, DateTime, FieldDefaultValue, FieldFormatter, FieldsValidators, HtmlValue } from '@app/shared/internal'; import { TestValues } from './_test-helpers'; const { - createField + createField, } = TestValues; const now = DateTime.parseISO('2017-10-12T16:30:10Z'); @@ -75,7 +73,7 @@ describe('AssetsField', () => { }); it('should override default value from localizable properties', () => { - const field2 = createField({ properties: createProperties('Assets', { defaultValue: ['1', '2'], defaultValues: { 'iv': null } }) }); + const field2 = createField({ properties: createProperties('Assets', { defaultValue: ['1', '2'], defaultValues: { iv: null } }) }); expect(FieldDefaultValue.get(field2, 'iv')).toBeNull(); }); @@ -155,7 +153,7 @@ describe('BooleanField', () => { }); it('should override default value from localizable properties', () => { - const field2 = createField({ properties: createProperties('Boolean', { defaultValue: true, defaultValues: { 'iv': null } }) }); + const field2 = createField({ properties: createProperties('Boolean', { defaultValue: true, defaultValues: { iv: null } }) }); expect(FieldDefaultValue.get(field2, 'iv')).toBeNull(); }); @@ -205,7 +203,7 @@ describe('DateTimeField', () => { }); it('should override default value from localizable properties', () => { - const field2 = createField({ properties: createProperties('DateTime', { defaultValue: '2017-10-12T16:00:00Z', defaultValues: { 'iv': null } }) }); + const field2 = createField({ properties: createProperties('DateTime', { defaultValue: '2017-10-12T16:00:00Z', defaultValues: { iv: null } }) }); expect(FieldDefaultValue.get(field2, 'iv')).toBeNull(); }); @@ -323,7 +321,7 @@ describe('NumberField', () => { }); it('should override default value from localizable properties', () => { - const field2 = createField({ properties: createProperties('Number', { defaultValue: 13, defaultValues: { 'iv': null } }) }); + const field2 = createField({ properties: createProperties('Number', { defaultValue: 13, defaultValues: { iv: null } }) }); expect(FieldDefaultValue.get(field2, 'iv')).toBeNull(); }); @@ -359,7 +357,7 @@ describe('ReferencesField', () => { }); it('should override default value from localizable properties', () => { - const field2 = createField({ properties: createProperties('References', { defaultValue: ['1', '2'], defaultValues: { 'iv': null } }) }); + const field2 = createField({ properties: createProperties('References', { defaultValue: ['1', '2'], defaultValues: { iv: null } }) }); expect(FieldDefaultValue.get(field2, 'iv')).toBeNull(); }); @@ -405,7 +403,7 @@ describe('StringField', () => { }); it('should override default value from localizable properties', () => { - const field2 = createField({ properties: createProperties('String', { defaultValue: 'MyDefault', defaultValues: { 'iv': null } }) }); + const field2 = createField({ properties: createProperties('String', { defaultValue: 'MyDefault', defaultValues: { iv: null } }) }); expect(FieldDefaultValue.get(field2, 'iv')).toBeNull(); }); @@ -437,7 +435,7 @@ describe('TagsField', () => { }); it('should override default value from localizable properties', () => { - const field2 = createField({ properties: createProperties('Tags', { defaultValue: ['1', '2'], defaultValues: { 'iv': null } }) }); + const field2 = createField({ properties: createProperties('Tags', { defaultValue: ['1', '2'], defaultValues: { iv: null } }) }); expect(FieldDefaultValue.get(field2, 'iv')).toBeNull(); }); @@ -445,4 +443,4 @@ describe('TagsField', () => { function isUtc() { return new Date().getTimezoneOffset() === 0; -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/contents.forms.visitors.ts b/frontend/app/shared/state/contents.forms.visitors.ts index 016b83caf..35d4ef3ec 100644 --- a/frontend/app/shared/state/contents.forms.visitors.ts +++ b/frontend/app/shared/state/contents.forms.visitors.ts @@ -5,9 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length -// tslint:disable: prefer-for-of - import { ValidatorFn, Validators } from '@angular/forms'; import { DateTime, Types, ValidatorsEx } from '@app/framework'; import { ContentDto, ContentReferencesValue } from './../services/contents.service'; @@ -17,14 +14,14 @@ import { ArrayFieldPropertiesDto, AssetsFieldPropertiesDto, BooleanFieldProperti export class HtmlValue { constructor( - public readonly html: string + public readonly html: string, ) { } } export type FieldValue = string | HtmlValue; -export function getContentValue(content: ContentDto, language: LanguageDto, field: RootFieldDto, allowHtml = true): { value: any, formatted: FieldValue } { +export function getContentValue(content: ContentDto, language: LanguageDto, field: RootFieldDto, allowHtml = true): { value: any; formatted: FieldValue } { if (content.referenceData) { const reference = content.referenceData[field.name]; @@ -66,6 +63,7 @@ export function getContentValue(content: ContentDto, language: LanguageDto, fiel } } } else { + // eslint-disable-next-line no-multi-assign value = formatted = '-'; } @@ -101,7 +99,7 @@ export function getContentValue(content: ContentDto, language: LanguageDto, fiel export class FieldFormatter implements FieldPropertiesVisitor { private constructor( private readonly value: any, - private readonly allowHtml: boolean + private readonly allowHtml: boolean, ) { } @@ -229,7 +227,7 @@ export function thumbnail(url: string, width?: number, height?: number) { export class FieldsValidators implements FieldPropertiesVisitor> { private constructor( - private readonly isOptional: boolean + private readonly isOptional: boolean, ) { } @@ -245,7 +243,7 @@ export class FieldsValidators implements FieldPropertiesVisitor { const validators: ValidatorFn[] = [ - ValidatorsEx.betweenLength(properties.minItems, properties.maxItems) + ValidatorsEx.betweenLength(properties.minItems, properties.maxItems), ]; return validators; @@ -253,7 +251,7 @@ export class FieldsValidators implements FieldPropertiesVisitor { const validators: ValidatorFn[] = [ - ValidatorsEx.betweenLength(properties.minItems, properties.maxItems) + ValidatorsEx.betweenLength(properties.minItems, properties.maxItems), ]; if (!properties.allowDuplicates) { @@ -273,7 +271,7 @@ export class FieldsValidators implements FieldPropertiesVisitor { const validators: ValidatorFn[] = [ - ValidatorsEx.betweenLength(properties.minItems, properties.maxItems) + ValidatorsEx.betweenLength(properties.minItems, properties.maxItems), ]; return validators; @@ -293,7 +291,7 @@ export class FieldsValidators implements FieldPropertiesVisitor { const validators: ValidatorFn[] = [ - ValidatorsEx.between(properties.minValue, properties.maxValue) + ValidatorsEx.between(properties.minValue, properties.maxValue), ]; if (properties.allowedValues && properties.allowedValues.length > 0) { @@ -311,7 +309,7 @@ export class FieldsValidators implements FieldPropertiesVisitor { const validators: ValidatorFn[] = [ - ValidatorsEx.betweenLength(properties.minItems, properties.maxItems) + ValidatorsEx.betweenLength(properties.minItems, properties.maxItems), ]; if (!properties.allowDuplicates) { @@ -323,7 +321,7 @@ export class FieldsValidators implements FieldPropertiesVisitor { const validators: ValidatorFn[] = [ - ValidatorsEx.betweenLength(properties.minLength, properties.maxLength) + ValidatorsEx.betweenLength(properties.minLength, properties.maxLength), ]; if (properties.pattern && properties.pattern.length > 0) { @@ -345,7 +343,7 @@ export class FieldsValidators implements FieldPropertiesVisitor { const validators: ValidatorFn[] = [ - ValidatorsEx.betweenLength(properties.minItems, properties.maxItems) + ValidatorsEx.betweenLength(properties.minItems, properties.maxItems), ]; if (properties.allowedValues && properties.allowedValues.length > 0) { @@ -365,7 +363,7 @@ export class FieldsValidators implements FieldPropertiesVisitor { private constructor( private readonly partitionKey: string, - private readonly now?: DateTime + private readonly now?: DateTime, ) { } @@ -440,4 +438,4 @@ export class FieldDefaultValue implements FieldPropertiesVisitor { return value; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/contents.state.ts b/frontend/app/shared/state/contents.state.ts index de76abb3a..89e6f747d 100644 --- a/frontend/app/shared/state/contents.state.ts +++ b/frontend/app/shared/state/contents.state.ts @@ -9,10 +9,10 @@ import { Injectable } from '@angular/core'; import { DialogService, ErrorDto, getPagingInfo, ListState, shareSubscribed, State, Types, Version, Versioned } from '@app/framework'; import { EMPTY, Observable, of } from 'rxjs'; import { catchError, finalize, map, switchMap, tap } from 'rxjs/operators'; -import { BulkResultDto, BulkUpdateJobDto, ContentDto, ContentsDto, ContentsService, StatusInfo } from './../services/contents.service'; +import { BulkResultDto, BulkUpdateJobDto, ContentDto, ContentsDto, ContentsService } from './../services/contents.service'; import { AppsState } from './apps.state'; import { SavedQuery } from './queries'; -import { Query } from './query'; +import { Query, StatusInfo } from './query'; import { SchemasState } from './schemas.state'; interface Snapshot extends ListState { @@ -89,14 +89,14 @@ export abstract class ContentsStateBase extends State { protected constructor(name: string, private readonly appsState: AppsState, private readonly contentsService: ContentsService, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super({ contents: [], page: 0, pageSize: 10, total: 0, - validationResults: {} + validationResults: {}, }, name); } @@ -205,7 +205,7 @@ export abstract class ContentsStateBase extends State { contents, selectedContent, statuses, - total + total, }; }, 'Loading Success'); }), @@ -311,7 +311,7 @@ export abstract class ContentsStateBase extends State { return this.loadInternal(false); } - public page(paging: { page: number, pageSize: number }) { + public page(paging: { page: number; pageSize: number }) { if (!this.next(paging, 'Loading Done')) { return EMPTY; } @@ -336,6 +336,8 @@ export abstract class ContentsStateBase extends State { return { ...s, contents, selectedContent }; }, 'Updated'); } + + return false; } private bulkWithRetry(contents: ReadonlyArray, job: Partial, confirmTitle: string, confirmText: string, confirmKey: string): Observable> { @@ -358,7 +360,7 @@ export abstract class ContentsStateBase extends State { const nonRetried = results.filter(x => !retried.find(y => y.contentId === x.contentId)); return [...nonRetried, ...retried]; - }) + }), ); } else { return of(results); @@ -368,12 +370,13 @@ export abstract class ContentsStateBase extends State { const errors = results.filter(x => !!x.error); if (errors.length > 0) { - const errror = errors[0].error!; + const error = errors[0].error!; if (errors.length >= contents.length) { - throw errror; + // eslint-disable-next-line @typescript-eslint/no-throw-literal + throw error; } else { - this.dialogs.notifyError(errror); + this.dialogs.notifyError(error); } } })); @@ -387,9 +390,9 @@ export abstract class ContentsStateBase extends State { schema: x.schemaName, status: undefined, expectedVersion: parseInt(x.version.value, 10), - ...job + ...job, })), - checkReferrers + checkReferrers, }; return this.contentsService.bulkUpdate(this.appName, this.schemaName, update as any); @@ -405,7 +408,7 @@ function isReferrerError(error?: ErrorDto) { @Injectable() export class ContentsState extends ContentsStateBase { constructor(appsState: AppsState, contentsService: ContentsService, dialogs: DialogService, - private readonly schemasState: SchemasState + private readonly schemasState: SchemasState, ) { super('Contents', appsState, contentsService, dialogs); } @@ -420,7 +423,7 @@ export class ComponentContentsState extends ContentsStateBase { public schema: { name: string }; constructor( - appsState: AppsState, contentsService: ContentsService, dialogs: DialogService + appsState: AppsState, contentsService: ContentsService, dialogs: DialogService, ) { super('Components Contents', appsState, contentsService, dialogs); } @@ -438,9 +441,9 @@ function buildStatusQuery(s: StatusInfo) { const query = { filter: { and: [ - { path: 'status', op: 'eq', value: s.status } - ] - } + { path: 'status', op: 'eq', value: s.status }, + ], + }, }; return ({ name: s.status, color: s.color, query }); diff --git a/frontend/app/shared/state/contributors.forms.ts b/frontend/app/shared/state/contributors.forms.ts index 5d99e13ec..960eef20f 100644 --- a/frontend/app/shared/state/contributors.forms.ts +++ b/frontend/app/shared/state/contributors.forms.ts @@ -18,14 +18,14 @@ export class AssignContributorForm extends Form super(formBuilder.group({ user: [null, [ - Validators.required - ] + Validators.required, + ], ], role: [null, [ - Validators.required - ] - ] + Validators.required, + ], + ], })); } @@ -51,9 +51,9 @@ export class ImportContributorsForm extends Form { app, appsState, newVersion, - version + version, } = TestValues; const allIds: number[] = []; @@ -161,7 +161,7 @@ describe('ContributorsState', () => { error = err; return EMPTY; - }) + }), ).subscribe(); expect(error!.message).toBe('i18n:contributors.userNotFound'); @@ -180,7 +180,7 @@ describe('ContributorsState', () => { error = err; return EMPTY; - }) + }), ).subscribe(); expect(error!.message).toBe('500'); @@ -203,4 +203,4 @@ describe('ContributorsState', () => { expect(contributorsState.snapshot.version).toEqual(newVersion); } }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/contributors.state.ts b/frontend/app/shared/state/contributors.state.ts index 7c12d7e3a..337ee51f6 100644 --- a/frontend/app/shared/state/contributors.state.ts +++ b/frontend/app/shared/state/contributors.state.ts @@ -38,7 +38,7 @@ export class ContributorsState extends State { this.project(x => x.query); public queryRegex = - this.projectFrom(this.query, x => x ? new RegExp(x, 'i') : undefined); + this.projectFrom(this.query, x => (x ? new RegExp(x, 'i') : undefined)); public maxContributors = this.project(x => x.maxContributors); @@ -62,7 +62,7 @@ export class ContributorsState extends State { constructor( private readonly appsState: AppsState, private readonly contributorsService: ContributorsService, - private readonly dialogs: DialogService + private readonly dialogs: DialogService, ) { super({ contributors: [], @@ -70,7 +70,7 @@ export class ContributorsState extends State { page: 0, pageSize: 10, total: 0, - version: Version.EMPTY + version: Version.EMPTY, }, 'Contributors'); } @@ -107,7 +107,7 @@ export class ContributorsState extends State { shareSubscribed(this.dialogs)); } - public page(paging: { page: number, pageSize: number }) { + public page(paging: { page: number; pageSize: number }) { this.next(paging, 'Results Paged'); } @@ -146,7 +146,7 @@ export class ContributorsState extends State { isLoading: false, maxContributors, total: items.length, - version + version, }, 'Loading Success / Updated'); } diff --git a/frontend/app/shared/state/languages.forms.ts b/frontend/app/shared/state/languages.forms.ts index 240a57a9c..1ccf826a9 100644 --- a/frontend/app/shared/state/languages.forms.ts +++ b/frontend/app/shared/state/languages.forms.ts @@ -14,7 +14,7 @@ export class EditLanguageForm extends Form { super(formBuilder.group({ language: [null, [ - Validators.required - ] - ] + Validators.required, + ], + ], })); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/languages.state.spec.ts b/frontend/app/shared/state/languages.state.spec.ts index 879b9b147..c2c0c1a37 100644 --- a/frontend/app/shared/state/languages.state.spec.ts +++ b/frontend/app/shared/state/languages.state.spec.ts @@ -17,7 +17,7 @@ describe('LanguagesState', () => { app, appsState, newVersion, - version + version, } = TestValues; const languageDE = new LanguageDto('de', 'German'); @@ -57,15 +57,15 @@ describe('LanguagesState', () => { languagesState.load().subscribe(); expect(languagesState.snapshot.languages).toEqual([ - { - language: oldLanguages.items[0], - fallbackLanguages: [oldLanguages.items[1]], - fallbackLanguagesNew: [] - }, { - language: oldLanguages.items[1], - fallbackLanguages: [oldLanguages.items[0]], - fallbackLanguagesNew: [] - } + { + language: oldLanguages.items[0], + fallbackLanguages: [oldLanguages.items[1]], + fallbackLanguagesNew: [], + }, { + language: oldLanguages.items[1], + fallbackLanguages: [oldLanguages.items[0]], + fallbackLanguagesNew: [], + }, ]); expect(languagesState.snapshot.allLanguagesNew).toEqual([languageIT, languageES]); expect(languagesState.snapshot.isLoaded).toBeTruthy(); @@ -138,11 +138,11 @@ describe('LanguagesState', () => { { language: updated.items[0], fallbackLanguages: [], - fallbackLanguagesNew: [] - } + fallbackLanguagesNew: [], + }, ]); expect(languagesState.snapshot.allLanguagesNew).toEqual([languageEN, languageIT, languageES]); expect(languagesState.snapshot.version).toEqual(newVersion); } }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/languages.state.ts b/frontend/app/shared/state/languages.state.ts index 003be739a..05f4d50a5 100644 --- a/frontend/app/shared/state/languages.state.ts +++ b/frontend/app/shared/state/languages.state.ts @@ -80,13 +80,13 @@ export class LanguagesState extends State { private readonly appLanguagesService: AppLanguagesService, private readonly appsState: AppsState, private readonly dialogs: DialogService, - private readonly languagesService: LanguagesService + private readonly languagesService: LanguagesService, ) { super({ allLanguages: [], allLanguagesNew: [], languages: [], - version: Version.EMPTY + version: Version.EMPTY, }, 'Languages'); } @@ -160,7 +160,7 @@ export class LanguagesState extends State { isLoaded: true, isLoading: false, languages: languages.map(x => this.createLanguage(x, languages)), - version + version, }; }, 'Loading Success / Updated'); } @@ -199,7 +199,7 @@ export class LanguagesState extends State { .filter(l => language.iso2Code !== l.iso2Code && language.fallback.indexOf(l.iso2Code) < 0) - .sortByString(x => x.englishName) + .sortByString(x => x.englishName), }; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/plans.state.spec.ts b/frontend/app/shared/state/plans.state.spec.ts index b5dadaf6f..908589db0 100644 --- a/frontend/app/shared/state/plans.state.spec.ts +++ b/frontend/app/shared/state/plans.state.spec.ts @@ -18,7 +18,7 @@ describe('PlansState', () => { authService, creator, newVersion, - version + version, } = TestValues; const oldPlans = { @@ -26,9 +26,9 @@ describe('PlansState', () => { planOwner: creator, plans: [ new PlanDto('id1', 'name1', '100€', undefined, 'id1_yearly', '200€', undefined, 1, 1, 1, 1), - new PlanDto('id2', 'name2', '400€', undefined, 'id2_yearly', '800€', undefined, 2, 2, 2, 2) + new PlanDto('id2', 'name2', '400€', undefined, 'id2_yearly', '800€', undefined, 2, 2, 2, 2), ], - hasPortal: true + hasPortal: true, }; let dialogs: IMock; @@ -54,8 +54,8 @@ describe('PlansState', () => { plansState.load().subscribe(); expect(plansState.snapshot.plans).toEqual([ - { isSelected: true, isYearlySelected: false, plan: oldPlans.plans[0] }, - { isSelected: false, isYearlySelected: false, plan: oldPlans.plans[1] } + { isSelected: true, isYearlySelected: false, plan: oldPlans.plans[0] }, + { isSelected: false, isYearlySelected: false, plan: oldPlans.plans[1] }, ]); expect(plansState.snapshot.isOwner).toBeFalsy(); expect(plansState.snapshot.isLoaded).toBeTruthy(); @@ -73,7 +73,7 @@ describe('PlansState', () => { expect(plansState.snapshot.plans).toEqual([ { isSelected: false, isYearlySelected: false, plan: oldPlans.plans[0] }, - { isSelected: false, isYearlySelected: true, plan: oldPlans.plans[1] } + { isSelected: false, isYearlySelected: true, plan: oldPlans.plans[1] }, ]); expect(plansState.snapshot.hasPortal).toBeTruthy(); expect(plansState.snapshot.isLoaded).toBeTruthy(); @@ -126,8 +126,8 @@ describe('PlansState', () => { plansState.change('free').pipe(onErrorResumeNext()).subscribe(); expect(plansState.snapshot.plans).toEqual([ - { isSelected: true, isYearlySelected: false, plan: oldPlans.plans[0] }, - { isSelected: false, isYearlySelected: false, plan: oldPlans.plans[1] } + { isSelected: true, isYearlySelected: false, plan: oldPlans.plans[0] }, + { isSelected: false, isYearlySelected: false, plan: oldPlans.plans[1] }, ]); expect(plansState.window.location.href).toBe(result.redirectUri); expect(plansState.snapshot.version).toEqual(version); @@ -141,10 +141,10 @@ describe('PlansState', () => { expect(plansState.snapshot.plans).toEqual([ { isSelected: false, isYearlySelected: false, plan: oldPlans.plans[0] }, - { isSelected: false, isYearlySelected: true, plan: oldPlans.plans[1] } + { isSelected: false, isYearlySelected: true, plan: oldPlans.plans[1] }, ]); expect(plansState.snapshot.isOwner).toBeTruthy(); expect(plansState.snapshot.version).toEqual(newVersion); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/plans.state.ts b/frontend/app/shared/state/plans.state.ts index 15891c26f..2a412c01e 100644 --- a/frontend/app/shared/state/plans.state.ts +++ b/frontend/app/shared/state/plans.state.ts @@ -74,7 +74,7 @@ export class PlansState extends State { private readonly appsState: AppsState, private readonly authState: AuthService, private readonly dialogs: DialogService, - private readonly plansService: PlansService + private readonly plansService: PlansService, ) { super({ plans: [], version: Version.EMPTY }, 'Plans'); } @@ -105,7 +105,7 @@ export class PlansState extends State { isLoading: false, isOwner: !payload.planOwner || payload.planOwner === this.userId, plans, - version + version, }, 'Loading Success'); }), finalize(() => { @@ -147,6 +147,6 @@ function createPlan(plan: PlanDto, id: string) { return { plan, isSelected: plan.id === id, - isYearlySelected: plan.yearlyId === id + isYearlySelected: plan.yearlyId === id, }; -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/queries.spec.ts b/frontend/app/shared/state/queries.spec.ts index d4d8ee71f..827c53c8a 100644 --- a/frontend/app/shared/state/queries.spec.ts +++ b/frontend/app/shared/state/queries.spec.ts @@ -20,17 +20,17 @@ describe('Queries', () => { uiState = Mock.ofType(); const shared$ = new BehaviorSubject({ - key1: '{ "fullText": "shared1" }' + key1: '{ "fullText": "shared1" }', }); const user$ = new BehaviorSubject({ - key1: '{ "fullText": "user1" }' + key1: '{ "fullText": "user1" }', }); const merged$ = new BehaviorSubject({ key1: '{ "fullText": "merged1" }', key2: 'merged2', - key3: undefined + key3: undefined, }); uiState.setup(x => x.get('schemas.my-schema.queries', {})) @@ -54,12 +54,12 @@ describe('Queries', () => { expect(converted!).toEqual([ { - name: 'key1', query: { fullText: 'merged1' } + name: 'key1', query: { fullText: 'merged1' }, }, { - name: 'key2', query: { fullText: 'merged2' } + name: 'key2', query: { fullText: 'merged2' }, }, { - name: 'key3', query: undefined - } + name: 'key3', query: undefined, + }, ]); }); @@ -72,8 +72,8 @@ describe('Queries', () => { expect(converted!).toEqual([ { - name: 'key1', query: { fullText: 'shared1' } - } + name: 'key1', query: { fullText: 'shared1' }, + }, ]); }); @@ -86,8 +86,8 @@ describe('Queries', () => { expect(converted!).toEqual([ { - name: 'key1', query: { fullText: 'user1' } - } + name: 'key1', query: { fullText: 'user1' }, + }, ]); }); @@ -124,4 +124,4 @@ describe('Queries', () => { uiState.verify(x => x.removeUser('schemas.my-schema.queries.key3'), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/queries.ts b/frontend/app/shared/state/queries.ts index d61d787de..0ae0a406e 100644 --- a/frontend/app/shared/state/queries.ts +++ b/frontend/app/shared/state/queries.ts @@ -24,8 +24,8 @@ export interface SavedQuery { const OLDEST_FIRST: Query = { sort: [ - { path: 'lastModified', order: 'descending' } - ] + { path: 'lastModified', order: 'descending' }, + ], }; export class Queries { @@ -35,12 +35,12 @@ export class Queries { public defaultQueries: ReadonlyArray = [ { name: 'i18n:search.queryAllNewestFirst' }, - { name: 'i18n:search.queryAllOldestFirst', query: OLDEST_FIRST } + { name: 'i18n:search.queryAllOldestFirst', query: OLDEST_FIRST }, ]; constructor( private readonly uiState: UIState, - private readonly prefix: string + private readonly prefix: string, ) { const path = `${prefix}.queries`; @@ -106,4 +106,4 @@ export function parseStored(name: string, raw?: string) { const query = deserializeQuery(raw); return { name, query }; -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/query.spec.ts b/frontend/app/shared/state/query.spec.ts index ef48db84c..d420c9c3e 100644 --- a/frontend/app/shared/state/query.spec.ts +++ b/frontend/app/shared/state/query.spec.ts @@ -14,9 +14,9 @@ describe('equalsQuery', () => { const rhs: Query = { filter: { - and: [] + and: [], }, - sort: [] + sort: [], }; expect(equalsQuery(lhs, rhs)).toBeTruthy(); @@ -25,15 +25,15 @@ describe('equalsQuery', () => { it('should return true if comparing without sort', () => { const lhs: Query = { filter: { - and: [] - } + and: [], + }, }; const rhs: Query = { filter: { - and: [] + and: [], }, - sort: [] + sort: [], }; expect(equalsQuery(lhs, rhs)).toBeTruthy(); @@ -41,14 +41,14 @@ describe('equalsQuery', () => { it('should return true if comparing without filter', () => { const lhs: Query = { - sort: [] + sort: [], }; const rhs: Query = { filter: { - and: [] + and: [], }, - sort: [] + sort: [], }; expect(equalsQuery(lhs, rhs)).toBeTruthy(); @@ -148,4 +148,4 @@ describe('QuerySynchronizer', () => { expect(value).toBeUndefined(); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/query.ts b/frontend/app/shared/state/query.ts index 658aacb19..ffc0a4d26 100644 --- a/frontend/app/shared/state/query.ts +++ b/frontend/app/shared/state/query.ts @@ -5,10 +5,7 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { QueryParams, RouteSynchronizer, Types } from '@app/framework'; -import { StatusInfo } from './../services/contents.service'; import { LanguageDto } from './../services/languages.service'; import { MetaFields, SchemaDto } from './../services/schemas.service'; @@ -23,6 +20,9 @@ export type QueryValueType = 'tags' | 'user'; +export type StatusInfo = + Readonly<{ status: string; color: string }>; + export interface FilterOperator { // The optional display value. name: string; @@ -89,7 +89,7 @@ export interface QuerySorting { export const SORT_MODES: ReadonlyArray = [ 'ascending', - 'descending' + 'descending', ]; export type SortMode = 'ascending' | 'descending'; @@ -113,9 +113,9 @@ export interface Query { const DEFAULT_QUERY = { filter: { - and: [] + and: [], }, - sort: [] + sort: [], }; export class QueryFullTextSynchronizer implements RouteSynchronizer { @@ -129,6 +129,8 @@ export class QueryFullTextSynchronizer implements RouteSynchronizer { if (Types.isString(query)) { return { query: { fullText: query } }; } + + return undefined; } public parseFromState(state: any) { @@ -137,6 +139,8 @@ export class QueryFullTextSynchronizer implements RouteSynchronizer { if (Types.isObject(value) && Types.isString(value.fullText) && value.fullText.length > 0) { return { query: value.fullText }; } + + return undefined; } } @@ -151,6 +155,8 @@ export class QuerySynchronizer implements RouteSynchronizer { if (Types.isString(query)) { return { query: deserializeQuery(query) }; } + + return undefined; } public parseFromState(state: any) { @@ -159,6 +165,8 @@ export class QuerySynchronizer implements RouteSynchronizer { if (Types.isObject(value)) { return { query: serializeQuery(value) }; } + + return undefined; } } @@ -191,7 +199,7 @@ export function encodeQuery(query?: Query | null) { } export function deserializeQuery(raw?: string): Query | undefined { - let query: Query | undefined = undefined; + let query: Query | undefined; try { if (Types.isString(raw)) { @@ -214,116 +222,116 @@ export function hasFilter(query?: Query | null) { const EqualOperators: ReadonlyArray = [ { name: 'i18n:common.queryOperators.eq', value: 'eq' }, - { name: 'i18n:common.queryOperators.ne', value: 'ne' } + { name: 'i18n:common.queryOperators.ne', value: 'ne' }, ]; const CompareOperator: ReadonlyArray = [ { name: 'i18n:common.queryOperators.lt', value: 'lt' }, { name: 'i18n:common.queryOperators.le', value: 'le' }, { name: 'i18n:common.queryOperators.gt', value: 'gt' }, - { name: 'i18n:common.queryOperators.ge', value: 'ge' } + { name: 'i18n:common.queryOperators.ge', value: 'ge' }, ]; const StringOperators: ReadonlyArray = [ { name: 'i18n:common.queryOperators.matchs', value: 'matchs' }, { name: 'i18n:common.queryOperators.startsWith', value: 'startsWith' }, { name: 'i18n:common.queryOperators.endsWith', value: 'endsWith' }, - { name: 'i18n:common.queryOperators.contains', value: 'contains' } + { name: 'i18n:common.queryOperators.contains', value: 'contains' }, ]; const ArrayOperators: ReadonlyArray = [ { name: 'i18n:common.queryOperators.empty', value: 'empty', noValue: true }, - { name: 'i18n:common.queryOperators.exists', value: 'exists', noValue: true } + { name: 'i18n:common.queryOperators.exists', value: 'exists', noValue: true }, ]; const TypeBoolean: QueryFieldModel = { type: 'boolean', - operators: EqualOperators + operators: EqualOperators, }; const TypeDateTime: QueryFieldModel = { type: 'datetime', - operators: [...EqualOperators, ...CompareOperator] + operators: [...EqualOperators, ...CompareOperator], }; const TypeNumber: QueryFieldModel = { type: 'number', - operators: [...EqualOperators, ...CompareOperator] + operators: [...EqualOperators, ...CompareOperator], }; const TypeReference: QueryFieldModel = { type: 'reference', - operators: [...EqualOperators, ...ArrayOperators] + operators: [...EqualOperators, ...ArrayOperators], }; const TypeStatus: QueryFieldModel = { type: 'status', - operators: EqualOperators + operators: EqualOperators, }; const TypeUser: QueryFieldModel = { type: 'user', - operators: EqualOperators + operators: EqualOperators, }; const TypeString: QueryFieldModel = { type: 'string', - operators: [...EqualOperators, ...CompareOperator, ...StringOperators, ...ArrayOperators] + operators: [...EqualOperators, ...CompareOperator, ...StringOperators, ...ArrayOperators], }; const TypeTags: QueryFieldModel = { type: 'string', - operators: EqualOperators + operators: EqualOperators, }; const DEFAULT_FIELDS: QueryModelFields = { created: { ...TypeDateTime, displayName: MetaFields.created, - description: 'i18n:contents.createFieldDescription' + description: 'i18n:contents.createFieldDescription', }, createdBy: { ...TypeUser, displayName: 'meta.createdBy', - description: 'i18n:contents.createdByFieldDescription' + description: 'i18n:contents.createdByFieldDescription', }, lastModified: { ...TypeDateTime, displayName: MetaFields.lastModified, - description: 'i18n:contents.lastModifiedFieldDescription' + description: 'i18n:contents.lastModifiedFieldDescription', }, lastModifiedBy: { ...TypeUser, displayName: 'meta.lastModifiedBy', - description: 'i18n:contents.lastModifiedByFieldDescription' + description: 'i18n:contents.lastModifiedByFieldDescription', }, version: { ...TypeNumber, displayName: MetaFields.version, - description: 'i18n:contents.versionFieldDescription' - } + description: 'i18n:contents.versionFieldDescription', + }, }; export function queryModelFromSchema(schema: SchemaDto, languages: ReadonlyArray, statuses: ReadonlyArray | undefined) { const languagesCodes = languages.map(x => x.iso2Code); const model: QueryModel = { - fields: { ...DEFAULT_FIELDS } + fields: { ...DEFAULT_FIELDS }, }; if (statuses) { model.fields['status'] = { - ...TypeStatus, - displayName: MetaFields.status, - description: 'i18n:contents.statusFieldDescription', - extra: statuses + ...TypeStatus, + displayName: MetaFields.status, + description: 'i18n:contents.statusFieldDescription', + extra: statuses, }; model.fields['newStatus'] = { - ...TypeStatus, - displayName: MetaFields.statusNext, - description: 'i18n:contents.newStatusFieldDescription', - extra: statuses + ...TypeStatus, + displayName: MetaFields.statusNext, + description: 'i18n:contents.newStatusFieldDescription', + extra: statuses, }; } @@ -352,7 +360,7 @@ export function queryModelFromSchema(schema: SchemaDto, languages: ReadonlyArray const infos = { displayName: `${field.name} (${code})`, description: 'i18n:contents.localizedFieldDescription', - fieldName: field.displayName + fieldName: field.displayName, }; model.fields[`data.${field.name}.${code}`] = { ...type, ...infos }; @@ -361,7 +369,7 @@ export function queryModelFromSchema(schema: SchemaDto, languages: ReadonlyArray const infos = { displayName: field.name, description: 'i18n:contents.invariantFieldDescription', - fieldName: field.displayName + fieldName: field.displayName, }; model.fields[`data.${field.name}.iv`] = { ...type, ...infos }; @@ -370,4 +378,4 @@ export function queryModelFromSchema(schema: SchemaDto, languages: ReadonlyArray } return model; -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/roles.forms.ts b/frontend/app/shared/state/roles.forms.ts index 13837aa1a..ee0af2bca 100644 --- a/frontend/app/shared/state/roles.forms.ts +++ b/frontend/app/shared/state/roles.forms.ts @@ -54,9 +54,9 @@ export class AddPermissionForm extends Form { super(formBuilder.group({ permission: ['', [ - Validators.required - ] - ] + Validators.required, + ], + ], })); } } @@ -68,9 +68,9 @@ export class AddRoleForm extends Form { super(formBuilder.group({ name: ['', [ - Validators.required - ] - ] + Validators.required, + ], + ], })); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/roles.state.spec.ts b/frontend/app/shared/state/roles.state.spec.ts index e8fcd059d..97727776d 100644 --- a/frontend/app/shared/state/roles.state.spec.ts +++ b/frontend/app/shared/state/roles.state.spec.ts @@ -17,7 +17,7 @@ describe('RolesState', () => { app, appsState, newVersion, - version + version, } = TestValues; const oldRoles = createRoles(1, 2); diff --git a/frontend/app/shared/state/roles.state.ts b/frontend/app/shared/state/roles.state.ts index 12c9704ed..2d85beb3c 100644 --- a/frontend/app/shared/state/roles.state.ts +++ b/frontend/app/shared/state/roles.state.ts @@ -48,7 +48,7 @@ export class RolesState extends State { constructor( private readonly appsState: AppsState, private readonly dialogs: DialogService, - private readonly rolesService: RolesService + private readonly rolesService: RolesService, ) { super({ roles: [], version: Version.EMPTY }, 'Roles'); } @@ -110,7 +110,7 @@ export class RolesState extends State { isLoaded: true, isLoading: false, roles, - version + version, }, 'Loading Success / Updated'); } @@ -121,4 +121,4 @@ export class RolesState extends State { private get version() { return this.snapshot.version; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/rule-events.state.spec.ts b/frontend/app/shared/state/rule-events.state.spec.ts index 9269ad463..fd823ac0b 100644 --- a/frontend/app/shared/state/rule-events.state.spec.ts +++ b/frontend/app/shared/state/rule-events.state.spec.ts @@ -15,12 +15,12 @@ import { TestValues } from './_test-helpers'; describe('RuleEventsState', () => { const { app, - appsState + appsState, } = TestValues; const oldRuleEvents = [ - createRuleEvent(1), - createRuleEvent(2) + createRuleEvent(1), + createRuleEvent(2), ]; let dialogs: IMock; @@ -120,4 +120,4 @@ describe('RuleEventsState', () => { rulesService.verify(x => x.cancelEvent(app, oldRuleEvents[0]), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/rule-events.state.ts b/frontend/app/shared/state/rule-events.state.ts index 949e82847..062a01c47 100644 --- a/frontend/app/shared/state/rule-events.state.ts +++ b/frontend/app/shared/state/rule-events.state.ts @@ -40,13 +40,13 @@ export class RuleEventsState extends State { constructor( private readonly appsState: AppsState, private readonly dialogs: DialogService, - private readonly rulesService: RulesService + private readonly rulesService: RulesService, ) { super({ ruleEvents: [], page: 0, pageSize: 30, - total: 0 + total: 0, }, 'Rule Events'); } @@ -76,7 +76,7 @@ export class RuleEventsState extends State { isLoaded: true, isLoading: false, ruleEvents, - total + total, }, 'Loading Success'); }), finalize(() => { @@ -113,7 +113,7 @@ export class RuleEventsState extends State { return this.loadInternal(false); } - public page(paging: { page: number, pageSize: number }) { + public page(paging: { page: number; pageSize: number }) { if (!this.next(paging, 'Loading Paged')) { return EMPTY; } @@ -127,4 +127,4 @@ export class RuleEventsState extends State { } const setCancelled = (event: RuleEventDto) => - event.with({ nextAttempt: null, jobResult: 'Cancelled' }); \ No newline at end of file + event.with({ nextAttempt: null, jobResult: 'Cancelled' }); diff --git a/frontend/app/shared/state/rule-simulator.state.spec.ts b/frontend/app/shared/state/rule-simulator.state.spec.ts index cc775fc0b..23fce805f 100644 --- a/frontend/app/shared/state/rule-simulator.state.spec.ts +++ b/frontend/app/shared/state/rule-simulator.state.spec.ts @@ -17,12 +17,12 @@ import { TestValues } from './_test-helpers'; describe('RuleSimulatorState', () => { const { app, - appsState + appsState, } = TestValues; const oldSimulatedRuleEvents = [ - createSimulatedRuleEvent(1), - createSimulatedRuleEvent(2) + createSimulatedRuleEvent(1), + createSimulatedRuleEvent(2), ]; let dialogs: IMock; @@ -69,4 +69,4 @@ describe('RuleSimulatorState', () => { rulesService.verify(x => x.getSimulatedEvents(app, It.isAnyString()), Times.never()); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/rule-simulator.state.ts b/frontend/app/shared/state/rule-simulator.state.ts index 225d5993c..01aa14746 100644 --- a/frontend/app/shared/state/rule-simulator.state.ts +++ b/frontend/app/shared/state/rule-simulator.state.ts @@ -37,13 +37,13 @@ export class RuleSimulatorState extends State { constructor( private readonly appsState: AppsState, private readonly dialogs: DialogService, - private readonly rulesService: RulesService + private readonly rulesService: RulesService, ) { super({ simulatedRuleEvents: [], page: 0, pageSize: 0, - total: 0 + total: 0, }, 'Simulated Rule Events'); } @@ -74,7 +74,7 @@ export class RuleSimulatorState extends State { isLoaded: true, isLoading: false, simulatedRuleEvents, - total + total, }, 'Loading Success'); }), finalize(() => { @@ -90,4 +90,4 @@ export class RuleSimulatorState extends State { private get appName() { return this.appsState.appName; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/rules.forms.ts b/frontend/app/shared/state/rules.forms.ts index 5845231ad..16a727870 100644 --- a/frontend/app/shared/state/rules.forms.ts +++ b/frontend/app/shared/state/rules.forms.ts @@ -11,7 +11,7 @@ import { RuleElementDto } from '../services/rules.service'; export class ActionForm extends Form { constructor(public readonly definition: RuleElementDto, - private readonly actionType: string + private readonly actionType: string, ) { super(ActionForm.builForm(definition)); } @@ -40,7 +40,7 @@ export class ActionForm extends Form { export class TriggerForm extends Form { constructor(formBuilder: FormBuilder, - private readonly triggerType: string + private readonly triggerType: string, ) { super(TriggerForm.builForm(formBuilder, triggerType)); } @@ -54,14 +54,14 @@ export class TriggerForm extends Form { return formBuilder.group({ limit: [20000, [ - Validators.required - ] + Validators.required, + ], ], numDays: [3, [ - ValidatorsEx.between(1, 30) - ] - ] + ValidatorsEx.between(1, 30), + ], + ], }); } default: { @@ -75,4 +75,4 @@ export class TriggerForm extends Form { return value; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/rules.state.spec.ts b/frontend/app/shared/state/rules.state.spec.ts index 6db470463..957d22dec 100644 --- a/frontend/app/shared/state/rules.state.spec.ts +++ b/frontend/app/shared/state/rules.state.spec.ts @@ -18,7 +18,7 @@ describe('RulesState', () => { const { app, appsState, - newVersion + newVersion, } = TestValues; const rule1 = createRule(1); @@ -197,7 +197,7 @@ describe('RulesState', () => { it('should update selected rule if reloaded', () => { const newRules = [ createRule(1, '_new'), - createRule(2, '_new') + createRule(2, '_new'), ]; rulesService.setup(x => x.getRules(app)) @@ -230,4 +230,4 @@ describe('RulesState', () => { expect(rulesState.snapshot.selectedRule).toBeNull(); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/rules.state.ts b/frontend/app/shared/state/rules.state.ts index ff3a449b3..66a42be55 100644 --- a/frontend/app/shared/state/rules.state.ts +++ b/frontend/app/shared/state/rules.state.ts @@ -72,7 +72,7 @@ export class RulesState extends State { constructor( private readonly appsState: AppsState, private readonly dialogs: DialogService, - private readonly rulesService: RulesService + private readonly rulesService: RulesService, ) { super({ rules: [] }, 'Rules'); } @@ -125,7 +125,7 @@ export class RulesState extends State { isLoading: false, runningRuleId, rules, - selectedRule + selectedRule, }; }, 'Loading Success'); }), @@ -220,4 +220,4 @@ export class RulesState extends State { private get appName() { return this.appsState.appName; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/schema-tag-source.ts b/frontend/app/shared/state/schema-tag-source.ts index 360dc1b68..e1b92843d 100644 --- a/frontend/app/shared/state/schema-tag-source.ts +++ b/frontend/app/shared/state/schema-tag-source.ts @@ -15,7 +15,7 @@ class SchemaConverter implements TagConverter { public suggestions: ReadonlyArray; constructor( - private readonly schemas: ReadonlyArray + private readonly schemas: ReadonlyArray, ) { this.suggestions = schemas.map(x => new TagValue(x.id, x.name, x.id)); } @@ -44,12 +44,12 @@ class SchemaConverter implements TagConverter { @Injectable() export class SchemaTagSource { public converter = - this.schemasState.schemas.pipe( - map(x => new SchemaConverter(x), shareReplay(1))); + this.schemasState.schemas.pipe( + map(x => new SchemaConverter(x), shareReplay(1))); constructor( - readonly schemasState: SchemasState + readonly schemasState: SchemasState, ) { this.schemasState.loadIfNotLoaded(); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/schemas.forms.ts b/frontend/app/shared/state/schemas.forms.ts index cb052961e..3b2ea701c 100644 --- a/frontend/app/shared/state/schemas.forms.ts +++ b/frontend/app/shared/state/schemas.forms.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable no-useless-escape */ + import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Form, ValidatorsEx, value$ } from '@app/framework'; import { map } from 'rxjs/operators'; @@ -16,7 +18,7 @@ type CreateCategoryFormType = { name: string }; export class CreateCategoryForm extends Form { constructor(formBuilder: FormBuilder) { super(formBuilder.group({ - name: [''] + name: [''], })); } } @@ -28,16 +30,16 @@ export class CreateSchemaForm extends Form { [ Validators.required, Validators.maxLength(40), - ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'i18n:schemas.schemaNameValidationMessage') - ] + ValidatorsEx.pattern('[a-z0-9]+(\-[a-z0-9]+)*', 'i18n:schemas.schemaNameValidationMessage'), + ], ], type: ['Default', [ - Validators.required - ] + Validators.required, + ], ], initialCategory: undefined, - importing: {} + importing: {}, })); } @@ -59,7 +61,7 @@ export class SynchronizeSchemaForm extends Form super(formBuilder.group({ json: {}, fieldsDelete: false, - fieldsRecreate: false + fieldsRecreate: false, })); } @@ -71,7 +73,7 @@ export class SynchronizeSchemaForm extends Form return { ...value.json, noFieldDeletion: !value.fieldsDelete, - noFieldRecreation: !value.fieldsRecreate + noFieldRecreation: !value.fieldsRecreate, }; } } @@ -82,7 +84,7 @@ export class ConfigureFieldRulesForm extends Form { create: '', change: '', delete: '', - update: '' + update: '', })); } } @@ -216,25 +218,25 @@ export class EditFieldForm extends Form { const config = { label: ['', [ - Validators.maxLength(100) - ] + Validators.maxLength(100), + ], ], hints: ['', [ - Validators.maxLength(1000) - ] + Validators.maxLength(1000), + ], ], placeholder: ['', [ - Validators.maxLength(1000) - ] + Validators.maxLength(1000), + ], ], editor: undefined, editorUrl: undefined, isRequired: false, isRequiredOnPublish: false, isHalfWidth: false, - tags: [] + tags: [], }; const visitor = new EditFieldFormVisitor(config); @@ -247,7 +249,7 @@ export class EditFieldForm extends Form { export class EditFieldFormVisitor implements FieldPropertiesVisitor { constructor( - private readonly config: { [key: string]: any; } + private readonly config: { [key: string]: any }, ) { } @@ -352,15 +354,15 @@ export class EditFieldFormVisitor implements FieldPropertiesVisitor { } public visitGeolocation() { - return; + return undefined; } public visitJson() { - return; + return undefined; } public visitUI() { - return; + return undefined; } } @@ -369,19 +371,19 @@ export class EditSchemaForm extends Form { super(formBuilder.group({ type: ['String', [ - Validators.required - ] + Validators.required, + ], ], name: ['', [ Validators.required, Validators.maxLength(40), - ValidatorsEx.pattern('[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*', 'i18n:schemas.field.nameValidationMessage') - ] + ValidatorsEx.pattern('[a-zA-Z0-9]+(\\-[a-zA-Z0-9]+)*', 'i18n:schemas.field.nameValidationMessage'), + ], ], - isLocalizable: false + isLocalizable: false, })); } @@ -424,4 +426,4 @@ export class AddFieldForm extends Form { return { name: value.name, partitioning, properties }; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/schemas.state.spec.ts b/frontend/app/shared/state/schemas.state.spec.ts index fbf85046f..e04093ec8 100644 --- a/frontend/app/shared/state/schemas.state.spec.ts +++ b/frontend/app/shared/state/schemas.state.spec.ts @@ -18,7 +18,7 @@ describe('SchemasState', () => { app, appsState, newVersion, - version + version, } = TestValues; const schema1 = createSchema(1); @@ -28,9 +28,9 @@ describe('SchemasState', () => { canCreate: true, items: [ schema1, - schema2 + schema2, ], - _links: {} + _links: {}, }; let dialogs: IMock; @@ -64,7 +64,7 @@ describe('SchemasState', () => { { displayName: 'i18n:common.components', schemas: [] }, { displayName: 'i18n:common.schemas', schemas: [] }, { displayName: 'schema-category1', name: 'schema-category1', schemas: [schema1] }, - { displayName: 'schema-category2', name: 'schema-category2', schemas: [schema2] } + { displayName: 'schema-category2', name: 'schema-category2', schemas: [schema2] }, ]); schemasService.verifyAll(); @@ -88,7 +88,7 @@ describe('SchemasState', () => { { displayName: 'i18n:common.schemas', schemas: [] }, { displayName: 'schema-category1', name: 'schema-category1', schemas: [schema1] }, { displayName: 'schema-category2', name: 'schema-category2', schemas: [schema2] }, - { displayName: 'schema-category3', name: 'schema-category3', schemas: [] } + { displayName: 'schema-category3', name: 'schema-category3', schemas: [] }, ]); schemasService.verifyAll(); @@ -157,7 +157,7 @@ describe('SchemasState', () => { { displayName: 'i18n:common.schemas', schemas: [] }, { displayName: 'schema-category1', name: 'schema-category1', schemas: [schema1] }, { displayName: 'schema-category2', name: 'schema-category2', schemas: [schema2] }, - { displayName: 'schema-category3', name: 'schema-category3', schemas: [] } + { displayName: 'schema-category3', name: 'schema-category3', schemas: [] }, ]); }); @@ -170,7 +170,7 @@ describe('SchemasState', () => { { displayName: 'i18n:common.components', schemas: [] }, { displayName: 'i18n:common.schemas', schemas: [] }, { displayName: 'schema-category1', name: 'schema-category1', schemas: [schema1] }, - { displayName: 'schema-category2', name: 'schema-category2', schemas: [schema2] } + { displayName: 'schema-category2', name: 'schema-category2', schemas: [schema2] }, ]); }); @@ -184,7 +184,7 @@ describe('SchemasState', () => { { displayName: 'i18n:common.schemas', schemas: [] }, { displayName: 'schema-category1', name: 'schema-category1', schemas: [schema1] }, { displayName: 'schema-category2', name: 'schema-category2', schemas: [schema2] }, - { displayName: 'schema-category3', name: 'schema-category3', schemas: [] } + { displayName: 'schema-category3', name: 'schema-category3', schemas: [] }, ]); schemasState.removeCategory('schema-category3'); @@ -195,7 +195,7 @@ describe('SchemasState', () => { { displayName: 'i18n:common.components', schemas: [] }, { displayName: 'i18n:common.schemas', schemas: [] }, { displayName: 'schema-category1', name: 'schema-category1', schemas: [schema1] }, - { displayName: 'schema-category2', name: 'schema-category2', schemas: [schema2] } + { displayName: 'schema-category2', name: 'schema-category2', schemas: [schema2] }, ]); }); diff --git a/frontend/app/shared/state/schemas.state.ts b/frontend/app/shared/state/schemas.state.ts index 9424f927d..3e1df383f 100644 --- a/frontend/app/shared/state/schemas.state.ts +++ b/frontend/app/shared/state/schemas.state.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { Injectable } from '@angular/core'; import { DialogService, shareMapSubscribed, shareSubscribed, State, Version } from '@app/framework'; import { EMPTY, Observable, of } from 'rxjs'; @@ -37,7 +35,7 @@ interface Snapshot { } export type SchemasList = ReadonlyArray; -export type SchemaCategory = { displayName: string; name?: string; schemas: SchemaDto[]; }; +export type SchemaCategory = { displayName: string; name?: string; schemas: SchemaDto[] }; @Injectable() export class SchemasState extends State { @@ -80,7 +78,7 @@ export class SchemasState extends State { constructor( private readonly appsState: AppsState, private readonly dialogs: DialogService, - private readonly schemasService: SchemasService + private readonly schemasService: SchemasService, ) { super({ schemas: [], categories: new Set() }, 'Schemas'); } @@ -135,7 +133,7 @@ export class SchemasState extends State { canCreate, isLoaded: true, isLoading: true, - schemas + schemas, }, 'Loading Success'); }), finalize(() => { @@ -351,10 +349,8 @@ export class SchemasState extends State { return { ...s, schemas, selectedSchema }; }, 'Updated'); - } else { - if (updateText) { - this.dialogs.notifyInfo('i18n:common.nothingChanged'); - } + } else if (updateText) { + this.dialogs.notifyInfo('i18n:common.nothingChanged'); } } @@ -377,12 +373,12 @@ const SPECIAL_COMPONENTS = 'i18n:common.components'; function buildCategories(categories: Set, allSchemas: SchemasList): ReadonlyArray { const schemas: SchemaCategory = { displayName: SPECIAL_SCHEMAS, - schemas: [] + schemas: [], }; const components: SchemaCategory = { displayName: SPECIAL_COMPONENTS, - schemas: [] + schemas: [], }; const result: SchemaCategory[] = [schemas, components]; @@ -391,7 +387,7 @@ function buildCategories(categories: Set, allSchemas: SchemasList): Read result.push({ displayName: name, name, - schemas: [] + schemas: [], }); } @@ -405,7 +401,7 @@ function buildCategories(categories: Set, allSchemas: SchemasList): Read category = { displayName: name, name, - schemas: [] + schemas: [], }; result.push(category); @@ -422,4 +418,4 @@ function buildCategories(categories: Set, allSchemas: SchemasList): Read result.sortByString(x => x.displayName); return result; -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/settings.ts b/frontend/app/shared/state/settings.ts index 6c9e091cc..5e4439c6c 100644 --- a/frontend/app/shared/state/settings.ts +++ b/frontend/app/shared/state/settings.ts @@ -11,7 +11,7 @@ export const Settings = { HIDE_ASSETS: 'ui.assets.hide', HIDE_CONTENTS: (schema: any) => `ui.contents.${schema}.hide`, HIDE_SCHEMAS: 'ui.schemas.hide', - HIDE_SETTINGS: 'ui.settings.hide' + HIDE_SETTINGS: 'ui.settings.hide', }, Local: { ASSETS_MODE: 'squidex.assets.list-view', @@ -23,6 +23,6 @@ export const Settings = { NEWS_VERSION: 'squidex.news.version', SCHEMA_CATEGORY_COLLAPSED: (category: any) => `squidex.schema.category.${category}.collapsed`, SCHEMA_PREVIEW: (schema: any) => `squidex.schemas.${schema}.preview-button`, - SCHEMAS_COLLAPSED: 'content.schemas.collapsed' - } -}; \ No newline at end of file + SCHEMAS_COLLAPSED: 'content.schemas.collapsed', + }, +}; diff --git a/frontend/app/shared/state/table-fields.spec.ts b/frontend/app/shared/state/table-fields.spec.ts index 1cbfcaaba..68fd3a1d2 100644 --- a/frontend/app/shared/state/table-fields.spec.ts +++ b/frontend/app/shared/state/table-fields.spec.ts @@ -25,7 +25,7 @@ describe('TableFields', () => { false, {}, [ - new RootFieldDto({}, 1, 'string', createProperties('String'), 'invariant') + new RootFieldDto({}, 1, 'string', createProperties('String'), 'invariant'), ]); beforeEach(() => { @@ -34,10 +34,10 @@ describe('TableFields', () => { const INVALID_CONFIGS = [ { case: 'empty', fields: [] }, - { case: 'invalid', fields: ['invalid'] } + { case: 'invalid', fields: ['invalid'] }, ]; - INVALID_CONFIGS.map(test => { + INVALID_CONFIGS.forEach(test => { it(`should provide default fields if config is ${test.case}`, () => { let fields: ReadonlyArray; let fieldNames: ReadonlyArray; @@ -47,26 +47,31 @@ describe('TableFields', () => { const tableFields = new TableFields(uiState.object, schema); - tableFields.listFields.subscribe(result => fields = result); - tableFields.listFieldNames.subscribe(result => fieldNames = result); + tableFields.listFields.subscribe(result => { + fields = result; + }); + + tableFields.listFieldNames.subscribe(result => { + fieldNames = result; + }); expect(fields!).toEqual([ MetaFields.lastModifiedByAvatar, schema.fields[0], MetaFields.statusColor, - MetaFields.lastModified + MetaFields.lastModified, ]); expect(fieldNames!).toEqual([ MetaFields.lastModifiedByAvatar, schema.fields[0].name, MetaFields.statusColor, - MetaFields.lastModified + MetaFields.lastModified, ]); }); }); - INVALID_CONFIGS.map(test => { + INVALID_CONFIGS.forEach(test => { it(`should remove ui state if config is ${test.case}`, () => { uiState.setup(x => x.getUser('schemas.my-schema.view', [])) .returns(() => of([])); @@ -92,15 +97,20 @@ describe('TableFields', () => { const tableFields = new TableFields(uiState.object, schema); - tableFields.listFields.subscribe(result => fields = result); - tableFields.listFieldNames.subscribe(result => fieldNames = result); + tableFields.listFields.subscribe(result => { + fields = result; + }); + + tableFields.listFieldNames.subscribe(result => { + fieldNames = result; + }); expect(fields!).toEqual([ - MetaFields.version + MetaFields.version, ]); expect(fieldNames!).toEqual([ - MetaFields.version + MetaFields.version, ]); }); @@ -118,4 +128,4 @@ describe('TableFields', () => { expect().nothing(); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/table-fields.ts b/frontend/app/shared/state/table-fields.ts index 75da6dae4..573538926 100644 --- a/frontend/app/shared/state/table-fields.ts +++ b/frontend/app/shared/state/table-fields.ts @@ -5,8 +5,6 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: readonly-array - import { BehaviorSubject, Observable } from 'rxjs'; import { take } from 'rxjs/operators'; import { MetaFields, SchemaDto, TableField } from './../services/schemas.service'; @@ -31,7 +29,7 @@ export class TableFields { constructor( private readonly uiState: UIState, - private readonly schema: SchemaDto + private readonly schema: SchemaDto, ) { this.allFields = [...this.schema.contentFields.map(x => x.name), ...META_FIELD_NAMES].sort(); @@ -52,10 +50,8 @@ export class TableFields { if (save) { this.uiState.removeUser(this.settingsKey); } - } else { - if (save) { - this.uiState.set(this.settingsKey, fieldNames, true); - } + } else if (save) { + this.uiState.set(this.settingsKey, fieldNames, true); } const fields: ReadonlyArray = fieldNames.map(n => this.schema.fields.find(f => f.name === n) || n); @@ -63,4 +59,4 @@ export class TableFields { this.listField$.next(fields); this.listFieldName$.next(fieldNames); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/ui-languages.ts b/frontend/app/shared/state/ui-languages.ts index 97f1d5159..0835e40f4 100644 --- a/frontend/app/shared/state/ui-languages.ts +++ b/frontend/app/shared/state/ui-languages.ts @@ -5,17 +5,17 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -type UILanguage = { iso2Code: string, localName: string }; +type UILanguage = { iso2Code: string; localName: string }; export module UILanguages { export const ALL: ReadonlyArray = [{ iso2Code: 'en', - localName: 'English' + localName: 'English', }, { iso2Code: 'nl', - localName: 'Nederlands' + localName: 'Nederlands', }, { iso2Code: 'it', - localName: 'Italiano' + localName: 'Italiano', }]; -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/ui.state.spec.ts b/frontend/app/shared/state/ui.state.spec.ts index 54a187f28..b3201a869 100644 --- a/frontend/app/shared/state/ui.state.spec.ts +++ b/frontend/app/shared/state/ui.state.spec.ts @@ -13,7 +13,7 @@ import { TestValues } from './_test-helpers'; describe('UIState', () => { const { app, - appsState + appsState, } = TestValues; const common = { @@ -21,29 +21,29 @@ describe('UIState', () => { map: { type: 'GSM', sizeX: 800, - sizeY: 600 + sizeY: 600, }, - canCreateApps: true + canCreateApps: true, }; const shared = { map: { - type: 'GM', key: 'xyz' + type: 'GM', key: 'xyz', }, - canCreateApps: true + canCreateApps: true, }; const user = { map: { - sizeX: 1000 + sizeX: 1000, }, - canCustomize: true + canCustomize: true, }; const resources: ResourceLinks = { - ['admin/events']: { method: 'GET', href: '/api/events' }, - ['admin/restore']: { method: 'GET', href: '/api/restore' }, - ['admin/users']: { method: 'GET', href: '/api/users' } + 'admin/events': { method: 'GET', href: '/api/events' }, + 'admin/restore': { method: 'GET', href: '/api/restore' }, + 'admin/users': { method: 'GET', href: '/api/users' }, }; let usersService: IMock; @@ -77,10 +77,10 @@ describe('UIState', () => { type: 'GM', sizeX: 1000, sizeY: 600, - key: 'xyz' + key: 'xyz', }, canCreateApps: true, - canCustomize: true + canCustomize: true, }); expect(uiState.snapshot.canReadEvents).toBeTruthy(); @@ -100,13 +100,13 @@ describe('UIState', () => { type: 'GM', sizeX: 1000, sizeY: 600, - key: 'xyz' + key: 'xyz', }, canCreateApps: true, canCustomize: true, root: { - nested: 123 - } + nested: 123, + }, }); uiState.get('root', {}).subscribe(x => { @@ -136,13 +136,13 @@ describe('UIState', () => { type: 'GM', sizeX: 1000, sizeY: 600, - key: 'xyz' + key: 'xyz', }, canCreateApps: true, canCustomize: true, root: { - nested: 123 - } + nested: 123, + }, }); uiState.get('root', {}).subscribe(x => { @@ -171,10 +171,10 @@ describe('UIState', () => { map: { type: 'GM', sizeX: 1000, - sizeY: 600 + sizeY: 600, }, canCreateApps: true, - canCustomize: true + canCustomize: true, }); uiService.verifyAll(); @@ -192,12 +192,12 @@ describe('UIState', () => { type: 'GM', sizeX: 800, sizeY: 600, - key: 'xyz' + key: 'xyz', }, canCreateApps: true, - canCustomize: true + canCustomize: true, }); uiService.verifyAll(); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/ui.state.ts b/frontend/app/shared/state/ui.state.ts index 85e291ac6..62b59c6e4 100644 --- a/frontend/app/shared/state/ui.state.ts +++ b/frontend/app/shared/state/ui.state.ts @@ -12,7 +12,7 @@ import { UIService } from './../services/ui.service'; import { UsersService } from './../services/users.service'; import { AppsState } from './apps.state'; -type Settings = { canCreateApps?: boolean, [key: string]: any }; +type Settings = { canCreateApps?: boolean; [key: string]: any }; interface Snapshot { // All common settings. @@ -87,11 +87,11 @@ export class UIState extends State { constructor( private readonly appsState: AppsState, private readonly uiService: UIService, - private readonly usersService: UsersService + private readonly usersService: UsersService, ) { super({ settings: {}, - settingsCommon: {} + settingsCommon: {}, }, 'Setting'); this.loadResources(); @@ -108,7 +108,7 @@ export class UIState extends State { ...s, settings: s.settingsCommon, settingsShared: undefined, - settingsUser: undefined + settingsUser: undefined, }), 'Loading Done'); this.uiService.getSharedSettings(app) @@ -136,7 +136,7 @@ export class UIState extends State { canReadEvents: hasAnyLink(payload, 'admin/events'), canReadUsers: hasAnyLink(payload, 'admin/users'), canRestore: hasAnyLink(payload, 'admin/restore'), - canUseOrleans: hasAnyLink(payload, 'admin/orleans') + canUseOrleans: hasAnyLink(payload, 'admin/orleans'), }, 'Loading Resources Done'); }); } @@ -278,4 +278,4 @@ function updateSettings(state: Snapshot, update: Partial) { Types.mergeInto(settings, update.settingsUser || state.settingsUser); return { ...state, settings, ...update }; -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/workflows.forms.ts b/frontend/app/shared/state/workflows.forms.ts index 46669c171..2c9db9539 100644 --- a/frontend/app/shared/state/workflows.forms.ts +++ b/frontend/app/shared/state/workflows.forms.ts @@ -16,9 +16,9 @@ export class AddWorkflowForm extends Form { super(formBuilder.group({ name: ['', [ - Validators.required - ] - ] + Validators.required, + ], + ], })); } -} \ No newline at end of file +} diff --git a/frontend/app/shared/state/workflows.state.spec.ts b/frontend/app/shared/state/workflows.state.spec.ts index f9fb9ef9d..24627c9d0 100644 --- a/frontend/app/shared/state/workflows.state.spec.ts +++ b/frontend/app/shared/state/workflows.state.spec.ts @@ -17,7 +17,7 @@ describe('WorkflowsState', () => { app, appsState, newVersion, - version + version, } = TestValues; const oldWorkflows = createWorkflows('1', '2'); @@ -87,7 +87,7 @@ describe('WorkflowsState', () => { workflowsService.setup(x => x.postWorkflow(app, { name: 'my-workflow' }, version)) .returns(() => of(versioned(newVersion, updated))).verifiable(); - workflowsState.add('my-workflow' ).subscribe(); + workflowsState.add('my-workflow').subscribe(); expectNewWorkflows(updated); }); @@ -123,4 +123,4 @@ describe('WorkflowsState', () => { expect(workflowsState.snapshot.version).toEqual(newVersion); } }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/state/workflows.state.ts b/frontend/app/shared/state/workflows.state.ts index e2ee544b0..d5486b77b 100644 --- a/frontend/app/shared/state/workflows.state.ts +++ b/frontend/app/shared/state/workflows.state.ts @@ -52,7 +52,7 @@ export class WorkflowsState extends State { constructor( private readonly appsState: AppsState, private readonly dialogs: DialogService, - private readonly workflowsService: WorkflowsService + private readonly workflowsService: WorkflowsService, ) { super({ errors: [], workflows: [], version: Version.EMPTY }, 'Workflows'); } @@ -117,7 +117,7 @@ export class WorkflowsState extends State { isLoaded: true, isLoading: false, version, - workflows + workflows, }, 'Loading Success / Updated'); } @@ -128,4 +128,4 @@ export class WorkflowsState extends State { private get version() { return this.snapshot.version; } -} \ No newline at end of file +} diff --git a/frontend/app/shared/utils/editor-utils.spec.ts b/frontend/app/shared/utils/editor-utils.spec.ts index bc314a09d..00c4aa41f 100644 --- a/frontend/app/shared/utils/editor-utils.spec.ts +++ b/frontend/app/shared/utils/editor-utils.spec.ts @@ -5,6 +5,8 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ +/* eslint-disable no-template-curly-in-string */ + import { Version } from '@app/framework'; import { AppSettingsDto } from './../services/apps.service'; import { computeEditorUrl } from './editor-utils'; @@ -12,13 +14,13 @@ import { computeEditorUrl } from './editor-utils'; describe('EditorUtils', () => { const settings = new AppSettingsDto({}, false, [], [{ name: 'editor1', - url: 'url/to/editor1' + url: 'url/to/editor1', }, { name: 'duplicate', - url: 'url/to/duplicate1' + url: 'url/to/duplicate1', }, { name: 'duplicate', - url: 'url/to/duplicate2' + url: 'url/to/duplicate2', }], new Version('1')); @@ -52,11 +54,11 @@ describe('EditorUtils', () => { expect(result).toEqual('http://undefined?query=value'); }); - [null, undefined, ''].map(url => { + [null, undefined, ''].forEach(url => { it(`should return empty string if url is ${url}`, () => { const result = computeEditorUrl(url, settings); expect(result).toEqual(''); }); }); -}); \ No newline at end of file +}); diff --git a/frontend/app/shared/utils/editor-utils.ts b/frontend/app/shared/utils/editor-utils.ts index 974817c66..505ffed2f 100644 --- a/frontend/app/shared/utils/editor-utils.ts +++ b/frontend/app/shared/utils/editor-utils.ts @@ -22,4 +22,4 @@ export function computeEditorUrl(url?: string | null, settings?: AppSettingsDto } return interpolate(url, editors) || ''; -} \ No newline at end of file +} diff --git a/frontend/app/shared/utils/messages.ts b/frontend/app/shared/utils/messages.ts index 0e0696eb8..d2ae89ac3 100644 --- a/frontend/app/shared/utils/messages.ts +++ b/frontend/app/shared/utils/messages.ts @@ -5,4 +5,4 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -export class HistoryChannelUpdated {} \ No newline at end of file +export class HistoryChannelUpdated {} diff --git a/frontend/app/shell/index.ts b/frontend/app/shell/index.ts index da0f82225..898be9a7c 100644 --- a/frontend/app/shell/index.ts +++ b/frontend/app/shell/index.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/app/shell/module.ts b/frontend/app/shell/module.ts index eeaa01ca6..5e803c8a9 100644 --- a/frontend/app/shell/module.ts +++ b/frontend/app/shell/module.ts @@ -1,12 +1,10 @@ -/* +/* * Squidex Headless CMS * * @license * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -// tslint:disable: max-line-length - import { NgModule } from '@angular/core'; import { SqxFrameworkModule, SqxSharedModule } from '@app/shared'; import { AppAreaComponent, AppsMenuComponent, ForbiddenPageComponent, HomePageComponent, InternalAreaComponent, LeftMenuComponent, LoginPageComponent, LogoComponent, LogoutPageComponent, NotFoundPageComponent, NotificationsMenuComponent, ProfileMenuComponent, SearchMenuComponent } from './declarations'; @@ -14,14 +12,14 @@ import { AppAreaComponent, AppsMenuComponent, ForbiddenPageComponent, HomePageCo @NgModule({ imports: [ SqxFrameworkModule, - SqxSharedModule + SqxSharedModule, ], exports: [ AppAreaComponent, HomePageComponent, ForbiddenPageComponent, InternalAreaComponent, - NotFoundPageComponent + NotFoundPageComponent, ], declarations: [ AppAreaComponent, @@ -36,7 +34,7 @@ import { AppAreaComponent, AppsMenuComponent, ForbiddenPageComponent, HomePageCo NotFoundPageComponent, NotificationsMenuComponent, ProfileMenuComponent, - SearchMenuComponent - ] + SearchMenuComponent, + ], }) -export class SqxShellModule { } \ No newline at end of file +export class SqxShellModule { } diff --git a/frontend/app/shell/pages/app/app-area.component.ts b/frontend/app/shell/pages/app/app-area.component.ts index f7cf575a3..117c69356 100644 --- a/frontend/app/shell/pages/app/app-area.component.ts +++ b/frontend/app/shell/pages/app/app-area.component.ts @@ -11,13 +11,13 @@ import { AppsState, defined } from '@app/shared'; @Component({ selector: 'sqx-app-area', styleUrls: ['./app-area.component.scss'], - templateUrl: './app-area.component.html' + templateUrl: './app-area.component.html', }) export class AppAreaComponent { public selectedApp = this.appsState.selectedApp.pipe(defined()); constructor( - private readonly appsState: AppsState + private readonly appsState: AppsState, ) { } -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/app/left-menu.component.ts b/frontend/app/shell/pages/app/left-menu.component.ts index 804b1fddf..30beab720 100644 --- a/frontend/app/shell/pages/app/left-menu.component.ts +++ b/frontend/app/shell/pages/app/left-menu.component.ts @@ -12,7 +12,7 @@ import { AppDto, Settings } from '@app/shared'; selector: 'sqx-left-menu', styleUrls: ['./left-menu.component.scss'], templateUrl: './left-menu.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class LeftMenuComponent { @Input() @@ -33,4 +33,4 @@ export class LeftMenuComponent { public isApiHidden(app: AppDto) { return app.roleProperties[Settings.AppProperties.HIDE_API] === true; } -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/forbidden/forbidden-page.component.ts b/frontend/app/shell/pages/forbidden/forbidden-page.component.ts index 6bde5d3f0..0c340e9bf 100644 --- a/frontend/app/shell/pages/forbidden/forbidden-page.component.ts +++ b/frontend/app/shell/pages/forbidden/forbidden-page.component.ts @@ -11,15 +11,15 @@ import { Component } from '@angular/core'; @Component({ selector: 'sqx-forbidden-page', styleUrls: ['./forbidden-page.component.scss'], - templateUrl: './forbidden-page.component.html' + templateUrl: './forbidden-page.component.html', }) export class ForbiddenPageComponent { constructor( - private readonly location: Location + private readonly location: Location, ) { } public back() { this.location.back(); } -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/home/home-page.component.ts b/frontend/app/shell/pages/home/home-page.component.ts index 42da3b5f5..1f4267404 100644 --- a/frontend/app/shell/pages/home/home-page.component.ts +++ b/frontend/app/shell/pages/home/home-page.component.ts @@ -12,14 +12,14 @@ import { AuthService } from '@app/shared'; @Component({ selector: 'sqx-home-page', styleUrls: ['./home-page.component.scss'], - templateUrl: './home-page.component.html' + templateUrl: './home-page.component.html', }) export class HomePageComponent { public showLoginError = false; constructor( private readonly authService: AuthService, - private readonly router: Router + private readonly router: Router, ) { } @@ -30,7 +30,7 @@ export class HomePageComponent { this.authService.loginPopup() .subscribe(() => { this.router.navigate(['/app']); - }, _ => { + }, () => { this.showLoginError = true; }); } @@ -41,4 +41,4 @@ export class HomePageComponent { return isIE; } -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/internal/apps-menu.component.ts b/frontend/app/shell/pages/internal/apps-menu.component.ts index 51b3d2c0b..efc865060 100644 --- a/frontend/app/shell/pages/internal/apps-menu.component.ts +++ b/frontend/app/shell/pages/internal/apps-menu.component.ts @@ -13,9 +13,9 @@ import { AppDto, AppsState, DialogModel, fadeAnimation, ModalModel, UIState } fr styleUrls: ['./apps-menu.component.scss'], templateUrl: './apps-menu.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppsMenuComponent { public addAppDialog = new DialogModel(); @@ -24,11 +24,11 @@ export class AppsMenuComponent { constructor( public readonly appsState: AppsState, - public readonly uiState: UIState + public readonly uiState: UIState, ) { } public trackByApp(_index: number, app: AppDto) { return app.id; } -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/internal/internal-area.component.ts b/frontend/app/shell/pages/internal/internal-area.component.ts index e07492f59..94567a2cb 100644 --- a/frontend/app/shell/pages/internal/internal-area.component.ts +++ b/frontend/app/shell/pages/internal/internal-area.component.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license @@ -12,13 +12,13 @@ import { DialogService, LoadingService, Notification, ResourceOwner } from '@app @Component({ selector: 'sqx-internal-area', styleUrls: ['./internal-area.component.scss'], - templateUrl: './internal-area.component.html' + templateUrl: './internal-area.component.html', }) export class InternalAreaComponent extends ResourceOwner implements OnInit { constructor( public readonly loadingService: LoadingService, private readonly dialogs: DialogService, - private readonly route: ActivatedRoute + private readonly route: ActivatedRoute, ) { super(); } @@ -39,4 +39,4 @@ export class InternalAreaComponent extends ResourceOwner implements OnInit { } })); } - } \ No newline at end of file +} diff --git a/frontend/app/shell/pages/internal/logo.component.ts b/frontend/app/shell/pages/internal/logo.component.ts index c465ab157..9c0ccb4e2 100644 --- a/frontend/app/shell/pages/internal/logo.component.ts +++ b/frontend/app/shell/pages/internal/logo.component.ts @@ -11,9 +11,9 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; selector: 'sqx-logo', styleUrls: ['./logo.component.scss'], templateUrl: './logo.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class LogoComponent { @Input() public isLoading?: boolean | null; -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/internal/notifications-menu.component.ts b/frontend/app/shell/pages/internal/notifications-menu.component.ts index b17ce8979..d70a917b8 100644 --- a/frontend/app/shell/pages/internal/notifications-menu.component.ts +++ b/frontend/app/shell/pages/internal/notifications-menu.component.ts @@ -11,7 +11,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; selector: 'sqx-notifications-menu', styleUrls: ['./notifications-menu.component.scss'], templateUrl: './notifications-menu.component.html', - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class NotificationsMenuComponent { -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/internal/profile-menu.component.ts b/frontend/app/shell/pages/internal/profile-menu.component.ts index c27dbbc17..0b41b3ec0 100644 --- a/frontend/app/shell/pages/internal/profile-menu.component.ts +++ b/frontend/app/shell/pages/internal/profile-menu.component.ts @@ -30,9 +30,9 @@ interface State { styleUrls: ['./profile-menu.component.scss'], templateUrl: './profile-menu.component.html', animations: [ - fadeAnimation + fadeAnimation, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class ProfileMenuComponent extends StatefulComponent implements OnInit { public modalMenu = new ModalModel(); @@ -43,14 +43,14 @@ export class ProfileMenuComponent extends StatefulComponent implements On constructor(changeDetector: ChangeDetectorRef, apiUrl: ApiUrlConfig, public readonly uiState: UIState, public readonly uiOptions: UIOptions, - public readonly authService: AuthService + public readonly authService: AuthService, ) { super(changeDetector, { profileDisplayName: '', profileEmail: '', profileId: '', profileUrl: apiUrl.buildUrl('/identity-server/account/profile'), - showSubmenu: false + showSubmenu: false, }); } @@ -66,7 +66,7 @@ export class ProfileMenuComponent extends StatefulComponent implements On this.next({ profileId, profileEmail, - profileDisplayName + profileDisplayName, }); } })); @@ -76,17 +76,18 @@ export class ProfileMenuComponent extends StatefulComponent implements On Cookies.remove('.AspNetCore.Culture'); Cookies.set('.AspNetCore.Culture', `c=${code}|uic=${code}`, 365); + // eslint-disable-next-line no-restricted-globals location.reload(); } public toggle() { this.next(s => ({ ...s, - showSubmenu: !s.showSubmenu + showSubmenu: !s.showSubmenu, })); } public logout() { this.authService.logoutRedirect(); } -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/internal/search-menu.component.scss b/frontend/app/shell/pages/internal/search-menu.component.scss index 866e043f1..cf1dea3ca 100644 --- a/frontend/app/shell/pages/internal/search-menu.component.scss +++ b/frontend/app/shell/pages/internal/search-menu.component.scss @@ -1,4 +1,4 @@ -:host /deep/ { +:host ::ng-deep { .form-control { @include placeholder-color($color-theme-blue-light); background: darken($color-theme-blue-dark, 5%); diff --git a/frontend/app/shell/pages/internal/search-menu.component.ts b/frontend/app/shell/pages/internal/search-menu.component.ts index 1122a8293..dbfe2b894 100644 --- a/frontend/app/shell/pages/internal/search-menu.component.ts +++ b/frontend/app/shell/pages/internal/search-menu.component.ts @@ -16,7 +16,7 @@ export class SearchSource implements AutocompleteSource { constructor( private readonly appsState: AppsState, - private readonly searchService: SearchService + private readonly searchService: SearchService, ) { } @@ -34,9 +34,9 @@ export class SearchSource implements AutocompleteSource { styleUrls: ['./search-menu.component.scss'], templateUrl: './search-menu.component.html', providers: [ - SearchSource + SearchSource, ], - changeDetection: ChangeDetectionStrategy.OnPush + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SearchMenuComponent { @ViewChild(AutocompleteComponent, { static: false }) @@ -47,7 +47,7 @@ export class SearchMenuComponent { constructor( private readonly router: Router, private readonly apiUrl: ApiUrlConfig, - public readonly searchSource: SearchSource + public readonly searchSource: SearchSource, ) { } @@ -60,4 +60,4 @@ export class SearchMenuComponent { this.searchControl.reset(); } } -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/login/login-page.component.ts b/frontend/app/shell/pages/login/login-page.component.ts index 9acf381c7..f8d5729a9 100644 --- a/frontend/app/shell/pages/login/login-page.component.ts +++ b/frontend/app/shell/pages/login/login-page.component.ts @@ -11,12 +11,12 @@ import { AuthService } from '@app/shared'; @Component({ selector: 'sqx-login', - template: '' + template: '', }) export class LoginPageComponent implements OnInit { constructor( private readonly authService: AuthService, - private readonly router: Router + private readonly router: Router, ) { } @@ -28,7 +28,7 @@ export class LoginPageComponent implements OnInit { }, () => { this.router.navigate(['/'], { replaceUrl: true }); - } + }, ); } -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/logout/logout-page.component.ts b/frontend/app/shell/pages/logout/logout-page.component.ts index a8db1137e..a9e78f8f7 100644 --- a/frontend/app/shell/pages/logout/logout-page.component.ts +++ b/frontend/app/shell/pages/logout/logout-page.component.ts @@ -11,12 +11,12 @@ import { AuthService } from '@app/shared'; @Component({ selector: 'sqx-logout', - template: '' + template: '', }) export class LogoutPageComponent implements OnInit { constructor( private readonly authService: AuthService, - private readonly router: Router + private readonly router: Router, ) { } @@ -28,7 +28,7 @@ export class LogoutPageComponent implements OnInit { }, () => { this.router.navigate(['/'], { replaceUrl: true }); - } + }, ); } -} \ No newline at end of file +} diff --git a/frontend/app/shell/pages/not-found/not-found-page.component.ts b/frontend/app/shell/pages/not-found/not-found-page.component.ts index 4df1b1a22..53d07e8e0 100644 --- a/frontend/app/shell/pages/not-found/not-found-page.component.ts +++ b/frontend/app/shell/pages/not-found/not-found-page.component.ts @@ -11,15 +11,15 @@ import { Component } from '@angular/core'; @Component({ selector: 'sqx-not-found-page', styleUrls: ['./not-found-page.component.scss'], - templateUrl: './not-found-page.component.html' + templateUrl: './not-found-page.component.html', }) export class NotFoundPageComponent { constructor( - private readonly location: Location + private readonly location: Location, ) { } public back() { this.location.back(); } -} \ No newline at end of file +} diff --git a/frontend/app/shims.ts b/frontend/app/shims.ts index 4bef65b62..c150a2cda 100644 --- a/frontend/app/shims.ts +++ b/frontend/app/shims.ts @@ -1,4 +1,4 @@ -/* +/* * Squidex Headless CMS * * @license diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6b77f88da..59b5027b1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -506,6 +506,24 @@ } } }, + "@babel/runtime-corejs3": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.0.tgz", + "integrity": "sha512-0R0HTZWHLk6G8jIk0FtoX+AatCtKnswS98VhXwGImFc759PJRp4Tru0PQYZofyijTFUr+gT8Mu7sgXVJLQ0ceg==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + } + } + }, "@babel/template": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", @@ -612,6 +630,40 @@ "@types/hammerjs": "^2.0.36" } }, + "@eslint/eslintrc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", + "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, "@ngtools/webpack": { "version": "11.2.9", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.2.9.tgz", @@ -719,6 +771,16 @@ "integrity": "sha512-Xwy8o12ak+iYgFr/KCVaVK5Sy+jFMiiPAID3+ObvMlBzy26XQJw5xu+a6rlHsrJENXj/AwJOGsJpVohUjAzSKQ==", "dev": true }, + "@types/eslint": { + "version": "7.2.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.10.tgz", + "integrity": "sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, "@types/estree": { "version": "0.0.47", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", @@ -956,6 +1018,153 @@ "@types/node": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.23.0.tgz", + "integrity": "sha512-tGK1y3KIvdsQEEgq6xNn1DjiFJtl+wn8JJQiETtCbdQxw1vzjXyAaIkEmO2l6Nq24iy3uZBMFQjZ6ECf1QdgGw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.23.0", + "@typescript-eslint/scope-manager": "4.23.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz", + "integrity": "sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.23.0", + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/typescript-estree": "4.23.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.23.0.tgz", + "integrity": "sha512-wsvjksHBMOqySy/Pi2Q6UuIuHYbgAMwLczRl4YanEPKW5KVxI9ZzDYh3B5DtcZPQTGRWFJrfcbJ6L01Leybwug==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.23.0", + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/typescript-estree": "4.23.0", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz", + "integrity": "sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/visitor-keys": "4.23.0" + } + }, + "@typescript-eslint/types": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.23.0.tgz", + "integrity": "sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz", + "integrity": "sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.23.0", + "@typescript-eslint/visitor-keys": "4.23.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz", + "integrity": "sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.23.0", + "eslint-visitor-keys": "^2.0.0" + } + }, "@videojs/http-streaming": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-2.6.4.tgz", @@ -1211,12 +1420,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1233,27 +1436,16 @@ "integrity": "sha512-G+chJctFPiiLGvs3+/Mly3apXTcfgE45dT5yp12BcWZ1kUs+gm0qd3/fv4gsz6fVag4mM0moHVpjHDIgph6Psg==" }, "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -1329,12 +1521,6 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "angular-gridster2": { "version": "11.1.5", "resolved": "https://registry.npmjs.org/angular-gridster2/-/angular-gridster2-11.1.5.tgz", @@ -1394,7 +1580,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1412,16 +1597,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1458,18 +1633,117 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -1488,30 +1762,130 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } + } + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", "safer-buffer": "^2.1.0" }, "dependencies": { @@ -1550,12 +1924,6 @@ } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -1568,6 +1936,12 @@ "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -1583,24 +1957,12 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -1650,16 +2012,10 @@ } } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "axe-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.0.tgz", + "integrity": "sha512-1uIESzroqpaTzt9uX48HO+6gfnKu3RwvWdCcWSrX4csMInJfCo1yvKPNXCwXFRpJqRW25tiASb6No0YH57PXqg==", "dev": true }, "axobject-query": { @@ -1976,15 +2332,6 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "bfj": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", @@ -2006,8 +2353,7 @@ "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" }, "blob": { "version": "0.0.5", @@ -2108,7 +2454,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -2403,24 +2748,6 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -2445,12 +2772,6 @@ "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chainsaw": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.0.9.tgz", @@ -2505,7 +2826,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -2805,15 +3125,6 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -2908,6 +3219,12 @@ "typedarray": "^0.0.6" } }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -2949,18 +3266,33 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "contains-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-1.0.0.tgz", + "integrity": "sha1-NFizMhhWA+ju0Y9RjUoQiIo6vJE=", + "dev": true, + "requires": { + "normalize-path": "^2.1.1", + "path-starts-with": "^1.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -3093,6 +3425,12 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz", "integrity": "sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA==" }, + "core-js-pure": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.12.1.tgz", + "integrity": "sha512-1cch+qads4JnDSWsvc7d6nzlKAippwjUlf6vykkTLW53VSV+NkE6muGBToAjEA8pG90cSfcud3JgVmW2ds5TaQ==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -3642,15 +3980,6 @@ "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==", "dev": true }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -3679,15 +4008,6 @@ "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-fns": { "version": "2.21.1", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.21.1.tgz", @@ -3883,18 +4203,6 @@ } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4010,13 +4318,12 @@ } }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" } }, "dom-converter": { @@ -4181,16 +4488,6 @@ "stream-shift": "^1.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4349,6 +4646,23 @@ "tapable": "^1.0.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + } + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -4360,12 +4674,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true - }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -4526,99 +4834,234 @@ } }, "eslint": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", - "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "concat-stream": "^1.4.6", - "debug": "^2.1.1", - "doctrine": "^1.2.2", - "es6-map": "^0.1.3", - "escope": "^3.6.0", - "espree": "^3.1.6", - "estraverse": "^4.2.0", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz", + "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^1.1.1", - "glob": "^7.0.3", - "globals": "^9.2.0", - "ignore": "^3.1.2", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "optionator": "^0.8.1", - "path-is-absolute": "^1.0.0", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.6.0", - "strip-json-comments": "~1.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.21", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "color-convert": "^2.0.1" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { - "ms": "2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "globals": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", + "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { - "minimist": "^1.2.5" + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-config-airbnb": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz", + "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^14.2.1", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "dependencies": { + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "dependencies": { + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } + } + }, + "eslint-config-airbnb-typescript": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-12.3.1.tgz", + "integrity": "sha512-ql/Pe6/hppYuRp4m3iPaHJqkBB7dgeEmGPQ6X0UNmrQOfTF+dXw29/ZjU2kQ6RDoLxaxOA+Xqv07Vbef6oVTWw==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^4.4.1", + "eslint-config-airbnb": "^18.2.0", + "eslint-config-airbnb-base": "^14.2.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" } }, "ms": { @@ -4626,20 +5069,300 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "locate-path": "^2.0.0" } }, - "supports-color": { + "locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.0.tgz", + "integrity": "sha512-W5v1f7Cbam6BwbSSKtN6+yoUAms07ozbqAEhLOtf5erEqRv7w67PeZuAuBThaUkzdq2GfBx/5GBvxF+NWJshrQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "contains-path": "^1.0.0", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", + "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.11.2", + "aria-query": "^4.2.2", + "array-includes": "^3.1.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.0.2", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.6", + "emoji-regex": "^9.0.0", + "has": "^1.0.3", + "jsx-ast-utils": "^3.1.0", + "language-tags": "^1.0.5" + }, + "dependencies": { + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true } } @@ -4654,14 +5377,60 @@ "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "eslint-webpack-plugin": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "dev": true, + "requires": { + "@types/eslint": "^7.2.6", + "arrify": "^2.0.1", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^3.0.0" + } + }, "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -4670,6 +5439,23 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -4938,9 +5724,9 @@ }, "dependencies": { "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", "dev": true } } @@ -5037,12 +5823,6 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5116,13 +5896,12 @@ } }, "file-entry-cache": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", - "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "^3.0.4" } }, "file-loader": { @@ -5145,7 +5924,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -5327,39 +6105,20 @@ } }, "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true } } }, @@ -5402,23 +6161,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -5500,7 +6242,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, "optional": true }, "function-bind": { @@ -5509,67 +6250,11 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "generate-function": { "version": "2.3.1", @@ -5610,12 +6295,6 @@ "has-symbols": "^1.0.1" } }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -5631,15 +6310,6 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -5657,7 +6327,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -5839,22 +6508,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5921,12 +6574,6 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -6433,17 +7080,6 @@ } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -6799,7 +7435,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -6847,6 +7482,15 @@ } } }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -6907,8 +7551,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.1.0", @@ -6930,7 +7573,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -6963,8 +7605,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.4", @@ -7061,18 +7702,6 @@ "has-symbols": "^1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -7112,12 +7741,6 @@ "isarray": "1.0.0" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul-instrumenter-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", @@ -7344,12 +7967,6 @@ } } }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7365,12 +7982,6 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -7388,12 +7999,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -7409,10 +8014,10 @@ "jsonify": "~0.0.0" } }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "json3": { @@ -7450,16 +8055,28 @@ "integrity": "sha512-CXcRvMyTlnR53xMcKnuMzfCA5i/nfblTnnr74CZb6C4vG39eu6w51t7nKmU5MfLfbTgGItliNyjO/ciNPDqClg==", "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + }, + "dependencies": { + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } } }, "karma": { @@ -7721,6 +8338,21 @@ "integrity": "sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==", "dev": true }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, "last-call-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", @@ -7732,13 +8364,13 @@ } }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "line-column": { @@ -7765,36 +8397,6 @@ "uc.micro": "^1.0.1" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -7838,6 +8440,12 @@ "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", @@ -7869,6 +8477,12 @@ "lodash._reinterpolate": "^3.0.0" } }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -7911,16 +8525,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, "lower-case": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", @@ -7999,12 +8603,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -8076,24 +8674,6 @@ "readable-stream": "^2.0.1" } }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, "merge": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", @@ -8432,7 +9012,8 @@ "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true + "dev": true, + "optional": true }, "nanoid": { "version": "3.1.16", @@ -8459,6 +9040,12 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -8523,55 +9110,6 @@ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -8632,90 +9170,6 @@ "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", "dev": true }, - "node-sass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-5.0.0.tgz", - "integrity": "sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^7.0.3", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^7.1.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -8731,8 +9185,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -8763,18 +9216,6 @@ } } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -8796,12 +9237,6 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8895,18 +9330,122 @@ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } } } @@ -9833,17 +10372,17 @@ } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "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", + "word-wrap": "^1.2.3" } }, "original": { @@ -10086,6 +10625,26 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, + "path-starts-with": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-starts-with/-/path-starts-with-1.0.0.tgz", + "integrity": "sha1-soJDAV6LE43lcmgqxS2kLmRq2E4=", + "dev": true, + "requires": { + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -10111,17 +10670,10 @@ "sha.js": "^2.4.8" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" }, "pify": { "version": "4.0.1", @@ -10166,6 +10718,66 @@ "find-up": "^4.0.0" } }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, "pluralize": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", @@ -11860,9 +12472,9 @@ "dev": true }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "pretty-error": { @@ -11887,9 +12499,9 @@ "dev": true }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "progressbar.js": { @@ -11932,12 +12544,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -12122,67 +12728,6 @@ } } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -12202,7 +12747,6 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -12229,27 +12773,6 @@ } } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - } - } - }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -12281,6 +12804,12 @@ "define-properties": "^1.1.3" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -12420,47 +12949,17 @@ "is-finite": "^1.0.0" } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -12813,182 +13312,381 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "sass": { + "version": "1.32.13", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.13.tgz", + "integrity": "sha512-dEgI9nShraqP7cXQH+lEXVf73WOPCse0QlFzSD8k+1TcOxCMwVXfQlr0jtoluZysQOyJGnfr21dLvYKDJq8HkA==", + "requires": { + "chokidar": ">=3.0.0 <4.0.0" + } + }, + "sass-lint": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sass-lint/-/sass-lint-1.13.1.tgz", + "integrity": "sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q==", "dev": true, "requires": { + "commander": "^2.8.1", + "eslint": "^2.7.0", + "front-matter": "2.1.2", + "fs-extra": "^3.0.1", "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" + "globule": "^1.0.0", + "gonzales-pe-sl": "^4.2.3", + "js-yaml": "^3.5.4", + "known-css-properties": "^0.3.0", + "lodash.capitalize": "^4.1.0", + "lodash.kebabcase": "^4.0.0", + "merge": "^1.2.0", + "path-is-absolute": "^1.0.0", + "util": "^0.10.3" }, "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "eslint": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", + "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "concat-stream": "^1.4.6", + "debug": "^2.1.1", + "doctrine": "^1.2.2", + "es6-map": "^0.1.3", + "escope": "^3.6.0", + "espree": "^3.1.6", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^1.1.1", + "glob": "^7.0.3", + "globals": "^9.2.0", + "ignore": "^3.1.2", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "optionator": "^0.8.1", + "path-is-absolute": "^1.0.0", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.6.0", + "strip-json-comments": "~1.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "file-entry-cache": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", + "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" } }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "graceful-fs": "^4.1.6" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "p-limit": "^2.0.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "minimist": "^1.2.5" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" } }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "ansi-regex": "^2.0.0" } - } - } - }, - "sass-lint": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sass-lint/-/sass-lint-1.13.1.tgz", - "integrity": "sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q==", - "dev": true, - "requires": { - "commander": "^2.8.1", - "eslint": "^2.7.0", - "front-matter": "2.1.2", - "fs-extra": "^3.0.1", - "glob": "^7.0.0", - "globule": "^1.0.0", - "gonzales-pe-sl": "^4.2.3", - "js-yaml": "^3.5.4", - "known-css-properties": "^0.3.0", - "lodash.capitalize": "^4.1.0", - "lodash.kebabcase": "^4.0.0", - "merge": "^1.2.0", - "path-is-absolute": "^1.0.0", - "util": "^0.10.3" - }, - "dependencies": { - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" } }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "prelude-ls": "~1.1.2" } } } @@ -13050,36 +13748,15 @@ }, "dependencies": { "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - } - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } } } @@ -13380,10 +14057,41 @@ "dev": true }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } }, "slugify": { "version": "1.5.0", @@ -13811,23 +14519,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", @@ -13870,15 +14561,6 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -13995,34 +14677,16 @@ "ansi-regex": "^5.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "style-loader": { @@ -14135,106 +14799,35 @@ } }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", "dev": true, "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.3.0.tgz", + "integrity": "sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true } } @@ -14422,7 +15015,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -14438,42 +15030,17 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" - } - }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -14633,62 +15200,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tslint-immutable": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tslint-immutable/-/tslint-immutable-6.0.1.tgz", - "integrity": "sha512-3GQ6HffN64gLmT/N1YzyVMqyf6uBjMvhNaevK8B0K01/QC0OU5AQZrH4TjMHo1IdG3JpqsZvuRy9IW1LA3zjwA==", - "dev": true, - "requires": { - "tsutils": "^2.28.0 || ^3.0.0" - } - }, - "tslint-webpack-plugin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslint-webpack-plugin/-/tslint-webpack-plugin-2.1.0.tgz", - "integrity": "sha512-subYgmwihOGftPZS59looqPWdbqMIvsoTy8MeQPeZ7bOdwZfR3AAnVG8/VzpSRly8l/xbPosrX2QKtJEZPt71A==", - "dev": true, - "requires": { - "chalk": "^2.1.0" - } - }, "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", @@ -14712,21 +15223,6 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -14734,14 +15230,20 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -15073,17 +15575,6 @@ "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "video.js": { "version": "7.11.8", "resolved": "https://registry.npmjs.org/video.js/-/video.js-7.11.8.tgz", @@ -16604,48 +17095,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/frontend/package.json b/frontend/package.json index c7e27f5c1..e07b35f61 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -55,6 +55,7 @@ "react": "17.0.2", "react-dom": "17.0.2", "rxjs": "6.6.7", + "sass": "^1.32.13", "simplemde": "1.11.2", "slugify": "1.5.0", "tinymce": "5.7.1", @@ -82,6 +83,8 @@ "@types/simplemde": "1.11.7", "@types/tapable": "1.0.6", "@types/tinymce": "4.6.0", + "@typescript-eslint/eslint-plugin": "^4.23.0", + "@typescript-eslint/parser": "^4.23.0", "@types/ws": "^7.4.1", "browserslist": "4.16.4", "caniuse-lite": "1.0.30001208", @@ -91,6 +94,11 @@ "css-loader": "5.2.1", "cssnano": "5.0.1", "entities": "2.2.0", + "eslint": "^7.26.0", + "eslint-config-airbnb-typescript": "^12.3.1", + "eslint-plugin-import": "^2.23.0", + "eslint-plugin-jsx-a11y": "^6.4.1", + "eslint-webpack-plugin": "^2.5.4", "file-loader": "6.2.0", "html-loader": "1.3.2", "html-webpack-plugin": "4.5.0", @@ -108,7 +116,6 @@ "karma-sourcemap-loader": "0.3.8", "karma-webpack": "4.0.2", "mini-css-extract-plugin": "1.3.1", - "node-sass": "5.0.0", "optimize-css-assets-webpack-plugin": "5.0.4", "postcss-import": "14.0.1", "postcss-loader": "4.0.4", @@ -126,9 +133,6 @@ "terser-webpack-plugin": "4.2.3", "ts-loader": "8.0.13", "tsconfig-paths-webpack-plugin": "3.5.1", - "tslint": "6.1.3", - "tslint-immutable": "6.0.1", - "tslint-webpack-plugin": "2.1.0", "typemoq": "2.1.0", "typescript": "4.0", "underscore": "1.13.1",