Compare commits
8 Commits
2024.7.0-b
...
2024.7.0-b
Author | SHA1 | Date | |
---|---|---|---|
![]() |
efa80f9ad4 | ||
![]() |
61f4a03e6c | ||
![]() |
085b3abf26 | ||
![]() |
5df85b8be1 | ||
![]() |
02ecd1b371 | ||
![]() |
22c4e9d7ec | ||
![]() |
46d96c7412 | ||
![]() |
0d76842abe |
@@ -41,6 +41,9 @@
|
|||||||
- Fix: リアクションしたユーザー一覧のユーザー名がはみ出る問題を修正
|
- Fix: リアクションしたユーザー一覧のユーザー名がはみ出る問題を修正
|
||||||
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/672)
|
(Cherry-picked from https://github.com/MisskeyIO/misskey/pull/672)
|
||||||
- Fix: `/share`ページにおいて絵文字ピッカーを開くことができない問題を修正
|
- Fix: `/share`ページにおいて絵文字ピッカーを開くことができない問題を修正
|
||||||
|
- Fix: ダイレクト投稿の"削除して編集"において、宛先が保持されていなかった問題を修正
|
||||||
|
- Fix: 投稿フォームへのURL貼り付けによる引用が下書きに保存されていなかった問題を修正
|
||||||
|
- Fix: "削除して編集"や下書きにおいて、リアクションの受け入れ設定が保持/保存されていなかった問題を修正
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
- Feat: レートリミット制限に引っかかったときに`Retry-After`ヘッダーを返すように (#13949)
|
- Feat: レートリミット制限に引っかかったときに`Retry-After`ヘッダーを返すように (#13949)
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
# Contribution guide
|
# Contribution guide
|
||||||
We're glad you're interested in contributing Misskey! In this document you will find the information you need to contribute to the project.
|
We're glad you're interested in contributing Misskey! In this document you will find the information you need to contribute to the project.
|
||||||
|
|
||||||
> **Note**
|
> [!NOTE]
|
||||||
> This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.**
|
> This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.**
|
||||||
> Also, you might receive comments on your Issue/PR in Japanese, but you do not need to reply to them in Japanese as well.\
|
> Also, you might receive comments on your Issue/PR in Japanese, but you do not need to reply to them in Japanese as well.\
|
||||||
> The accuracy of machine translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language.
|
> The accuracy of machine translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language.
|
||||||
@@ -17,32 +17,31 @@ Before creating an issue, please check the following:
|
|||||||
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
||||||
- Please ask questions or troubleshooting in [GitHub Discussions](https://github.com/misskey-dev/misskey/discussions) or [Discord](https://discord.gg/Wp8gVStHW3).
|
- Please ask questions or troubleshooting in [GitHub Discussions](https://github.com/misskey-dev/misskey/discussions) or [Discord](https://discord.gg/Wp8gVStHW3).
|
||||||
|
|
||||||
> **Warning**
|
> [!WARNING]
|
||||||
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
||||||
|
|
||||||
|
|
||||||
### Recommended discussing before implementation
|
### Recommended discussing before implementation
|
||||||
We welcome your purposal.
|
We welcome your proposal.
|
||||||
|
|
||||||
When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented.
|
When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented.
|
||||||
|
|
||||||
At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them.
|
At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them.
|
||||||
PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review.
|
PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review.
|
||||||
|
|
||||||
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask Commiter to assign you).
|
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask Committer to assign you).
|
||||||
By expressing your intention to work on the Issue, you can prevent conflicts in the work.
|
By expressing your intention to work on the Issue, you can prevent conflicts in the work.
|
||||||
|
|
||||||
To the Committers: you should not assign someone on it before the Final Decision.
|
To the Committers: you should not assign someone on it before the Final Decision.
|
||||||
|
|
||||||
### How issues are triaged
|
### How issues are triaged
|
||||||
|
|
||||||
The Commiters may:
|
The Committers may:
|
||||||
* close an issue that is not reproducible on latest stable release,
|
* close an issue that is not reproducible on latest stable release,
|
||||||
* merge an issue into another issue,
|
* merge an issue into another issue,
|
||||||
* split an issue into multiple issues,
|
* split an issue into multiple issues,
|
||||||
* or re-open that has been closed for some reason which is not applicable anymore.
|
* or re-open that has been closed for some reason which is not applicable anymore.
|
||||||
|
|
||||||
@syuilo reserves the Final Desicion rights including whether the project will implement feature and how to implement, these rights are not always exercised.
|
@syuilo reserves the Final Decision rights including whether the project will implement feature and how to implement, these rights are not always exercised.
|
||||||
|
|
||||||
## Well-known branches
|
## Well-known branches
|
||||||
- **`master`** branch is tracking the latest release and used for production purposes.
|
- **`master`** branch is tracking the latest release and used for production purposes.
|
||||||
@@ -53,14 +52,14 @@ The Commiters may:
|
|||||||
## Creating a PR
|
## Creating a PR
|
||||||
Thank you for your PR! Before creating a PR, please check the following:
|
Thank you for your PR! Before creating a PR, please check the following:
|
||||||
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
||||||
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc
|
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc
|
||||||
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
||||||
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
|
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
|
||||||
- Please add the summary of the changes to [`CHANGELOG.md`](/CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring.
|
- Please add the summary of the changes to [`CHANGELOG.md`](/CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring.
|
||||||
- Check if there are any documents that need to be created or updated due to this change.
|
- Check if there are any documents that need to be created or updated due to this change.
|
||||||
- If you have added a feature or fixed a bug, please add a test case if possible.
|
- If you have added a feature or fixed a bug, please add a test case if possible.
|
||||||
- Please make sure that tests and Lint are passed in advance.
|
- Please make sure that tests and Lint are passed in advance.
|
||||||
- You can run it with `pnpm test` and `pnpm lint`. [See more info](#testing)
|
- You can run it with `pnpm test` and `pnpm lint`. [See more info](#testing)
|
||||||
- If this PR includes UI changes, please attach a screenshot in the text.
|
- If this PR includes UI changes, please attach a screenshot in the text.
|
||||||
|
|
||||||
Thanks for your cooperation 🤗
|
Thanks for your cooperation 🤗
|
||||||
@@ -70,8 +69,8 @@ Be willing to comment on the good points and not just the things you want fixed
|
|||||||
|
|
||||||
### Review perspective
|
### Review perspective
|
||||||
- Scope
|
- Scope
|
||||||
- Are the goals of the PR clear?
|
- Are the goals of the PR clear?
|
||||||
- Is the granularity of the PR appropriate?
|
- Is the granularity of the PR appropriate?
|
||||||
- Security
|
- Security
|
||||||
- Does merging this PR create a vulnerability?
|
- Does merging this PR create a vulnerability?
|
||||||
- Performance
|
- Performance
|
||||||
@@ -93,7 +92,7 @@ An actual domain will be assigned so you can test the federation.
|
|||||||
|
|
||||||
## Release
|
## Release
|
||||||
### Release Instructions
|
### Release Instructions
|
||||||
1. Commit version changes in the `develop` branch ([package.json](https://github.com/misskey-dev/misskey/blob/develop/package.json))
|
1. Commit version changes in the `develop` branch ([package.json](package.json))
|
||||||
2. Create a release PR.
|
2. Create a release PR.
|
||||||
- Into `master` from `develop` branch.
|
- Into `master` from `develop` branch.
|
||||||
- The title must be in the format `Release: x.y.z`.
|
- The title must be in the format `Release: x.y.z`.
|
||||||
@@ -104,7 +103,7 @@ An actual domain will be assigned so you can test the federation.
|
|||||||
- The target branch must be `master`
|
- The target branch must be `master`
|
||||||
- The tag name must be the version
|
- The tag name must be the version
|
||||||
|
|
||||||
> **Note**
|
> [!NOTE]
|
||||||
> Why this instruction is necessary:
|
> Why this instruction is necessary:
|
||||||
> - To perform final QA checks
|
> - To perform final QA checks
|
||||||
> - To distribute responsibility
|
> - To distribute responsibility
|
||||||
@@ -139,7 +138,7 @@ You could obtain middleware container by typing `docker compose -f $PROJECT_ROOT
|
|||||||
Devcontainer also has necessary setting. This method can be done by connecting from VSCode.
|
Devcontainer also has necessary setting. This method can be done by connecting from VSCode.
|
||||||
|
|
||||||
Instead of running `pnpm` locally, you can use Dev Container to set up your development environment.
|
Instead of running `pnpm` locally, you can use Dev Container to set up your development environment.
|
||||||
To use Dev Container, open the project directory on VSCode with Dev Containers installed.
|
To use Dev Container, open the project directory on VSCode with Dev Containers installed.
|
||||||
**Note:** If you are using Windows, please clone the repository with WSL. Using Git for Windows will result in broken files due to the difference in how newlines are handled.
|
**Note:** If you are using Windows, please clone the repository with WSL. Using Git for Windows will result in broken files due to the difference in how newlines are handled.
|
||||||
|
|
||||||
It will run the following command automatically inside the container.
|
It will run the following command automatically inside the container.
|
||||||
@@ -155,11 +154,9 @@ After finishing the migration, you can proceed.
|
|||||||
|
|
||||||
### Start developing
|
### Start developing
|
||||||
During development, it is useful to use the
|
During development, it is useful to use the
|
||||||
|
|
||||||
```
|
```
|
||||||
pnpm dev
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
command.
|
command.
|
||||||
|
|
||||||
- Server-side source files and automatically builds them if they are modified. Automatically start the server process(es).
|
- Server-side source files and automatically builds them if they are modified. Automatically start the server process(es).
|
||||||
@@ -232,7 +229,7 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
|
|||||||
### ルート定義
|
### ルート定義
|
||||||
ルート定義は、以下の形式のオブジェクトの配列です。
|
ルート定義は、以下の形式のオブジェクトの配列です。
|
||||||
|
|
||||||
``` ts
|
```ts
|
||||||
{
|
{
|
||||||
name?: string;
|
name?: string;
|
||||||
path: string;
|
path: string;
|
||||||
@@ -245,7 +242,7 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Warning**
|
> [!WARNING]
|
||||||
> 現状、ルートは定義された順に評価されます。
|
> 現状、ルートは定義された順に評価されます。
|
||||||
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
|
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
|
||||||
|
|
||||||
@@ -307,7 +304,7 @@ export const Default = {
|
|||||||
parameters: {
|
parameters: {
|
||||||
layout: 'centered',
|
layout: 'centered',
|
||||||
},
|
},
|
||||||
} satisfies StoryObj<typeof MkAvatar>;
|
} satisfies StoryObj<typeof MyComponent>;
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want to opt-out from the automatic generation, create a `MyComponent.stories.impl.ts` file and add the following line to the file.
|
If you want to opt-out from the automatic generation, create a `MyComponent.stories.impl.ts` file and add the following line to the file.
|
||||||
@@ -418,7 +415,7 @@ describe('test', () => {
|
|||||||
})
|
})
|
||||||
.useMocker(...
|
.useMocker(...
|
||||||
.compile();
|
.compile();
|
||||||
|
|
||||||
fooService = app.get<FooService>(FooService);
|
fooService = app.get<FooService>(FooService);
|
||||||
barService = app.get<BarService>(BarService) as jest.Mocked<BarService>;
|
barService = app.get<BarService>(BarService) as jest.Mocked<BarService>;
|
||||||
|
|
||||||
@@ -539,13 +536,13 @@ pnpm dlx typeorm migration:generate -d ormconfig.js -o <migration name>
|
|||||||
- 作成されたスクリプトは不必要な変更を含むため除去してください
|
- 作成されたスクリプトは不必要な変更を含むため除去してください
|
||||||
|
|
||||||
### JSON SchemaのobjectでanyOfを使うとき
|
### JSON SchemaのobjectでanyOfを使うとき
|
||||||
JSON Schemaで、objectに対してanyOfを使う場合、anyOfの中でpropertiesを定義しないこと。
|
JSON Schemaで、objectに対してanyOfを使う場合、anyOfの中でpropertiesを定義しないこと。
|
||||||
バリデーションが効かないため。(SchemaTypeもそのように作られており、objectのanyOf内のpropertiesは捨てられます)
|
バリデーションが効かないため。(SchemaTypeもそのように作られており、objectのanyOf内のpropertiesは捨てられます)
|
||||||
https://github.com/misskey-dev/misskey/pull/10082
|
https://github.com/misskey-dev/misskey/pull/10082
|
||||||
|
|
||||||
テキストhogeおよびfugaについて、片方を必須としつつ両方の指定もありうる場合:
|
テキストhogeおよびfugaについて、片方を必須としつつ両方の指定もありうる場合:
|
||||||
|
|
||||||
```
|
```ts
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
properties: {
|
properties: {
|
||||||
|
30
package.json
30
package.json
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "2024.7.0-beta.2",
|
"version": "2024.7.0-beta.3",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/misskey-dev/misskey.git"
|
"url": "https://github.com/misskey-dev/misskey.git"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@9.5.0",
|
"packageManager": "pnpm@9.6.0",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/frontend",
|
"packages/frontend",
|
||||||
"packages/backend",
|
"packages/backend",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
"build-assets": "node ./scripts/build-assets.mjs",
|
"build-assets": "node ./scripts/build-assets.mjs",
|
||||||
"build": "pnpm build-pre && pnpm -r build && pnpm build-assets",
|
"build": "pnpm build-pre && pnpm -r build && pnpm build-assets",
|
||||||
"build-storybook": "pnpm --filter frontend build-storybook",
|
"build-storybook": "pnpm --filter frontend build-storybook",
|
||||||
"build-misskey-js-with-types": "pnpm build-pre && pnpm --filter backend... --filter=!misskey-js build && pnpm --filter backend generate-api-json && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build && pnpm --filter misskey-js api",
|
"build-misskey-js-with-types": "pnpm build-pre && pnpm --filter backend... --filter=!misskey-js build && pnpm --filter backend generate-api-json --no-build && ncp packages/backend/built/api.json packages/misskey-js/generator/api.json && pnpm --filter misskey-js update-autogen-code && pnpm --filter misskey-js build && pnpm --filter misskey-js api",
|
||||||
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js",
|
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/entry.js",
|
||||||
"start:test": "cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
|
"start:test": "cd packages/backend && cross-env NODE_ENV=test node ./built/boot/entry.js",
|
||||||
"init": "pnpm migrate",
|
"init": "pnpm migrate",
|
||||||
@@ -51,24 +51,24 @@
|
|||||||
"cssnano": "6.1.2",
|
"cssnano": "6.1.2",
|
||||||
"execa": "8.0.1",
|
"execa": "8.0.1",
|
||||||
"fast-glob": "3.3.2",
|
"fast-glob": "3.3.2",
|
||||||
"ignore-walk": "6.0.4",
|
"ignore-walk": "6.0.5",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"postcss": "8.4.38",
|
"postcss": "8.4.40",
|
||||||
"tar": "6.2.1",
|
"tar": "6.2.1",
|
||||||
"terser": "5.31.1",
|
"terser": "5.31.3",
|
||||||
"typescript": "5.5.3",
|
"typescript": "5.5.4",
|
||||||
"esbuild": "0.22.0",
|
"esbuild": "0.23.0",
|
||||||
"glob": "10.3.12"
|
"glob": "11.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@misskey-dev/eslint-plugin": "2.0.2",
|
"@misskey-dev/eslint-plugin": "2.0.2",
|
||||||
"@types/node": "20.14.9",
|
"@types/node": "20.14.12",
|
||||||
"@typescript-eslint/eslint-plugin": "7.15.0",
|
"@typescript-eslint/eslint-plugin": "7.17.0",
|
||||||
"@typescript-eslint/parser": "7.15.0",
|
"@typescript-eslint/parser": "7.17.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "13.13.0",
|
"cypress": "13.13.1",
|
||||||
"eslint": "9.6.0",
|
"eslint": "9.8.0",
|
||||||
"globals": "15.7.0",
|
"globals": "15.8.0",
|
||||||
"ncp": "2.0.0",
|
"ncp": "2.0.0",
|
||||||
"start-server-and-test": "2.0.4"
|
"start-server-and-test": "2.0.4"
|
||||||
},
|
},
|
||||||
|
@@ -31,7 +31,7 @@
|
|||||||
"test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e",
|
"test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e",
|
||||||
"test-and-coverage": "pnpm jest-and-coverage",
|
"test-and-coverage": "pnpm jest-and-coverage",
|
||||||
"test-and-coverage:e2e": "pnpm build && pnpm build:test && pnpm jest-and-coverage:e2e",
|
"test-and-coverage:e2e": "pnpm build && pnpm build:test && pnpm jest-and-coverage:e2e",
|
||||||
"generate-api-json": "pnpm build && node ./scripts/generate_api_json.js"
|
"generate-api-json": "node ./scripts/generate_api_json.js"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@swc/core-android-arm64": "1.3.11",
|
"@swc/core-android-arm64": "1.3.11",
|
||||||
@@ -65,11 +65,11 @@
|
|||||||
"utf-8-validate": "6.0.3"
|
"utf-8-validate": "6.0.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "3.600.0",
|
"@aws-sdk/client-s3": "3.620.0",
|
||||||
"@aws-sdk/lib-storage": "3.600.0",
|
"@aws-sdk/lib-storage": "3.620.0",
|
||||||
"@bull-board/api": "5.20.5",
|
"@bull-board/api": "5.21.1",
|
||||||
"@bull-board/fastify": "5.20.5",
|
"@bull-board/fastify": "5.21.1",
|
||||||
"@bull-board/ui": "5.20.5",
|
"@bull-board/ui": "5.21.1",
|
||||||
"@discordapp/twemoji": "15.0.3",
|
"@discordapp/twemoji": "15.0.3",
|
||||||
"@fastify/accepts": "4.3.0",
|
"@fastify/accepts": "4.3.0",
|
||||||
"@fastify/cookie": "9.3.1",
|
"@fastify/cookie": "9.3.1",
|
||||||
@@ -86,22 +86,22 @@
|
|||||||
"@nestjs/core": "10.3.10",
|
"@nestjs/core": "10.3.10",
|
||||||
"@nestjs/testing": "10.3.10",
|
"@nestjs/testing": "10.3.10",
|
||||||
"@peertube/http-signature": "1.7.0",
|
"@peertube/http-signature": "1.7.0",
|
||||||
"@sentry/node": "8.13.0",
|
"@sentry/node": "8.20.0",
|
||||||
"@sentry/profiling-node": "8.13.0",
|
"@sentry/profiling-node": "8.20.0",
|
||||||
"@simplewebauthn/server": "10.0.0",
|
"@simplewebauthn/server": "10.0.1",
|
||||||
"@sinonjs/fake-timers": "11.2.2",
|
"@sinonjs/fake-timers": "11.2.2",
|
||||||
"@smithy/node-http-handler": "2.5.0",
|
"@smithy/node-http-handler": "2.5.0",
|
||||||
"@swc/cli": "0.3.12",
|
"@swc/cli": "0.3.12",
|
||||||
"@swc/core": "1.6.6",
|
"@swc/core": "1.6.6",
|
||||||
"@twemoji/parser": "15.1.1",
|
"@twemoji/parser": "15.1.1",
|
||||||
"accepts": "1.3.8",
|
"accepts": "1.3.8",
|
||||||
"ajv": "8.16.0",
|
"ajv": "8.17.1",
|
||||||
"archiver": "7.0.1",
|
"archiver": "7.0.1",
|
||||||
"async-mutex": "0.5.0",
|
"async-mutex": "0.5.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"blurhash": "2.0.5",
|
"blurhash": "2.0.5",
|
||||||
"body-parser": "1.20.2",
|
"body-parser": "1.20.2",
|
||||||
"bullmq": "5.8.3",
|
"bullmq": "5.10.4",
|
||||||
"cacheable-lookup": "7.0.0",
|
"cacheable-lookup": "7.0.0",
|
||||||
"cbor": "9.0.2",
|
"cbor": "9.0.2",
|
||||||
"chalk": "5.3.0",
|
"chalk": "5.3.0",
|
||||||
@@ -115,10 +115,10 @@
|
|||||||
"fastify": "4.28.1",
|
"fastify": "4.28.1",
|
||||||
"fastify-raw-body": "4.3.0",
|
"fastify-raw-body": "4.3.0",
|
||||||
"feed": "4.2.2",
|
"feed": "4.2.2",
|
||||||
"file-type": "19.0.0",
|
"file-type": "19.3.0",
|
||||||
"fluent-ffmpeg": "2.1.3",
|
"fluent-ffmpeg": "2.1.3",
|
||||||
"form-data": "4.0.0",
|
"form-data": "4.0.0",
|
||||||
"got": "14.4.1",
|
"got": "14.4.2",
|
||||||
"happy-dom": "10.0.3",
|
"happy-dom": "10.0.3",
|
||||||
"hpagent": "1.2.0",
|
"hpagent": "1.2.0",
|
||||||
"htmlescape": "1.1.1",
|
"htmlescape": "1.1.1",
|
||||||
@@ -128,7 +128,7 @@
|
|||||||
"ipaddr.js": "2.2.0",
|
"ipaddr.js": "2.2.0",
|
||||||
"is-svg": "5.0.1",
|
"is-svg": "5.0.1",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"jsdom": "24.1.0",
|
"jsdom": "24.1.1",
|
||||||
"json5": "2.2.3",
|
"json5": "2.2.3",
|
||||||
"jsonld": "8.3.2",
|
"jsonld": "8.3.2",
|
||||||
"jsrsasign": "11.1.0",
|
"jsrsasign": "11.1.0",
|
||||||
@@ -177,11 +177,11 @@
|
|||||||
"tsc-alias": "1.8.10",
|
"tsc-alias": "1.8.10",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"typeorm": "0.3.20",
|
"typeorm": "0.3.20",
|
||||||
"typescript": "5.5.3",
|
"typescript": "5.5.4",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"vary": "1.1.2",
|
"vary": "1.1.2",
|
||||||
"web-push": "3.6.7",
|
"web-push": "3.6.7",
|
||||||
"ws": "8.17.1",
|
"ws": "8.18.0",
|
||||||
"xev": "3.0.2"
|
"xev": "3.0.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -201,11 +201,11 @@
|
|||||||
"@types/jest": "29.5.12",
|
"@types/jest": "29.5.12",
|
||||||
"@types/js-yaml": "4.0.9",
|
"@types/js-yaml": "4.0.9",
|
||||||
"@types/jsdom": "21.1.7",
|
"@types/jsdom": "21.1.7",
|
||||||
"@types/jsonld": "1.5.14",
|
"@types/jsonld": "1.5.15",
|
||||||
"@types/jsrsasign": "10.5.14",
|
"@types/jsrsasign": "10.5.14",
|
||||||
"@types/mime-types": "2.1.4",
|
"@types/mime-types": "2.1.4",
|
||||||
"@types/ms": "0.7.34",
|
"@types/ms": "0.7.34",
|
||||||
"@types/node": "20.14.9",
|
"@types/node": "20.14.12",
|
||||||
"@types/nodemailer": "6.4.15",
|
"@types/nodemailer": "6.4.15",
|
||||||
"@types/oauth": "0.9.5",
|
"@types/oauth": "0.9.5",
|
||||||
"@types/oauth2orize": "1.11.5",
|
"@types/oauth2orize": "1.11.5",
|
||||||
@@ -225,18 +225,18 @@
|
|||||||
"@types/tmp": "0.2.6",
|
"@types/tmp": "0.2.6",
|
||||||
"@types/vary": "1.1.3",
|
"@types/vary": "1.1.3",
|
||||||
"@types/web-push": "3.6.3",
|
"@types/web-push": "3.6.3",
|
||||||
"@types/ws": "8.5.10",
|
"@types/ws": "8.5.11",
|
||||||
"@typescript-eslint/eslint-plugin": "7.15.0",
|
"@typescript-eslint/eslint-plugin": "7.17.0",
|
||||||
"@typescript-eslint/parser": "7.15.0",
|
"@typescript-eslint/parser": "7.17.0",
|
||||||
"aws-sdk-client-mock": "4.0.1",
|
"aws-sdk-client-mock": "4.0.1",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"eslint-plugin-import": "2.29.1",
|
"eslint-plugin-import": "2.29.1",
|
||||||
"execa": "9.2.0",
|
"execa": "9.3.0",
|
||||||
"fkill": "9.0.0",
|
"fkill": "9.0.0",
|
||||||
"jest": "29.7.0",
|
"jest": "29.7.0",
|
||||||
"jest-mock": "29.7.0",
|
"jest-mock": "29.7.0",
|
||||||
"nodemon": "3.1.4",
|
"nodemon": "3.1.4",
|
||||||
"pid-port": "1.0.0",
|
"pid-port": "1.0.0",
|
||||||
"simple-oauth2": "5.0.1"
|
"simple-oauth2": "5.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,11 +3,34 @@
|
|||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { loadConfig } from '../built/config.js'
|
import { execa } from 'execa';
|
||||||
import { genOpenapiSpec } from '../built/server/api/openapi/gen-spec.js'
|
import { writeFileSync, existsSync } from "node:fs";
|
||||||
import { writeFileSync } from "node:fs";
|
|
||||||
|
|
||||||
const config = loadConfig();
|
async function main() {
|
||||||
const spec = genOpenapiSpec(config, true);
|
if (!process.argv.includes('--no-build')) {
|
||||||
|
await execa('pnpm', ['run', 'build'], {
|
||||||
|
stdout: process.stdout,
|
||||||
|
stderr: process.stderr,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
writeFileSync('./built/api.json', JSON.stringify(spec), 'utf-8');
|
if (!existsSync('./built')) {
|
||||||
|
throw new Error('`built` directory does not exist.');
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @type {import('../src/config.js')} */
|
||||||
|
const { loadConfig } = await import('../built/config.js');
|
||||||
|
|
||||||
|
/** @type {import('../src/server/api/openapi/gen-spec.js')} */
|
||||||
|
const { genOpenapiSpec } = await import('../built/server/api/openapi/gen-spec.js');
|
||||||
|
|
||||||
|
const config = loadConfig();
|
||||||
|
const spec = genOpenapiSpec(config, true);
|
||||||
|
|
||||||
|
writeFileSync('./built/api.json', JSON.stringify(spec), 'utf-8');
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch(e => {
|
||||||
|
console.error(e);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
@@ -204,6 +204,7 @@ export const packedNoteSchema = {
|
|||||||
reactionAcceptance: {
|
reactionAcceptance: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
optional: false, nullable: true,
|
optional: false, nullable: true,
|
||||||
|
enum: ['likeOnly', 'likeOnlyForRemote', 'nonSensitiveOnly', 'nonSensitiveOnlyForLocalLikeOnlyForRemote'],
|
||||||
},
|
},
|
||||||
reactionEmojis: {
|
reactionEmojis: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
|
@@ -27,8 +27,8 @@
|
|||||||
"@syuilo/aiscript": "0.19.0",
|
"@syuilo/aiscript": "0.19.0",
|
||||||
"@tabler/icons-webfont": "3.3.0",
|
"@tabler/icons-webfont": "3.3.0",
|
||||||
"@twemoji/parser": "15.1.1",
|
"@twemoji/parser": "15.1.1",
|
||||||
"@vitejs/plugin-vue": "5.0.5",
|
"@vitejs/plugin-vue": "5.1.0",
|
||||||
"@vue/compiler-sfc": "3.4.31",
|
"@vue/compiler-sfc": "3.4.34",
|
||||||
"aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.11",
|
"aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.11",
|
||||||
"astring": "1.8.6",
|
"astring": "1.8.6",
|
||||||
"broadcast-channel": "7.0.0",
|
"broadcast-channel": "7.0.0",
|
||||||
@@ -39,9 +39,9 @@
|
|||||||
"chartjs-chart-matrix": "2.0.1",
|
"chartjs-chart-matrix": "2.0.1",
|
||||||
"chartjs-plugin-gradient": "0.6.1",
|
"chartjs-plugin-gradient": "0.6.1",
|
||||||
"chartjs-plugin-zoom": "2.0.1",
|
"chartjs-plugin-zoom": "2.0.1",
|
||||||
"chromatic": "11.5.4",
|
"chromatic": "11.5.6",
|
||||||
"compare-versions": "6.1.0",
|
"compare-versions": "6.1.1",
|
||||||
"cropperjs": "2.0.0-beta.5",
|
"cropperjs": "2.0.0-rc.1",
|
||||||
"date-fns": "2.30.0",
|
"date-fns": "2.30.0",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"estree-walker": "3.0.3",
|
"estree-walker": "3.0.3",
|
||||||
@@ -57,85 +57,85 @@
|
|||||||
"misskey-reversi": "workspace:*",
|
"misskey-reversi": "workspace:*",
|
||||||
"photoswipe": "5.4.4",
|
"photoswipe": "5.4.4",
|
||||||
"punycode": "2.3.1",
|
"punycode": "2.3.1",
|
||||||
"rollup": "4.18.0",
|
"rollup": "4.19.1",
|
||||||
"sanitize-html": "2.13.0",
|
"sanitize-html": "2.13.0",
|
||||||
"sass": "1.77.6",
|
"sass": "1.77.8",
|
||||||
"shiki": "1.10.0",
|
"shiki": "1.12.0",
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.165.0",
|
"three": "0.167.0",
|
||||||
"throttle-debounce": "5.0.2",
|
"throttle-debounce": "5.0.2",
|
||||||
"tinycolor2": "1.6.0",
|
"tinycolor2": "1.6.0",
|
||||||
"tsc-alias": "1.8.10",
|
"tsc-alias": "1.8.10",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"typescript": "5.5.3",
|
"typescript": "5.5.4",
|
||||||
"uuid": "10.0.0",
|
"uuid": "10.0.0",
|
||||||
"v-code-diff": "1.12.0",
|
"v-code-diff": "1.12.0",
|
||||||
"vite": "5.3.2",
|
"vite": "5.3.5",
|
||||||
"vue": "3.4.31",
|
"vue": "3.4.34",
|
||||||
"vuedraggable": "next"
|
"vuedraggable": "next"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@misskey-dev/summaly": "5.1.0",
|
"@misskey-dev/summaly": "5.1.0",
|
||||||
"@storybook/addon-actions": "8.1.11",
|
"@storybook/addon-actions": "8.2.6",
|
||||||
"@storybook/addon-essentials": "8.1.11",
|
"@storybook/addon-essentials": "8.2.6",
|
||||||
"@storybook/addon-interactions": "8.1.11",
|
"@storybook/addon-interactions": "8.2.6",
|
||||||
"@storybook/addon-links": "8.1.11",
|
"@storybook/addon-links": "8.2.6",
|
||||||
"@storybook/addon-mdx-gfm": "8.1.11",
|
"@storybook/addon-mdx-gfm": "8.2.6",
|
||||||
"@storybook/addon-storysource": "8.1.11",
|
"@storybook/addon-storysource": "8.2.6",
|
||||||
"@storybook/blocks": "8.1.11",
|
"@storybook/blocks": "8.2.6",
|
||||||
"@storybook/components": "8.1.11",
|
"@storybook/components": "8.2.6",
|
||||||
"@storybook/core-events": "8.1.11",
|
"@storybook/core-events": "8.2.6",
|
||||||
"@storybook/manager-api": "8.1.11",
|
"@storybook/manager-api": "8.2.6",
|
||||||
"@storybook/preview-api": "8.1.11",
|
"@storybook/preview-api": "8.2.6",
|
||||||
"@storybook/react": "8.1.11",
|
"@storybook/react": "8.2.6",
|
||||||
"@storybook/react-vite": "8.1.11",
|
"@storybook/react-vite": "8.2.6",
|
||||||
"@storybook/test": "8.1.11",
|
"@storybook/test": "8.2.6",
|
||||||
"@storybook/theming": "8.1.11",
|
"@storybook/theming": "8.2.6",
|
||||||
"@storybook/types": "8.1.11",
|
"@storybook/types": "8.2.6",
|
||||||
"@storybook/vue3": "8.1.11",
|
"@storybook/vue3": "8.2.6",
|
||||||
"@storybook/vue3-vite": "8.1.11",
|
"@storybook/vue3-vite": "8.1.11",
|
||||||
"@testing-library/vue": "8.1.0",
|
"@testing-library/vue": "8.1.0",
|
||||||
"@types/escape-regexp": "0.0.3",
|
"@types/escape-regexp": "0.0.3",
|
||||||
"@types/estree": "1.0.5",
|
"@types/estree": "1.0.5",
|
||||||
"@types/matter-js": "0.19.6",
|
"@types/matter-js": "0.19.7",
|
||||||
"@types/micromatch": "4.0.9",
|
"@types/micromatch": "4.0.9",
|
||||||
"@types/node": "20.14.9",
|
"@types/node": "20.14.12",
|
||||||
"@types/punycode": "2.1.4",
|
"@types/punycode": "2.1.4",
|
||||||
"@types/sanitize-html": "2.11.0",
|
"@types/sanitize-html": "2.11.0",
|
||||||
"@types/seedrandom": "3.0.8",
|
"@types/seedrandom": "3.0.8",
|
||||||
"@types/throttle-debounce": "5.0.2",
|
"@types/throttle-debounce": "5.0.2",
|
||||||
"@types/tinycolor2": "1.4.6",
|
"@types/tinycolor2": "1.4.6",
|
||||||
"@types/uuid": "10.0.0",
|
"@types/uuid": "10.0.0",
|
||||||
"@types/ws": "8.5.10",
|
"@types/ws": "8.5.11",
|
||||||
"@typescript-eslint/eslint-plugin": "7.15.0",
|
"@typescript-eslint/eslint-plugin": "7.17.0",
|
||||||
"@typescript-eslint/parser": "7.15.0",
|
"@typescript-eslint/parser": "7.17.0",
|
||||||
"@vitest/coverage-v8": "1.6.0",
|
"@vitest/coverage-v8": "1.6.0",
|
||||||
"@vue/runtime-core": "3.4.31",
|
"@vue/runtime-core": "3.4.34",
|
||||||
"acorn": "8.12.0",
|
"acorn": "8.12.1",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"cypress": "13.13.0",
|
"cypress": "13.13.1",
|
||||||
"eslint-plugin-import": "2.29.1",
|
"eslint-plugin-import": "2.29.1",
|
||||||
"eslint-plugin-vue": "9.26.0",
|
"eslint-plugin-vue": "9.27.0",
|
||||||
"fast-glob": "3.3.2",
|
"fast-glob": "3.3.2",
|
||||||
"happy-dom": "10.0.3",
|
"happy-dom": "10.0.3",
|
||||||
"intersection-observer": "0.12.2",
|
"intersection-observer": "0.12.2",
|
||||||
"micromatch": "4.0.7",
|
"micromatch": "4.0.7",
|
||||||
"msw": "2.3.1",
|
"msw": "2.3.4",
|
||||||
"msw-storybook-addon": "2.0.2",
|
"msw-storybook-addon": "2.0.3",
|
||||||
"nodemon": "3.1.4",
|
"nodemon": "3.1.4",
|
||||||
"prettier": "3.3.2",
|
"prettier": "3.3.3",
|
||||||
"react": "18.3.1",
|
"react": "18.3.1",
|
||||||
"react-dom": "18.3.1",
|
"react-dom": "18.3.1",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
"start-server-and-test": "2.0.4",
|
"start-server-and-test": "2.0.4",
|
||||||
"storybook": "8.1.11",
|
"storybook": "8.2.6",
|
||||||
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
|
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
|
||||||
"vite-plugin-turbosnap": "1.0.3",
|
"vite-plugin-turbosnap": "1.0.3",
|
||||||
"vitest": "1.6.0",
|
"vitest": "1.6.0",
|
||||||
"vitest-fetch-mock": "0.2.2",
|
"vitest-fetch-mock": "0.2.2",
|
||||||
"vue-component-type-helpers": "2.0.24",
|
"vue-component-type-helpers": "2.0.29",
|
||||||
"vue-eslint-parser": "9.4.3",
|
"vue-eslint-parser": "9.4.3",
|
||||||
"vue-tsc": "2.0.24"
|
"vue-tsc": "2.0.29"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,12 +7,12 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
<MkModal ref="modal" :preferType="'dialog'" @click="onBgClick" @closed="emit('closed')" @esc="emit('esc')">
|
<MkModal ref="modal" :preferType="'dialog'" @click="onBgClick" @closed="emit('closed')" @esc="emit('esc')">
|
||||||
<div ref="rootEl" :class="$style.root" :style="{ width: `${width}px`, height: `min(${height}px, 100%)` }">
|
<div ref="rootEl" :class="$style.root" :style="{ width: `${width}px`, height: `min(${height}px, 100%)` }">
|
||||||
<div ref="headerEl" :class="$style.header">
|
<div ref="headerEl" :class="$style.header">
|
||||||
<button v-if="withOkButton" :class="$style.headerButton" class="_button" @click="$emit('close')"><i class="ti ti-x"></i></button>
|
<button v-if="withOkButton && withCloseButton" :class="$style.headerButton" class="_button" @click="emit('close')"><i class="ti ti-x"></i></button>
|
||||||
<span :class="$style.title">
|
<span :class="$style.title">
|
||||||
<slot name="header"></slot>
|
<slot name="header"></slot>
|
||||||
</span>
|
</span>
|
||||||
<button v-if="!withOkButton" :class="$style.headerButton" class="_button" data-cy-modal-window-close @click="$emit('close')"><i class="ti ti-x"></i></button>
|
<button v-if="!withOkButton && withCloseButton" :class="$style.headerButton" class="_button" data-cy-modal-window-close @click="emit('close')"><i class="ti ti-x"></i></button>
|
||||||
<button v-if="withOkButton" :class="$style.headerButton" class="_button" :disabled="okButtonDisabled" @click="$emit('ok')"><i class="ti ti-check"></i></button>
|
<button v-if="withOkButton" :class="$style.headerButton" class="_button" :disabled="okButtonDisabled" @click="emit('ok')"><i class="ti ti-check"></i></button>
|
||||||
</div>
|
</div>
|
||||||
<div :class="$style.body">
|
<div :class="$style.body">
|
||||||
<slot :width="bodyWidth" :height="bodyHeight"></slot>
|
<slot :width="bodyWidth" :height="bodyHeight"></slot>
|
||||||
@@ -27,11 +27,13 @@ import MkModal from './MkModal.vue';
|
|||||||
|
|
||||||
const props = withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
withOkButton: boolean;
|
withOkButton: boolean;
|
||||||
|
withCloseButton: boolean;
|
||||||
okButtonDisabled: boolean;
|
okButtonDisabled: boolean;
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
}>(), {
|
}>(), {
|
||||||
withOkButton: false,
|
withOkButton: false,
|
||||||
|
withCloseButton: true,
|
||||||
okButtonDisabled: false,
|
okButtonDisabled: false,
|
||||||
width: 400,
|
width: 400,
|
||||||
height: 500,
|
height: 500,
|
||||||
@@ -51,13 +53,13 @@ const headerEl = shallowRef<HTMLElement>();
|
|||||||
const bodyWidth = ref(0);
|
const bodyWidth = ref(0);
|
||||||
const bodyHeight = ref(0);
|
const bodyHeight = ref(0);
|
||||||
|
|
||||||
const close = () => {
|
function close() {
|
||||||
modal.value?.close();
|
modal.value?.close();
|
||||||
};
|
}
|
||||||
|
|
||||||
const onBgClick = () => {
|
function onBgClick() {
|
||||||
emit('click');
|
emit('click');
|
||||||
};
|
}
|
||||||
|
|
||||||
const ro = new ResizeObserver((entries, observer) => {
|
const ro = new ResizeObserver((entries, observer) => {
|
||||||
if (rootEl.value == null || headerEl.value == null) return;
|
if (rootEl.value == null || headerEl.value == null) return;
|
||||||
|
@@ -367,6 +367,8 @@ function watchForDraft() {
|
|||||||
watch(files, () => saveDraft(), { deep: true });
|
watch(files, () => saveDraft(), { deep: true });
|
||||||
watch(visibility, () => saveDraft());
|
watch(visibility, () => saveDraft());
|
||||||
watch(localOnly, () => saveDraft());
|
watch(localOnly, () => saveDraft());
|
||||||
|
watch(quoteId, () => saveDraft());
|
||||||
|
watch(reactionAcceptance, () => saveDraft());
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkMissingMention() {
|
function checkMissingMention() {
|
||||||
@@ -703,6 +705,8 @@ function saveDraft() {
|
|||||||
files: files.value,
|
files: files.value,
|
||||||
poll: poll.value,
|
poll: poll.value,
|
||||||
visibleUserIds: visibility.value === 'specified' ? visibleUsers.value.map(x => x.id) : undefined,
|
visibleUserIds: visibility.value === 'specified' ? visibleUsers.value.map(x => x.id) : undefined,
|
||||||
|
quoteId: quoteId.value,
|
||||||
|
reactionAcceptance: reactionAcceptance.value,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -991,6 +995,8 @@ onMounted(() => {
|
|||||||
users.forEach(u => pushVisibleUser(u));
|
users.forEach(u => pushVisibleUser(u));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
quoteId.value = draft.data.quoteId;
|
||||||
|
reactionAcceptance.value = draft.data.reactionAcceptance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -998,9 +1004,11 @@ onMounted(() => {
|
|||||||
if (props.initialNote) {
|
if (props.initialNote) {
|
||||||
const init = props.initialNote;
|
const init = props.initialNote;
|
||||||
text.value = init.text ? init.text : '';
|
text.value = init.text ? init.text : '';
|
||||||
files.value = init.files ?? [];
|
|
||||||
cw.value = init.cw ?? null;
|
|
||||||
useCw.value = init.cw != null;
|
useCw.value = init.cw != null;
|
||||||
|
cw.value = init.cw ?? null;
|
||||||
|
visibility.value = init.visibility;
|
||||||
|
localOnly.value = init.localOnly ?? false;
|
||||||
|
files.value = init.files ?? [];
|
||||||
if (init.poll) {
|
if (init.poll) {
|
||||||
poll.value = {
|
poll.value = {
|
||||||
choices: init.poll.choices.map(x => x.text),
|
choices: init.poll.choices.map(x => x.text),
|
||||||
@@ -1009,9 +1017,13 @@ onMounted(() => {
|
|||||||
expiredAfter: null,
|
expiredAfter: null,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
visibility.value = init.visibility;
|
if (init.visibleUserIds) {
|
||||||
localOnly.value = init.localOnly ?? false;
|
misskeyApi('users/show', { userIds: init.visibleUserIds }).then(users => {
|
||||||
|
users.forEach(u => pushVisibleUser(u));
|
||||||
|
});
|
||||||
|
}
|
||||||
quoteId.value = init.renote ? init.renote.id : null;
|
quoteId.value = init.renote ? init.renote.id : null;
|
||||||
|
reactionAcceptance.value = init.reactionAcceptance;
|
||||||
}
|
}
|
||||||
|
|
||||||
nextTick(() => watchForDraft());
|
nextTick(() => watchForDraft());
|
||||||
|
@@ -24,22 +24,23 @@ export type MkSystemWebhookResult = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export async function showSystemWebhookEditorDialog(props: MkSystemWebhookEditorProps): Promise<MkSystemWebhookResult | null> {
|
export async function showSystemWebhookEditorDialog(props: MkSystemWebhookEditorProps): Promise<MkSystemWebhookResult | null> {
|
||||||
const { dispose, result } = await new Promise<{ dispose: () => void, result: MkSystemWebhookResult | null }>(async resolve => {
|
const { result } = await new Promise<{ result: MkSystemWebhookResult | null }>(async resolve => {
|
||||||
const { dispose: _dispose } = os.popup(
|
const { dispose } = os.popup(
|
||||||
defineAsyncComponent(() => import('@/components/MkSystemWebhookEditor.vue')),
|
defineAsyncComponent(() => import('@/components/MkSystemWebhookEditor.vue')),
|
||||||
props,
|
props,
|
||||||
{
|
{
|
||||||
submitted: (ev: MkSystemWebhookResult) => {
|
submitted: (ev: MkSystemWebhookResult) => {
|
||||||
resolve({ dispose: _dispose, result: ev });
|
resolve({ result: ev });
|
||||||
|
},
|
||||||
|
canceled: () => {
|
||||||
|
resolve({ result: null });
|
||||||
},
|
},
|
||||||
closed: () => {
|
closed: () => {
|
||||||
resolve({ dispose: _dispose, result: null });
|
dispose();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
dispose();
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@@ -5,6 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<MkModalWindow
|
<MkModalWindow
|
||||||
|
ref="dialogEl"
|
||||||
:width="450"
|
:width="450"
|
||||||
:height="590"
|
:height="590"
|
||||||
:canClose="true"
|
:canClose="true"
|
||||||
@@ -12,7 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
:okButtonDisabled="false"
|
:okButtonDisabled="false"
|
||||||
@click="onCancelClicked"
|
@click="onCancelClicked"
|
||||||
@close="onCancelClicked"
|
@close="onCancelClicked"
|
||||||
@closed="onCancelClicked"
|
@closed="emit('closed')"
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
{{ mode === 'create' ? i18n.ts._webhookSettings.createWebhook : i18n.ts._webhookSettings.modifyWebhook }}
|
{{ mode === 'create' ? i18n.ts._webhookSettings.createWebhook : i18n.ts._webhookSettings.modifyWebhook }}
|
||||||
@@ -59,8 +60,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, onMounted, ref, toRefs } from 'vue';
|
import { computed, onMounted, ref, shallowRef, toRefs } from 'vue';
|
||||||
import FormSection from '@/components/form/section.vue';
|
|
||||||
import MkInput from '@/components/MkInput.vue';
|
import MkInput from '@/components/MkInput.vue';
|
||||||
import MkSwitch from '@/components/MkSwitch.vue';
|
import MkSwitch from '@/components/MkSwitch.vue';
|
||||||
import {
|
import {
|
||||||
@@ -82,9 +82,12 @@ type EventType = {
|
|||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
(ev: 'submitted', result: MkSystemWebhookResult): void;
|
(ev: 'submitted', result: MkSystemWebhookResult): void;
|
||||||
|
(ev: 'canceled'): void;
|
||||||
(ev: 'closed'): void;
|
(ev: 'closed'): void;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
|
const dialogEl = shallowRef<InstanceType<typeof MkModalWindow>>();
|
||||||
|
|
||||||
const props = defineProps<MkSystemWebhookEditorProps>();
|
const props = defineProps<MkSystemWebhookEditorProps>();
|
||||||
|
|
||||||
const { mode, id, requiredEvents } = toRefs(props);
|
const { mode, id, requiredEvents } = toRefs(props);
|
||||||
@@ -133,12 +136,14 @@ async function onSubmitClicked() {
|
|||||||
switch (mode.value) {
|
switch (mode.value) {
|
||||||
case 'create': {
|
case 'create': {
|
||||||
const result = await misskeyApi('admin/system-webhook/create', params);
|
const result = await misskeyApi('admin/system-webhook/create', params);
|
||||||
|
dialogEl.value?.close();
|
||||||
emit('submitted', result);
|
emit('submitted', result);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'edit': {
|
case 'edit': {
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
const result = await misskeyApi('admin/system-webhook/update', { id: id.value!, ...params });
|
const result = await misskeyApi('admin/system-webhook/update', { id: id.value!, ...params });
|
||||||
|
dialogEl.value?.close();
|
||||||
emit('submitted', result);
|
emit('submitted', result);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -147,13 +152,15 @@ async function onSubmitClicked() {
|
|||||||
} catch (ex: any) {
|
} catch (ex: any) {
|
||||||
const msg = ex.message ?? i18n.ts.internalServerErrorDescription;
|
const msg = ex.message ?? i18n.ts.internalServerErrorDescription;
|
||||||
await os.alert({ type: 'error', title: i18n.ts.error, text: msg });
|
await os.alert({ type: 'error', title: i18n.ts.error, text: msg });
|
||||||
emit('closed');
|
dialogEl.value?.close();
|
||||||
|
emit('canceled');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onCancelClicked() {
|
function onCancelClicked() {
|
||||||
emit('closed');
|
dialogEl.value?.close();
|
||||||
|
emit('canceled');
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadingScope<T>(fn: () => Promise<T>): Promise<T> {
|
async function loadingScope<T>(fn: () => Promise<T>): Promise<T> {
|
||||||
@@ -183,11 +190,12 @@ onMounted(async () => {
|
|||||||
for (const ev of Object.keys(events.value)) {
|
for (const ev of Object.keys(events.value)) {
|
||||||
events.value[ev] = res.on.includes(ev as SystemWebhookEventType);
|
events.value[ev] = res.on.includes(ev as SystemWebhookEventType);
|
||||||
}
|
}
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
} catch (ex: any) {
|
} catch (ex: any) {
|
||||||
const msg = ex.message ?? i18n.ts.internalServerErrorDescription;
|
const msg = ex.message ?? i18n.ts.internalServerErrorDescription;
|
||||||
await os.alert({ type: 'error', title: i18n.ts.error, text: msg });
|
await os.alert({ type: 'error', title: i18n.ts.error, text: msg });
|
||||||
emit('closed');
|
dialogEl.value?.close();
|
||||||
|
emit('canceled');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -61,7 +61,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, ref } from 'vue';
|
import { onMounted, ref, shallowRef } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import MkInput from '@/components/MkInput.vue';
|
import MkInput from '@/components/MkInput.vue';
|
||||||
import FormSplit from '@/components/form/split.vue';
|
import FormSplit from '@/components/form/split.vue';
|
||||||
@@ -91,7 +91,7 @@ const host = ref('');
|
|||||||
const users = ref<Misskey.entities.UserLite[]>([]);
|
const users = ref<Misskey.entities.UserLite[]>([]);
|
||||||
const recentUsers = ref<Misskey.entities.UserDetailed[]>([]);
|
const recentUsers = ref<Misskey.entities.UserDetailed[]>([]);
|
||||||
const selected = ref<Misskey.entities.UserLite | null>(null);
|
const selected = ref<Misskey.entities.UserLite | null>(null);
|
||||||
const dialogEl = ref();
|
const dialogEl = shallowRef<InstanceType<typeof MkModalWindow>>();
|
||||||
|
|
||||||
function search() {
|
function search() {
|
||||||
if (username.value === '' && host.value === '') {
|
if (username.value === '' && host.value === '') {
|
||||||
@@ -122,7 +122,7 @@ async function ok() {
|
|||||||
});
|
});
|
||||||
emit('ok', user);
|
emit('ok', user);
|
||||||
|
|
||||||
dialogEl.value.close();
|
dialogEl.value?.close();
|
||||||
|
|
||||||
// 最近使ったユーザー更新
|
// 最近使ったユーザー更新
|
||||||
let recents = defaultStore.state.recentlyUsedUsers;
|
let recents = defaultStore.state.recentlyUsedUsers;
|
||||||
@@ -133,7 +133,7 @@ async function ok() {
|
|||||||
|
|
||||||
function cancel() {
|
function cancel() {
|
||||||
emit('cancel');
|
emit('cancel');
|
||||||
dialogEl.value.close();
|
dialogEl.value?.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
@@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<MkModalWindow
|
<MkModalWindow
|
||||||
ref="dialog"
|
ref="dialogEl"
|
||||||
:width="400"
|
:width="400"
|
||||||
:height="490"
|
:height="490"
|
||||||
:withOkButton="false"
|
:withOkButton="false"
|
||||||
@@ -71,7 +71,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, onMounted, ref, toRefs } from 'vue';
|
import { computed, onMounted, ref, shallowRef, toRefs } from 'vue';
|
||||||
import { entities } from 'misskey-js';
|
import { entities } from 'misskey-js';
|
||||||
import MkButton from '@/components/MkButton.vue';
|
import MkButton from '@/components/MkButton.vue';
|
||||||
import MkModalWindow from '@/components/MkModalWindow.vue';
|
import MkModalWindow from '@/components/MkModalWindow.vue';
|
||||||
@@ -88,6 +88,7 @@ type NotificationRecipientMethod = 'email' | 'webhook';
|
|||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
(ev: 'submitted'): void;
|
(ev: 'submitted'): void;
|
||||||
|
(ev: 'canceled'): void;
|
||||||
(ev: 'closed'): void;
|
(ev: 'closed'): void;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
@@ -98,6 +99,8 @@ const props = defineProps<{
|
|||||||
|
|
||||||
const { mode, id } = toRefs(props);
|
const { mode, id } = toRefs(props);
|
||||||
|
|
||||||
|
const dialogEl = shallowRef<InstanceType<typeof MkModalWindow>>();
|
||||||
|
|
||||||
const loading = ref<number>(0);
|
const loading = ref<number>(0);
|
||||||
|
|
||||||
const title = ref<string>('');
|
const title = ref<string>('');
|
||||||
@@ -166,18 +169,21 @@ async function onSubmitClicked() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dialogEl.value?.close();
|
||||||
emit('submitted');
|
emit('submitted');
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
} catch (ex: any) {
|
} catch (ex: any) {
|
||||||
const msg = ex.message ?? i18n.ts.internalServerErrorDescription;
|
const msg = ex.message ?? i18n.ts.internalServerErrorDescription;
|
||||||
await os.alert({ type: 'error', title: i18n.ts.error, text: msg });
|
await os.alert({ type: 'error', title: i18n.ts.error, text: msg });
|
||||||
emit('closed');
|
dialogEl.value?.close();
|
||||||
|
emit('canceled');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onCancelClicked() {
|
function onCancelClicked() {
|
||||||
emit('closed');
|
dialogEl.value?.close();
|
||||||
|
emit('canceled');
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onEditSystemWebhookClicked() {
|
async function onEditSystemWebhookClicked() {
|
||||||
@@ -262,7 +268,8 @@ onMounted(async () => {
|
|||||||
} catch (ex: any) {
|
} catch (ex: any) {
|
||||||
const msg = ex.message ?? i18n.ts.internalServerErrorDescription;
|
const msg = ex.message ?? i18n.ts.internalServerErrorDescription;
|
||||||
await os.alert({ type: 'error', title: i18n.ts.error, text: msg });
|
await os.alert({ type: 'error', title: i18n.ts.error, text: msg });
|
||||||
emit('closed');
|
dialogEl.value?.close();
|
||||||
|
emit('canceled');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
userId.value = moderators.value[0]?.id ?? null;
|
userId.value = moderators.value[0]?.id ?? null;
|
||||||
@@ -296,11 +303,13 @@ onMounted(async () => {
|
|||||||
gap: 8px;
|
gap: 8px;
|
||||||
|
|
||||||
button {
|
button {
|
||||||
width: 2.5em;
|
min-width: 0;
|
||||||
height: 2.5em;
|
min-height: 0;
|
||||||
min-width: 2.5em;
|
width: 34px;
|
||||||
min-height: 2.5em;
|
height: 34px;
|
||||||
|
flex-shrink: 0;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
margin: 1px 0;
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -108,26 +108,27 @@ async function onDeleteButtonClicked(id: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function showEditor(mode: 'create' | 'edit', id?: string) {
|
async function showEditor(mode: 'create' | 'edit', id?: string) {
|
||||||
const { dispose, needLoad } = await new Promise<{ dispose: () => void, needLoad: boolean }>(async resolve => {
|
const { needLoad } = await new Promise<{ needLoad: boolean }>(async resolve => {
|
||||||
const { dispose: _dispose } = os.popup(
|
const { dispose } = os.popup(
|
||||||
defineAsyncComponent(() => import('./notification-recipient.editor.vue')),
|
defineAsyncComponent(() => import('./notification-recipient.editor.vue')),
|
||||||
{
|
{
|
||||||
mode,
|
mode,
|
||||||
id,
|
id,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
submitted: async () => {
|
submitted: () => {
|
||||||
resolve({ dispose: _dispose, needLoad: true });
|
resolve({ needLoad: true });
|
||||||
|
},
|
||||||
|
canceled: () => {
|
||||||
|
resolve({ needLoad: false });
|
||||||
},
|
},
|
||||||
closed: () => {
|
closed: () => {
|
||||||
resolve({ dispose: _dispose, needLoad: false });
|
dispose();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
dispose();
|
|
||||||
|
|
||||||
if (needLoad) {
|
if (needLoad) {
|
||||||
await fetchRecipients();
|
await fetchRecipients();
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"name": "misskey-js",
|
"name": "misskey-js",
|
||||||
"version": "2024.7.0-beta.2",
|
"version": "2024.7.0-beta.3",
|
||||||
"description": "Misskey SDK for JavaScript",
|
"description": "Misskey SDK for JavaScript",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
@@ -35,23 +35,23 @@
|
|||||||
"directory": "packages/misskey-js"
|
"directory": "packages/misskey-js"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@microsoft/api-extractor": "7.47.0",
|
"@microsoft/api-extractor": "7.47.4",
|
||||||
"@swc/jest": "0.2.36",
|
"@swc/jest": "0.2.36",
|
||||||
"@types/jest": "29.5.12",
|
"@types/jest": "29.5.12",
|
||||||
"@types/node": "20.14.9",
|
"@types/node": "20.14.12",
|
||||||
"@typescript-eslint/eslint-plugin": "7.15.0",
|
"@typescript-eslint/eslint-plugin": "7.17.0",
|
||||||
"@typescript-eslint/parser": "7.15.0",
|
"@typescript-eslint/parser": "7.17.0",
|
||||||
"jest": "29.7.0",
|
"jest": "29.7.0",
|
||||||
"jest-fetch-mock": "3.0.3",
|
"jest-fetch-mock": "3.0.3",
|
||||||
"jest-websocket-mock": "2.5.0",
|
"jest-websocket-mock": "2.5.0",
|
||||||
"mock-socket": "9.3.1",
|
"mock-socket": "9.3.1",
|
||||||
"ncp": "2.0.0",
|
"ncp": "2.0.0",
|
||||||
"nodemon": "3.1.4",
|
"nodemon": "3.1.4",
|
||||||
"execa": "9.2.0",
|
"execa": "9.3.0",
|
||||||
"tsd": "0.31.1",
|
"tsd": "0.31.1",
|
||||||
"typescript": "5.5.3",
|
"typescript": "5.5.4",
|
||||||
"esbuild": "0.22.0",
|
"esbuild": "0.23.0",
|
||||||
"glob": "10.4.2"
|
"glob": "11.0.0"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"built"
|
"built"
|
||||||
|
@@ -4089,7 +4089,8 @@ export type components = {
|
|||||||
userId: string | null;
|
userId: string | null;
|
||||||
}) | null;
|
}) | null;
|
||||||
localOnly?: boolean;
|
localOnly?: boolean;
|
||||||
reactionAcceptance: string | null;
|
/** @enum {string|null} */
|
||||||
|
reactionAcceptance: 'likeOnly' | 'likeOnlyForRemote' | 'nonSensitiveOnly' | 'nonSensitiveOnlyForLocalLikeOnlyForRemote';
|
||||||
reactionEmojis: {
|
reactionEmojis: {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
};
|
};
|
||||||
|
@@ -9,16 +9,16 @@
|
|||||||
"lint": "pnpm typecheck && pnpm eslint"
|
"lint": "pnpm typecheck && pnpm eslint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "0.22.0",
|
"esbuild": "0.23.0",
|
||||||
"idb-keyval": "6.2.1",
|
"idb-keyval": "6.2.1",
|
||||||
"misskey-js": "workspace:*"
|
"misskey-js": "workspace:*"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@typescript-eslint/parser": "7.15.0",
|
"@typescript-eslint/parser": "7.17.0",
|
||||||
"@typescript/lib-webworker": "npm:@types/serviceworker@0.0.67",
|
"@typescript/lib-webworker": "npm:@types/serviceworker@0.0.67",
|
||||||
"eslint-plugin-import": "2.29.1",
|
"eslint-plugin-import": "2.29.1",
|
||||||
"nodemon": "3.1.4",
|
"nodemon": "3.1.4",
|
||||||
"typescript": "5.5.3"
|
"typescript": "5.5.4"
|
||||||
},
|
},
|
||||||
"type": "module"
|
"type": "module"
|
||||||
}
|
}
|
||||||
|
5436
pnpm-lock.yaml
generated
5436
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user