DEV Community

Dima Portenko
Dima Portenko

Posted on

4 3

Prepare Expo project with bash script to setup TypeScript ESLint Prettier

In this post I shared my step by step way to setup new expo project generally required to any project I would like to create. But after passed this instructions several times I found it very annoying and wasting my time. So I decided to write a script which will do all steps in one go.

Let's create directory and script file

mkdir -p automation/bin
cd automation/bin
touch quickstart
Enter fullscreen mode Exit fullscreen mode

So quickstart will be our executable, continue with write our script in this file.

#!/usr/bin/env bash
Enter fullscreen mode Exit fullscreen mode

This basically means that executable will be run by bash.

I would like to run command with project name as param

quickstart your-project-name-param
Enter fullscreen mode Exit fullscreen mode

And I like to exit script if project name wasn't provided.

if [ -n "$1" ]; then
  echo $1
else
  echo "Error! Please enter project name!" 1>&2
  exit 1
fi
Enter fullscreen mode Exit fullscreen mode

$1 is first script param. And now we can create expo project with typescript template

expo init -t expo-template-blank-typescript $1
Enter fullscreen mode Exit fullscreen mode

Then move to the project directory and install dependencies

DIR="$(pwd)"
cd "$DIR/$1"

yarn add -D eslint prettier @react-native-community/eslint-config @typescript-eslint/eslint-plugin eslint-config-prettier
Enter fullscreen mode Exit fullscreen mode

Create and fill .eslintrc.js

cat > .eslintrc.js <<EOF
module.exports = {
  extends: ['@react-native-community', "eslint-config-prettier"],
}
EOF
Enter fullscreen mode Exit fullscreen mode

Update json files is easier to do inside the nodejs script automation/patch-json.js.

const fs = require('fs');

const args = process.argv.slice(2);
const getFilepath = (filename) => `${args[0]}/${filename}`
// console.log(args)

let fileName = getFilepath('tsconfig.json');
let file = require(fileName);

file.compilerOptions.module = "es6";

fs.writeFile(fileName, JSON.stringify(file), function writeJSON(err) {
  if (err) return console.log(err);
  console.log(JSON.stringify(file));
  console.log('writing to ' + fileName);
});

fileName = getFilepath('package.json');
file = require(fileName);

if (file.resolutions) {
  file.resolutions["@types/react"] = "^17"
} else {
  file.resolutions = {
    "@types/react": "^17"
  }
}

fs.writeFile(fileName, JSON.stringify(file), function writeJSON(err) {
  if (err) return console.log(err);
  console.log(JSON.stringify(file));
  console.log('writing to ' + fileName);
});
Enter fullscreen mode Exit fullscreen mode

And we can run this node script like this

SCRIPTS_DIR="$(dirname -- "${BASH_SOURCE[0]}")/.."
node "$SCRIPTS_DIR/patch-json.js" "$DIR/$1"
Enter fullscreen mode Exit fullscreen mode

SCRIPTS_DIR - directory where our patch-json.js script located. "$DIR/$1" - path of our newly created project.

Since I'm using WebStorm I would like to update .gitignore

echo ".idea" >> ".gitignore"
Enter fullscreen mode Exit fullscreen mode

Apply all my rules with prettier

./node_modules/prettier/bin-prettier.js --write .
Enter fullscreen mode Exit fullscreen mode

And commit changes to the git

git add .
git commit -m 'expostart script updates'
Enter fullscreen mode Exit fullscreen mode

And the final step - to be able run the command from any directory I need to add my bin directory to the terminal PATH varilble. I'm using zsh so I'll put following to the ~/.zshrc

export PATH=$PATH:$HOME/scripts/expo/bin
Enter fullscreen mode Exit fullscreen mode

Don't forget to source config before use

source ~/.zshrc
Enter fullscreen mode Exit fullscreen mode

Now you can create new project with following command

quickstart your-project-name
Enter fullscreen mode Exit fullscreen mode

You can find full script in the repository.

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs