mirror of https://github.com/abpframework/abp.git
63 changed files with 948 additions and 495 deletions
@ -1,5 +1,4 @@ |
|||||
{ |
{ |
||||
"printWidth": 120, |
"printWidth": 120, |
||||
"singleQuote": true, |
"singleQuote": true |
||||
"trailingComma": "all" |
|
||||
} |
} |
||||
|
|||||
@ -1,2 +1,2 @@ |
|||||
export * from './localization.pipe'; |
export * from './localization.pipe'; |
||||
export * from "./sort.pipe"; |
export * from './sort.pipe'; |
||||
|
|||||
@ -1,13 +1,14 @@ |
|||||
import { Pipe, PipeTransform } from '@angular/core'; |
import { Pipe, PipeTransform } from '@angular/core'; |
||||
|
|
||||
@Pipe({ |
@Pipe({ |
||||
name: 'abpSort', |
name: 'abpSort', |
||||
pure: false |
// tslint:disable-next-line: no-pipe-impure
|
||||
|
pure: false |
||||
}) |
}) |
||||
export class SortPipe implements PipeTransform { |
export class SortPipe implements PipeTransform { |
||||
transform(value: any[], sortOrder: string): any { |
transform(value: any[], sortOrder: string): any { |
||||
sortOrder = sortOrder.toLowerCase(); |
sortOrder = sortOrder.toLowerCase(); |
||||
if(sortOrder === "desc") return value.reverse(); |
if (sortOrder === 'desc') return value.reverse(); |
||||
else return value; |
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() { |
export function noop() { |
||||
|
// tslint:disable-next-line: only-arrow-functions
|
||||
const fn = function() {}; |
const fn = function() {}; |
||||
return fn; |
return fn; |
||||
} |
} |
||||
|
|||||
@ -1,5 +1,6 @@ |
|||||
export function uuid(a?: any): string { |
export function uuid(a?: any): string { |
||||
return a |
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); |
: ('' + 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", |
"extends": "../../tslint.json", |
||||
"rules": { |
"rules": { |
||||
"directive-selector": [ |
"directive-selector": [true, "attribute", "abp", "camelCase"], |
||||
true, |
"component-selector": [true, "element", "abp", "kebab-case"] |
||||
"attribute", |
|
||||
"lib", |
|
||||
"camelCase" |
|
||||
], |
|
||||
"component-selector": [ |
|
||||
true, |
|
||||
"element", |
|
||||
"lib", |
|
||||
"kebab-case" |
|
||||
] |
|
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -1,55 +1,100 @@ |
|||||
{ |
{ |
||||
"extends": "tslint:recommended", |
"extends": "tslint:recommended", |
||||
|
"rulesDirectory": ["node_modules/codelyzer"], |
||||
"rules": { |
"rules": { |
||||
"array-type": false, |
"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-parens": false, |
||||
|
"arrow-return-shorthand": true, |
||||
|
"callable-types": true, |
||||
|
"class-name": true, |
||||
|
"component-selector": [true, "element", "abp", "kebab-case"], |
||||
|
"curly": false, |
||||
"deprecation": { |
"deprecation": { |
||||
"severity": "warn" |
"severity": "warn" |
||||
}, |
}, |
||||
"component-class-suffix": true, |
|
||||
"contextual-lifecycle": true, |
|
||||
"directive-class-suffix": true, |
|
||||
"directive-selector": [true, "attribute", "abp", "camelCase"], |
"directive-selector": [true, "attribute", "abp", "camelCase"], |
||||
"component-selector": [true, "element", "abp", "kebab-case"], |
"forin": true, |
||||
"import-blacklist": [true, "rxjs/Rx"], |
"import-blacklist": [true, "rxjs/Rx"], |
||||
"interface-name": false, |
"interface-over-type-literal": true, |
||||
"max-classes-per-file": false, |
"interface-name": [true, "never-prefix"], |
||||
"max-line-length": [true, 140], |
"member-access": [true, "no-public"], |
||||
"member-access": false, |
|
||||
"member-ordering": [ |
"member-ordering": [ |
||||
true, |
true, |
||||
{ |
{ |
||||
"order": ["static-field", "instance-field", "static-method", "instance-method"] |
"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-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-empty": false, |
||||
"no-inferrable-types": [false, "ignore-params"], |
"no-eval": true, |
||||
"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-host-metadata-property": 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-inputs-metadata-property": true, |
||||
|
"no-misused-new": true, |
||||
|
"no-namespace": false, |
||||
|
"no-non-null-assertion": true, |
||||
"no-output-native": true, |
"no-output-native": true, |
||||
"no-output-on-prefix": true, |
"no-output-on-prefix": true, |
||||
"no-output-rename": true, |
"no-output-rename": false, |
||||
"no-outputs-metadata-property": true, |
"no-outputs-metadata-property": true, |
||||
"no-namespace": false, |
"no-shadowed-variable": true, |
||||
"template-banana-in-box": true, |
"no-string-literal": false, |
||||
"template-no-negated-async": true, |
"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-lifecycle-interface": true, |
||||
"use-pipe-transform-interface": true |
"use-pipe-transform-interface": true, |
||||
}, |
"variable-name": false, |
||||
"rulesDirectory": ["codelyzer"] |
"prefer-for-of": false |
||||
|
} |
||||
} |
} |
||||
|
|||||
Loading…
Reference in new issue