@@ -4,32 +4,76 @@ import { promisify } from 'util';
4
4
import { resolve } from 'path' ;
5
5
import tslint from 'danger-plugin-tslint' ;
6
6
import { prettyResults } from 'danger-plugin-tslint/dist/prettyResults' ;
7
+ import { CLIEngine } from 'eslint' ;
7
8
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
+ }
9
51
10
52
export default async ( ) => {
11
53
if ( ! danger . github ) {
12
54
return ;
13
55
}
14
56
15
57
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
+ } ) ;
29
73
} ) ;
30
- } ) ;
31
- } ) ,
32
- ) ) . filter ( str => str . length ) ;
74
+ } ) ,
75
+ )
76
+ ) . filter ( str => str . length ) ;
33
77
if ( tsLintResult . length ) {
34
78
tsLintResult . forEach ( tsLintFail => {
35
79
fail ( `${ tsLintFail } ` ) ;
@@ -39,6 +83,8 @@ export default async () => {
39
83
}
40
84
} ) ;
41
85
86
+ await eslint ( ) ;
87
+
42
88
const hasChangelog = danger . git . modified_files . indexOf ( 'CHANGELOG.md' ) !== - 1 ;
43
89
const isTrivial = ( danger . github . pr . body + danger . github . pr . title ) . includes ( '#trivial' ) ;
44
90
0 commit comments