cal/CONTRIBUTING.md
2022-05-30 12:37:57 +02:00

843 lines
20 KiB
Markdown

# Contributing to Cal.com
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.
- Before jumping into a PR be sure to search [existing PRs](https://github.com/calcom/cal.com/pulls) or [issues](https://github.com/calcom/cal.com/issues) for an open or closed item that relates to your submission.
## Areas of expertise
### Legend
✅ = has knowledge
🥇 = is their main priority
⚠️ = is the only one with knowledge
👀 = has no knowledge but wants to be onboarded
<table>
<thead>
<tr>
<th>Core Team</th>
<th>
<span title="Availability">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Availability?text=Availability&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Availability?text=Availability&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Timezones">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Timezones?text=Timezones&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Timezones?text=Timezones&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="App Store">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/App Store?text=App Store&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/App Store?text=App Store&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Teams">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Teams?text=Teams&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Teams?text=Teams&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Booking Page">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Booking Page?text=Booking Page&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Booking Page?text=Booking Page&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Turbo Repo">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Turbo Repo?text=Turbo Repo&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Turbo Repo?text=Turbo Repo&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Testing">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Testing?text=Testing&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Testing?text=Testing&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Webhooks">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Webhooks?text=Webhooks&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Webhooks?text=Webhooks&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Event-Types">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Event-Types?text=Event-Types&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Event-Types?text=Event-Types&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Prisma">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Prisma?text=Prisma&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Prisma?text=Prisma&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Stripe Billing">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Stripe Billing?text=Stripe Billing&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Stripe Billing?text=Stripe Billing&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Auth">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Auth?text=Auth&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Auth?text=Auth&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Stripe App">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Stripe App?text=Stripe App&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Stripe App?text=Stripe App&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Google Cal">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Google Cal?text=Google Cal&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Google Cal?text=Google Cal&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="tRPC">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/tRPC?text=tRPC&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/tRPC?text=tRPC&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="SSO SAML">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/SSO SAML?text=SSO SAML&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/SSO SAML?text=SSO SAML&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="CalDAV">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/CalDAV?text=CalDAV&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/CalDAV?text=CalDAV&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Outlook App">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Outlook App?text=Outlook App&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Outlook App?text=Outlook App&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Slack App">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Slack App?text=Slack App&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Slack App?text=Slack App&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Public API">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Public API?text=Public API&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Public API?text=Public API&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Recurring Events">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Recurring Events?text=Recurring Events&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Recurring Events?text=Recurring Events&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Seats">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Seats?text=Seats&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Seats?text=Seats&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Zapier">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Zapier?text=Zapier&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Zapier?text=Zapier&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Embeds">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Embeds?text=Embeds&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Embeds?text=Embeds&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Console">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Console?text=Console&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Console?text=Console&color=white&size=12"
/>
</picture>
</span>
</th>
<th>
<span title="Workflows">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="
https://rotate-svg-text-agu.vercel.app/api/Workflows?text=Workflows&color=dark&size=12
"
/>
<img
src="https://rotate-svg-text-agu.vercel.app/api/Workflows?text=Workflows&color=white&size=12"
/>
</picture>
</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>@PeerRich</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>@baileypumfleet</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>@zomars</td>
<td></td>
<td></td>
<td>🥇✅</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>@emrysal</td>
<td>🥇✅</td>
<td>🥇✅</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>@alannnc</td>
<td></td>
<td>🥇✅</td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>🥇✅</td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>@agustif</td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td>🥇✅</td>
<td>👀</td>
<td></td>
<td></td>
<td>🥇✅</td>
<td></td>
<td></td>
<td></td>
<td>🥇✅</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>@leog</td>
<td>👀</td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td>👀</td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td>✅⚠️</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>@joeauyeung</td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>✅👀</td>
<td>✅👀</td>
<td>✅👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>✅⚠️</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>@alishaz-polymath</td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>✅👀</td>
<td></td>
<td>✅👀</td>
<td>👀</td>
<td>👀</td>
<td></td>
<td></td>
<td>👀</td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>@hariombalhara</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>✅⚠️</td>
<td></td>
<td></td>
</tr>
<tr>
<td>@CarinaWolli</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>✅⚠️</td>
<td></td>
<td></td>
<td>✅⚠️</td>
</tr>
<tr>
<td>@sean-brydon</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td></td>
<td></td>
<td></td>
<td>👀</td>
<td>👀</td>
<td></td>
<td>🥇✅⚠️</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
## Developing
The development branch is `main`. This is the branch that all pull
requests should be made against. The changes on the `main`
branch are tagged into a release monthly.
To develop locally:
1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your
own GitHub account and then
[clone](https://help.github.com/articles/cloning-a-repository/) it to your local device.
2. Create a new branch:
```sh
git checkout -b MY_BRANCH_NAME
```
3. Install yarn:
```sh
npm install -g yarn
```
4. Install the dependencies with:
```sh
yarn
```
5. Start developing and watch for code changes:
```sh
yarn dev
```
## Building
You can build the project with:
```bash
yarn build
```
Please be sure that you can make a full production build before pushing code.
## Testing
More info on how to add new tests coming soon.
### Running tests
This will run and test all flows in multiple Chromium windows to verify that no critical flow breaks:
```sh
yarn test-e2e
```
## Linting
To check the formatting of your code:
```sh
yarn lint
```
If you get errors, be sure to fix them before committing.
## Making a Pull Request
- Be sure to [check the "Allow edits from maintainers" option](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork) while creating you PR.
- If your PR refers to or fixes an issue, be sure to add `refs #XXX` or `fixes #XXX` to the PR description. Replacing `XXX` with the respective issue number. Se more about [Linking a pull request to an issue
](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue).
- Be sure to fill the PR Template accordingly.