Home

Awesome

Auth and Identity domain monorepo

Coverage Duplicated Lines (%) Code Smells

Requirements

This project requires specific versions of the following tools. To make sure your development setup matches with production follow the recommended installation methods.

Tasks

Tasks are defined in the turbo.json and package.json files. To execute a task, just run the command at the project root:

yarn <cmd>

Turborepo will execute the task for all the workspaces that declare the same command in their package.json file; it also applies caching policies to the command according to the rules defined in turbo.json.

To define a new task:

Defined tasks are lint, test, and typecheck.

Dependencies

[!IMPORTANT] This project uses Yarn Plug'n'Play as installation strategy for dependencies. Check out the official Yarn documentation to lean about pnp and its difference from the classic node_modules approach.

# install all dependencies for the project
yarn

# install a dependency to a workspace
#   (workspace name is the name in the package.json file)
yarn workspace <workspace name> add <package name>
yarn workspace <workspace name> add -D <package name>

# install a dependency for the monorepo
#   (ideally a shared dev dependency)
yarn add -D <package name>

To add a dependency to a local workspace, manually edit the target workspace's package.json file adding the dependency as

"dependencies": {
    "my-dependency-workspace": "workspace:*"
}

Yarn SDKS (.yarn/sdks)

Smart IDEs (such as VSCode or IntelliJ) require special configuration for TypeScript to work when using Plug'n'Play installs. That configuration is generated automatically by yarn (via yarn dlx @yarnpkg/sdks vscode vim [other-editor...]) and commited to .yarn/sdks.

Folder structure

/apps

It contains the applications included in the project. Each folder is meant to produce a deployable artifact; how and where to deploy it is demanded to a single application.

Each sub-folder is a workspace.

/packages

Packages are reusable TypeScript modules that implement a specific logic of the project. They are meant for sharing implementations across other apps and packages of the same projects, as well as being published in public registries.

Packages that are meant for internal code sharing have private: true in their package.json file; all the others are meant to be published into the public registry.

Each sub-folder is a workspace.

/infra

It contains the infrastructure-as-code project that defines the resources for the project as well as the executuion environments. Database schemas and migrations are defined here too, in case they are needed.

Releases

Releases are handled using Changeset. Changeset takes care of bumping packages, updating the changelog, and tag the repository accordingly.

How it works

Infrastructure as Code

Folder structure

The IaC template contains the following projects:

identity

Handle the identity federation between GitHub and Azure. The identity defines the grants the GitHub Workflows have on the Azure subscription. Configurations are intended for the pair (environment, region); each configuration is a Terraform project in the folder infra/identity/<env>/<region> It's intended to be executed once on a local machine at project initialization.

⚠️ The following edits have to be done to work on the repository:

# Substitute env and region with actual values
cd infra/identity/<env>/<region>

# Substitute subscription_name with the actual subscription name
az account set --name <subscription_name>

terraform init
terraform plan
terraform apply

repository

Set up the current repository settings. It's intended to be executed once on a local machine at project initialization.

⚠️ The following edits have to be done to work on the repository:

cd infra/repository

# Substitute subscription_name with the actual subscription name
az account set --name <subscription_name>

terraform init
terraform plan
terraform apply

resources

Contains the actual resources for the developed applications. Configurations are intended for the pair (environment, region); each configuration is a Terraform project in the folder infra/resources/<env>/<region>

⚠️ The following edits have to be done to work on the repository:

Workflow automation

The workflow pr_infra.yaml is executed on every PR that edits the infra/resources folder or the workflow definition itself. It executes a terraform plan and comments the PR with the result. If the plan fails, the workflow fails.

Vitest extension for VSCode

Vitest extension is configured for running and debugging tests with integrated Test View . It requires Node 18. NOTE: If you've opened the repository within a workspace folder, you need to replicate the vitest configuration in .code-workspace too.

Import existing repo into the monorepo

This project include a simple tool to import existing repositories as workspace into the monorepo.

The command that start the interactive procedure is:

yarn install
yarn build
yarn workspace repo-importer import

The imported repo has is history commit. Maybe a code refactory is needed after the import to make the workspace compatible with the monorepo configuration.