blob: 9ed4b48a557029c6420e1f60a1595566535c9bc9 [file] [log] [blame]
#!/usr/bin/env node
const inquirer = require('inquirer')
const fs = require('fs')
const path = require('path')
const defaults = {
project: 'lib',
env: 'browser',
typeSystem: 'none',
react: true,
relay: true
}
const packagePath = path.resolve(process.cwd(), 'package.json')
if (fs.existsSync(packagePath)) {
const packageJSON = JSON.parse(fs.readFileSync(packagePath, 'utf8'))
defaults.project = packageJSON.private ? 'app' : 'lib'
const dependencies = Object.keys(packageJSON.dependencies || {})
const devDependencies = Object.keys(packageJSON.devDependencies || {})
defaults.react = dependencies.includes('react') || devDependencies.includes('react')
defaults.relay = dependencies.includes('relay') || devDependencies.includes('relay')
if (dependencies.includes('flow-bin') || devDependencies.includes('flow-bin')) {
defaults.typeSystem = 'flow'
}
if (dependencies.includes('typescript') || devDependencies.includes('typescript')) {
defaults.typeSystem = 'typescript'
}
}
const questions = [
{
type: 'list',
name: 'project',
message: 'Is this project a web app or reuseable library?',
choices: ['app', 'lib'],
default: defaults.project
},
{
type: 'list',
name: 'env',
message: 'Which environment does this library target?',
choices: ['browser', 'node'],
default: defaults.env
},
{
type: 'list',
name: 'typeSystem',
message: 'What type system are you using?',
choices: ['flow', 'typescript', 'none'],
default: defaults.typeSystem
},
{
type: 'confirm',
name: 'relay',
message: 'Are you using Relay?',
default: defaults.relay
},
{
type: 'confirm',
name: 'react',
message: 'Are you using React?',
default: defaults.react,
when: answers => answers.env === 'browser'
}
]
inquirer.prompt(questions).then(answers => {
const eslintrc = {extends: ['plugin:github/es6']}
if (answers.env === 'node') {
eslintrc.extends.push('plugin:github/node')
} else if (answers.project === 'app') {
eslintrc.extends.push('plugin:github/app')
} else if (answers.env === 'browser') {
eslintrc.extends.push('plugin:github/browser')
}
if (answers.typeSystem === 'flow') eslintrc.extends.push('plugin:github/flow')
if (answers.typeSystem === 'typescript') {
eslintrc.extends.push('plugin:github/typescript')
eslintrc.parser = '@typescript-eslint/parser'
// Create a `tsconfig.json`.
const tsconfigPath = path.resolve(process.cwd(), 'tsconfig.json')
if (!fs.existsSync(tsconfigPath)) {
const tsconfigDefaults = {
compilerOptions: {
target: 'es2015',
module: 'esnext',
lib: ['esnext', 'dom'],
allowSyntheticDefaultImports: true,
moduleResolution: 'node'
}
}
if (answers.react) {
tsconfigDefaults.compilerOptions.jsx = 'react'
}
fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfigDefaults, null, ' '), 'utf8')
}
}
if (answers.react) eslintrc.extends.push('plugin:github/react')
if (answers.relay) eslintrc.extends.push('plugin:github/relay')
fs.writeFileSync(path.resolve(process.cwd(), '.eslintrc.json'), JSON.stringify(eslintrc, null, ' '), 'utf8')
const prettierConfig = []
if (answers.typeSystem === 'flow') prettierConfig.push('/* @flow */')
prettierConfig.push("module.exports = require('eslint-plugin-github/prettier.config')")
prettierConfig.push('')
fs.writeFileSync(path.resolve(process.cwd(), 'prettier.config.js'), prettierConfig.join('\n'), 'utf8')
})