Please take a moment to review this document in order to make the contribution process easy and effective for everyone involved.
Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue or assessing patches and features.
Good pull requests, such as patches, improvements, and new features, are a fantastic help. They should remain focused in scope and avoid containing unrelated commits.
Please ask first if somebody else is already working on this or the core developers think your feature is in-scope for the related package / project. Generally always have a related issue with discussions for whatever you are including.
Please also provide a test plan, i.e. specify how you verified that your addition works.
Please adhere to the coding conventions used throughout a project (indentation, accurate comments, etc.) and any other requirements (such as test coverage).
-
Clone the repo with
git clone [email protected]:commercetools/nodejs.git
-
Run
yarn install
(oryarn
) in the rootnodejs
folder. This will ensure that all package dependencies are properly installed / linked. The repository uses lerna to orchestrate the different packages. -
If you're writing documentation, you can start the gitbook development server with
yarn docs:watch
-
To run all packages tests simply do
yarn test
(we use jest). If you want to work on a specific package and run the tests only for that package, we recommend to useyarn test:package
. This will prompt you to select one of the available packages. To run in watch mode simply doyarn test:package --watch
. -
Integration tests are separated out in another folder "/integration-tests". To run the integration test, you need to export the environment variables into the process env by doing the following :-
- Export
npm_config_projectkey
=projectKey
, - Export
CT_PROJECT_KEY
=CLIENT_ID
:CLIENT_SECRET
as specified here. - Then run integration test with
yarn test:integration
- Export
Note: Due to the setup/teardown nature of the integration tests, there is the risk of potential data loss in your project
- Linting and static checks are done by
yarn lint
. We the Airbnb eslint config. Static checks are done using Flow and can be included / adopted incrementally. Committing also runs a git hook to lint the changed files.
We use prettier to format our code, so we don't ever have to argue over code-style.
Prettier is integrated into ESLint, so all code is checked. The rules are only enabled when running yarn lint
from the command-line.
The rules are disabled in Atom so we don't get the annoying warnings while developing.
Since prettier is integrated into ESLint it should run for the exact same files that are being linted.
We run prettier as part of ESLint using eslint-plugin-prettier
. We disable all rules that prettier
takes care of using eslint-config-prettier
.
We use Renovate to get notified whenever there is a new version of a dependency, in form of a Pull Request. It's recommended to check the changes of the new versions before merging the PR. If necessary the PR should be updated with necessary code changes / migrations.
To ensure the lock file is up-to-date with the new versions, it's recommended to do checkout the branch, install the new deps with yarn
and push the updated lock file to the PR.
We use lerna for releasing packages. Just run yarn release
from master
(after pulling in the latest merges) to publish a single or a set of modules. Lerna will check changes on packages providing semver bumps according to the commit messages used for each package.
This will also append all PRs up until the release in the CHANGELOG.md
and push it as a separate commit with the message docs: update changelog
. For this to work, we need to have a Type
-label on the PRs, so please make sure they are added.
For this to work, it is essential that you create and export a github token that has read access to your public repos.
$ export GITHUB_AUTH=<your_token>
Make sure your commit messages follow Angular's commit message format. To make this easy run yarn commit
from the root.
docs(contributing): add example of a full commit message
The example commit message in the contributing.md document is not a concrete example. This is a problem because the
contributor is left to imagine what the commit message should look like based on a description rather than an example. Fix the
problem by making the example concrete and imperative.
Closes #1
BREAKING CHANGE: imagination no longer works
Based on the semantic release conventions, there are 3 triggers to control the semver version plus a trigger for releasing the actual packages.
fix
(commit type): commits with this type will bump apatch
versionfeat
(commit type): commits with this type will bump aminor
versionBREAKING CHANGE
(commit description): commits with this keywords in the description will bump amajor
version
To avoid possible mistakes in the commit messages, and ensure that merging PRs will lead to releasing new versions, there is only one way to merge the PR: by Squash and Commit
.
This is the perfect opportunity to ensure to adjust the commit message description following the semantic release conventions. This means that commits done while developing the PR don't necessary need to include the release triggers. You can simply do that when squashing the "final" commit.
Many thanks to h5bp and create-react-app for the inspiration with this contributing guide