forked from mirror/misskey
f0a29721c9
* wip * Update note.ts * Update timeline.ts * Update core.ts * wip * Update generate-visibility-query.ts * wip * wip * wip * wip * wip * Update global-timeline.ts * wip * wip * wip * Update vote.ts * wip * wip * Update create.ts * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * Update files.ts * wip * wip * Update CONTRIBUTING.md * wip * wip * wip * wip * wip * wip * wip * wip * Update read-notification.ts * wip * wip * wip * wip * wip * wip * wip * Update cancel.ts * wip * wip * wip * Update show.ts * wip * wip * Update gen-id.ts * Update create.ts * Update id.ts * wip * wip * wip * wip * wip * wip * wip * Docker: Update files about Docker (#4599) * Docker: Use cache if files used by `yarn install` was not updated This patch reduces the number of times to installing node_modules. For example, `yarn install` step will be skipped when only ".config/default.yml" is updated. * Docker: Migrate MongoDB to Postgresql Misskey uses Postgresql as a database instead of Mongodb since version 11. * Docker: Uncomment about data persistence This patch will save a lot of databases. * wip * wip * wip * Update activitypub.ts * wip * wip * wip * Update logs.ts * wip * Update drive-file.ts * Update register.ts * wip * wip * Update mentions.ts * wip * wip * wip * Update recommendation.ts * wip * Update index.ts * wip * Update recommendation.ts * Doc: Update docker.ja.md and docker.en.md (#1) (#4608) Update how to set up misskey. * wip * ✌️ * wip * Update note.ts * Update postgre.ts * wip * wip * wip * wip * Update add-file.ts * wip * wip * wip * Clean up * Update logs.ts * wip * 🍕 * wip * Ad notes * wip * Update api-visibility.ts * Update note.ts * Update add-file.ts * tests * tests * Update postgre.ts * Update utils.ts * wip * wip * Refactor * wip * Refactor * wip * wip * Update show-users.ts * Update update-instance.ts * wip * Update feed.ts * Update outbox.ts * Update outbox.ts * Update user.ts * wip * Update list.ts * Update update-hashtag.ts * wip * Update update-hashtag.ts * Refactor * Update update.ts * wip * wip * ✌️ * clean up * docs * Update push.ts * wip * Update api.ts * wip * ✌️ * Update make-pagination-query.ts * ✌️ * Delete hashtags.ts * Update instances.ts * Update instances.ts * Update create.ts * Update search.ts * Update reversi-game.ts * Update signup.ts * Update user.ts * id * Update example.yml * 🎨 * objectid * fix * reversi * reversi * Fix bug of chart engine * Add test of chart engine * Improve test * Better testing * Improve chart engine * Refactor * Add test of chart engine * Refactor * Add chart test * Fix bug * コミットし忘れ * Refactoring * ✌️ * Add tests * Add test * Extarct note tests * Refactor * 存在しないユーザーにメンションできなくなっていた問題を修正 * Fix bug * Update update-meta.ts * Fix bug * Update mention.vue * Fix bug * Update meta.ts * Update CONTRIBUTING.md * Fix bug * Fix bug * Fix bug * Clean up * Clean up * Update notification.ts * Clean up * Add mute tests * Add test * Refactor * Add test * Fix test * Refactor * Refactor * Add tests * Update utils.ts * Update utils.ts * Fix test * Update package.json * Update update.ts * Update manifest.ts * Fix bug * Fix bug * Add test * 🎨 * Update endpoint permissions * Updaye permisison * Update person.ts #4299 * データベースと同期しないように * Fix bug * Fix bug * Update reversi-game.ts * Use a feature of Node v11.7.0 to extract a public key (#4644) * wip * wip * ✌️ * Refactoring #1540 * test * test * test * test * test * test * test * Fix bug * Fix test * 🍣 * wip * #4471 * Add test for #4335 * Refactor * Fix test * Add tests * 🕓 * Fix bug * Add test * Add test * rename * Fix bug
136 lines
3.9 KiB
Markdown
136 lines
3.9 KiB
Markdown
# Contribution guide
|
|
:v: Thanks for your contributions :v:
|
|
|
|
## Issues
|
|
Feature suggestions and bug reports are filed in https://github.com/syuilo/misskey/issues .
|
|
Before creating a new issue, please search existing issues to avoid duplication.
|
|
If you find the existing issue, please add your reaction or comment to the issue.
|
|
|
|
## Localization (l10n)
|
|
Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
|
|
|
|
![Crowdin](https://d322cqt584bo4o.cloudfront.net/misskey/localized.svg)
|
|
|
|
## Internationalization (i18n)
|
|
Misskey uses [vue-i18n](https://github.com/kazupon/vue-i18n).
|
|
|
|
## Documentation
|
|
* Documents for contributors are located in `/docs`.
|
|
* Documents for instance admins are located in `/docs`.
|
|
* Documents for end users are located in `src/docs`.
|
|
|
|
## Test
|
|
* Test codes are located in `/test`.
|
|
|
|
## Continuous integration
|
|
Misskey uses CircleCI for automated test.
|
|
Configuration files are located in `/.circleci`.
|
|
|
|
## Glossary
|
|
### AP
|
|
Stands for _**A**ctivity**P**ub_.
|
|
|
|
### MFM
|
|
Stands for _**M**isskey **F**lavored **M**arkdown_.
|
|
|
|
### Mk
|
|
Stands for _**M**iss**k**ey_.
|
|
|
|
### SW
|
|
Stands for _**S**ervice**W**orker_.
|
|
|
|
### Nyaize
|
|
Convert な(na) to にゃ(nya)
|
|
|
|
#### Denyaize
|
|
Revert Nyaize
|
|
|
|
## Code style
|
|
### Use semicolon
|
|
To avoid ASI Hazard
|
|
|
|
### Don't use `export default`
|
|
Bad:
|
|
``` ts
|
|
export default function(foo: string): string {
|
|
```
|
|
|
|
Good:
|
|
``` ts
|
|
export function something(foo: string): string {
|
|
```
|
|
|
|
## Directory structure
|
|
```
|
|
src ... Source code
|
|
@types ... Type definitions
|
|
prelude ... Independence utils for coding JavaScript without side effects
|
|
misc ... Independence utils for Misskey without side effects
|
|
service ... Common functions with side effects
|
|
queue ... Job queues and Jobs
|
|
server ... Web Server
|
|
client ... Client
|
|
mfm ... MFM
|
|
|
|
test ... Test code
|
|
|
|
```
|
|
|
|
## Notes
|
|
### placeholder
|
|
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
|
|
例えば
|
|
``` ts
|
|
query.andWhere(new Brackets(qb => {
|
|
for (const type of ps.fileType) {
|
|
qb.orWhere(`:type = ANY(note.attachedFileTypes)`, { type: type });
|
|
}
|
|
}));
|
|
```
|
|
と書くと、ループ中で`type`というプレースホルダが複数回使われてしまいおかしくなる
|
|
だから次のようにする必要がある
|
|
```ts
|
|
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 });
|
|
}
|
|
}));
|
|
```
|
|
|
|
### `null` in SQL
|
|
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
|
|
例えば
|
|
``` ts
|
|
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
|
```
|
|
という処理で、`ps.folderId`が`null`だと結果的に`file.folderId = null`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
|
だから次のようにする必要がある
|
|
``` ts
|
|
if (ps.folderId) {
|
|
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
|
} else {
|
|
query.where('file.folderId IS NULL');
|
|
}
|
|
```
|
|
|
|
### `[]` in SQL
|
|
SQLを発行する際、`IN`のパラメータが`[]`(空の配列)になる可能性のある場合はSQL文を出し分けなければならない
|
|
例えば
|
|
``` ts
|
|
const users = await Users.find({
|
|
id: In(userIds)
|
|
});
|
|
```
|
|
という処理で、`userIds`が`[]`だと結果的に`user.id IN ()`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
|
だから次のようにする必要がある
|
|
``` ts
|
|
const users = userIds.length > 0 ? await Users.find({
|
|
id: In(userIds)
|
|
}) : [];
|
|
```
|
|
|
|
### `undefined`にご用心
|
|
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
|
|
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
|