| #!/usr/bin/env node |
| // usage: github-lint |
| // |
| // Run ESLint and Flow on project. |
| |
| const childProcess = require('child_process') |
| const fs = require('fs') |
| const path = require('path') |
| const supportsColors = require('supports-color') |
| |
| const hasBasicColorSupport = supportsColors.stdout.hasBasic && supportsColors.stderr.hasBasic |
| |
| function execFile(command, args) { |
| return new Promise(resolve => { |
| childProcess.execFile(command, args, {maxBuffer: 1024 ** 2}, (error, stdout, stderr) => { |
| resolve({code: error ? error.code : 0, stdout, stderr}) |
| }) |
| }) |
| } |
| |
| ;(async function() { |
| let runs = 0 |
| const codes = [] |
| const commands = [] |
| |
| const packageJson = fs.existsSync('package.json') ? require(path.join(process.cwd(), 'package.json')) : {} |
| |
| let eslintOptions = ['--report-unused-disable-directives', '.'] |
| |
| if (hasBasicColorSupport) { |
| eslintOptions = eslintOptions.concat(['--color']) |
| } |
| |
| const isTypeScriptProject = fs.existsSync('tsconfig.json') |
| |
| if (isTypeScriptProject) { |
| eslintOptions = eslintOptions.concat(['--ext', '.js,.ts,.tsx']) |
| } |
| |
| commands.push(['eslint', eslintOptions]) |
| |
| if (isTypeScriptProject) { |
| commands.push(['tsc', ['--noEmit']]) |
| } |
| |
| if (fs.existsSync('.flowconfig')) { |
| commands.push(['flow', ['check']]) |
| } |
| |
| if (packageJson && packageJson.flow && packageJson.flow.coverageThreshold) { |
| commands.push(['flow-coverage', []]) |
| } |
| |
| for (const [command, args] of commands) { |
| if (runs > 0) process.stderr.write('\n') |
| process.stderr.write(`> ${command} ${args.join(' ')}\n`) |
| |
| const {code, stdout, stderr} = await execFile(command, args) |
| codes.push(code) |
| if (stderr) process.stderr.write(stderr) |
| if (stdout) process.stdout.write(stdout) |
| |
| runs++ |
| } |
| |
| const nonzero = codes.find(code => code !== 0) |
| if (nonzero) { |
| process.stderr.write(`\nCommand failed: ${nonzero}\n`) |
| process.exit(nonzero) |
| } |
| })().catch(error => { |
| setTimeout(() => { |
| throw error |
| }) |
| }) |