1 | #!/usr/bin/env node
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | const childProcess = require('child_process')
|
7 | const fs = require('fs')
|
8 | const path = require('path')
|
9 |
|
10 | function execFile(command, args) {
|
11 | return new Promise(resolve => {
|
12 | childProcess.execFile(command, args, (error, stdout, stderr) => {
|
13 | resolve({code: error ? error.code : 0, stdout, stderr})
|
14 | })
|
15 | })
|
16 | }
|
17 |
|
18 | ;(async function() {
|
19 | let runs = 0
|
20 | const codes = []
|
21 | const commands = []
|
22 |
|
23 | const packageJson = fs.existsSync('package.json') ? require(path.join(process.cwd(), 'package.json')) : {}
|
24 |
|
25 | let eslintOptions = ['--report-unused-disable-directives', '.']
|
26 |
|
27 | const isTypeScriptProject = fs.existsSync('tsconfig.json')
|
28 |
|
29 | if (isTypeScriptProject) {
|
30 | eslintOptions = eslintOptions.concat(['--ext', '.ts,.tsx'])
|
31 | }
|
32 |
|
33 | commands.push(['eslint', eslintOptions])
|
34 |
|
35 | if (isTypeScriptProject) {
|
36 | commands.push(['tsc', ['--noEmit']])
|
37 | }
|
38 |
|
39 | if (fs.existsSync('.flowconfig')) {
|
40 | commands.push(['flow', ['check']])
|
41 | }
|
42 |
|
43 | if (packageJson && packageJson.flow && packageJson.flow.coverageThreshold) {
|
44 | commands.push(['flow-coverage', []])
|
45 | }
|
46 |
|
47 | for (const [command, args] of commands) {
|
48 | if (runs > 0) process.stderr.write('\n')
|
49 | process.stderr.write(`> ${command} ${args.join(' ')}\n`)
|
50 |
|
51 | const {code, stdout, stderr} = await execFile(command, args)
|
52 | codes.push(code)
|
53 | if (stderr) process.stderr.write(stderr)
|
54 | if (stdout) process.stdout.write(stdout)
|
55 |
|
56 | runs++
|
57 | }
|
58 |
|
59 | const nonzero = codes.find(code => code !== 0)
|
60 | if (nonzero) {
|
61 | process.stderr.write(`\nCommand failed: ${nonzero}\n`)
|
62 | process.exit(nonzero)
|
63 | }
|
64 | })().catch(error => {
|
65 | setTimeout(() => {
|
66 | throw error
|
67 | })
|
68 | })
|