'use strict'

const path = require('path')
const {spawn} = require('child_process')
const process = require('process')

const CONFIG = require('../config')

module.exports = async function () {
  return new Promise((resolve, reject) => {
    const eslintArgs = ['--cache', '--format', 'json']

    if (process.argv.includes('--fix')) {
      eslintArgs.push('--fix')
    }

    const eslint = spawn(
      path.join('script', 'node_modules', '.bin', 'eslint'),
      [...eslintArgs, '.'],
      { cwd: CONFIG.repositoryRootPath }
    )

    let output = ''
    let errorOutput = ''
    eslint.stdout.on('data', data => {
      output += data.toString()
    })

    eslint.stderr.on('data', data => {
      errorOutput += data.toString()
    })

    eslint.on('error', error => reject(error))
    eslint.on('close', exitCode => {
      const errors = []
      let files

      try {
        files = JSON.parse(output)
      } catch (_) {
        reject(errorOutput)
        return
      }

      for (const file of files) {
        for (const error of file.messages) {
          errors.push({
            path: file.filePath,
            message: error.message,
            lineNumber: error.line,
            rule: error.ruleId
          })
        }
      }

      resolve(errors)
    })
  })
}

'use strict'

const path = require('path')
const {spawn} = require('child_process')
const process = require('process')

const CONFIG = require('../config')

module.exports = async function () {
  return new Promise((resolve, reject) => {
    const eslintArgs = ['--cache', '--format', 'json']

    if (process.argv.includes('--fix')) {
      eslintArgs.push('--fix')
    }

    const eslintBinary = process.platform === 'win32' ? 'eslint.cmd' : 'eslint'
    const eslint = spawn(
      path.join('script', 'node_modules', '.bin', eslintBinary),
      [...eslintArgs, '.'],
      { cwd: CONFIG.repositoryRootPath }
    )

    let output = ''
    let errorOutput = ''
    eslint.stdout.on('data', data => {
      output += data.toString()
    })

    eslint.stderr.on('data', data => {
      errorOutput += data.toString()
    })

    eslint.on('error', error => reject(error))
    eslint.on('close', exitCode => {
      const errors = []
      let files

      try {
        files = JSON.parse(output)
      } catch (_) {
        reject(errorOutput)
        return
      }

      for (const file of files) {
        for (const error of file.messages) {
          errors.push({
            path: file.filePath,
            message: error.message,
            lineNumber: error.line,
            rule: error.ruleId
          })
        }
      }

      resolve(errors)
    })
  })
}

Make linter compatible with Windows
Make linter compatible with Windows
