Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
#!/bin/bash
# bash script that can setup environment with common linting and testing tools
yes="${@}"
function yes_or_no {
if [[ $yes == "-y" ]]; then
echo "πŸ›‘πŸ‘πŸ›‘ !!! skipping question !!! πŸ›‘πŸ‘πŸ›‘"
else
while true; do
read -p "$* [y/n]: " yn
case $yn in
[Yy]*) return 0 ;;
[Nn]*) echo "πŸ‘ install aborted" ; return 1 ;;
esac
done
fi
}
echo "πŸ›‘πŸ›‘πŸ›‘ !!!on your own risk!!! πŸ›‘πŸ›‘πŸ›‘,
πŸ’‘ commit before running the script and control the output using diff in version control."
yes_or_no "I have done the git commit and I want to continue." || exit 1
function editorconfig {
echo "πŸ‘ .editorconfig added"
echo "# EditorConfig: http://EditorConfig.org
# EditorConfig Properties: https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties
# top-most EditorConfig file
root = true
### defaults
[*]
charset = utf-8
# Unix-style newlines with
end_of_line = lf
# Max line length
max_line_length=80
# 2 space indentation
indent_size = 2
indent_style = space
# remove any whitespace characters preceding newline characters
trim_trailing_whitespace = true
# newline ending every file
insert_final_newline = true
# Denotes preferred quoting style for string literals
quote_type = double
### custom for markdown
[*.md]
# do not remove any whitespace characters preceding newline characters
trim_trailing_whitespace = false" > .editorconfig
}
editorconfig
function babelrc {
echo "πŸ‘ .babelrc added"
yarn add --dev --exact @babel/cli babel-core@^7.0.0-bridge.0 @babel/core @babel/preset-env @babel/preset-react @babel/preset-flow babel-jest regenerator-runtime
echo '{
// An important note is that babelrc does not merge presets or plugins
"presets": [
["@babel/preset-env",
{
"targets": "> 0.25%, not dead"
}
],
"@babel/preset-react",
"@babel/preset-flow"
],
"plugins": [
// "babel-plugin-emotion", // yarn add emotion react-emotion && yarn add babel-plugin-emotion --dev --exact
// ["babel-plugin-styled-components", { "displayName": true }] // yarn add styled-components && yarn add babel-plugin-emotion --dev --exact
],
"env": {
"production": {
"plugins": [
"lodash"
]
},
"development": {
"plugins": [
"react-hot-loader/babel"
]
},
"test": {
"presets": [
[
"@babel/env",
{
"targets": {
"node": "current"
}
}
],
"@babel/preset-react",
"@babel/preset-flow"
],
"compact": false
}
}
}' > .babelrc
}
if [ ! -f .babelrc ]; then
babelrc
else
yes_or_no "πŸ’‘ .babelrc exist do you want override it" && babelrc
fi
function eslintrc {
echo "πŸ‘ .eslintrc.yml added"
echo '---
extends:
- eslint-config-with-prettier
rules:
' > .eslintrc.yml
}
if [ ! -f ".eslintrc.yml" ]; then
eslintrc
else
yes_or_no "πŸ’‘ .eslintrc.yml exist do you want override it" && eslintrc
fi
function eslintignore {
echo "πŸ‘ .eslintignore added"
echo "flow-typed/npm/**
coverage/**
dist/**
.history/**
.next/**
.vscode/**
.idea/**
" > .eslintignore
}
if [ ! -f .eslintignore ]; then
eslintignore
else
yes_or_no "πŸ’‘ .eslintignore exist do you want override it" && eslintignore
fi
function prettierrc {
echo "πŸ‘ .prettierrc added"
echo "trailingComma: all
bracketSpacing: false
" > .prettierrc
}
if [ ! -f .prettierrc ]; then
prettierrc
else
yes_or_no "πŸ’‘ .prettierrc exist do you want override it" && prettierrc
fi
function prettierignore {
echo "πŸ‘ .prettierignore added"
echo "package.json
package-lock.json
flow-typed/npm/**
" > .prettierignore
}
if [ ! -f .prettierignore ]; then
prettierignore
else
yes_or_no "πŸ’‘ .prettierignore exist do you want override it" && prettierignore
fi
function flowconfig {
echo "πŸ‘ .flowconfig added"
echo "[ignore]
<PROJECT_ROOT>/.idea/.*
[include]
[libs]
flow-typed
[options]
emoji=true
" > .flowconfig
}
function gitignore {
echo "πŸ‘ .gitingore added"
commonGitIgnore=$(curl -s https://www.gitignore.io/api/archive,macos,linux,windows,node,jetbrains,sublimetext,eclipse,netbeans,visualstudiocode)
currentGitIgnore=$(cat .gitignore)
echo "$commonGitIgnore
### Custom .gitignore
/flow-typed/npm
flow-coverage
dist
$currentGitIgnore" > .gitignore
}
grep -q www.gitignore.io .gitignore || gitignore
yarn add --dev --exact eslint jest husky lint-staged prettier imagemin-lint-staged
packagejson=$(cat package.json)
addtopackagejson=$(echo '{
"scripts": {
"test": "jest",
"test:changed": "yarn test --onlyChanged --passWithNoTests --silent --runInBand",
"test:watch": "yarn test --watch",
"test:update": "yarn test --update",
"test:coverage": "yarn test --coverage --verbose --silent --runInBand --passWithNoTests",
"lint": "eslint . --cache",
"lint:fix": "yarn lint --fix",
"lint:img": "find src -iname '*.gif' -o -iname '*.jpg' -o -iname '*.png' -o -iname '*.jpeg' -o -iname '*.svg' | xargs imagemin-lint-staged",
"lint:staged": "eslint --fix --max-warnings=0",
"prettier": "prettier --write *.{js,jsx,html,md,mdx,yaml,json,css,scss,less}",
"precommit": "lint-staged && yarn test:changed",
"prepush": "yarn test:coverage"
},
"husky": {
"hooks": {
"pre-commit": "yarn precommit",
"pre-push": "yarn prepush"
}
},
"lint-staged": {
"linters": {
"*.{js,jsx}": [
"yarn run lint:staged",
"git add"
],
"*.{html,md,mdx,yaml,json,css,scss,less}": [
"prettier --write",
"git add"
],
"*.{png,jpeg,jpg,gif,svg}": [
"imagemin-lint-staged",
"git add"
]
}
}
}')
echo "πŸ‘ package.json added with linting and testing"
echo "$addtopackagejson
$packagejson" | ./node_modules/.bin/json --deep-merge > package.json
function enzyme {
yarn add --dev enzyme enzyme-adapter-react-16 enzyme-react-intl enzyme-to-json react-test-renderer
packagejson=$(cat package.json)
addtopackagejson=$(echo '{
"jest": {
"snapshotSerializers": ["enzyme-to-json/serializer"],
"setupFiles": ["raf/polyfill", "<rootDir>/jest.setup.js"]
}
}')
echo "πŸ‘ package.json added with enzyme snapshotSerializers"
echo "$addtopackagejson
$packagejson" | ./node_modules/.bin/json --deep-merge > package.json
echo 'import Enzyme from "enzyme";
import Adapter from "enzyme-adapter-react-16";
// React 16 Enzyme adapter
Enzyme.configure({adapter: new Adapter()});
' > jest.setup.js
}
yes_or_no "πŸ‘Œ Do you want to use enzyme for Component testing?" && enzyme
function flow {
yarn add --dev flow-bin flow-typed flow-coverage-report
packagejson=$(cat package.json)
addtopackagejson=$(echo '{
"scripts": {
"flow:setup": "yarn && flow-typed install",
"flow:update": "flow-typed update",
"flow": "flow",
"flow:errors": "flow --show-all-errors",
"flow:coverage": "flow coverage ./src/index.js --color && flow-coverage-report -i 'src/**/*.js' -x 'src/**/*.test.js' -x 'src/**/*.spec.js' -t html",
"prepush": "yarn test:coverage && yarn run flow:errors"
}
}')
echo "πŸ‘ package.json added with flow scripts"
echo "$addtopackagejson
$packagejson" | ./node_modules/.bin/json --deep-merge > package.json
yarn run flow:setup
if [ ! -f .flowconfig ]; then
flowconfig
else
yes_or_no "πŸ’‘ .flowconfig exist do you want override it" && flowconfig
fi
}
yes_or_no "πŸ‘Œ Do you want to use setup flow?" && flow
echo "🏁 thanks for running the script now check output using version control"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.