Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(misskey-js): エラーを型として出力・利用できるように #14069

Draft
wants to merge 15 commits into
base: develop
Choose a base branch
from

Conversation

kakkokari-gtyih
Copy link
Contributor

@kakkokari-gtyih kakkokari-gtyih commented Jun 22, 2024

What

  • misskey-jsでのエラーハンドリングでエラー型を使えるように
    • generatorにそれ用のコードを追加
  • os.apiWithDialogで、エラーコードごとにカスタムエラーメッセージを指定できるように
  • misskeyApiのreject側の戻り値にエラー型が出るように

Why

  • エラーの型が使えると便利
  • apiWithDialogに特別な変更を加えなくても独自のエラーダイアログを追加できて楽

Additional info (optional)

独自エラーの追加はこんな感じ

os.apiWithDialog(pin ? 'i/pin' : 'i/unpin', {
	noteId: appearNote.id,
}, token, {
	PIN_LIMIT_EXCEEDED: { // ←ここにも型が効く
		// titleも指定可能(任意)
		text: i18n.ts.pinLimitExceeded,
	},
});

Checklist

  • Read the contribution guide
  • Test working in a local environment
  • (If needed) Add story of storybook
  • (If needed) Update CHANGELOG.md
  • (If possible) Add tests

@github-actions github-actions bot added packages/frontend Client side specific issue/PR packages/misskey-js labels Jun 22, 2024
Copy link

codecov bot commented Jun 22, 2024

Codecov Report

Attention: Patch coverage is 6.18557% with 91 lines in your changes missing coverage. Please review.

Project coverage is 65.25%. Comparing base (b269c43) to head (3156b2d).

Files Patch % Lines
packages/frontend/src/os.ts 6.97% 80 Missing ⚠️
packages/frontend/src/scripts/misskey-api.ts 0.00% 11 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##           develop   #14069       +/-   ##
============================================
- Coverage    77.90%   65.25%   -12.66%     
============================================
  Files          185     1004      +819     
  Lines        25563   115306    +89743     
  Branches       487     5541     +5054     
============================================
+ Hits         19916    75246    +55330     
- Misses        5640    38621    +32981     
- Partials         7     1439     +1432     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@kakkokari-gtyih
Copy link
Contributor Author

paramsを入力するまでは型が認識されてるのに、paramsを入力しようとすると型が消える

image

image

@anatawa12
Copy link
Member

public request<E extends keyof Endpoints, P extends Endpoints[E]['req']>(
endpoint: E,
params: P = {} as P,
credential?: string | null,
): Promise<SwitchCaseResponseType<E, P>> {

Pがジェネリクスなのでそうなる

@kakkokari-gtyih
Copy link
Contributor Author

どう直せば型補完がちゃんと効くようになるかしら・・・

@anatawa12
Copy link
Member

Ideaであれば補完自体は出てきたと思うけどVSCだとだめなのか

@kakkokari-gtyih
Copy link
Contributor Author

code側の問題?

@kakkokari-gtyih
Copy link
Contributor Author

codeのアプデ来てたのでちょっと試してみます

@anatawa12
Copy link
Member

image

IDEAだとでたね。Code側の問題か、codeのしようかですね(IDEAがjsのlanguage serverを生で使ってる保証はない)

@kakkokari-gtyih
Copy link
Contributor Author

codeのアプデ来てたのでちょっと試してみます

だめだった

@kakkokari-gtyih
Copy link
Contributor Author

モノ自体はなにもおかしくないしエラーハンドリングはちゃんと型定義通っているのでマージしても大丈夫そう
環境によっては型補完がでるっぽいので

Copy link
Member

@anatawa12 anatawa12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ErrPromise<T,RE>という方針、fetchの各種エラー(fetch がネットワークエラーを発生した場合のTypeErrorとか)がMisskey.Endpoints[E]['errors']に化けちゃってすごく良くない気がします。

@kakkokari-gtyih
Copy link
Contributor Author

ErrPromise<T,RE>という方針、fetchの各種エラー(fetch がネットワークエラーを発生した場合のTypeErrorとか)がMisskey.Endpoints[E]['errors']に化けちゃってすごく良くない気がします。

そのとおりだけど良い直し方が思いつかない…

@KisaragiEffective
Copy link
Sponsor Member

nominal type idiomで各エラーを包んだらいい感じにそのふるまいをオプトアウト出来そう

@anatawa12
Copy link
Member

私はそもそも元の実装からそうですがJsonのオブジェクトをそのままthrow(reject)するのが悪手だと思ってます。

ApiError的なErrorを継承したclassのインスタンスにしてthrowするようにし、これのエラーペイロードに関してMisskey.Endpoints[E]['errors']であるとするのは(未だにas必要にはなるけど)やって良い範囲の仮定だと思ってます

@kakkokari-gtyih
Copy link
Contributor Author

大規模にコードを修正しないといけない割には使用箇所が限られるので今やる必要はないかも

@kakkokari-gtyih kakkokari-gtyih marked this pull request as draft June 23, 2024 05:33
@KisaragiEffective
Copy link
Sponsor Member

私はそもそも元の実装からそうですがJsonのオブジェクトをそのままthrow(reject)するのが悪手だと思ってます。

ApiError的なErrorを継承したclassのインスタンスにしてthrowするようにし、これのエラーペイロードに関してMisskey.Endpoints[E]['errors']であるとするのは(未だにas必要にはなるけど)やって良い範囲の仮定だと思ってます

これについてはCONTRIBUTING.mdで禁止したあとno-throw-literalをerrorにして違反箇所を随時潰していくしかないと思っている

}

export function isAPIError<ER extends Endpoints[keyof Endpoints]['errors']>(reason: any): reason is APIError<ER> {
return reason instanceof Error && MK_API_ERROR in reason;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instanceofは公称型のチェックになるのでreason instanceof APIErrorにしてMK_API_ERROR symbolはなくしていい気がする。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
packages/frontend Client side specific issue/PR packages/misskey-js
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants