| #!/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') |
| }) |