@@ -4,32 +4,76 @@ import { promisify } from 'util';
44import { resolve } from 'path' ;
55import tslint from 'danger-plugin-tslint' ;
66import { prettyResults } from 'danger-plugin-tslint/dist/prettyResults' ;
7+ import { CLIEngine } from 'eslint' ;
78
8- const packages = [ 'apm' , 'browser' , 'core' , 'hub' , 'integrations' , 'minimal' , 'node' , 'types' , 'utils' ] ;
9+ interface Options {
10+ baseConfig ?: any ;
11+ extensions ?: string [ ] ;
12+ }
13+
14+ const packages = [ 'apm' , 'core' , 'hub' , 'integrations' , 'minimal' , 'node' , 'types' , 'utils' ] ;
15+
16+ /**
17+ * Eslint your code with Danger
18+ * Based on fork from: https://github.com/appcelerator/danger-plugin-eslint
19+ */
20+ async function eslint ( config : any , extensions ?: string [ ] ) {
21+ const allFiles = danger . git . created_files . concat ( danger . git . modified_files ) ;
22+ const options : Options = { baseConfig : config } ;
23+ if ( extensions ) {
24+ options . extensions = extensions ;
25+ }
26+ const cli = new CLIEngine ( options ) ;
27+ // let eslint filter down to non-ignored, matching the extensions expected
28+ const filesToLint = allFiles . filter ( f => {
29+ return ! cli . isPathIgnored ( f ) && cli . options . extensions . some ( ext => f . endsWith ( ext ) ) ;
30+ } ) ;
31+ return Promise . all ( filesToLint . map ( f => lintFile ( cli , config , f ) ) ) ;
32+ }
33+
34+ async function lintFile ( linter , config , path ) {
35+ const contents = await danger . github . utils . fileContents ( path ) ;
36+ const report = linter . executeOnText ( contents , path ) ;
37+
38+ if ( report . results . length !== 0 ) {
39+ report . results [ 0 ] . messages . map ( msg => {
40+ if ( msg . fatal ) {
41+ fail ( `Fatal error linting ${ path } with eslint.` ) ;
42+ return ;
43+ }
44+
45+ const fn = { 1 : warn , 2 : fail } [ msg . severity ] ;
46+
47+ fn ( `${ path } line ${ msg . line } – ${ msg . message } (${ msg . ruleId } )` , path , msg . line ) ;
48+ } ) ;
49+ }
50+ }
951
1052export default async ( ) => {
1153 if ( ! danger . github ) {
1254 return ;
1355 }
1456
1557 schedule ( async ( ) => {
16- const tsLintResult = ( await Promise . all (
17- packages . map ( packageName => {
18- return new Promise < string > ( res => {
19- tslint ( {
20- lintResultsJsonPath : resolve ( __dirname , 'packages' , packageName , 'lint-results.json' ) ,
21- handleResults : results => {
22- if ( results . length > 0 ) {
23- const formattedResults = prettyResults ( results ) ;
24- res ( `TSLint failed: **@sentry/${ packageName } **\n\n${ formattedResults } ` ) ;
25- } else {
26- res ( '' ) ;
27- }
28- } ,
58+ const tsLintResult = (
59+ await Promise . all (
60+ packages . map ( packageName => {
61+ return new Promise < string > ( res => {
62+ tslint ( {
63+ lintResultsJsonPath : resolve ( __dirname , 'packages' , packageName , 'lint-results.json' ) ,
64+ handleResults : results => {
65+ if ( results . length > 0 ) {
66+ const formattedResults = prettyResults ( results ) ;
67+ res ( `TSLint failed: **@sentry/${ packageName } **\n\n${ formattedResults } ` ) ;
68+ } else {
69+ res ( '' ) ;
70+ }
71+ } ,
72+ } ) ;
2973 } ) ;
30- } ) ;
31- } ) ,
32- ) ) . filter ( str => str . length ) ;
74+ } ) ,
75+ )
76+ ) . filter ( str => str . length ) ;
3377 if ( tsLintResult . length ) {
3478 tsLintResult . forEach ( tsLintFail => {
3579 fail ( `${ tsLintFail } ` ) ;
@@ -39,6 +83,8 @@ export default async () => {
3983 }
4084 } ) ;
4185
86+ await eslint ( ) ;
87+
4288 const hasChangelog = danger . git . modified_files . indexOf ( 'CHANGELOG.md' ) !== - 1 ;
4389 const isTrivial = ( danger . github . pr . body + danger . github . pr . title ) . includes ( '#trivial' ) ;
4490
0 commit comments