Sharkey/CONTRIBUTING.md
2021-08-30 20:11:22 +09:00

9 KiB
Raw Blame History

Contribution guide

English version available

プロジェクトに興味を持っていただきありがとうございます! このドキュメントでは、プロジェクトに貢献する際に必要な情報をまとめています。

Issues

Issueを作成する前に、以下をご確認ください:

  • 重複を防ぐため、既に同様の内容のIssueが作成されていないか検索してから新しいIssueを作ってください。
  • Issueを質問に使わないでください。
    • Issueは、要望、提案、問題の報告にのみ使用してください。
    • 質問は、Misskey ForumDiscordでお願いします。

実装をする前に

機能追加やバグ修正をしたいときは、まずIssueで設計、方針をレビューしてもらいましょう(無い場合は作ってください)。このステップがないと、せっかく実装してもPRがマージされない可能性が高くなります。

また、実装に取り掛かるときは当該Issueに自分をアサインしてください(自分でできない場合は他メンバーに自分をアサインしてもらうようお願いしてください)。 自分が実装するという意思表示をすることで、作業がバッティングするのを防ぎます。

PRの作成

PRありがとうございます PRを作成する前に、以下をご確認ください:

  • 可能であればタイトルに、以下で示すようなPRの種類が分かるキーワードをプリフィクスしてください。
    • fix / refactor / feat / enhance / perf / chore など
    • また、PRの粒度が適切であることを確認してください。ひとつのPRに複数の種類の変更や関心を含めることは避けてください。
  • このPRによって解決されるIssueがある場合は、そのIssueへの参照を本文内に含めてください。
  • CHANGELOG.mdに変更点を追記してください。リファクタリングなど、利用者に影響を与えない変更についてはこの限りではありません。
  • この変更により新たに作成、もしくは更新すべきドキュメントがないか確認してください。
  • 機能追加やバグ修正をした場合は、可能であればテストケースを追加してください。
  • テスト、Lintが通っていることを予め確認してください。
    • npm run testnpm run lintでぞれぞれ実施可能です。詳細
  • UIに変更がある場合はスクリーンショットを本文内に添付してください。

ご協力ありがとうございます🤗

ブランチ

  • master branch is tracking the latest release and used for production purposes.
  • develop branch is where we work for the next release.
    • PRを作成するときは、基本的にこのブランチに向けてください。
  • l10n_develop branch is reserved for localization management.

Localization (l10n)

Misskey uses Crowdin for localization management. You can improve our translations with your Crowdin account. Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository. The owner @syuilo merges the PR into the develop branch before the next release.

If your language is not listed in Crowdin, please open an issue.

Crowdin

Documentation

  • Documents for instance admins are located in /docs.
  • Documents for end users are located in /src/docs.

Testing

  • Test codes are located in /test.

Run test

npm run test

Run specify test

npx cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" npx mocha test/foo.ts --require ts-node/register

e2e tests

TODO

Continuous integration

Misskey uses GitHub Actions for executing automated tests. Configuration files are located in /.github/workflows.

Adding MisskeyRoom items

  • Use English for material, object and texture names.
  • Use meter for unit of length.
  • Your PR should include all source files (e.g. .png, .blend) of your models (for later editing).
  • Your PR must include the glTF binary files (.glb) of your models.
  • Add a locale key room.furnitures.YOUR_ITEM at /locales/ja-JP.yml.
  • Add a furniture definition at src/client/scripts/room/furnitures.json5.

If you have no experience on 3D modeling, we suggest to use the free 3DCG software Blender. You can find information on glTF 2.0 at glTF 2.0 — Blender Manual.

Notes

How to resolve conflictions occurred at yarn.lock?

Just execute yarn to fix it.

placeholder

SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない 例えば

query.andWhere(new Brackets(qb => {
	for (const type of ps.fileType) {
		qb.orWhere(`:type = ANY(note.attachedFileTypes)`, { type: type });
	}
}));

と書くと、ループ中でtypeというプレースホルダが複数回使われてしまいおかしくなる だから次のようにする必要がある

query.andWhere(new Brackets(qb => {
	for (const type of ps.fileType) {
		const i = ps.fileType.indexOf(type);
		qb.orWhere(`:type${i} = ANY(note.attachedFileTypes)`, { [`type${i}`]: type });
	}
}));

Not null in TypeORM

const foo = await Foos.findOne({
	bar: Not(null)
});

のようなクエリ(barnullではない)は期待通りに動作しない。 次のようにします:

const foo = await Foos.findOne({
	bar: Not(IsNull())
});

null in SQL

SQLを発行する際、パラメータがnullになる可能性のある場合はSQL文を出し分けなければならない 例えば

query.where('file.folderId = :folderId', { folderId: ps.folderId });

という処理で、ps.folderIdnullだと結果的にfile.folderId = nullのようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない だから次のようにする必要がある

if (ps.folderId) {
	query.where('file.folderId = :folderId', { folderId: ps.folderId });
} else {
	query.where('file.folderId IS NULL');
}

[] in SQL

SQLを発行する際、INのパラメータが[](空の配列)になる可能性のある場合はSQL文を出し分けなければならない 例えば

const users = await Users.find({
	id: In(userIds)
});

という処理で、userIds[]だと結果的にuser.id IN ()のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない だから次のようにする必要がある

const users = userIds.length > 0 ? await Users.find({
	id: In(userIds)
}) : [];

配列のインデックス in SQL

SQLでは配列のインデックスは1始まり[a, b, c]aにアクセスしたいなら[0]ではなく[1]と書く

undefinedにご用心

MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 undefined が返ってくるので注意。 MongoDBはnullで返してきてたので、その感覚でif (x === null)とか書くとバグる。代わりにif (x == null)と書いてください

Migration作成方法

npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前

作成されたスクリプトは不必要な変更を含むため除去してください。

コネクションにはmarkRawせよ

Vueのコンポーネントのdataオプションとしてmisskey.jsのコネクションを設定するとき、必ずmarkRawでラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。

JSONのimportに気を付けよう

TypeScriptでjsonをimportすると、tscでコンパイルするときにそのjsonファイルも一緒にdistディレクトリに吐き出されてしまう。この挙動により、意図せずファイルの書き換えが発生することがあるので、jsonをimportするときは書き換えられても良いものかどうか確認すること。書き換えされて欲しくない場合は、importで読み込むのではなく、fs.readFileSyncなどの関数を使って読み込むようにすればよい。

その他

HTMLのクラス名で follow という単語は使わない

広告ブロッカーで誤ってブロックされる