mirror of https://github.com/abpframework/abp.git
committed by
GitHub
63 changed files with 950 additions and 497 deletions
@ -1,5 +1,4 @@ |
|||
{ |
|||
"printWidth": 120, |
|||
"singleQuote": true, |
|||
"trailingComma": "all" |
|||
"singleQuote": true |
|||
} |
|||
|
|||
@ -1,2 +1,2 @@ |
|||
export * from './localization.pipe'; |
|||
export * from "./sort.pipe"; |
|||
export * from './sort.pipe'; |
|||
|
|||
@ -1,13 +1,14 @@ |
|||
import { Pipe, PipeTransform } from '@angular/core'; |
|||
|
|||
@Pipe({ |
|||
name: 'abpSort', |
|||
pure: false |
|||
name: 'abpSort', |
|||
// tslint:disable-next-line: no-pipe-impure
|
|||
pure: false |
|||
}) |
|||
export class SortPipe implements PipeTransform { |
|||
transform(value: any[], sortOrder: string): any { |
|||
sortOrder = sortOrder.toLowerCase(); |
|||
if(sortOrder === "desc") return value.reverse(); |
|||
else return value; |
|||
} |
|||
} |
|||
transform(value: any[], sortOrder: string): any { |
|||
sortOrder = sortOrder.toLowerCase(); |
|||
if (sortOrder === 'desc') return value.reverse(); |
|||
else return value; |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,154 @@ |
|||
import { ConfigState, CoreModule, DynamicLayoutComponent, eLayoutType, ABP, RouterOutletComponent } from '@abp/ng.core'; |
|||
import { Location } from '@angular/common'; |
|||
import { Component } from '@angular/core'; |
|||
import { createRoutingFactory, SpectatorRouting, SpyObject } from '@ngneat/spectator'; |
|||
import { NgxsModule, Store } from '@ngxs/store'; |
|||
import { LAYOUTS, ThemeBasicModule } from '../../../../theme-basic/src/public-api'; |
|||
import { OAuthService } from 'angular-oauth2-oidc'; |
|||
import { NgxsResetPluginModule, StateOverwrite } from 'ngxs-reset-plugin'; |
|||
import { ThemeSharedModule } from '../../../../theme-shared/src/public-api'; |
|||
import { ActivatedRoute } from '@angular/router'; |
|||
|
|||
@Component({ |
|||
selector: 'abp-dummy', |
|||
template: '{{route.snapshot.data?.name}} works!' |
|||
}) |
|||
class DummyComponent { |
|||
constructor(public route: ActivatedRoute) {} |
|||
} |
|||
|
|||
describe('DynamicLayoutComponent', () => { |
|||
const createComponent = createRoutingFactory({ |
|||
component: RouterOutletComponent, |
|||
declareComponent: false, |
|||
imports: [ |
|||
CoreModule, |
|||
NgxsModule.forRoot([ConfigState]), |
|||
NgxsResetPluginModule.forRoot(), |
|||
ThemeSharedModule.forRoot(), |
|||
ThemeBasicModule |
|||
], |
|||
declarations: [DummyComponent], |
|||
stubsEnabled: false, |
|||
providers: [{ provide: OAuthService, useValue: { getAccessToken: () => true } }], |
|||
routes: [ |
|||
{ path: '', component: RouterOutletComponent }, |
|||
{ |
|||
path: 'parentWithLayout', |
|||
component: DynamicLayoutComponent, |
|||
children: [ |
|||
{ |
|||
path: 'childWithoutLayout', |
|||
component: DummyComponent, |
|||
data: { name: 'childWithoutLayout' } |
|||
}, |
|||
{ |
|||
path: 'childWithLayout', |
|||
component: DummyComponent, |
|||
data: { name: 'childWithLayout' } |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
path: 'withData', |
|||
component: DynamicLayoutComponent, |
|||
children: [ |
|||
{ |
|||
path: '', |
|||
component: DummyComponent, |
|||
data: { name: 'withData' } |
|||
} |
|||
], |
|||
data: { layout: eLayoutType.empty } |
|||
}, |
|||
{ |
|||
path: 'withoutLayout', |
|||
component: DynamicLayoutComponent, |
|||
children: [ |
|||
{ |
|||
path: '', |
|||
component: DummyComponent, |
|||
data: { name: 'withoutLayout' } |
|||
} |
|||
], |
|||
data: { layout: null } |
|||
} |
|||
] |
|||
}); |
|||
|
|||
let spectator: SpectatorRouting<RouterOutletComponent>; |
|||
let store: SpyObject<Store>; |
|||
|
|||
beforeEach(async () => { |
|||
spectator = createComponent(); |
|||
store = spectator.get(Store); |
|||
store.dispatch( |
|||
new StateOverwrite([ |
|||
ConfigState, |
|||
{ |
|||
requirements: { layouts: LAYOUTS }, |
|||
routes: [ |
|||
{ |
|||
path: '', |
|||
wrapper: true, |
|||
children: [ |
|||
{ |
|||
path: 'parentWithLayout', |
|||
layout: eLayoutType.application, |
|||
children: [{ path: 'childWithoutLayout' }, { path: 'childWithLayout', layout: eLayoutType.account }] |
|||
} |
|||
] |
|||
}, |
|||
{ path: 'withData', layout: eLayoutType.application }, |
|||
, |
|||
] as ABP.FullRoute[], |
|||
environment: { application: {} } |
|||
} |
|||
]) |
|||
); |
|||
}); |
|||
|
|||
it('should handle application layout from parent abp route and display it', async () => { |
|||
spectator.router.navigateByUrl('/parentWithLayout/childWithoutLayout'); |
|||
await spectator.fixture.whenStable(); |
|||
spectator.detectComponentChanges(); |
|||
expect(spectator.query('abp-dynamic-layout')).toBeTruthy(); |
|||
expect(spectator.query('abp-layout-application')).toBeTruthy(); |
|||
}); |
|||
|
|||
it('should handle account layout from own property and display it', async () => { |
|||
spectator.router.navigateByUrl('/parentWithLayout/childWithLayout'); |
|||
await spectator.fixture.whenStable(); |
|||
spectator.detectComponentChanges(); |
|||
expect(spectator.query('abp-layout-account')).toBeTruthy(); |
|||
}); |
|||
|
|||
it('should handle empty layout from route data and display it', async () => { |
|||
spectator.router.navigateByUrl('/withData'); |
|||
await spectator.fixture.whenStable(); |
|||
spectator.detectComponentChanges(); |
|||
expect(spectator.query('abp-layout-empty')).toBeTruthy(); |
|||
}); |
|||
|
|||
it('should display empty layout when layout is null', async () => { |
|||
spectator.router.navigateByUrl('/withoutLayout'); |
|||
await spectator.fixture.whenStable(); |
|||
spectator.detectComponentChanges(); |
|||
expect(spectator.query('abp-layout-empty')).toBeTruthy(); |
|||
}); |
|||
|
|||
it('should not display any layout when layouts are empty', async () => { |
|||
store.dispatch( |
|||
new StateOverwrite([ConfigState, { ...store.selectSnapshot(ConfigState), requirements: { layouts: [] } }]) |
|||
); |
|||
|
|||
spectator.detectChanges(); |
|||
|
|||
spectator.router.navigateByUrl('/withoutLayout'); |
|||
await spectator.fixture.whenStable(); |
|||
spectator.detectComponentChanges(); |
|||
|
|||
expect(spectator.query('abp-layout-empty')).toBeFalsy(); |
|||
expect(spectator.query('abp-dynamic-layout').children[0].tagName).toEqual('ROUTER-OUTLET'); |
|||
}); |
|||
}); |
|||
@ -0,0 +1,15 @@ |
|||
import { Spectator, createComponentFactory, createHostFactory } from '@ngneat/spectator'; |
|||
import { RouterOutletComponent } from '@abp/ng.core'; |
|||
import { RouterTestingModule } from '@angular/router/testing'; |
|||
|
|||
describe('RouterOutletComponent', () => { |
|||
let spectator: Spectator<RouterOutletComponent>; |
|||
const createHost = createHostFactory({ component: RouterOutletComponent, imports: [RouterTestingModule] }); |
|||
|
|||
it('should have a router-outlet element', () => { |
|||
spectator = createHost('<abp-router-outlet></abp-router-outlet>'); |
|||
console.log((spectator.debugElement.nativeElement as HTMLElement).children); |
|||
expect((spectator.debugElement.nativeElement as HTMLElement).children.length).toBe(1); |
|||
expect((spectator.debugElement.nativeElement as HTMLElement).children[0].tagName).toBe('ROUTER-OUTLET'); |
|||
}); |
|||
}); |
|||
@ -1,4 +1,5 @@ |
|||
export function noop() { |
|||
// tslint:disable-next-line: only-arrow-functions
|
|||
const fn = function() {}; |
|||
return fn; |
|||
} |
|||
|
|||
@ -1,5 +1,6 @@ |
|||
export function uuid(a?: any): string { |
|||
return a |
|||
? (a ^ ((Math.random() * 16) >> (a / 4))).toString(16) |
|||
? // tslint:disable-next-line: no-bitwise
|
|||
(a ^ ((Math.random() * 16) >> (a / 4))).toString(16) |
|||
: ('' + 1e7 + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, uuid); |
|||
} |
|||
|
|||
@ -1 +1 @@ |
|||
export * from "./feature-management.state"; |
|||
export * from './feature-management.state'; |
|||
|
|||
@ -1 +1 @@ |
|||
export * from "./permission-management.state"; |
|||
export * from './permission-management.state'; |
|||
|
|||
@ -1 +1 @@ |
|||
export * from "./layout.state"; |
|||
export * from './layout.state'; |
|||
|
|||
@ -0,0 +1,13 @@ |
|||
<ol *ngIf="show" class="breadcrumb"> |
|||
<li class="breadcrumb-item"> |
|||
<a routerLink="/"><i class="fa fa-home"></i> </a> |
|||
</li> |
|||
<li |
|||
*ngFor="let segment of segments; let last = last" |
|||
class="breadcrumb-item" |
|||
[class.active]="last" |
|||
aria-current="page" |
|||
> |
|||
{{ segment | abpLocalization }} |
|||
</li> |
|||
</ol> |
|||
@ -0,0 +1,22 @@ |
|||
<div class="error"> |
|||
<button id="abp-close-button mr-4" type="button" class="close" (click)="destroy()"> |
|||
<span aria-hidden="true">×</span> |
|||
</button> |
|||
<div class="row centered"> |
|||
<div class="col-md-12"> |
|||
<div class="error-template"> |
|||
<h1> |
|||
{{ title | abpLocalization }} |
|||
</h1> |
|||
<div class="error-details"> |
|||
{{ details | abpLocalization }} |
|||
</div> |
|||
<div class="error-actions"> |
|||
<a (click)="destroy()" routerLink="/" class="btn btn-primary btn-md mt-2" |
|||
><span class="glyphicon glyphicon-home"></span> {{ '::Menu:Home' | abpLocalization }} |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
@ -0,0 +1,22 @@ |
|||
import { Component, Renderer2, ElementRef } from '@angular/core'; |
|||
|
|||
@Component({ |
|||
selector: 'abp-error', |
|||
templateUrl: './error.component.html', |
|||
styleUrls: ['error.component.scss'] |
|||
}) |
|||
export class ErrorComponent { |
|||
title = 'Oops!'; |
|||
|
|||
details = 'Sorry, an error has occured.'; |
|||
|
|||
renderer: Renderer2; |
|||
|
|||
elementRef: ElementRef; |
|||
|
|||
host: any; |
|||
|
|||
destroy() { |
|||
this.renderer.removeChild(this.host, this.elementRef.nativeElement); |
|||
} |
|||
} |
|||
@ -1,45 +0,0 @@ |
|||
import { Component, Renderer2, ElementRef } from '@angular/core'; |
|||
|
|||
@Component({ |
|||
selector: 'abp-error', |
|||
template: ` |
|||
<div class="error"> |
|||
<button id="abp-close-button mr-2" type="button" class="close" (click)="destroy()"> |
|||
<span aria-hidden="true">×</span> |
|||
</button> |
|||
<div class="row centered"> |
|||
<div class="col-md-12"> |
|||
<div class="error-template"> |
|||
<h1> |
|||
{{ title | abpLocalization }} |
|||
</h1> |
|||
<div class="error-details"> |
|||
{{ details | abpLocalization }} |
|||
</div> |
|||
<div class="error-actions"> |
|||
<a (click)="destroy()" routerLink="/" class="btn btn-primary btn-md mt-2" |
|||
><span class="glyphicon glyphicon-home"></span> {{ '::Menu:Home' | abpLocalization }} |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
`,
|
|||
styleUrls: ['error.component.scss'], |
|||
}) |
|||
export class ErrorComponent { |
|||
title = 'Oops!'; |
|||
|
|||
details = 'Sorry, an error has occured.'; |
|||
|
|||
renderer: Renderer2; |
|||
|
|||
elementRef: ElementRef; |
|||
|
|||
host: any; |
|||
|
|||
destroy() { |
|||
this.renderer.removeChild(this.host, this.elementRef.nativeElement); |
|||
} |
|||
} |
|||
@ -1 +1 @@ |
|||
export default ``; |
|||
export default ''; |
|||
|
|||
@ -0,0 +1,54 @@ |
|||
import { CoreModule } from '@abp/ng.core'; |
|||
import { |
|||
createComponentFactory, |
|||
createHostFactory, |
|||
Spectator, |
|||
SpectatorHost, |
|||
createTestComponentFactory |
|||
} from '@ngneat/spectator'; |
|||
import { ButtonComponent } from '../components'; |
|||
|
|||
describe('ButtonComponent', () => { |
|||
let host: SpectatorHost<ButtonComponent>; |
|||
|
|||
const createHost = createHostFactory(ButtonComponent); |
|||
|
|||
beforeEach(() => (host = createHost('<abp-button iconClass="fa fa-check">Button</abp-button>'))); |
|||
|
|||
it('should display the button', () => { |
|||
expect(host.query('button')).toBeTruthy(); |
|||
}); |
|||
|
|||
it('should equal the default classes to btn btn-primary', () => { |
|||
expect(host.query('button')).toHaveClass('btn btn-primary'); |
|||
}); |
|||
|
|||
it('should equal the default type to button', () => { |
|||
expect(host.query('button')).toHaveAttribute('type', 'button'); |
|||
}); |
|||
|
|||
it('should enabled', () => { |
|||
expect(host.query('[disabled]')).toBeFalsy(); |
|||
}); |
|||
|
|||
it('should have the text content', () => { |
|||
expect(host.query('button')).toHaveText('Button'); |
|||
}); |
|||
|
|||
it('should display the icon', () => { |
|||
expect(host.query('i.d-none')).toBeFalsy(); |
|||
expect(host.query('i')).toHaveClass('fa'); |
|||
}); |
|||
|
|||
it('should display the spinner icon', () => { |
|||
host.component.loading = true; |
|||
host.detectComponentChanges(); |
|||
expect(host.query('i')).toHaveClass('fa-spinner'); |
|||
}); |
|||
|
|||
it('should disabled when the loading input is true', () => { |
|||
host.component.loading = true; |
|||
host.detectComponentChanges(); |
|||
expect(host.query('[disabled]')).toBeDefined(); |
|||
}); |
|||
}); |
|||
@ -0,0 +1,109 @@ |
|||
import { CoreModule, RestOccurError, RouterOutletComponent } from '@abp/ng.core'; |
|||
import { Location } from '@angular/common'; |
|||
import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; |
|||
import { Component } from '@angular/core'; |
|||
import { createRoutingFactory, SpectatorRouting } from '@ngneat/spectator'; |
|||
import { RouterState } from '@ngxs/router-plugin'; |
|||
import { NgxsModule, Store } from '@ngxs/store'; |
|||
import { NgxsResetPluginModule, StateOverwrite } from 'ngxs-reset-plugin'; |
|||
import { DEFAULT_ERROR_MESSAGES, ErrorHandler } from '../handlers'; |
|||
import { ThemeSharedModule } from '../theme-shared.module'; |
|||
|
|||
@Component({ selector: 'abp-dummy', template: 'dummy works! <abp-confirmation></abp-confirmation>' }) |
|||
class DummyComponent { |
|||
constructor(public errorHandler: ErrorHandler, public store: Store) {} |
|||
} |
|||
|
|||
describe('With Custom Host Component', () => { |
|||
let component: SpectatorRouting<DummyComponent>; |
|||
const createComponent = createRoutingFactory({ |
|||
component: DummyComponent, |
|||
imports: [CoreModule, ThemeSharedModule.forRoot(), NgxsModule.forRoot([]), NgxsResetPluginModule.forRoot()], |
|||
stubsEnabled: false, |
|||
routes: [{ path: '', component: DummyComponent }, { path: 'account/login', component: RouterOutletComponent }] |
|||
}); |
|||
|
|||
beforeEach(() => { |
|||
component = createComponent(); |
|||
const abpError = document.querySelector('abp-error'); |
|||
if (abpError) document.body.removeChild(abpError); |
|||
}); |
|||
|
|||
it('should display the error component when server error occurs', () => { |
|||
component.component.store.dispatch(new RestOccurError(new HttpErrorResponse({ status: 500 }))); |
|||
component.detectChanges(); |
|||
expect(document.querySelector('.error-template')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultError500.title); |
|||
expect(document.querySelector('.error-details')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultError500.details); |
|||
}); |
|||
|
|||
it('should display the error component when authorize error occurs', () => { |
|||
component.component.store.dispatch(new RestOccurError(new HttpErrorResponse({ status: 403 }))); |
|||
component.detectChanges(); |
|||
expect(document.querySelector('.error-template')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultError403.title); |
|||
expect(document.querySelector('.error-details')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultError403.details); |
|||
}); |
|||
|
|||
it('should display the error component when unknown error occurs', () => { |
|||
component.component.store.dispatch( |
|||
new RestOccurError(new HttpErrorResponse({ status: 0, statusText: 'Unknown Error' })) |
|||
); |
|||
component.detectChanges(); |
|||
expect(document.querySelector('.error-template')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultErrorUnknown.title); |
|||
expect(document.querySelector('.error-details')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultErrorUnknown.details); |
|||
}); |
|||
|
|||
it('should display the confirmation when not found error occurs', () => { |
|||
component.component.store.dispatch(new RestOccurError(new HttpErrorResponse({ status: 404 }))); |
|||
component.detectChanges(); |
|||
expect(component.query('.abp-confirm-summary')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultError404.title); |
|||
expect(component.query('.abp-confirm-body')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultError404.details); |
|||
}); |
|||
|
|||
it('should display the confirmation when default error occurs', () => { |
|||
component.component.store.dispatch(new RestOccurError(new HttpErrorResponse({ status: 412 }))); |
|||
component.detectChanges(); |
|||
expect(component.query('.abp-confirm-summary')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultError.title); |
|||
expect(component.query('.abp-confirm-body')).toHaveText(DEFAULT_ERROR_MESSAGES.defaultError.details); |
|||
}); |
|||
|
|||
it('should display the confirmation when authenticated error occurs', async () => { |
|||
component.component.store.dispatch(new RestOccurError(new HttpErrorResponse({ status: 401 }))); |
|||
component.detectChanges(); |
|||
|
|||
component.component.store.dispatch(new StateOverwrite([RouterState, { state: { url: '/' } }])); |
|||
component.click('#confirm'); |
|||
await component.fixture.whenStable(); |
|||
expect(component.get(Location).path()).toBe('/account/login'); |
|||
}); |
|||
|
|||
it('should display the confirmation when authenticated error occurs with _AbpErrorFormat header', async () => { |
|||
let headers: HttpHeaders = new HttpHeaders(); |
|||
headers = headers.append('_AbpErrorFormat', '_AbpErrorFormat'); |
|||
|
|||
component.component.store.dispatch(new RestOccurError(new HttpErrorResponse({ status: 401, headers }))); |
|||
component.detectChanges(); |
|||
component.component.store.dispatch(new StateOverwrite([RouterState, { state: { url: '/' } }])); |
|||
component.click('#confirm'); |
|||
await component.fixture.whenStable(); |
|||
expect(component.get(Location).path()).toBe('/account/login'); |
|||
}); |
|||
|
|||
it('should display the confirmation when error occurs with _AbpErrorFormat header', () => { |
|||
let headers: HttpHeaders = new HttpHeaders(); |
|||
headers = headers.append('_AbpErrorFormat', '_AbpErrorFormat'); |
|||
|
|||
component.component.store.dispatch( |
|||
new RestOccurError( |
|||
new HttpErrorResponse({ |
|||
error: { error: { message: 'test message', details: 'test detail' } }, |
|||
status: 412, |
|||
headers |
|||
}) |
|||
) |
|||
); |
|||
component.detectChanges(); |
|||
|
|||
expect(component.query('.abp-confirm-summary')).toHaveText('test message'); |
|||
expect(component.query('.abp-confirm-body')).toHaveText('test detail'); |
|||
}); |
|||
}); |
|||
@ -1,17 +1,7 @@ |
|||
{ |
|||
"extends": "../../tslint.json", |
|||
"rules": { |
|||
"directive-selector": [ |
|||
true, |
|||
"attribute", |
|||
"lib", |
|||
"camelCase" |
|||
], |
|||
"component-selector": [ |
|||
true, |
|||
"element", |
|||
"lib", |
|||
"kebab-case" |
|||
] |
|||
"directive-selector": [true, "attribute", "abp", "camelCase"], |
|||
"component-selector": [true, "element", "abp", "kebab-case"] |
|||
} |
|||
} |
|||
|
|||
@ -1,55 +1,100 @@ |
|||
{ |
|||
"extends": "tslint:recommended", |
|||
"rulesDirectory": ["node_modules/codelyzer"], |
|||
"rules": { |
|||
"array-type": false, |
|||
"contextual-lifecycle": true, |
|||
"component-class-suffix": [true, "Component"], |
|||
"directive-class-suffix": [true, "Directive"], |
|||
"max-line-length": [true, 140], |
|||
"no-consecutive-blank-lines": false, |
|||
"no-redundant-jsdoc": true, |
|||
"no-var-requires": false, |
|||
"object-literal-key-quotes": [true, "as-needed"], |
|||
"ordered-imports": false, |
|||
"trailing-comma": false, |
|||
"component-max-inline-declarations": [true, { "animations": 20, "styles": 10, "template": 10 }], |
|||
"no-forward-ref": true, |
|||
"no-lifecycle-call": true, |
|||
"no-pipe-impure": true, |
|||
"no-queries-metadata-property": true, |
|||
"no-unused-css": true, |
|||
"prefer-output-readonly": true, |
|||
"template-conditional-complexity": [true, 4], |
|||
"use-component-selector": true, |
|||
"max-classes-per-file": false, |
|||
"arrow-parens": false, |
|||
"arrow-return-shorthand": true, |
|||
"callable-types": true, |
|||
"class-name": true, |
|||
"component-selector": [true, "element", "abp", "kebab-case"], |
|||
"curly": false, |
|||
"deprecation": { |
|||
"severity": "warn" |
|||
}, |
|||
"component-class-suffix": true, |
|||
"contextual-lifecycle": true, |
|||
"directive-class-suffix": true, |
|||
"directive-selector": [true, "attribute", "abp", "camelCase"], |
|||
"component-selector": [true, "element", "abp", "kebab-case"], |
|||
"forin": true, |
|||
"import-blacklist": [true, "rxjs/Rx"], |
|||
"interface-name": false, |
|||
"max-classes-per-file": false, |
|||
"max-line-length": [true, 140], |
|||
"member-access": false, |
|||
"interface-over-type-literal": true, |
|||
"interface-name": [true, "never-prefix"], |
|||
"member-access": [true, "no-public"], |
|||
"member-ordering": [ |
|||
true, |
|||
{ |
|||
"order": ["static-field", "instance-field", "static-method", "instance-method"] |
|||
} |
|||
], |
|||
"no-consecutive-blank-lines": false, |
|||
"no-arg": true, |
|||
"no-bitwise": true, |
|||
"no-conflicting-lifecycle": true, |
|||
"no-console": [true, "debug", "info", "time", "timeEnd", "trace"], |
|||
"no-construct": true, |
|||
"no-debugger": true, |
|||
"no-duplicate-super": true, |
|||
"no-empty-interface": true, |
|||
"no-empty": false, |
|||
"no-inferrable-types": [false, "ignore-params"], |
|||
"no-non-null-assertion": true, |
|||
"no-redundant-jsdoc": true, |
|||
"no-switch-case-fall-through": true, |
|||
"no-use-before-declare": true, |
|||
"no-var-requires": false, |
|||
"curly": false, |
|||
"object-literal-key-quotes": [true, "as-needed"], |
|||
"object-literal-sort-keys": false, |
|||
"ordered-imports": false, |
|||
"quotemark": [true, "single"], |
|||
"trailing-comma": false, |
|||
"no-conflicting-lifecycle": true, |
|||
"no-eval": true, |
|||
"no-host-metadata-property": true, |
|||
"no-input-rename": true, |
|||
"no-inferrable-types": [true, "ignore-params"], |
|||
"no-input-rename": false, |
|||
"no-inputs-metadata-property": true, |
|||
"no-misused-new": true, |
|||
"no-namespace": false, |
|||
"no-non-null-assertion": true, |
|||
"no-output-native": true, |
|||
"no-output-on-prefix": true, |
|||
"no-output-rename": true, |
|||
"no-output-rename": false, |
|||
"no-outputs-metadata-property": true, |
|||
"no-namespace": false, |
|||
"template-banana-in-box": true, |
|||
"template-no-negated-async": true, |
|||
"no-shadowed-variable": true, |
|||
"no-string-literal": false, |
|||
"no-string-throw": true, |
|||
"no-switch-case-fall-through": true, |
|||
"no-unnecessary-initializer": true, |
|||
"no-unnecessary-semicolons": false, |
|||
"no-unused-expression": true, |
|||
"no-var-keyword": true, |
|||
"object-literal-sort-keys": false, |
|||
"prefer-const": true, |
|||
"quotemark": [true, "single", "avoid-escape", "avoid-template"], |
|||
"radix": true, |
|||
"semicolon": [true, "always", "ignore-bound-class-methods"], |
|||
// "template-accessibility-alt-text": true, |
|||
// "template-accessibility-elements-content": true, |
|||
// "template-accessibility-label-for": true, |
|||
// "template-accessibility-tabindex-no-positive": true, |
|||
// "template-accessibility-table-scope": true, |
|||
// "template-accessibility-valid-aria": true, |
|||
// "template-banana-in-box": true, |
|||
// "template-click-events-have-key-events": true, |
|||
// "template-mouse-events-have-key-events": true, |
|||
// "template-no-autofocus": true, |
|||
// "template-no-distracting-elements": true, |
|||
// "template-no-negated-async": true, |
|||
"triple-equals": [true, "allow-null-check"], |
|||
"unified-signatures": true, |
|||
"use-lifecycle-interface": true, |
|||
"use-pipe-transform-interface": true |
|||
}, |
|||
"rulesDirectory": ["codelyzer"] |
|||
"use-pipe-transform-interface": true, |
|||
"variable-name": false, |
|||
"prefer-for-of": false |
|||
} |
|||
} |
|||
|
|||
Loading…
Reference in new issue