Using fastify, this template includes:
- API Docs:
Swagger UI
- Input definition:
Typebox
- ORM:
Prisma
- Deployment:
- Dockerfile & docker-compose files
- Script CI/CD in
.github/workflows
- Testing:
jest
- Code linting & styling:
husky
+prettier
- Precommit hook:
lint-staged
For applying conventional commits, refer commitizen.
docker
v20.10.22docker-compose
v1.29.2node
v18.13.0npm
8.19.3
Note: Fill in .env
file (use template from .env.example
) before starts.
yarn bootstrap
: Set up developmentyarn barrels
: Gather export objects from many files in a folder and re-export inindex.ts
file. See configs in.barrelsby.json
.yarn start
: Start application in dev modeyarn db:migrate
: Apply new migration to current databaseyarn db:reset
: Reset database and run seedyarn db:deploy
: Deploy all migrations without confirmations (use in production)yarn db:generate
: Just generate prisma client libraryyarn db:studio
: Interact with database by a web UIyarn lint
: Check lintingyarn format
: Format codeyarn start:docker
: Rundocker-compose.dev.yml
file to set up local databaseyarn clean:docker
: Remove local database instance include its data.yarn clean:git
: Clean local branches which were merged on remoteyarn test <test_label>
: Run test with label<test_label>
. For example:yarn test auth
will run all tests inauth.test.ts
orauth.spec.ts
file.
📦prisma
┣ 📂migrations # All SQL migration scripts go here
┣ 📜schema.prisma # Database schema declaration
┗ 📜seed.ts # Generate sample data script
📦src
┣ 📂configs # Contain environment variables & other app configurations
┣ 📂constants # Constants and enums go here
┣ 📂dtos # Schema for input (from requests) & output (from responses)
┃ ┣ 📂in
┃ ┣ 📂out
┃ ┗ 📂common # Reusable schemas
┣ 📂handlers # Handlers, which are responsible for handling core business logic
┣ 📂interfaces # Interfaces
┣ 📂plugins # Plugin, in charge of organizing api routings & registering middleware
┣ 📂repositories # Datasource configurations & connections. Could have more than one datasource.
┣ 📂services # 3rd-party services or business logic services
┣ 📂types # Types
┣ 📂utils # Helping classes and functions
┣ 📜Server.ts # Server setting & binding modules
┗ 📜index.ts # Program entry
This section contains some useful information for development.
These are some best practices for testing and overall quality:
- At the very least, write API (component) testing.
- Include 3 parts in each test name
- Structure tests by the AAA pattern
- Ensure Node version is unified
- Avoid global test fixtures and seeds, add data per-test
- Check your test coverage, it helps to identify wrong test patterns
- Refactor regularly using static analysis tools
- Mock responses of external HTTP services
- Test your middlewares in isolation
- Specify a port in production, randomize in testing
- Test the five possible outcomes
We use eslint
to find and fix problem in code, such as:
- Unused variables
- Use
var
declaration - Loosely comparation using
==
- ...
You can run this command to test eslint script:
yarn lint
To maintain only one style coding across members, we use prettier
. Try:
yarn format
You don't need to run these scripts regularly or before commiting code. They are run automatically before git commit
command by setting as a precommit script. In some circumstances, precommit script is not enabled by default, just type two commands below to fix it:
chmod ug+x .husky/*
chmod ug+x .git/hooks/*
For a tip, two plugins above could be installed in VSCode
's extensions.
............
┣ 📂controllers
┃ ┗ 📜user.ctrler.ts
┣ 📂routes
┃ ┗ 📜user.route.ts
┣ 📂schemas
┃ ┣ 📂in
┃ ┃ ┣ 📜ids.schema.ts
┃ ┃ ┣ 📜user.schema.ts
┃ ┃ ┗ 📜index.ts
............
Imagine you are in user.ctrler.ts
and want to import ASchema
from ids.schema.ts
. The code can be like this:
import { ASchema } from '../schemas/in/ids.schema.ts'
The more nested folders, the more bad looking importation. It is waste time to guess how many ..
should be put in relative path.
The solution is barrelsby
and path alias. With configurations in .barrelsby.json
, barrelsby can import your entire code base in a specific folder, and re-export them in index.ts
file.
Try this:
yarn barrels
To avoid using many ..
in relative path, config path alias in tsconfig.json
. See the guideline here.
- For every updates, DO NOT push directly to
master
branch. Create a new branch, commit, publish branch and create a pull request (PR) instead. - A branch should have prefix
feat/
for a feature update, prefixhotf/
for a hotfix,improv/
for an improvement ... - A PR should be small enough to review. To split a large PR, use stacked PRs.