Run TSLint in Azure Pipelines (#3639)

This commit is contained in:
Matt Irvine
2018-12-19 12:17:23 -08:00
committed by GitHub
parent 7f950ddb80
commit db145b4999
29 changed files with 117 additions and 62 deletions

View File

@@ -34,5 +34,9 @@ steps:
- task: PublishTestResults@2
inputs:
testResultsFiles: '**/test-results.xml'
condition: succeededOrFailed()
testResultsFiles: '**/test-results.xml'
condition: succeededOrFailed()
- script: |
yarn run tslint
displayName: 'Run TSLint'

View File

@@ -23,4 +23,8 @@ steps:
- task: PublishTestResults@2
inputs:
testResultsFiles: 'test-results.xml'
condition: succeededOrFailed()
condition: succeededOrFailed()
- script: |
yarn run tslint
displayName: 'Run TSLint'

View File

@@ -23,7 +23,8 @@
"smoketest": "cd test/smoke && node test/index.js",
"monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit",
"download-builtin-extensions": "node build/lib/builtInExtensions.js",
"check-monaco-editor-compilation": "tsc -p src/tsconfig.monaco.json --noEmit"
"check-monaco-editor-compilation": "tsc -p src/tsconfig.monaco.json --noEmit",
"tslint": "node node_modules/tslint/bin/tslint -c tslint-gci.json -p src/tsconfig.json"
},
"dependencies": {
"@angular/animations": "~4.1.3",
@@ -154,6 +155,7 @@
"source-map": "^0.4.4",
"temp-write": "^3.4.0",
"tslint": "^5.9.1",
"tslint-microsoft-contrib": "^6.0.0",
"typemoq": "^0.3.2",
"typescript": "2.9.2",
"typescript-formatter": "7.1.0",

View File

@@ -47,7 +47,7 @@ export class CopyKeybind<T> implements Slick.Plugin<T> {
if (!isUndefinedOrNull(this.grid.getColumns()[0].selectable) && !this.grid.getColumns()[0].selectable) {
startColumn = 1;
}
ranges = [new Slick.Range(selectedRows[0], startColumn, selectedRows[selectedRows.length - 1], this.grid.getColumns().length)]
ranges = [new Slick.Range(selectedRows[0], startColumn, selectedRows[selectedRows.length - 1], this.grid.getColumns().length)];
}
this._onCopy.fire(ranges);
}

View File

@@ -349,6 +349,7 @@ export class RowDetailView {
//slick-cell to escape the cell overflow clipping.
//sneaky extra </div> inserted here-----------------v
/* tslint:disable:no-unexternalized-strings */
html.push("<div class='detailView-toggle collapse'></div></div>");
html.push("<div id='cellDetailView_", dataContext.id, "' class='dynamic-cell-detail' "); //apply custom css to detail
@@ -356,6 +357,7 @@ export class RowDetailView {
html.push("top:", rowHeight, "px'>"); //shift detail below 1st row
html.push("<div id='detailViewContainer_", dataContext.id, "' class='detail-container' style='max-height:" + (dataContext._height - rowHeight + bottomMargin) + "px'>"); //sub ctr for custom styling
html.push("<div id='innerDetailView_", dataContext.id, "'>", escape(dataContext._detailContent), "</div></div>");
/* tslint:enable:no-unexternalized-strings */
//&omit a final closing detail container </div> that would come next
return html.join('');
@@ -364,17 +366,21 @@ export class RowDetailView {
}
public resizeDetailView(item) {
if (!item) return;
if (!item) {
return;
}
// Grad each of the dom items
let mainContainer = document.getElementById('detailViewContainer_' + item.id);
let cellItem = document.getElementById('cellDetailView_' + item.id);
let inner = document.getElementById('innerDetailView_' + item.id);
if (!mainContainer || !cellItem || !inner) return;
if (!mainContainer || !cellItem || !inner) {
return;
}
for (let idx = 1; idx <= item._sizePadding; idx++) {
this._dataView.deleteItem(item.id + "." + idx);
this._dataView.deleteItem(item.id + '.' + idx);
}
let rowHeight = this._grid.getOptions().rowHeight; // height of a row
@@ -395,9 +401,9 @@ export class RowDetailView {
this._grid.getOptions().minRowBuffer = item._sizePadding + 3;
}
mainContainer.setAttribute("style", "max-height: " + item._height + "px");
mainContainer.setAttribute('style', 'max-height: ' + item._height + 'px');
if (cellItem) {
cellItem.setAttribute("style", "height: " + item._height + "px;top:" + rowHeight + "px");
cellItem.setAttribute('style', 'height: ' + item._height + 'px;top:' + rowHeight + 'px');
}
let idxParent = this._dataView.getIdxById(item.id);

View File

@@ -17,7 +17,6 @@ import { IConnectionProfile } from 'sql/parts/connection/common/interfaces';
import { ConnectionOptionSpecialType } from 'sql/workbench/api/common/sqlExtHostTypes';
import * as Constants from 'sql/parts/connection/common/constants';
import { ConnectionProfileGroup, IConnectionProfileGroup } from 'sql/parts/connection/common/connectionProfileGroup';
import { attachButtonStyler, attachCheckboxStyler, attachEditableDropdownStyler, attachInputBoxStyler } from 'sql/common/theme/styler';
import { Dropdown } from 'sql/base/browser/ui/editableDropdown/dropdown';
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService';
@@ -290,14 +289,14 @@ export class ConnectionWidget {
private registerListeners(): void {
// Theme styler
this._toDispose.push(attachInputBoxStyler(this._serverNameInputBox, this._themeService));
this._toDispose.push(attachEditableDropdownStyler(this._databaseNameInputBox, this._themeService));
this._toDispose.push(attachInputBoxStyler(this._connectionNameInputBox, this._themeService));
this._toDispose.push(attachInputBoxStyler(this._userNameInputBox, this._themeService));
this._toDispose.push(attachInputBoxStyler(this._passwordInputBox, this._themeService));
this._toDispose.push(styler.attachInputBoxStyler(this._serverNameInputBox, this._themeService));
this._toDispose.push(styler.attachEditableDropdownStyler(this._databaseNameInputBox, this._themeService));
this._toDispose.push(styler.attachInputBoxStyler(this._connectionNameInputBox, this._themeService));
this._toDispose.push(styler.attachInputBoxStyler(this._userNameInputBox, this._themeService));
this._toDispose.push(styler.attachInputBoxStyler(this._passwordInputBox, this._themeService));
this._toDispose.push(styler.attachSelectBoxStyler(this._serverGroupSelectBox, this._themeService));
this._toDispose.push(attachButtonStyler(this._advancedButton, this._themeService));
this._toDispose.push(attachCheckboxStyler(this._rememberPasswordCheckBox, this._themeService));
this._toDispose.push(styler.attachButtonStyler(this._advancedButton, this._themeService));
this._toDispose.push(styler.attachCheckboxStyler(this._rememberPasswordCheckBox, this._themeService));
this._toDispose.push(styler.attachSelectBoxStyler(this._azureAccountDropdown, this._themeService));
if (this._authTypeSelectBox) {

View File

@@ -17,7 +17,7 @@ import * as nls from 'vs/nls';
export enum BreadcrumbClass {
DatabasePage,
ServerPage
};
}
@Injectable()
export class BreadcrumbService implements IBreadcrumbService {

View File

@@ -22,25 +22,25 @@ export const recoveryModelSimple = 'Simple';
export const recoveryModelFull = 'Full';
// Constants for UI strings
export const labelDatabase = 'Database';
export const labelFilegroup = 'Files and filegroups';
export const labelFull = 'Full';
export const labelDifferential = 'Differential';
export const labelLog = 'Transaction Log';
export const labelDisk = 'Disk';
export const labelUrl = 'Url';
export const labelDatabase = localize('backup.labelDatabase', 'Database');
export const labelFilegroup = localize('backup.labelFilegroup', 'Files and filegroups');
export const labelFull = localize('backup.labelFull', 'Full');
export const labelDifferential = localize('backup.labelDifferential', 'Differential');
export const labelLog = localize('backup.labelLog', 'Transaction Log');
export const labelDisk = localize('backup.labelDisk', 'Disk');
export const labelUrl = localize('backup.labelUrl', 'Url');
export const defaultCompression = 'Use the default server setting';
export const compressionOn = 'Compress backup';
export const compressionOff = 'Do not compress backup';
export const defaultCompression = localize('backup.defaultCompression', 'Use the default server setting');
export const compressionOn = localize('backup.compressBackup', 'Compress backup');
export const compressionOff = localize('backup.doNotCompress', 'Do not compress backup');
export const aes128 = 'AES 128';
export const aes192 = 'AES 192';
export const aes256 = 'AES 256';
export const tripleDES = 'Triple DES';
export const serverCertificate = "Server Certificate";
export const asymmetricKey = "Asymmetric Key";
export const serverCertificate = localize('backup.serverCertificate', "Server Certificate");
export const asymmetricKey = localize('backup.asymmetricKey', "Asymmetric Key");
export const fileFiltersSet: {label: string, filters: string[]}[] = [
{ label: localize('backup.filterBackupFiles', "Backup Files"), filters: ['*.bak', '*.trn', '*.log'] },

View File

@@ -7,5 +7,5 @@
* List of services that provide file validation callback to file browser service
*/
export const backup: string = "Backup";
export const restore: string = "Restore";
export const backup: string = 'Backup';
export const restore: string = 'Restore';

View File

@@ -412,7 +412,7 @@ export class JobsViewComponent extends JobManagementView implements OnInit, OnDe
};
sibling.onmouseleave = (e) => {
targetChildren.removeClass('hovered');
}
};
break;
}
}

View File

@@ -131,7 +131,7 @@ export default class CardComponent extends ComponentWithIconBase implements ICom
}
public get showRadioButton():boolean{
return this.selectable && (this.selected || this._hasFocus)
return this.selectable && (this.selected || this._hasFocus);
}
public get showAsSelected(): boolean {

View File

@@ -4,9 +4,8 @@
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
import { JSONObject } from './jsonext';
import { JSONObject, isPrimitive } from './jsonext';
import { MimeModel } from './mimemodel';
import * as JSONExt from './jsonext';
import { nbformat } from './nbformat';
import { nb } from 'sqlops';
@@ -77,7 +76,7 @@ export function getBundleOptions(
*/
export function extract(value: JSONObject, key: string): {} {
let item = value[key];
if (JSONExt.isPrimitive(item)) {
if (isPrimitive(item)) {
return item;
}
return JSON.parse(JSON.stringify(item));

View File

@@ -19,7 +19,7 @@ import { Action } from 'vs/base/common/actions';
import * as nls from 'vs/nls';
import { IEditorAction } from 'vs/editor/common/editorCommon';
import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService';
import { ICommandService } from 'vs/platform/commands/common/commands'
import { ICommandService } from 'vs/platform/commands/common/commands';
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { INotificationService } from 'vs/platform/notification/common/notification';

View File

@@ -530,7 +530,7 @@ export class ProfilerEditor extends BaseEditor {
}
this._sessionSelector.selectWithOptionName(this.input.sessionName);
};
}
});
}

View File

@@ -271,7 +271,7 @@ export class ProfilerInput extends EditorInput implements IProfilerSession {
} else {
return ConfirmResult.CANCEL;
}
});;
});
} else {
return TPromise.wrap(ConfirmResult.DONT_SAVE);
}

View File

@@ -107,7 +107,7 @@ export class ProfilerTestBackend implements sqlops.ProfilerProvider {
this.testData[i / columns.length] = new Array<string>();
}
this.testData[Math.floor(i / columns.length)][i % columns.length] = tabsep[i];
};
}
resolve(true);
});
});

View File

@@ -148,7 +148,7 @@ export class SqlFlavorStatusbarItem implements IStatusbarItem {
// Show/hide query status for active editor
private _showStatus(uri: string): void {
let activeEditor = this._editorService.activeControl
let activeEditor = this._editorService.activeControl;
if (activeEditor) {
let currentUri = WorkbenchUtils.getEditorUri(activeEditor.input);
if (uri === currentUri) {

View File

@@ -394,7 +394,7 @@ export class QueryModelService implements IQueryModelService {
queryRunner.onResultSetUpdate(resultSetSummaries => {
resultSetSummaries.forEach(resultSet => {
this._fireQueryEvent(ownerUri, resultSetEventType, resultSet);
})
});
});
queryRunner.addListener(QREvents.BATCH_START, batch => {
let link = undefined;

View File

@@ -143,7 +143,7 @@ export class PlanNode {
export class PlanXmlParser {
parser: DOMParser = new DOMParser();
doc: Document;
planXml: string
planXml: string;
root: PlanNode;
constructor(planXml: string) {

View File

@@ -175,7 +175,7 @@ export class TaskService implements ITaskService {
clearTimeout(timeoutId);
if (!isTimeout) {
resolve(false);
};
}
});
timeoutId = setTimeout(function () {
isTimeout = true;

View File

@@ -3,9 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
import { EditorDescriptor } from 'vs/workbench/browser/editor';
import { IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor';
import { IEditorRegistry, Extensions as EditorExtensions, EditorDescriptor } from 'vs/workbench/browser/editor';
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { Registry } from 'vs/platform/registry/common/platform';
import { TaskDialogEditor } from 'sql/parts/tasks/dialog/taskDialogEditor';

View File

@@ -40,4 +40,4 @@ export class FileTelemetryService implements ITelemetryService {
machineId: 'someValue.machineId'
});
}
};
}

View File

@@ -36,7 +36,7 @@ export abstract class FixedCollapsibleView extends AbstractCollapsibleView {
this.setFixed(this.fixedSize);
if (this.body) {
if (state == CollapsibleState.COLLAPSED) {
if (state === CollapsibleState.COLLAPSED) {
// make sure the body goes out of the tabindex world by hiding it
$(this.body).hide();
} else {

View File

@@ -55,7 +55,7 @@ export class ErrorMessageDialog extends Modal {
protected renderBody(container: HTMLElement) {
new Builder(container).div({ 'class': 'error-dialog' }, (bodyBuilder) => {
this._body = bodyBuilder.getHTMLElement();;
this._body = bodyBuilder.getHTMLElement();
});
}

View File

@@ -19,7 +19,7 @@ suite('Firewall rule view model tests', () => {
viewModel.updateDefaultValues(IPAddress);
assert.equal(IPAddress, viewModel.defaultIPAddress);
assert.equal('250.222.155.0', viewModel.defaultFromSubnetIPRange);
assert.equal('250.222.155.255', viewModel.defaultToSubnetIPRange);;
assert.equal('250.222.155.255', viewModel.defaultToSubnetIPRange);
});
test('update default values to 250.222.155.0 should calculate the correct default subnet IP range', () => {

View File

@@ -113,7 +113,7 @@ export class CapabilitiesTestService implements ICapabilitiesService {
}
public getLegacyCapabilities(provider: string): sqlops.DataProtocolServerCapabilities {
throw new Error("Method not implemented.");
throw new Error('Method not implemented.');
}
public get providers(): { [id: string]: ProviderFeatures } {

View File

@@ -5,9 +5,7 @@
'use strict';
import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
import { IConfigurationData, IConfigurationOverrides, ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
import { IConfigurationValue } from 'vs/workbench/services/configuration/node/configurationEditingService';
import { IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration';
import { IConfigurationData, IConfigurationOverrides, ConfigurationTarget, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration';
import { TPromise } from 'vs/base/common/winjs.base';
import { Event } from 'vs/base/common/event';
@@ -36,11 +34,11 @@ export class WorkspaceConfigurationTestService implements IWorkspaceConfiguratio
return TPromise.as(null);
}
updateValue(key: string, value: any): TPromise<void>
updateValue(key: string, value: any, overrides: IConfigurationOverrides): TPromise<void>
updateValue(key: string, value: any, target: ConfigurationTarget): TPromise<void>
updateValue(key: string, value: any, overrides: IConfigurationOverrides, target: ConfigurationTarget): TPromise<void>
updateValue(key: string, value: any, overrides: IConfigurationOverrides, target: ConfigurationTarget, donotNotifyError: boolean): TPromise<void>
updateValue(key: string, value: any): TPromise<void>;
updateValue(key: string, value: any, overrides: IConfigurationOverrides): TPromise<void>;
updateValue(key: string, value: any, target: ConfigurationTarget): TPromise<void>;
updateValue(key: string, value: any, overrides: IConfigurationOverrides, target: ConfigurationTarget): TPromise<void>;
updateValue(key: string, value: any, overrides: IConfigurationOverrides, target: ConfigurationTarget, donotNotifyError: boolean): TPromise<void>;
updateValue(key: string, value: any, arg3?: any, arg4?: any, donotNotifyError?: any): TPromise<void> {
return TPromise.as(null);
}

26
tslint-gci.json Normal file
View File

@@ -0,0 +1,26 @@
{
"extends": "./tslint.json",
"rules": {
"no-banned-terms": true,
"no-delete-expression": true,
"no-document-domain": true,
"no-disable-auto-sanitization": true,
"no-duplicate-parameter-names": true,
"no-exec-script": true,
"no-function-constructor-with-string-args": true,
"no-octal-literal": true,
"no-reserved-keywords": false,
"variable-name": {
"options": ["ban-keywords"]
},
"no-string-based-set-immediate": true,
"no-string-based-set-interval": true,
"no-string-based-set-timeout": true,
"no-eval": true
},
"defaultSeverity": "error",
"rulesDirectory": "./node_modules/tslint-microsoft-contrib/",
"linterOptions": {
"exclude": ["src/vs/**/*.ts"]
}
}

View File

@@ -7066,6 +7066,18 @@ tslib@^1.8.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
tslib@^1.8.1:
version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
tslint-microsoft-contrib@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-6.0.0.tgz#7bff73c9ad7a0b7eb5cdb04906de58f42a2bf7a2"
integrity sha512-R//efwn+34IUjTJeYgNDAJdzG0jyLWIehygPt/PHuZAieTolFVS56FgeFW7DOLap9ghXzMiFPTmDgm54qaL7QA==
dependencies:
tsutils "^2.27.2 <2.29.0"
tslint@^5.9.1:
version "5.9.1"
resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.9.1.tgz#1255f87a3ff57eb0b0e1f0e610a8b4748046c9ae"
@@ -7089,6 +7101,13 @@ tsutils@^2.12.1:
dependencies:
tslib "^1.7.1"
"tsutils@^2.27.2 <2.29.0":
version "2.28.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1"
integrity sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==
dependencies:
tslib "^1.8.1"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"