Skip to content

Commit 8013e7b

Browse files
Foxandxsspkozlowski-opensource
authored andcommitted
chore: add linting
Closes ng-bootstrap#184
1 parent f4901b1 commit 8013e7b

18 files changed

+152
-50
lines changed

gulpfile.js

+9-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var merge = require('merge2');
1010
var clangFormat = require('clang-format');
1111
var gulpFormat = require('gulp-clang-format');
1212
var runSequence = require('run-sequence');
13+
var tslint = require('gulp-tslint');
1314
var webpack = require('webpack');
1415
var webpackDemoConfig = require('./webpack.demo.js');
1516

@@ -101,6 +102,12 @@ gulp.task('tdd', ['clean:build-tests'], function(done) {
101102

102103
// Formatting
103104

105+
gulp.task('lint', function() {
106+
return gulp.src(PATHS.src).pipe(tslint({configuration: require('./tslint.json')})).pipe(tslint.report('prose', {
107+
summarizeFailureOutput: true
108+
}));
109+
});
110+
104111
gulp.task('check-format', function() {
105112
return doCheckFormat().on(
106113
'warning', function(e) { console.log("NOTE: this will be promoted to an ERROR in the continuous build"); });
@@ -135,11 +142,11 @@ gulp.task('demo-push', function() { return gulp.src(PATHS.demoDist).pipe(ghPages
135142
gulp.task('clean', ['clean:build', 'clean:tests', 'clean:demo', 'clean:demo-cache']);
136143

137144
gulp.task('build', function(done) {
138-
runSequence('enforce-format', 'ddescribe-iit', 'test', 'clean:build', 'cjs', 'umd', done);
145+
runSequence('lint', 'enforce-format', 'ddescribe-iit', 'test', 'clean:build', 'cjs', 'umd', done);
139146
});
140147

141148
gulp.task('deploy-demo', function(done) {
142149
runSequence('clean:demo', 'copy:polyfills-demo', 'build:demo', 'demo-push', 'clean:demo-cache', done);
143150
});
144151

145-
gulp.task('default', function(done) { runSequence('enforce-format', 'ddescribe-iit', 'test', done); });
152+
gulp.task('default', function(done) { runSequence('lint', 'enforce-format', 'ddescribe-iit', 'test', done); });

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"gulp-gh-pages": "^0.5.4",
4242
"gulp-shell": "^0.5.1",
4343
"gulp-sourcemaps": "^1.6.0",
44+
"gulp-tslint": "^5.0.0",
4445
"gulp-typescript": "^2.9.2",
4546
"gulp-util": "^3.0.6",
4647
"html-loader": "^0.4.3",
@@ -66,6 +67,7 @@
6667
"style-loader": "^0.13.1",
6768
"systemjs": "^0.19.26",
6869
"ts-loader": "^0.8.2",
70+
"tslint": "^3.8.1",
6971
"typescript": "^1.6.2",
7072
"typings": "^0.7.9",
7173
"url-loader": "^0.5.7",

src/accordion/accordion.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111

1212
import {NgbCollapse} from '../collapse/collapse';
1313

14-
var nextId = 0;
14+
let nextId = 0;
1515

1616
@Component({
1717
selector: 'ngb-panel',
@@ -71,7 +71,7 @@ export class NgbAccordion implements AfterContentChecked {
7171
}
7272

7373
ngAfterContentChecked() {
74-
var openPanels = this._panels.toArray().filter((panel) => panel.open);
74+
const openPanels = this._panels.toArray().filter((panel) => panel.open);
7575
if (openPanels.length > 1) {
7676
this.closeOthers(openPanels[0]);
7777
}

src/collapse/collapse.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ function getCollapsibleContent(element: HTMLElement): HTMLDivElement {
2020

2121
describe('ngb-collapse', () => {
2222

23-
const html = `<div [ngbCollapse]="collapsed">Some content</div>`;
23+
let html = `<div [ngbCollapse]="collapsed">Some content</div>`;
2424

2525
it('should have content open and aria-expanded true', async(inject([TestComponentBuilder], (tcb) => {
2626
tcb.overrideTemplate(TestComponent, html).createAsync(TestComponent).then((fixture) => {
@@ -65,7 +65,7 @@ describe('ngb-collapse', () => {
6565
})));
6666

6767
it('should allow toggling collapse from outside', async(inject([TestComponentBuilder], (tcb) => {
68-
const html = `
68+
html = `
6969
<button (click)="collapse.collapsed = !collapse.collapsed">Collapse</button>
7070
<div [ngbCollapse] #collapse="ngbCollapse"></div>`;
7171

src/modal/modal_backdrop.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import {Component} from "@angular/core";
1+
import {Component} from '@angular/core';
22

3-
@Component({selector: 'ngb-modal-backdrop', template: '', host: {"class": "modal-backdrop"}})
3+
@Component({selector: 'ngb-modal-backdrop', template: '', host: {'class': 'modal-backdrop'}})
44
export class NgbModalBackdrop {
55
}

src/modal/modal_window.spec.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
import {TestComponentBuilder} from '@angular/compiler/testing';
1313

1414
import {NgbModalWindow} from './modal_window';
15-
import {ModalDismissReasons} from "./modal_dismiss_reasons";
15+
import {ModalDismissReasons} from './modal_dismiss_reasons';
1616

1717
describe('ngb-modal-dialog', () => {
1818

@@ -22,8 +22,8 @@ describe('ngb-modal-dialog', () => {
2222
tcb.createAsync(NgbModalWindow).then((fixture) => {
2323
fixture.detectChanges();
2424

25-
var modalEl: Element = fixture.nativeElement;
26-
var dialogEl: Element = fixture.nativeElement.querySelector('.modal-dialog');
25+
const modalEl: Element = fixture.nativeElement;
26+
const dialogEl: Element = fixture.nativeElement.querySelector('.modal-dialog');
2727

2828
expect(modalEl).toHaveCssClass('modal');
2929
expect(dialogEl).toHaveCssClass('modal-dialog');
@@ -36,7 +36,7 @@ describe('ngb-modal-dialog', () => {
3636
fixture.componentInstance.size = 'sm';
3737
fixture.detectChanges();
3838

39-
var dialogEl: Element = fixture.nativeElement.querySelector('.modal-dialog');
39+
const dialogEl: Element = fixture.nativeElement.querySelector('.modal-dialog');
4040
expect(dialogEl).toHaveCssClass('modal-dialog');
4141
expect(dialogEl).toHaveCssClass('modal-sm');
4242
});
@@ -45,7 +45,7 @@ describe('ngb-modal-dialog', () => {
4545

4646
describe('dismiss', () => {
4747

48-
var tcb: TestComponentBuilder;
48+
let tcb: TestComponentBuilder;
4949

5050
beforeEach(inject([TestComponentBuilder], (tcBuilder) => { tcb = tcBuilder; }));
5151

src/modal/modal_window.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ import {
44
EventEmitter,
55
Input,
66
HostListener,
7-
} from "@angular/core";
7+
} from '@angular/core';
88

99
import {ModalDismissReasons} from './modal_dismiss_reasons';
1010

1111
@Component({
1212
selector: 'ngb-modal-window',
13-
host: {"class": "modal", "role": "dialog", "tabindex": "-1", "style": "display: block;"},
13+
host: {'class': 'modal', 'role': 'dialog', 'tabindex': '-1', 'style': 'display: block;'},
1414
template: `
1515
<div [class]="'modal-dialog' + (size ? ' modal-' + size : '')">
1616
<div class="modal-content" (click)="stopPropagation($event)">
17-
<ng-content></ng-content>
17+
<ng-content></ng-content>
1818
</div>
1919
</div>
2020
`

src/pager/pager.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {Component} from '@angular/core';
1717
import {NgbPager} from './pager';
1818

1919
function expectPager(nativeEl: HTMLElement, pagerStates: boolean[]): void {
20-
var pagerCtrls = nativeEl.querySelectorAll('li');
20+
const pagerCtrls = nativeEl.querySelectorAll('li');
2121

2222
if (pagerStates[0]) {
2323
expect(pagerCtrls[0]).not.toHaveCssClass('disabled');
@@ -40,7 +40,7 @@ describe('ngb-pagination', () => {
4040

4141
describe('business logic', () => {
4242

43-
var pager: NgbPager;
43+
let pager: NgbPager;
4444

4545
beforeEach(() => { pager = new NgbPager(); });
4646

src/pager/pager.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,19 @@ export class NgbPager implements OnChanges {
2020

2121
prev(): void {
2222
if (this.hasPrev()) {
23-
this.pageChange.emit(--this._currentPage)
23+
this.pageChange.emit(--this._currentPage);
2424
}
2525
}
2626

2727
next(): void {
2828
if (this.hasNext()) {
29-
this.pageChange.emit(++this._currentPage)
29+
this.pageChange.emit(++this._currentPage);
3030
}
3131
}
3232

3333
hasPrev(): boolean { return this._currentPage > 0; }
3434

3535
hasNext(): boolean { return this._currentPage < this.noOfPages - 1; }
3636

37-
ngOnChanges(): void { this._currentPage = Math.max(Math.min(this.page, this.noOfPages - 1), 0) }
37+
ngOnChanges(): void { this._currentPage = Math.max(Math.min(this.page, this.noOfPages - 1), 0); }
3838
}

src/pagination/pagination.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {Component} from '@angular/core';
1717
import {NgbPagination} from './pagination';
1818

1919
function expectPages(nativeEl: HTMLElement, pagesDef: string[]): void {
20-
var pages = nativeEl.querySelectorAll('li');
20+
const pages = nativeEl.querySelectorAll('li');
2121

2222
expect(pages.length).toEqual(pagesDef.length);
2323

@@ -53,7 +53,7 @@ describe('ngb-pagination', () => {
5353

5454
describe('business logic', () => {
5555

56-
var pagination: NgbPagination;
56+
let pagination: NgbPagination;
5757

5858
beforeEach(() => { pagination = new NgbPagination(); });
5959

src/pagination/pagination.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -62,21 +62,21 @@ export class NgbPagination implements OnChanges {
6262
hasNext(): boolean { return this.page < this.pages.length; }
6363

6464
selectPage(pageNumber: number): void {
65-
var prevPageNo = this.page;
65+
let prevPageNo = this.page;
6666
this._page = this._getPageNoInRange(pageNumber);
6767

68-
if (this.page != prevPageNo) {
68+
if (this.page !== prevPageNo) {
6969
this.pageChange.emit(this.page);
7070
}
7171
}
7272

7373
ngOnChanges(): void {
7474
// re-calculate new length of pages
75-
var pageCount = Math.ceil(this._collectionSize / this._pageSize);
75+
let pageCount = Math.ceil(this._collectionSize / this._pageSize);
7676

7777
// fill-in model needed to render pages
7878
this.pages.length = 0;
79-
for (var i = 1; i <= pageCount; i++) {
79+
for (let i = 1; i <= pageCount; i++) {
8080
this.pages.push(i);
8181
}
8282

src/radio/radio.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {NGB_RADIO_DIRECTIVES} from './radio';
55

66

77
function expectRadios(element: HTMLElement, states: number[]) {
8-
var labels = element.querySelectorAll('label');
8+
const labels = element.querySelectorAll('label');
99
expect(labels.length).toEqual(states.length);
1010

1111
for (let i = 0; i < states.length; i++) {

src/radio/radio.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export class NgbRadioGroup implements ControlValueAccessor {
4646

4747
private _setGroupValue(radio: NgbRadio) {
4848
this._selectedRadio = radio;
49-
var value = radio ? radio.value : null;
49+
const value = radio ? radio.value : null;
5050
this.writeValue(value);
5151
this.onChange(value);
5252
}
@@ -77,7 +77,7 @@ export class NgbRadio implements OnDestroy {
7777
@Input('value')
7878
set value(value) {
7979
this._value = value;
80-
var stringValue = value ? value.toString() : '';
80+
const stringValue = value ? value.toString() : '';
8181
this.renderer.setElementProperty(this.element.nativeElement, 'value', stringValue);
8282

8383
if (this.group) {

src/rating/rating.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import {Component, Input, Output, EventEmitter, OnInit} from '@angular/core';
66
<span tabindex="0" (mouseleave)="reset()" aria-valuemin="0" [attr.aria-valuemax]="max" [attr.aria-valuenow]="rate">
77
<template ngFor let-r [ngForOf]="range" let-index="index">
88
<span class="sr-only">({{ index < rate ? '*' : ' ' }})</span>
9-
<i class="glyphicon {{index < rate ? 'glyphicon-star' : 'glyphicon-star-empty'}}" (mouseenter)="enter(index + 1)" (click)="update(index + 1)" [title]="r.title" [attr.aria-valuetext]="r.title"></i>
9+
<i class="glyphicon {{index < rate ? 'glyphicon-star' : 'glyphicon-star-empty'}}" (mouseenter)="enter(index + 1)"
10+
(click)="update(index + 1)" [title]="r.title" [attr.aria-valuetext]="r.title"></i>
1011
</template>
1112
</span>
1213
`

src/tabset/tabset.spec.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ function getTabContent(nativeEl: HTMLElement) {
2525
}
2626

2727
function expectActiveTabs(nativeEl: HTMLElement, active: boolean[]) {
28-
var tabTitles = getTabTitles(nativeEl);
29-
var tabContent = getTabContent(nativeEl);
28+
const tabTitles = getTabTitles(nativeEl);
29+
const tabContent = getTabContent(nativeEl);
3030

3131
expect(tabTitles.length).toBe(active.length);
3232
expect(tabContent.length).toBe(active.length);
3333

34-
for (var i = 0; i < active.length; i++) {
34+
for (let i = 0; i < active.length; i++) {
3535
if (active[i]) {
3636
expect(tabTitles[i]).toHaveCssClass('active');
3737
expect(tabContent[i]).toHaveCssClass('active');
@@ -55,8 +55,8 @@ describe('ngb-tabset', () => {
5555
tcb.overrideTemplate(TestComponent, html).createAsync(TestComponent).then((fixture) => {
5656
fixture.detectChanges();
5757

58-
var tabTitles = getTabTitles(fixture.nativeElement);
59-
var tabContent = getTabContent(fixture.nativeElement);
58+
const tabTitles = getTabTitles(fixture.nativeElement);
59+
const tabContent = getTabContent(fixture.nativeElement);
6060

6161
expect(tabTitles[0].textContent).toMatchPattern(/foo/);
6262
expect(tabTitles[1].textContent).toMatchPattern(/bar/);
@@ -85,7 +85,7 @@ describe('ngb-tabset', () => {
8585
tcb.overrideTemplate(TestComponent, html).createAsync(TestComponent).then((fixture) => {
8686
fixture.detectChanges();
8787

88-
var tabTitles = getTabTitles(fixture.nativeElement);
88+
const tabTitles = getTabTitles(fixture.nativeElement);
8989

9090
expect(tabTitles[0].textContent).toMatchPattern(/foo/);
9191
expect(tabTitles[1].innerHTML).toMatchPattern(/<b>bar<\/b>/);
@@ -137,7 +137,7 @@ describe('ngb-tabset', () => {
137137
tcb.overrideTemplate(TestComponent, html).createAsync(TestComponent).then((fixture) => {
138138
fixture.detectChanges();
139139

140-
var tabTitles = getTabTitles(fixture.nativeElement);
140+
const tabTitles = getTabTitles(fixture.nativeElement);
141141

142142
(<HTMLAnchorElement>tabTitles[1]).click();
143143
fixture.detectChanges();

src/util/triggers.spec.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,23 @@ describe('triggers', () => {
1717
describe('parseTriggers', () => {
1818

1919
it('should parse single trigger', () => {
20-
var t = parseTriggers('foo');
20+
const t = parseTriggers('foo');
2121

2222
expect(t.length).toBe(1);
2323
expect(t[0].open).toBe('foo');
2424
expect(t[0].close).toBe('foo');
2525
});
2626

2727
it('should parse open:close form', () => {
28-
var t = parseTriggers('foo:bar');
28+
const t = parseTriggers('foo:bar');
2929

3030
expect(t.length).toBe(1);
3131
expect(t[0].open).toBe('foo');
3232
expect(t[0].close).toBe('bar');
3333
});
3434

3535
it('should parse multiple triggers', () => {
36-
var t = parseTriggers('foo:bar bar:baz');
36+
const t = parseTriggers('foo:bar bar:baz');
3737

3838
expect(t.length).toBe(2);
3939
expect(t[0].open).toBe('foo');
@@ -43,7 +43,7 @@ describe('triggers', () => {
4343
});
4444

4545
it('should parse multiple triggers with mixed forms', () => {
46-
var t = parseTriggers('foo bar:baz');
46+
const t = parseTriggers('foo bar:baz');
4747

4848
expect(t.length).toBe(2);
4949
expect(t[0].open).toBe('foo');
@@ -53,7 +53,7 @@ describe('triggers', () => {
5353
});
5454

5555
it('should properly trim excessive white-spaces', () => {
56-
var t = parseTriggers('foo bar \n baz ');
56+
const t = parseTriggers('foo bar \n baz ');
5757

5858
expect(t.length).toBe(3);
5959
expect(t[0].open).toBe('foo');
@@ -65,17 +65,17 @@ describe('triggers', () => {
6565
});
6666

6767
it('should lookup and translate special aliases', () => {
68-
var t = parseTriggers('hover');
68+
const t = parseTriggers('hover');
6969

7070
expect(t.length).toBe(1);
7171
expect(t[0].open).toBe('mouseenter');
7272
expect(t[0].close).toBe('mouseleave');
7373
});
7474

7575
it('should detect manual triggers', () => {
76-
var t = parseTriggers('manual');
76+
const t = parseTriggers('manual');
7777

78-
expect(t[0].isManual).toBeTruthy()
78+
expect(t[0].isManual).toBeTruthy();
7979
});
8080

8181
it('should ignore empty inputs', () => {

0 commit comments

Comments
 (0)