OSSコントリビュータデビューした話

## はじめに
怯えながらOSSコントリビュータとしてデビューしたので、その際の手順を残します。

今回触ったライブラリはreact-datepickerです。
テスティングライブラリにEnzymeを利用していたため、React Testing Libraryに移行するお手伝いをしました。
## 手順
1. 修正対象ライブラリのgithubから、リポジトリをフォークする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641495/ee093bce-6d9b-461b-54db-65e43c83e3b7.png)
リポジトリをフォークする先のOrganizationを選択して「Create Fork」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641495/7960c142-a15f-b099-c7fb-59366c9c5cb1.png)
1. フォークしてきた作業用リポジトリをクローンする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641495/2daa2e39-895a-b9f1-ecb7-b190b20ce917.png)
　```
git clone 作業用リポジトリのURL
　```
1. mainブランチから作業ブランチを切る
※mainブランチにそのまま修正を入れることも可能ですが、フォーク元のリポジトリとのコンフリクト解消をミスると面倒なことになります
※gitフローに沿った運用とする、また一時保存場所とする意味でもfeature/hogehogeのように作業用のブランチを切りましょう
1. 作業用ブランチに修正を入れる
1. PRを作成する前に、ライブラリに変更が入っていないか確認する
手順は以下のとおり。
    1. 作業用リポジトリのgithubで「Sync fork」をクリックする
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641495/737c04ee-1f14-8a54-91d0-64333c4784d3.png)
    1. フォーク元のリポジトリに変更が入っていれば「Update branch」と表示されるのでクリックする
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641495/d85f1115-bdd9-0c59-7e7f-663540acfdbb.png)
    1. gitクライアントやターミナルでpullし、作業用リポジトリのmainブランチを最新化する
    　```
    git pull origin main
    　```
    1. rebase、もしくはmergeでmainブランチに入った変更を作業用ブランチに取り込む
    作業用ブランチに切り替えてから、
    　```
    git rebase main
    　```
     もしくは
    　```
    git merge main
    　```
1. 作業用ブランチに最新のmainを取り込めたら、githubからPRを作成する。
githubの「Pull Requests」タブに「New pull request」があるのでクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641495/af9608e3-7152-64b4-3757-1fb372ec3ff8.png)
フォーク元リポジトリのmainに、作業用リポジトリの作業用ブランチを向ける。
差分があり、かつコンフリクトがない場合は「Create pull request」と表示されるのでクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641495/f958bb6e-d2ed-3b65-25ba-a5ffe33f5e2a.png)
タイトルと説明文を書いて「Create pull request」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641495/d850b9be-2b8a-db89-44a2-dc8007236ace.png)
1. マージされるまで待つ

## 実際に入れた修正
- 修正前
・Enzymeのmountを使ってインスタンスを作成
・取得したインスタンスのイベントを直で呼んでいた
```js:test\year_dropdown_options_test.test.js（修正前）
  it("calls the supplied onCancel function on handleClickOutside", () => {
    const instance = mount(
      <YearDropdownOptions
        year={2015}
        onChange={mockHandleChange}
        onCancel={onCancelSpy}
      />,
    ).instance();
    instance.handleClickOutside();
    expect(onCancelSpy).toHaveBeenCalled();
  });
```
- 修正後
・React Testing Libraryのrenderを使ってインスタンスを作成
・呼び出したいイベント（インスタンス外のクリック）の都合上、document.bodyのmouseDown/touchStartイベントを発火
```js:test\year_dropdown_options_test.test.js（修正後）
  it("calls the supplied onCancel function on handleClickOutside", () => {
    const WrappedYearDropdownOptions = onClickOutside(YearDropdownOptions);
    render(
      <WrappedYearDropdownOptions
        year={2015}
        onChange={mockHandleChange}
        onCancel={onCancelSpy}
      />,
    );
    fireEvent.mouseDown(document.body);
    fireEvent.touchStart(document.body);
    expect(onCancelSpy).toHaveBeenCalledTimes(2);
  });
```
無事にマージされて、[リリースノート](https://github.com/Hacker0x01/react-datepicker/releases/tag/v6.3.0)に載りました🎉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641495/52a8c44c-b9af-8293-83f6-ce8bf137cf82.png)

## まとめ
OSS修正は敷居の高いものだというイメージがありましたが、修正してPRを出すフローは通常の業務フローと変わらず、そこまで苦手意識を持たなくても良さそうです。

rect-datepickerに限らず、OSSには多くのissueがあります。
（react-datepickerだけでも、2024/03の時点でissueは300以上）
ぜひ修正が出来そうなものに取り掛かって、OSSコントリビュータデビューしましょう。

参考: https://zenn.dev/kaz_z/articles/first-contributions