# Contributing ## Table of contents - [Setting Up the Environment](#setting-up-the-environment) - [Running Tests](#running-tests) - [Submitting a Pull Request (PR)](#submitting-a-pull-request-pr) - [After your pull request is merged](#after-your-pull-request-is-merged) - [Coding Style Guidelines](#coding-style-guidelines) - [Commit Message Guidelines](#commit-message-guidelines) - [Commit Message Format](#commit-message-format) - [Revert](#revert) - [Type](#type) - [Scope](#scope) - [Subject](#subject) - [Body](#body) - [Footer](#footer) ## Setting Up the Environment 1. Run `pnpm install` in the root of the repository to install all dependencies. 1. Run `pnpm link --dir ./pnpm/dev -g` to make pnpm from the repository available in the command line via the `pd` command. 1. Run `pnpm run compile` to create an initial build of pnpm from the source in the repository. 1. Now you can change any source code file and run `pd [command] [flags]` to run `pnpm` directly from the source code by compiling all the files without typechecking in memory. 1. Alternatively, for recompiling all the projects with typechecking after your changes, again run `pnpm run compile` in the root of the repository. To run a task that will recompile the projects on change, run `pnpm run watch`. 1. In order to run all the tests in the repository, run `pnpm run test-main`. You may also run tests of specific projects by running `pnpm test` inside a project's directory or using `pnpm --filter test`. Some of the e2e tests run node-gyp, so you might need to install some build-essentials on your system for those tests to pass. On Fedora, install these: ``` sudo dnf install make automake gcc gcc-c++ kernel-devel ``` ## Running Tests You can run the tests of the project that you modified by going to the project's directory and running: ```shell pnpm test ``` Alternatively, you can run it from anywhere by specifying the name of the project using the `--filter` option: ```shell pnpm --filter core test ``` If you want to pass options to Jest, use the `pnpm run test` command and append any needed options. For instance, if you want to run a single test in a single file, run: ```shell pnpm --filter core run test test/lockfile.ts -t "lockfile has dev deps even when installing for prod only" ``` ## Submitting a Pull Request (PR) Before you submit your Pull Request (PR) consider the following guidelines: - Search [GitHub](https://github.com/pnpm/pnpm/pulls) for an open or closed PR that relates to your submission. You don't want to duplicate effort. - Make your changes in a new git branch: ```shell git checkout -b my-fix-branch main ``` - Create your patch, following [code style guidelines](#coding-style-guidelines), and **including appropriate test cases**. - Run `pnpm changeset` in the root of the repository and describe your changes. The resulting files should be committed as they will be used during release. - Run the full test suite and ensure that all tests pass. - Commit your changes using a descriptive commit message that follows our [commit message conventions](#commit-message-guidelines). Adherence to these conventions is necessary because release notes are automatically generated from these messages. ```shell git commit -a ``` Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files. - Push your branch to GitHub: ```shell git push origin my-fix-branch ``` - In GitHub, send a pull request to `pnpm:main`. - If we suggest changes then: - Make the required updates. - Re-run the test suites to ensure tests are still passing. - Rebase your branch and force push to your GitHub repository (this will update your Pull Request): ```shell git rebase main -i git push -f ``` That's it! Thank you for your contribution! ### After your pull request is merged After your pull request is merged, you can safely delete your branch and pull the changes from the main (upstream) repository: - Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows: ```shell git push origin --delete my-fix-branch ``` - Check out the main branch: ```shell git checkout main -f ``` - Delete the local branch: ```shell git branch -D my-fix-branch ``` - Update your main with the latest upstream version: ```shell git pull --ff upstream main ``` ## Coding Style Guidelines [![js-standard-style](https://raw.githubusercontent.com/standard/standard/master/badge.svg)](https://github.com/standard/standard) Use the [Standard Style](https://github.com/standard/standard). ## Commit Message Guidelines [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) We have very precise rules over how our git commit messages can be formatted. This leads to **more readable messages** that are easy to follow when looking through the **project history**. ### Commit Message Format Each commit message consists of a **header**, a **body** and a **footer**. The header has a special format that includes a **type**, a **scope** and a **subject**: ():