diff --git a/CHANGELOG.md b/CHANGELOG.md index 97d2bec939..7b2d991732 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,9 @@ - OAuth 2.0のサポート ### Client -- +- Enhance: 自分が押したリアクションのデザインを改善 +- Fix: サーバー情報画面(`/instance-info/{domain}`)でブロックができないのを修正 +- Fix: 未読のお知らせの「わかった」をクリック・タップしてもその場で「わかった」が消えない問題を修正 ### Server - diff --git a/package.json b/package.json index 125a33f406..283894f934 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "lodash": "4.17.21" }, "dependencies": { - "execa": "7.1.1", + "execa": "7.2.0", "gulp": "4.0.2", "gulp-cssnano": "2.1.3", "gulp-rename": "2.0.0", @@ -54,13 +54,13 @@ "typescript": "5.1.6" }, "devDependencies": { - "@types/gulp": "4.0.10", - "@types/gulp-rename": "2.0.1", - "@typescript-eslint/eslint-plugin": "5.61.0", - "@typescript-eslint/parser": "5.61.0", + "@types/gulp": "4.0.13", + "@types/gulp-rename": "2.0.2", + "@typescript-eslint/eslint-plugin": "6.2.0", + "@typescript-eslint/parser": "6.2.0", "cross-env": "7.0.3", - "cypress": "12.17.1", - "eslint": "8.45.0", + "cypress": "12.17.2", + "eslint": "8.46.0", "start-server-and-test": "2.0.0" }, "optionalDependencies": { diff --git a/packages/backend/package.json b/packages/backend/package.json index bbca9e59c4..8c5b67ced6 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -59,25 +59,25 @@ "@aws-sdk/client-s3": "3.367.0", "@aws-sdk/lib-storage": "3.367.0", "@aws-sdk/node-http-handler": "3.360.0", - "@bull-board/api": "5.6.1", - "@bull-board/fastify": "5.6.1", - "@bull-board/ui": "5.6.1", + "@bull-board/api": "5.7.1", + "@bull-board/fastify": "5.7.1", + "@bull-board/ui": "5.7.1", "@discordapp/twemoji": "14.1.2", "@fastify/accepts": "4.2.0", "@fastify/cookie": "8.3.0", "@fastify/cors": "8.3.0", "@fastify/express": "2.3.0", "@fastify/http-proxy": "9.2.1", - "@fastify/multipart": "7.7.1", + "@fastify/multipart": "7.7.3", "@fastify/static": "6.10.2", "@fastify/view": "8.0.0", - "@nestjs/common": "10.1.0", - "@nestjs/core": "10.1.0", - "@nestjs/testing": "10.1.0", + "@nestjs/common": "10.1.2", + "@nestjs/core": "10.1.2", + "@nestjs/testing": "10.1.2", "@peertube/http-signature": "1.7.0", "@sinonjs/fake-timers": "10.3.0", "@swc/cli": "0.1.62", - "@swc/core": "1.3.70", + "@swc/core": "1.3.72", "accepts": "1.3.8", "ajv": "8.12.0", "archiver": "5.3.1", @@ -85,9 +85,9 @@ "bcryptjs": "2.4.3", "blurhash": "2.0.5", "body-parser": "1.20.2", - "bullmq": "4.4.0", + "bullmq": "4.6.3", "cacheable-lookup": "7.0.0", - "cbor": "9.0.0", + "cbor": "9.0.1", "chalk": "5.3.0", "chalk-template": "1.1.0", "chokidar": "3.5.3", @@ -96,7 +96,7 @@ "content-disposition": "0.5.4", "date-fns": "2.30.0", "deep-email-validator": "0.1.21", - "fastify": "4.20.0", + "fastify": "4.21.0", "feed": "4.2.2", "file-type": "18.5.0", "fluent-ffmpeg": "2.1.2", @@ -104,7 +104,7 @@ "got": "13.0.0", "happy-dom": "10.0.3", "hpagent": "1.2.0", - "http-link-header": "1.1.0", + "http-link-header": "1.1.1", "ioredis": "5.3.2", "ip-cidr": "3.1.0", "ipaddr.js": "2.1.0", @@ -121,14 +121,14 @@ "misskey-js": "workspace:*", "ms": "3.0.0-canary.1", "nested-property": "4.0.0", - "node-fetch": "3.3.1", - "nodemailer": "6.9.3", + "node-fetch": "3.3.2", + "nodemailer": "6.9.4", "nsfwjs": "2.4.2", "oauth": "0.10.0", "oauth2orize": "1.11.1", "oauth2orize-pkce": "0.1.2", "os-utils": "0.0.14", - "otpauth": "9.1.3", + "otpauth": "9.1.4", "parse5": "7.1.2", "pg": "8.11.1", "pkce-challenge": "4.0.1", @@ -140,20 +140,20 @@ "qrcode": "1.5.3", "random-seed": "0.3.0", "ratelimiter": "3.4.1", - "re2": "1.19.1", + "re2": "1.20.1", "redis-lock": "0.1.4", "reflect-metadata": "0.1.13", "rename": "1.0.4", "rss-parser": "3.13.0", "rxjs": "7.8.1", "sanitize-html": "2.11.0", - "sharp": "0.32.3", + "sharp": "0.32.4", "sharp-read-bmp": "github:misskey-dev/sharp-read-bmp", "slacc": "0.0.10", "strict-event-emitter-types": "2.0.0", "stringz": "2.1.0", "summaly": "github:misskey-dev/summaly", - "systeminformation": "5.18.7", + "systeminformation": "5.18.9", "tinycolor2": "1.6.0", "tmp": "0.2.1", "tsc-alias": "1.8.7", @@ -163,13 +163,13 @@ "typescript": "5.1.6", "ulid": "2.3.0", "vary": "1.1.2", - "web-push": "3.6.3", + "web-push": "3.6.4", "ws": "8.13.0", "xev": "3.0.2" }, "devDependencies": { - "@jest/globals": "29.6.1", - "@swc/jest": "0.2.26", + "@jest/globals": "29.6.2", + "@swc/jest": "0.2.27", "@types/accepts": "1.3.5", "@types/archiver": "5.3.2", "@types/bcryptjs": "2.4.2", @@ -186,9 +186,9 @@ "@types/jsrsasign": "10.5.8", "@types/mime-types": "2.1.1", "@types/ms": "0.7.31", - "@types/node": "20.4.2", + "@types/node": "20.4.5", "@types/node-fetch": "3.0.3", - "@types/nodemailer": "6.4.8", + "@types/nodemailer": "6.4.9", "@types/oauth": "0.9.1", "@types/oauth2orize": "1.11.0", "@types/oauth2orize-pkce": "0.1.0", @@ -209,15 +209,15 @@ "@types/vary": "1.1.0", "@types/web-push": "3.3.2", "@types/ws": "8.5.5", - "@typescript-eslint/eslint-plugin": "5.61.0", - "@typescript-eslint/parser": "5.61.0", + "@typescript-eslint/eslint-plugin": "6.2.0", + "@typescript-eslint/parser": "6.2.0", "aws-sdk-client-mock": "3.0.0", "cross-env": "7.0.3", - "eslint": "8.45.0", - "eslint-plugin-import": "2.27.5", - "execa": "7.1.1", - "jest": "29.6.1", - "jest-mock": "29.6.1", + "eslint": "8.46.0", + "eslint-plugin-import": "2.28.0", + "execa": "7.2.0", + "jest": "29.6.2", + "jest-mock": "29.6.2", "simple-oauth2": "5.0.0" } } diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index b2b5d9aff6..29f511842c 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -197,7 +197,7 @@ function convertRedisOptions(options: RedisOptionsSource, host: string): RedisOp ...options, password: options.pass, prefix: options.prefix ?? host, - family: options.family == null ? 0 : options.family, + family: options.family ?? 0, keyPrefix: `${options.prefix ?? host}:`, db: options.db ?? 0, }; diff --git a/packages/backend/src/core/DriveService.ts b/packages/backend/src/core/DriveService.ts index a4f6a96a41..511c2c9581 100644 --- a/packages/backend/src/core/DriveService.ts +++ b/packages/backend/src/core/DriveService.ts @@ -574,9 +574,7 @@ export class DriveService { file.maybePorn = info.porn; file.isSensitive = user ? this.userEntityService.isLocalUser(user) && profile!.alwaysMarkNsfw ? true : - (sensitive !== null && sensitive !== undefined) - ? sensitive - : false + sensitive ?? false : false; if (info.sensitive && profile!.autoSensitive) file.isSensitive = true; diff --git a/packages/backend/src/core/FetchInstanceMetadataService.ts b/packages/backend/src/core/FetchInstanceMetadataService.ts index cf3ebbebfa..22309f230f 100644 --- a/packages/backend/src/core/FetchInstanceMetadataService.ts +++ b/packages/backend/src/core/FetchInstanceMetadataService.ts @@ -108,7 +108,7 @@ export class FetchInstanceMetadataService { if (name) updates.name = name; if (description) updates.description = description; - if (icon || favicon) updates.iconUrl = (icon && !icon.includes('data:image/png;base64')) ? icon : favicon; + if (icon ?? favicon) updates.iconUrl = (icon && !icon.includes('data:image/png;base64')) ? icon : favicon; if (favicon) updates.faviconUrl = favicon; if (themeColor) updates.themeColor = themeColor; diff --git a/packages/backend/src/core/HttpRequestService.ts b/packages/backend/src/core/HttpRequestService.ts index 47878ed694..487172deae 100644 --- a/packages/backend/src/core/HttpRequestService.ts +++ b/packages/backend/src/core/HttpRequestService.ts @@ -93,7 +93,7 @@ export class HttpRequestService { */ @bindThis public getAgentByUrl(url: URL, bypassProxy = false): http.Agent | https.Agent { - if (bypassProxy || (this.config.proxyBypassHosts || []).includes(url.hostname)) { + if (bypassProxy || (this.config.proxyBypassHosts ?? []).includes(url.hostname)) { return url.protocol === 'http:' ? this.http : this.https; } else { return url.protocol === 'http:' ? this.httpAgent : this.httpsAgent; diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index e0ea949c66..5ed5a08f07 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -367,7 +367,7 @@ export class NoteCreateService implements OnApplicationShutdown { name: data.name, text: data.text, hasPoll: data.poll != null, - cw: data.cw == null ? null : data.cw, + cw: data.cw ?? null, tags: tags.map(tag => normalizeForSearch(tag)), emojis, userId: user.id, @@ -402,7 +402,7 @@ export class NoteCreateService implements OnApplicationShutdown { const url = profile != null ? profile.url : null; return { uri: u.uri, - url: url == null ? undefined : url, + url: url ?? undefined, username: u.username, host: u.host, } as IMentionedRemoteUsers[0]; diff --git a/packages/backend/src/core/activitypub/models/ApNoteService.ts b/packages/backend/src/core/activitypub/models/ApNoteService.ts index e915f948c9..e107b9fe5a 100644 --- a/packages/backend/src/core/activitypub/models/ApNoteService.ts +++ b/packages/backend/src/core/activitypub/models/ApNoteService.ts @@ -200,7 +200,7 @@ export class ApNoteService { // 引用 let quote: Note | undefined | null = null; - if (note._misskey_quote || note.quoteUrl) { + if (note._misskey_quote ?? note.quoteUrl) { const tryResolveNote = async (uri: string): Promise< | { status: 'ok'; res: Note } | { status: 'permerror' | 'temperror' } diff --git a/packages/backend/src/postgres.ts b/packages/backend/src/postgres.ts index 45ca364b52..57262f31f0 100644 --- a/packages/backend/src/postgres.ts +++ b/packages/backend/src/postgres.ts @@ -232,7 +232,7 @@ export function createPostgresDataSource(config: Config) { options: { host: config.redis.host, port: config.redis.port, - family: config.redis.family == null ? 0 : config.redis.family, + family: config.redis.family ?? 0, password: config.redis.pass, keyPrefix: `${config.redis.prefix}:query:`, db: config.redis.db ?? 0, diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts index 10e8654df8..75c837b502 100644 --- a/packages/backend/src/server/api/endpoints/notes/create.ts +++ b/packages/backend/src/server/api/endpoints/notes/create.ts @@ -193,7 +193,7 @@ export default class extends Endpoint { } let files: DriveFile[] = []; - const fileIds = ps.fileIds != null ? ps.fileIds : ps.mediaIds != null ? ps.mediaIds : null; + const fileIds = ps.fileIds ?? ps.mediaIds ?? null; if (fileIds != null) { files = await this.driveFilesRepository.createQueryBuilder('file') .where('file.userId = :userId AND file.id IN (:...fileIds)', { diff --git a/packages/backend/src/server/api/endpoints/pages/update.ts b/packages/backend/src/server/api/endpoints/pages/update.ts index ee503429f6..679b1ed464 100644 --- a/packages/backend/src/server/api/endpoints/pages/update.ts +++ b/packages/backend/src/server/api/endpoints/pages/update.ts @@ -117,13 +117,17 @@ export default class extends Endpoint { await this.pagesRepository.update(page.id, { updatedAt: new Date(), title: ps.title, + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing name: ps.name === undefined ? page.name : ps.name, summary: ps.summary === undefined ? page.summary : ps.summary, content: ps.content, variables: ps.variables, script: ps.script, + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing alignCenter: ps.alignCenter === undefined ? page.alignCenter : ps.alignCenter, + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing hideTitleWhenPinned: ps.hideTitleWhenPinned === undefined ? page.hideTitleWhenPinned : ps.hideTitleWhenPinned, + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing font: ps.font === undefined ? page.font : ps.font, eyeCatchingImageId: ps.eyeCatchingImageId === null ? null diff --git a/packages/frontend/.eslintrc.js b/packages/frontend/.eslintrc.js index 24c3ad4b83..77038f0dfa 100644 --- a/packages/frontend/.eslintrc.js +++ b/packages/frontend/.eslintrc.js @@ -21,9 +21,6 @@ module.exports = { 'allowSingleExtends': true, }, ], - '@typescript-eslint/prefer-nullish-coalescing': [ - 'error', - ], // window の禁止理由: グローバルスコープと衝突し、予期せぬ結果を招くため // e の禁止理由: error や event など、複数のキーワードの頭文字であり分かりにくいため 'id-denylist': ['error', 'window', 'e'], diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 2819f858c1..7d3c8b9767 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -21,9 +21,9 @@ "@rollup/plugin-replace": "5.0.2", "@rollup/pluginutils": "5.0.2", "@syuilo/aiscript": "0.15.0", - "@tabler/icons-webfont": "2.25.0", + "@tabler/icons-webfont": "2.30.0", "@vitejs/plugin-vue": "4.2.3", - "@vue-macros/reactivity-transform": "0.3.15", + "@vue-macros/reactivity-transform": "0.3.16", "@vue/compiler-sfc": "3.3.4", "astring": "1.8.6", "autosize": "6.0.1", @@ -31,13 +31,13 @@ "browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3", "buraha": "0.0.1", "canvas-confetti": "1.6.0", - "chart.js": "4.3.0", + "chart.js": "4.3.2", "chartjs-adapter-date-fns": "3.0.0", "chartjs-chart-matrix": "2.0.1", "chartjs-plugin-gradient": "0.6.1", "chartjs-plugin-zoom": "2.0.1", "chromatic": "6.19.9", - "compare-versions": "5.0.3", + "compare-versions": "6.0.0", "cropperjs": "2.0.0-beta.3", "date-fns": "2.30.0", "escape-regexp": "0.0.1", @@ -55,14 +55,14 @@ "prismjs": "1.29.0", "punycode": "2.3.0", "querystring": "0.2.1", - "rollup": "3.26.3", + "rollup": "3.27.0", "s-age": "1.1.2", "sanitize-html": "2.11.0", - "sass": "1.63.6", + "sass": "1.64.1", "strict-event-emitter-types": "2.0.0", "syuilo-password-strength": "0.0.1", "textarea-caret": "3.1.0", - "three": "0.154.0", + "three": "0.155.0", "throttle-debounce": "5.0.0", "tinycolor2": "1.6.0", "tsc-alias": "1.8.7", @@ -71,7 +71,7 @@ "typescript": "5.1.6", "uuid": "9.0.0", "vanilla-tilt": "1.8.0", - "vite": "4.4.4", + "vite": "4.4.7", "vue": "3.3.4", "vue-prism-editor": "2.0.0-alpha.2", "vuedraggable": "next" @@ -103,29 +103,29 @@ "@types/gulp-rename": "2.0.2", "@types/matter-js": "0.18.5", "@types/micromatch": "4.0.2", - "@types/node": "20.4.2", + "@types/node": "20.4.5", "@types/punycode": "2.1.0", "@types/sanitize-html": "2.9.0", - "@types/testing-library__jest-dom": "5.14.8", + "@types/testing-library__jest-dom": "5.14.9", "@types/throttle-debounce": "5.0.0", "@types/tinycolor2": "1.4.3", "@types/uuid": "9.0.2", "@types/websocket": "1.0.5", "@types/ws": "8.5.5", - "@typescript-eslint/eslint-plugin": "5.61.0", - "@typescript-eslint/parser": "5.61.0", + "@typescript-eslint/eslint-plugin": "6.2.0", + "@typescript-eslint/parser": "6.2.0", "@vitest/coverage-v8": "0.33.0", "@vue/runtime-core": "3.3.4", "acorn": "8.10.0", "cross-env": "7.0.3", - "cypress": "12.17.1", - "eslint": "8.45.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-vue": "9.15.1", - "fast-glob": "3.3.0", + "cypress": "12.17.2", + "eslint": "8.46.0", + "eslint-plugin-import": "2.28.0", + "eslint-plugin-vue": "9.16.1", + "fast-glob": "3.3.1", "happy-dom": "10.0.3", "micromatch": "4.0.5", - "msw": "1.2.2", + "msw": "1.2.3", "msw-storybook-addon": "1.8.0", "nodemon": "3.0.1", "prettier": "3.0.0", @@ -139,6 +139,6 @@ "vitest": "0.33.0", "vitest-fetch-mock": "0.2.2", "vue-eslint-parser": "9.3.1", - "vue-tsc": "1.8.5" + "vue-tsc": "1.8.8" } } diff --git a/packages/frontend/src/account.ts b/packages/frontend/src/account.ts index 3087b99f3b..c3f3337c9d 100644 --- a/packages/frontend/src/account.ts +++ b/packages/frontend/src/account.ts @@ -117,13 +117,13 @@ function fetchAccount(token: string, id?: string, forceShowDialog?: boolean): Pr .then(async res => { if (res.error) { if (res.error.id === 'a8c724b3-6e9c-4b46-b1a8-bc3ed6258370') { - // SUSPENDED + // SUSPENDED if (forceShowDialog || $i && (token === $i.token || id === $i.id)) { await showSuspendedDialog(); } } else if (res.error.id === 'e5b3b9f0-2b8f-4b9f-9c1f-8c5c1b2e1b1a') { - // USER_IS_DELETED - // アカウントが削除されている + // USER_IS_DELETED + // アカウントが削除されている if (forceShowDialog || $i && (token === $i.token || id === $i.id)) { await alert({ type: 'error', @@ -132,8 +132,8 @@ function fetchAccount(token: string, id?: string, forceShowDialog?: boolean): Pr }); } } else if (res.error.id === 'b0a7f5f8-dc2f-4171-b91f-de88ad238e14') { - // AUTHENTICATION_FAILED - // トークンが無効化されていたりアカウントが削除されたりしている + // AUTHENTICATION_FAILED + // トークンが無効化されていたりアカウントが削除されたりしている if (forceShowDialog || $i && (token === $i.token || id === $i.id)) { await alert({ type: 'error', diff --git a/packages/frontend/src/components/MkDateSeparatedList.vue b/packages/frontend/src/components/MkDateSeparatedList.vue index 20f13f965a..e6690ed8a0 100644 --- a/packages/frontend/src/components/MkDateSeparatedList.vue +++ b/packages/frontend/src/components/MkDateSeparatedList.vue @@ -168,10 +168,10 @@ export default defineComponent({ > *:empty { display: none; } - - > *:not(:last-child) { - margin-bottom: var(--margin); } + + &:not(.date-separated-list-nogap) > *:not(:last-child) { + margin-bottom: var(--margin); } } diff --git a/packages/frontend/src/components/MkReactionsViewer.reaction.vue b/packages/frontend/src/components/MkReactionsViewer.reaction.vue index d75fad35a7..baf4796d2f 100644 --- a/packages/frontend/src/components/MkReactionsViewer.reaction.vue +++ b/packages/frontend/src/components/MkReactionsViewer.reaction.vue @@ -143,15 +143,13 @@ useTooltip(buttonEl, async (showing) => { } } - &.reacted { - background: var(--accent); - - &:hover { - background: var(--accent); - } + &.reacted, &.reacted:hover { + background: var(--accentedBg); + color: var(--accent); + border: 1px solid var(--accent); > .count { - color: var(--fgOnAccent); + color: var(--accent); } > .icon { diff --git a/packages/frontend/src/components/MkUrlPreview.vue b/packages/frontend/src/components/MkUrlPreview.vue index ce9fe21fac..1a194ae9db 100644 --- a/packages/frontend/src/components/MkUrlPreview.vue +++ b/packages/frontend/src/components/MkUrlPreview.vue @@ -60,7 +60,7 @@ SPDX-License-Identifier: AGPL-3.0-only