-
Notifications
You must be signed in to change notification settings - Fork 8.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
spalger
committed
May 17, 2018
1 parent
bd0f4e1
commit 96ccc5b
Showing
27 changed files
with
590 additions
and
48 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import { Readable } from 'stream'; | ||
|
||
type LogLevel = 'silent' | 'error' | 'warning' | 'info' | 'debug' | 'verbose'; | ||
|
||
export class ToolingLog extends Readable { | ||
public verbose(...args: any[]): void; | ||
public debug(...args: any[]): void; | ||
public info(...args: any[]): void; | ||
public success(...args: any[]): void; | ||
public warning(...args: any[]): void; | ||
public error(errOrMsg: string | Error): void; | ||
public write(...args: any[]): void; | ||
public indent(spaces: number): void; | ||
public getLevel(): LogLevel; | ||
public setLevel(level: LogLevel): void; | ||
} | ||
|
||
export function createToolingLog(level?: LogLevel): ToolingLog; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"extends": "../../tsconfig.json", | ||
"include": [ | ||
"index.d.ts" | ||
], | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
extends: ../../tslint.yaml | ||
|
||
rules: | ||
max-classes-per-file: false | ||
interface-name: false | ||
variable-name: false | ||
no-empty: false | ||
object-literal-sort-keys: false | ||
member-ordering: false | ||
no-console: false | ||
only-arrow-functions: false | ||
no-shadowed-variable: false | ||
no-empty-interface: false | ||
ordered-imports: false | ||
interface-over-type-literal: false | ||
prettier: false | ||
prefer-const: false | ||
member-access: false |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
extends: ../../tslint.yaml | ||
|
||
rules: | ||
max-classes-per-file: false | ||
interface-name: false | ||
variable-name: false | ||
no-empty: false | ||
object-literal-sort-keys: false | ||
member-ordering: false | ||
member-access: false | ||
ordered-imports: false | ||
interface-over-type-literal: false | ||
array-type: false | ||
prefer-const: false |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
require('../src/babel-register'); | ||
require('../src/dev/tslint').runTslintCli(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export function createFailError(msg: string, exitCode: number): Error; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,17 @@ | ||
import { run } from './run'; | ||
|
||
import { lintFiles, pickFilesToLint } from './eslint'; | ||
import * as Eslint from './eslint'; | ||
import * as Tslint from './tslint'; | ||
import { getFilesForCommit, checkFileCasing } from './precommit_hook'; | ||
|
||
run(async ({ log }) => { | ||
const files = await getFilesForCommit(); | ||
await checkFileCasing(log, files); | ||
await lintFiles(log, pickFilesToLint(log, files)); | ||
|
||
for (const Linter of [Eslint, Tslint]) { | ||
const filesToLint = Linter.pickFilesToLint(log, files); | ||
if (filesToLint.length > 0) { | ||
await Linter.lintFiles(log, filesToLint); | ||
} | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export { runTslintCli } from './run_tslint_cli'; | ||
export { lintFiles } from './lint_files'; | ||
export { pickFilesToLint } from './pick_files_to_lint'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
import { CLIEngine } from 'eslint'; | ||
import { run } from 'tslint/lib/runner'; | ||
|
||
import { ToolingLog } from '@kbn/dev-utils'; | ||
import { REPO_ROOT } from '../constants'; | ||
import { File } from '../file'; | ||
import { createFailError } from '../run'; | ||
import { getTsProjectForAbsolutePath } from '../typescript'; | ||
|
||
function groupFilesByProject(files: File[]) { | ||
const filesByProject: Map< | ||
ReturnType<typeof getTsProjectForAbsolutePath>, | ||
File[] | ||
> = new Map(); | ||
|
||
files.forEach(file => { | ||
const project = getTsProjectForAbsolutePath(file.getAbsolutePath()); | ||
const filesForProject = filesByProject.get(project); | ||
|
||
if (!filesForProject) { | ||
filesByProject.set(project, [file]); | ||
} else { | ||
filesForProject.push(file); | ||
} | ||
}); | ||
|
||
return filesByProject; | ||
} | ||
|
||
/** | ||
* Lints a list of files with eslint. eslint reports are written to the log | ||
* and a FailError is thrown when linting errors occur. | ||
* | ||
* @param {ToolingLog} log | ||
* @param {Array<File>} files | ||
* @return {undefined} | ||
*/ | ||
export async function lintFiles(log: ToolingLog, files: File[]) { | ||
for (const [project, filesInProject] of groupFilesByProject(files)) { | ||
const exitCode = await run( | ||
{ | ||
exclude: [], | ||
files: filesInProject.map(f => f.getAbsolutePath()), | ||
fix: false, | ||
format: 'stylish', | ||
project: project.getTsConfigPath(), | ||
}, | ||
{ | ||
log(m: string) { | ||
log.write(m); | ||
}, | ||
error(m: string) { | ||
log.error(m); | ||
}, | ||
} | ||
); | ||
|
||
if (exitCode > 0) { | ||
throw createFailError(`[tslint] failure`, 1); | ||
} else { | ||
log.success( | ||
'[tslint/%s] %d files linted successfully', | ||
project.getName(), | ||
files.length | ||
); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
import { ToolingLog } from '@kbn/dev-utils'; | ||
|
||
import { File } from '../file'; | ||
|
||
export function pickFilesToLint(log: ToolingLog, files: File[]) { | ||
return files.filter(file => file.isTypescript()); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
const Lint = require('tslint'); | ||
|
||
const FAILURE_STRING = 'File must start with a license header'; | ||
const RULE_NAME = 'require-license-header'; | ||
|
||
exports.Rule = class extends Lint.Rules.AbstractRule { | ||
apply(sourceFile) { | ||
const [headerText] = this.getOptions().ruleArguments; | ||
|
||
if (!headerText) { | ||
throw new Error(`${RULE_NAME} requires a single argument containing the header text`); | ||
} | ||
|
||
if (sourceFile.text.startsWith(headerText)) { | ||
return []; | ||
} | ||
|
||
return [ | ||
new Lint.RuleFailure( | ||
sourceFile, | ||
0, | ||
0, | ||
FAILURE_STRING, | ||
RULE_NAME, | ||
new Lint.Replacement(0, 0, `${headerText}\n\n`) | ||
) | ||
]; | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
import chalk from 'chalk'; | ||
import { readFileSync } from 'fs'; | ||
import { extname, join, resolve } from 'path'; | ||
|
||
import { createToolingLog } from '@kbn/dev-utils'; | ||
import execa from 'execa'; | ||
import getopts from 'getopts'; | ||
import Listr from 'listr'; | ||
|
||
import { PROJECTS } from '../typescript'; | ||
|
||
class LintFailure { | ||
constructor( | ||
public project: typeof PROJECTS[0], | ||
public error: execa.ExecaError | ||
) {} | ||
} | ||
|
||
export function runTslintCli() { | ||
const log = createToolingLog('info'); | ||
log.pipe(process.stdout); | ||
|
||
const opts = getopts(process.argv.slice(2)); | ||
|
||
if (!opts.format) { | ||
process.argv.push('--format', 'stylish'); | ||
} | ||
|
||
if (opts.project) { | ||
require('tslint/bin/tslint'); | ||
} else { | ||
const tasks = PROJECTS.map(project => ({ | ||
task: () => | ||
execa( | ||
'tslint', | ||
[...process.argv.slice(2), '--project', project.getTsConfigPath()], | ||
{ | ||
cwd: project.getDirectory(), | ||
env: chalk.enabled ? { FORCE_COLOR: 'true' } : {}, | ||
stdio: ['ignore', 'pipe', 'pipe'], | ||
} | ||
).catch(error => { | ||
throw new LintFailure(project, error); | ||
}), | ||
title: project.getName(), | ||
})); | ||
|
||
const list = new Listr(tasks as any, { | ||
exitOnError: false, | ||
}); | ||
|
||
list.run().catch((error: any) => { | ||
if (!error.errors) { | ||
log.error('Unhandled execption!'); | ||
log.error(error); | ||
process.exit(1); | ||
} | ||
|
||
for (const e of error.errors) { | ||
if (e instanceof LintFailure) { | ||
log.write(''); | ||
log.error(`${e.project.getName()} failed\n${e.error.stdout}`); | ||
} else { | ||
log.error(e); | ||
} | ||
} | ||
}); | ||
} | ||
} |
Oops, something went wrong.