Coder Social home page Coder Social logo

chocolat-chaud-io / stator Goto Github PK

View Code? Open in Web Editor NEW
297.0 9.0 19.0 3.77 MB

Stator, your go-to template for the perfect stack. ๐Ÿ˜๐Ÿ™

License: MIT License

Shell 0.67% JavaScript 4.07% TypeScript 93.49% HTML 1.25% SCSS 0.16% Dockerfile 0.37%
boilerplate generator template project stator react reactjs nestjs nx javascript

stator's Introduction

Stator

Stator, your go-to template for the perfect stack.


๐Ÿš€ Quick Start

The interactive CLI will guide you to easily setup your project.

npm run get-started

๐Ÿ“‹ Table of Contents


๐Ÿ“š About the Project

Have you ever started a new project by yourself?
If so, you probably know that it is tedious to set up all the necessary tools.
Just like you, the part I enjoy the most is coding, not boilerplate.

Say hi to stator, a full-stack TypeScript template that enforces conventions, handles releases, automates deployments and much more!

If you want more details about how this idea was implemented, I recommend reading the series of blog articles I wrote on the topic.


๐Ÿฆ„ Demo Application

This template includes a demo todo application that serves as an example of sound patterns. Of course, you won't be creating a todo application for your project, but you can use this as an example of useful patterns and learn how to use the technologies presented in this project.

demo application

Technical Stack

For a detailed list of all those technologies, you can read this blog article.

Deployment Database Backend Frontend Testing Conventions
DigitalOcean App Platform Postgres Nest React jest commitlint
semantic-release Mongo Fastify React Router cypress eslint
docker-compose TypeORM Swagger Redux prettier
NestJs CRUD ReDoc Redux Toolkit
Material UI

๐Ÿ’ฅ Getting Started

Prerequisites

Copy the template

This repository is a repository template, which means you can use the Use this template button at the top to create your project based on this.

use template button

*Note: If you have an existing repository, this will require more work. I would recommend using the use template button and migrating your current code to the newly created projects.

Make it yours

You will now want to make this project yours by replacing all organization and project naming occurrences with your own names. Thankfully, we have a script just for that:

npm run rename-project -- --organization {YOUR_ORGANIZATION_NAME} --project {YOUR_PROJECT_NAME}

*Note: I highly recommend that the project name is the same as your git repository.

On completion, you will see the following message:

project appropriation success

Run the application

First, install the dependencies:

npm i

Then, run the whole stack:

npm run postgres
npm start api
npm start webapp

Finally, why not test it:

npm test api && npm run e2e webapp-e2e

For a full list of available commands, consult the package.json.

Continuous Integration

This templates integrates Github Actions for its Continuous Integration. The existing workflows are under .github/workflows. Currently, the CI will ensure all your apps work properly, by building and testing. For your pull requests, it will create a review application which will basically host your whole stack on a VM. Once everything is ready a new comment will be added to your pull request with the deployment URL. When the PR is closed, your review app will be destroyed as it's purpose will have been served. It's sacrifice will be for the greater good and also your wallet. To have the CI working, you must:

  1. (Optional) If you want review apps to work, you should follow the instruction provided by the get-started CLI.
  2. (Optional) Link your repository with Codecov by inserting your CODECOV_TOKEN in github secrets.
  3. (Optional) Insert your Nx Cloud access token in github secrets under NX_CLOUD_TOKEN. This enables for caching and faster build times.

Deployment

The application can be deployed in two different ways, depending on your objectives.

Digital Ocean App Platform

For a simple and fast deployment, the new App Platform from Digital Ocean makes it easy to work with monorepos. For our todo app, the config file lies under .do/app.yaml. There, you can change the configuration of the different apps being deployed. The spec can be found here.

To deploy this full stack application yourself, follow the steps below:

  1. Create an account on Digital Ocean Cloud (this is a sponsored link) and enable Github access
  2. Install doctl CLI
  3. Run doctl apps create --spec .do/app.yaml
  4. View the build, logs, and deployment url here

Once done, your app will be hooked to master branch commits as defined in the spec. Therefore, on merge, the application will update. To update the spec of the application, first get the application id with doctl apps list, then simply run doctl apps update <app id> --spec .do/app.yaml.


โš™๏ธ Implementation

Database

Postgres

There are 2 databases available, postgres and mongo. To ensure your developers don't get into any trouble while installing those, they are already pre-configured with docker-compose.yml files.

By default, the project uses postgres. If this is what you want, you're good to go; everything will work out of the box.

Migrations

By default, the automatic synchronization is activated between your models and the database. This means that making changes on your models will be automatically reflected on your database schemas. If you would like to control your migrations manually, you can do so by setting synchronize to false in orm-config.ts file.

Generate migration from your modified schemas:

npm run typeorm -- migration:generate -n {MIGRATION_NAME}

This will check the difference between models for your defined entities and your database schemas. If it finds changes, it will generate the appropriate migration scripts.

Run all pending migrations:

npm run typeorm -- migration:run

To get all the information on migrations, consult typeorm documentation.

Mongo [NOT RECOMMENDED]

If you would like to use mongodb, even though it is absolutely not recommended because it currently doesn't work well with typeorm, you can still do that by updating the connection info under ./apps/api/src/config/configuration.ts. You simply need to replace type: "postgres" with type: "mongo". Make sure you run the mongo container using the command: npm run mongo.

Data seeding

If you want your database to be pre-populated with that, it is very easy to do so. For postgres add your sql statements to apps/database/postgres/init.sql file. For mongo add your mongo statements to apps/database/mongo/mongo-entrypoint/seed-data.js file.

Backend

We are using cutting edge technologies to ensure that you get the best development experience one could hope for. To communicate with the database, we make use of the great typeorm. We use the code-first approach, which means defining your models will also represent your tables in your database. Here is an example:

import { Column, Entity } from "typeorm"
import { RootEntity } from "./root.entity"
import { MinLength } from "class-validator"

@Entity()
export class Todo extends RootEntity {
  @Column()
  @MinLength(5, { always: true })
  text: string
}

To serve your API requests, we make use of nest alongside with fastify to ensure blazing fast performance.

To reduce the boilerplate commonly found around creating a new entity, we are using the nestjsx/crud plugin that will generate all necessary routes for CRUD operations.

Here is an example from our todo app:

import { Controller } from "@nestjs/common"
import { Crud, CrudController } from "@nestjsx/crud"
import { Todo } from "@stator/models"

import { TodosService } from "./todos.service"

@Crud({ model: { type: Todo } })
@Controller("todos")
export class TodosController implements CrudController<Todo> {
  constructor(public service: TodosService) {}
}

Of course, you're probably wondering if this actually works. To convince you, we have implemented integration tests that perform real requests using supertest.

Can I view the generated endpoints? Well, of course, you can!

We now have generated swagger documentation that is viewable with the beautiful redoc.

Once you navigate to localhost:3333, you will see this:

redoc

Frontend

For our webapp, we're using the very popular react alongside redux-toolkit and react-router. We highly recommend that you use function components as demonstrated in the example.

To further reduce the boilerplate necessary you can generate hooks based on your API swagger by running npm run generate-api-redux. When you add new entities to your API, you should also add them in the output file property of the tools/generators/open-api-config.ts file. If you would like to avoid this, you can generate a single file by removing both properties [outputFiles, filterEndpoints]

This script will generate the required RTK Query code and caching keys so your data remains up to date while performing CRUD operations.

For a complete example of CRUD operations, consult the apps/webapp/src/pages/todos-page.tsx file.

In our example, we are using material-ui, but you could replace that with any other framework.

We also use axios to simplify our requests handling as it works very well with TypeScript.

General

We strongly believe that typing helps create a more robust program; thus, we use TypeScript.

To facilitate and optimize the usage of the monorepo, we make use of NX.

eslint enforces excellent standards, and prettier helps you apply them.

Commit messages must abide to those guidelines. If you need help following them, simply run npm run commit and you will be prompted with an interactive menu.

File and directory names are enforced by the custom-made enforce-file-folder-naming-convention.ts.

Branch names are enforced before you even commit to ensure everyone adopts the same standard: {issue-number}-{branch-work-title-kebab-case}.

For end-to-end testing, we use the notorious cypress.

We also have a pre-built CI toolkit for you that will build and run the tests.

stator's People

Contributors

benjaminromano avatar gabrielbottari avatar github-actions[bot] avatar iurygama avatar juanli16 avatar renovate-bot avatar tushgaurav avatar twelvenights avatar yann510 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

stator's Issues

Simplify readme

Organize readme so it's easier to read. Experiment with different ideas to improve readability.

Add utilities to enforce quality standards

  • Add CI which builds and fails if linting failed
  • Implement test coverage and CI artifacts
  • Enforce file naming conventions
  • Enforce branch naming convention
  • Make sure eslint works
  • Enforce commit convention with semantic release
  • Make sure commit messages are respected with commitizen
  • Add badges
  • Auto deploy webapp, backend and database with netlify or digital ocean

Add linting on modified files on pre-commit hook

  • Move import-sort to dev dependencies
  • Run linting and enforce-file-folder-naming-convention.js on hook
  • Make sure all those conventions are explained in the readme

This will help speed up the feedback loop for developers instead of having to wait for the CI to tell them.

Add support for optional logger system

  • Have the ability to view and filter logs from an URL (check if DigitalOcean have a solution for this)
  • Replace existing console.xxx with the logger implementation
  • Update get-started CLI accordingly (should be an optional step for the online saving part)
  • Ensure the logger works even if the online part isn't configured
  • Update README.md

What's the purpose of this project?

Before getting started let's communicate what's the vision for this project.

What's the purpose of this project?

Stator will be a highly opinionated tool to facilitate getting started with new projects by deciding for you what the perfect modern stack looks like.
It will be able to generate top level mono repository project as well as it's underlying packages such as web application, backend, database, etc.

How will the program be executed?

This will be a CLI tool that can be installed globally or as development dependency from the npm package registry.

What will stator be able to generate for v0

  • Root project will be using lerna, prettier, tslint, readme with starting instructions
  • Web application will be using react, redux (or other), bundler, typescript, test-framework (with code coverage), vscode config file
  • Backend will be using node, typescript, express (or other), hot-reload, test-framework (with code coverage), vscode config file
  • Database will be using mongodb

How will we generate those components?

We will be using a templating system named mustache

Create template for frontend app

  • Generate a frontend app named webapp using NX
  • Integrate a UI framework
  • Implement the best store system you can find
  • Implement a simple todo application with CRUD operations
  • Integrate the backend once it is ready
  • Implement end to end tests using cypress

Interactive CLI fixes

  • Add step in NX cloud CLI setup to install NX globally (or maybe use npx)
  • Add step in digital ocean that tells the user to run this command: doctl apps create --spec .do/app.yaml
  • Rename run commands from npm run api to npm start api and same thing for webapp

CLI improvements

  • Add a link to app platform apps after deployment
  • Move NX steps 10-11-12 to [PUBLIC REPOSITORY ONLY]
  • Detect OS windows messages as part of the steps

Implement a scalable deployment infrastructure

  • Auto deploy when a pull request is merged on master using Github Actions (if possible only affected apps)
  • Implement automatic scaling which can be configured through code/config file
  • Deploy self contained review apps on pull requests
  • Update the readme to reflect the new steps needed when using this project as a template

I was thinking maybe we could use Kubernetes, but one thing I don't like about it is the complexity which is often way too high for simple projects. Since this is a template project, make it as simple as possible with detailed instructions. We can use other tools if we see fit.

Best practices for managing environment variables?

Hey @yann510 !

Thank you so much for this amazing template. It's helped me learn so much about best practices for building a full stack app <3

Just had a quick question that I've been hitting my head on. What's your go-to for managing env variables in Stator? I tried cloning, running npm run gen-started and deploying via Digital Ocean but hit an error about the database env variables not being defined (like database.HOSTNAME).

Sorry if this is kind of a noob question ๐Ÿ˜…

Add CLI plugin for swagger

This will produce better documentation. The Webpack config from the API must be enhanced with the swagger plugin.

Refactor nx github actions

Instead of basing any affected changes from master, we should use github ${{ github.event.pull_request.base.sha }} and ${{ github.event.pull_request.head.sha }} as done like this open source action.

nx affected:build --base=${{ github.event.pull_request.base.sha }} --head=${{ github.event.pull_request.head.sha }}

Also, we should then remove the following command, as it becomes useless:

- name: Fetch latest changes
  run: git fetch --no-tags --prune --depth=5 origin master

Create review apps for every pull requests

  • Create a docker-compose file with frontend, backend, database
  • Automatically generate droplets on digital ocean and run the docker-compose if non exists with the PR number
  • Ensure application is available to the external world
  • Add a link in the pull request with the newly hosted app URL
  • When the pull request is deleted make sure the droplet is deleted too
  • Write documentation concerning the review apps in the readme
  • Ensure updating a PR update the review app
  • Optimize CI pipeline
  • Add support for https
  • Ensure review apps are not created for renovate bot PRs

Make readme About the Project section clearer

Following a conversation with nightowl_games from hacker news, I think this readme's section could be improved to fully grasp the intent of this project, what it actually is, and how it can be used.

Simplify the getting started process

Currently, we need to read too many texts in order to get started. This is not acceptable as the goal of this project is to make the process stupid simple. An interactive CLI could be a great idea.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.